找回密码
 立即注册
查看: 264|回复: 10

求一个15单片机与TM1652显示的例程

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2025-05-01 07:02:40

71

主题

84

回帖

212

积分

中级会员

积分
212
发表于 2025-2-26 14:46:34 | 显示全部楼层 |阅读模式
那位大师有15单片机控制TM1652,显示5位LED数码管的例程,参考学习一下。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-05-01 06:53:32
已绑定手机

4

主题

339

回帖

1558

积分

金牌会员

积分
1558
发表于 2025-2-26 15:33:42 | 显示全部楼层
TM1652没用过 只用过1727
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2025-05-01 07:02:40

71

主题

84

回帖

212

积分

中级会员

积分
212
发表于 2025-2-26 15:36:35 | 显示全部楼层
haiya*** 发表于 2025-2-26 15:33
TM1652没用过 只用过1727

1727是什么通信接口?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:297
  • 最近打卡:2025-05-01 06:53:32
已绑定手机

4

主题

339

回帖

1558

积分

金牌会员

积分
1558
发表于 2025-2-27 07:58:03 | 显示全部楼层
看看一样不
截图202502270755223263.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2025-2-27 13:29:11 | 显示全部楼层
用串口1的模式3就可以简单控制
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:346
  • 最近打卡:2025-05-01 19:40:16

10

主题

165

回帖

1233

积分

金牌会员

积分
1233
发表于 2025-4-6 14:21:42 | 显示全部楼层
你好,这个例程你找到了吗,我也想学习下。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2025-05-01 07:02:40

71

主题

84

回帖

212

积分

中级会员

积分
212
发表于 2025-4-6 19:26:09 | 显示全部楼层
lh*** 发表于 2025-4-6 14:21
你好,这个例程你找到了吗,我也想学习下。

这是我在网上买的模块,根据它提供的资料,结合AI生成的。
用模块厂家资料+豆包+自己修改生成的STC89C51单片机+TM1652 5位LED二键增减计数器,实际调试OK,献给大家。
//51单片机+TM1652二按键增减计数5位LED显示C代码//
//普通显示,无中断,调试OK
#include "REG51.h"
unsigned char KEY_NUM = 0;
typedef unsigned char u8;
typedef unsigned int u16;
u16 count = 0;    //按键计数值
sbit up = P3^6;   //增加按键
sbit down = P3^7;     //减少按键

sbit D_out = P0^0;    //模拟UART数据输出端,连接TM1652数据输入端D_in
const u8 CODE[16] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};  //共阴数码管0~F字型码

void Delay52us()  //@11.0592MHz
{
    unsigned char i;
    i = 21;
    while (--i);
}

void Delay5ms()  //@11.0592MHz
{
    unsigned char i, j;
    i = 9;
    j = 244;
    do
    {
        while (--j);
    } while (--i);
}

void Delay104us()  //@11.0592MHz
{
    unsigned char i;
    i = 45;
    while (--i);
}

void tm1652_send_data(u8 sdat)    //向TM1652发送数据
{
    unsigned char i = 0, sfalg = 0;
    //起始位
    D_out = 0;
    Delay52us();    //保持52us

    //发送8位数据
    for (i = 0; i < 8; i++)
    {
        if (sdat & 0x01)
        {
            D_out = 1;
            sfalg++;
        }
        else
        {
            D_out = 0;
        }
        Delay52us();
        sdat >>= 1;
    }

    //校验位,按照发送数据中1的个数来判断
    if (sfalg % 2 == 0)
    {
        D_out = 1;
    }
    else
    {
        D_out = 0;
    }
    Delay52us();
    //停止位
    D_out = 1;
    Delay104us();
}

void TM_Digtal_Display(u16 num)
{
    tm1652_send_data(0x08);
    // 确保能正确显示五位数
    tm1652_send_data(CODE[num / 10000]);        
    tm1652_send_data(CODE[num % 10000 / 1000]);   
    tm1652_send_data(CODE[num % 1000 / 100]);     
    tm1652_send_data(CODE[num % 100 / 10]);      
    tm1652_send_data(CODE[num % 10]);           
    Delay5ms();
    tm1652_send_data(0x18);        //向TM1652发送显示控制命令
    tm1652_send_data(0xFE);      //设置位占空比为 15/16,设置段驱动电流为 8/8,最大亮度。
}

// 延时函数,用于按键消抖
void delay(unsigned int time)
{
    unsigned int i, j;
    for (i = 0; i < time; i++)
        for (j = 0; j < 123; j++);
}

//主函数
void main()
{
    u16 delaytick = 0;
    // 开机显示00000
    TM_Digtal_Display(0);
    while (1)
    {
        // 检测上按键是否按下
        if (up == 0) {
            delay(20);  // 消抖
            if (up == 0)
            {
                if (count < 99999) {
                    count++;
                }
                while (up == 0) {
                    delay(10); // 持续检测按键释放,避免重复触发
                }
                delay(20); // 释放后再次消抖
            }
        }

        // 检测下按键是否按下
        if (down == 0) {
            delay(20);  // 消抖
            if (down == 0) {
                if (count > 0) {
                    count--;
                }
                while (down == 0)
{
                    delay(10); // 持续检测按键释放,避免重复触发
                }
                delay(20); // 释放后再次消抖
            }
        }

        if (++delaytick == 50) // 提高显示刷新频率
        {
            delaytick = 0;
            TM_Digtal_Display(count);
        }
        Delay5ms();
    }
}
QQ20250406-192834.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:346
  • 最近打卡:2025-05-01 19:40:16

10

主题

165

回帖

1233

积分

金牌会员

积分
1233
发表于 2025-4-7 07:57:24 | 显示全部楼层
cjt*** 发表于 2025-4-6 19:26
这是我在网上买的模块,根据它提供的资料,结合AI生成的。
用模块厂家资料+豆包+自己修改生成的STC89C51单 ...

谢谢楼主
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:350
  • 最近打卡:2025-05-01 00:32:14
已绑定手机

130

主题

1520

回帖

1855

积分

金牌会员

积分
1855
发表于 2025-4-7 09:26:46 | 显示全部楼层
参考tm1637把
这个好像不支持硬件I2C
用软件模拟I2C
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:120
  • 最近打卡:2025-05-01 07:02:40

71

主题

84

回帖

212

积分

中级会员

积分
212
发表于 2025-4-7 10:10:35 | 显示全部楼层
vb2*** 发表于 2025-4-7 09:26
参考tm1637把
这个好像不支持硬件I2C
用软件模拟I2C

TM1652这个是UART串口协议,只有接收,没有发送,所以只要一个数据线。整个芯片只需要电源VCC,接地GND和数据线DIN.
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 20:04 , Processed in 0.358178 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表