找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 713|回复: 8
收起左侧

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

[复制链接]
ID:33548 发表于 2025-2-26 15:10 | 显示全部楼层 |阅读模式
那位大师有STC15单片机控制TM1652,显示5位LED数码管的例程,参考学习一下。
回复

使用道具 举报

ID:866313 发表于 2025-2-27 03:09 | 显示全部楼层
以下内容由 DeepSeek R1 生成
以下是基于STC15单片机驱动TM1652数码管显示的示例代码,综合了多个搜索结果中的技术要点(如UART模拟时序、命令格式、硬件配置等),并针对5位数码管显示需求进行了适配和优化。代码注释中包含了关键逻辑说明,方便学习和移植。


STC15单片机驱动TM1652示例代码 #include "STC15F2K60S2.H"
#include <intrins.h>

// 定义TM1652通信引脚(假设使用P3.0作为数据线)
sbit TM1652_SDA = P3^0;

// 延时函数(适应11.0592MHz晶振,调整延时以满足52us/位的时序要求)
void delay_us(unsigned int us) {
     while (us--) {
         _nop_(); _nop_(); _nop_(); _nop_(); // 约1us延时
     }
}

// TM1652发送单字节函数
void TM1652_SendByte(unsigned char dat) {
     unsigned char i;
     unsigned char parity = 0; // 奇偶校验计数器

     // 起始位(高→低,持续52us)
     TM1652_SDA = 1;
     delay_us(5);
     TM1652_SDA = 0;
     delay_us(52);

     // 发送8位数据(低位优先)
     for (i = 0; i < 8; i++) {
         if (dat & 0x01) {
             TM1652_SDA = 1;
             parity++;
         } else {
             TM1652_SDA = 0;
         }
         dat >>= 1;
         delay_us(52);
     }

     // 校验位(若数据中1的个数为奇数,则校验位为0)
     TM1652_SDA = (parity % 2 == 0) ? 1 : 0;
     delay_us(52);

     // 停止位(高电平,持续52us)
     TM1652_SDA = 1;
     delay_us(52);
}

// 初始化TM1652(设置显示模式、亮度等)
void TM1652_Init() {
     // 显示控制命令:开启显示,亮度级别4(共8级)
     TM1652_SendByte(0x48); // 命令格式:0x4X(X为亮度值+显示开关)
}

// 显示5位数字(支持0-9)
void TM1652_Display5Digits(unsigned char *digits) {
     // 发送显示地址命令:从第一个数码管开始(地址0x00)
     TM1652_SendByte(0x00); // 地址命令
     
     // 发送5位数据(每位对应一个数码管)
     for (unsigned char i = 0; i < 5; i++) {
         TM1652_SendByte(digits); // 需根据段码表转换数字到TM1652编码
     }
     
     // 发送结束命令(可选)
     TM1652_SendByte(0x0F); // 结束帧
}

// 主函数示例
void main() {
     unsigned char display_data[5] = {0x3F, 0x06, 0x5B, 0x4F, 0x66}; // 显示"12345"

     TM1652_Init();          // 初始化TM1652
     TM1652_Display5Digits(display_data); // 更新显示

     while(1) {
         // 动态更新显示内容(如需)
     }
}

关键说明与注意事项
  • 硬件连接  

    • TM1652仅需一个数据线(SDA),连接到STC15的任意IO口(示例中使用P3.0)。
    • 数码管的段码需根据实际硬件电路定义(共阴/共阳),示例中的0x3F等值为共阴数码管编码。

  • 时序配置  

    • TM1652的UART波特率建议为19200bps(每位约52us),需通过delay_us精确控制时序。
    • 若主频非11.0592MHz,需调整延时函数参数。

  • 命令格式  

    • 显示控制命令:格式为0x4X,其中X的低3位控制亮度(0-7),最高位控制显示开关(1=开)。
    • 地址命令:发送0x00表示从第一个数码管开始写入数据,后续依次为0x01、0x02等。

  • 段码表参考  根据数码管类型(共阴/共阳)定义段码,例如共阴数码管数字0的编码为0x3F(对应段A-F点亮)。



扩展功能
  • 动态显示:在main函数循环中更新display_data数组并调用TM1652_Display5Digits,可实现滚动显示或实时数据更新。
  • 按键扫描:TM1652支持按键扫描功能,需结合中断读取键值(参考TM1652数据手册)。

如需完整工程或更详细的移植说明,可参考以下资源:
  • STC15W401AS驱动TM1652程序(C语言,直接适配)
  • TM1652通信协议详解(含时序图)


回复

使用道具 举报

ID:404160 发表于 2025-2-27 10:52 | 显示全部楼层
#include <STC15F2K60S2.h>  

#define TM1652_DIO P1_0 // DIO连接口  
#define TM1652_CLK P1_1 // CLK连接口  

// 定义命令  
#define CMD_WRITE 0x40  
#define CMD_DISPLAY_ON 0x88  

void DelayMs(unsigned int ms)  
{  
    while (ms--) {  
        unsigned int i = 123; // 大约1ms  
        while (i--);  
    }  
}  

void TM1652_SendByte(unsigned char dat)  
{  
    unsigned char i;  

    // 发送数据  
    for (i = 0; i < 8; i++) {  
        TM1652_DIO = dat & 0x01; // 发送最低位  
        dat >>= 1;               // 右移  
        TM1652_CLK = 1;          // 时钟高电平  
        DelayMs(1);              // 小延时  
        TM1652_CLK = 0;          // 时钟低电平  
    }  
}  

void TM1652_Init(void)  
{  
    TM1652_CLK = 0; // CLK初始化  
    TM1652_DIO = 0; // DIO初始化  

    TM1652_SendByte(CMD_WRITE); // 发送写命令  
    TM1652_SendByte(CMD_DISPLAY_ON); // 打开显示  
}  

void TM1652_Display(unsigned char pos, unsigned char data)  
{  
    // pos: 位置 (0-4) 对应于 5 位数码管  
    // data: 显示的数据  
    TM1652_SendByte(0xC0 | pos); // 设置起始地址  
    TM1652_SendByte(data); // 发送数据  
}  

void main(void)  
{  
    TM1652_Init(); // 初始化TM1652  

    while (1) {  
        TM1652_Display(0, 0x01); // 显示第0位数据  
        TM1652_Display(1, 0x02); // 显示第1位数据  
        TM1652_Display(2, 0x03); // 显示第2位数据  
        TM1652_Display(3, 0x04); // 显示第3位数据  
        TM1652_Display(4, 0x05); // 显示第4位数据  
        DelayMs(1000); // 延时1秒  

        TM1652_Display(0, 0x06); // 改变显示内容  
        TM1652_Display(1, 0x07);  
        TM1652_Display(2, 0x08);  
        TM1652_Display(3, 0x09);  
        TM1652_Display(4, 0x0A);  
        DelayMs(1000); // 延时1秒  
    }  
}

//参考,按思路去修改
回复

使用道具 举报

ID:161164 发表于 2025-2-27 11:32 | 显示全部楼层
用串口1的模式3就可以简单控制
回复

使用道具 举报

ID:1109793 发表于 2025-2-28 07:39 | 显示全部楼层
cedtek 发表于 2025-2-27 03:09
以下内容由 DeepSeek R1 生成以下是基于STC15单片机驱动TM1652数码管显示的示例代码,综合了多个搜索结果中 ...

居然只用一个脚通信?我记得好像18B20
回复

使用道具 举报

ID:161164 发表于 2025-2-28 11:38 | 显示全部楼层
xiaobendan001 发表于 2025-2-28 07:39
居然只用一个脚通信?我记得好像18B20

这芯片是串口通信的,只收不发
一个TxD就够
回复

使用道具 举报

ID:1109793 发表于 2025-2-28 12:38 | 显示全部楼层
lkc8210 发表于 2025-2-28 11:38
这芯片是串口通信的,只收不发
一个TxD就够

哦,没用过,那就是不能带按键 了
我用过1650带几个按键,还是很方便的,显示与主控分体时节省不少线。
回复

使用道具 举报

ID:33548 发表于 2025-2-28 17:32 | 显示全部楼层
飞云居士 发表于 2025-2-27 10:52
#include   

#define TM1652_DIO P1_0 // DIO连接口  

1652只有一个接收口,一线的
回复

使用道具 举报

ID:1133081 发表于 2025-3-1 08:35 | 显示全部楼层
cjtdz 发表于 2025-2-28 17:32
1652只有一个接收口,一线的

地板正解!使用单片机串口,只发不收。波特率19200. TM1652.PDF (369.46 KB, 下载次数: 0)
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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