找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 398|回复: 13
打印 上一主题 下一主题
收起左侧

TM1650能用于STC89C52单片机吗?

  [复制链接]
跳转到指定楼层
楼主
ID:134430 发表于 2025-7-23 21:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看到一些TM1650+数码管的案例都是用STM32的,请问能用于STC89C52吗?哪儿 !有例子可看?谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:44037 发表于 2025-7-24 07:30 | 只看该作者
很多  搜索一下
http://www.51hei.com/bbs/dpj-239409-1.html
回复

使用道具 举报

板凳
ID:1109793 发表于 2025-7-24 07:32 | 只看该作者
都一样用吧,我觉得AIP650E更好用呢。我用STC8G1K08-SOP16是没问题的。8H也可以。
回复

使用道具 举报

地板
ID:1133081 发表于 2025-7-24 07:49 | 只看该作者
TM1650适配于所有MCU。 4位数码管时钟 DS1302 TM1650程序.rar (27.41 KB, 下载次数: 0)
回复

使用道具 举报

5#
ID:230500 发表于 2025-7-24 08:02 | 只看该作者
51可以驱动
回复

使用道具 举报

6#
ID:421260 发表于 2025-7-24 08:15 | 只看该作者
当然可以,TM1650是通用的数码管控制芯片,常规单片机都能驱动
回复

使用道具 举报

7#
ID:774370 发表于 2025-7-24 08:34 | 只看该作者
实测可用,供参考。

TM1650动态数码管.rar

39.02 KB, 下载次数: 0

回复

使用道具 举报

8#
ID:732794 发表于 2025-7-24 08:44 | 只看该作者
你这等级,完全可以自己改一份出来了
回复

使用道具 举报

9#
ID:584814 发表于 2025-7-24 09:55 | 只看该作者
jintaiyang 发表于 2025-7-24 08:34
实测可用,供参考。

习惯买卖了
回复

使用道具 举报

10#
ID:353115 发表于 2025-7-24 09:55 | 只看该作者
自己做的串口形式的驱动芯片
https://blog.csdn.net/weixin_443 ... 1001.2014.3001.5501
回复

使用道具 举报

11#
ID:584814 发表于 2025-7-24 11:25 | 只看该作者
TM1650能用于常见的各类单片机,当然包括STC89C52。
例程本论坛不少,大多不用移植即可用。
回复

使用道具 举报

12#
ID:619259 发表于 2025-7-24 21:36 | 只看该作者
完全可以。对于新的芯片,研究它的时序就能够得出结论。
回复

使用道具 举报

13#
ID:134430 发表于 2025-7-31 16:06 | 只看该作者
感谢各位的帮助!
对照1650资料和网上的示例,编写了一个程序,STC89C52+1650+2位数码管,已搭建实物,运行成功。
说明一点:个人习惯,All.h 里面包含了所有用到的头文件。

#include "All.h"

        //----P0为开漏模式,需+4.7k上拉----
sbit SCL = P0^0;        //时钟
sbit SDA = P0^1;        //数据

        //----定义数码管代码(是固定的)----
#define DIG1 0x68                       
#define DIG2 0x6A
//#define DIG1 0x6C                       
//#define DIG2 0x6E


        //----共阴,无小数点----
uchar code Seg[] = {
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};               
//    0    1    2    3    4    5    6    7    8    9  熄灭
       
        //---约20us,晶振12----
void delay_us()
{
  uchar a;
  for(a=1;a>0;a--);
}

        //---- I2C起始信号 ----
void I2C_Start()
{
        SDA = 1;  
        SCL = 1;      
        _nop_();_nop_();_nop_();_nop_();
        SDA = 0;  
        SCL = 0;               
        _nop_();_nop_();_nop_();_nop_();
}

        //---- I2C停止信号 ----
void I2C_Stop()
{
        SCL = 1;  
        SDA = 1;                         
        _nop_();_nop_();_nop_();_nop_();
}

//---- I2C发送应答 ----
        void I2C_Ack()
{
        SDA = 0;
        _nop_();_nop_();
        SCL = 1;  
        delay_us();                //19us
        SCL = 0;  
        _nop_();_nop_();
}

        //---- I2C发送一个字节 ----
void I2C_SendByte(uchar datt)
{
        uchar i;
        for(i=0;i<8;i++)
        {               
                SDA = (datt & 0x80)? 1:0;        //高位先发
                _nop_();_nop_();_nop_();_nop_();
                SCL = 1;                                        //低电平准备
                datt <<=1;
                delay_us();
                SCL = 0;
        }
}

        //---- 写数据 ----
void TM1650_Write(uchar addr,uchar dat)
{
        I2C_Start();
        I2C_SendByte(addr);                //发送地址(命令模式+显存地址)
        I2C_Ack();                                //等待应答
        I2C_SendByte(dat);                //发送数据
        I2C_Ack();
        I2C_Stop();
}

        //---- 1650初始化:开显示、7段、亮度6级 ----
void TM1650_Init()
{
                //命令(0x48,固定数字):开显示,7段,亮度6级(0x69)
        TM1650_Write(0x48,0x69);

        P0 = 0xff;                //端口初始化
}

        //---- 数码管显示数字 -----
void DisplayDigits(uchar dat)
{
        uchar num1,num2;        //num3,num4;  显示几位开几位
       
        num1 = dat%10;                //个位
       
        if(dat <10)                        //一位数,十位是0,不显示
                num2 = 10;
        else                                //两位数及以上数
                num2 = dat/10%10;
       
        TM1650_Write(DIG1,Seg[num1]);                //第一位数码管地址0x68                //个位
        TM1650_Write(DIG2,Seg[num2]);                //第二位0x6a                                 //十位
//        TM1650_Write(DIG1,Seg[num3]);                //0x6c 用几位开几位
//        TM1650_Write(DIG2,Seg[num4]);                //0x6e
}


#include "All.h"

void main()
{       
        TM1650_Init();                        //初始化

        while(1)
        {
                DisplayDigits(47);        //举例47,5,123
                delay_1ms(500);
        }
}


回复

使用道具 举报

14#
ID:134430 发表于 2025-7-31 18:57 | 只看该作者
感谢各位帮助!
对照1650资料和网上的例子,编写了一个程序,STC89C52+1650+2位数码管,已搭建实物,运行良好,现发布,望提意见。说明一下,个人习惯,把用到的所有头文件都放在All.h里。c文件一共3个:main.c  1650.c  delay.c


#include "All.h"

        //----P0为开漏模式,需+4.7k上拉----
sbit SCL = P0^0;        //时钟
sbit SDA = P0^1;        //数据

        //----定义数码管代码(是固定的)----
#define DIG1 0x68                       
#define DIG2 0x6A
//#define DIG1 0x6C                       
//#define DIG2 0x6E


        //----共阴,无小数点----
uchar code Seg[] = {
        0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};               
//    0    1    2    3    4    5    6    7    8    9  熄灭
       
        //---约20us,晶振12----
void delay_us()
{
  uchar a;
  for(a=1;a>0;a--);
}

        //---- I2C起始信号 ----
void I2C_Start()
{
        SDA = 1;  
        SCL = 1;      
        _nop_();_nop_();_nop_();_nop_();
        SDA = 0;  
        SCL = 0;               
        _nop_();_nop_();_nop_();_nop_();
}

        //---- I2C停止信号 ----
void I2C_Stop()
{
        SCL = 1;  
        SDA = 1;                         
        _nop_();_nop_();_nop_();_nop_();
}

//---- I2C发送应答 ----
        void I2C_Ack()
{
        SDA = 0;
        _nop_();_nop_();
        SCL = 1;  
        delay_us();                //19us
        SCL = 0;  
        _nop_();_nop_();
}

        //---- I2C发送一个字节 ----
void I2C_SendByte(uchar datt)
{
        uchar i;
        for(i=0;i<8;i++)
        {               
                SDA = (datt & 0x80)? 1:0;        //高位先发
                _nop_();_nop_();_nop_();_nop_();
                SCL = 1;                                        //低电平准备
                datt <<=1;
                delay_us();
                SCL = 0;
        }
}

        //---- 写数据 ----
void TM1650_Write(uchar addr,uchar dat)
{
        I2C_Start();
        I2C_SendByte(addr);                //发送地址(命令模式+显存地址)
        I2C_Ack();                                //等待应答
        I2C_SendByte(dat);                //发送数据
        I2C_Ack();
        I2C_Stop();
}

        //---- 1650初始化:开显示、7段、亮度6级 ----
void TM1650_Init()
{
                //命令(0x48,固定数字):开显示,7段,亮度6级(0x69)
        TM1650_Write(0x48,0x69);

        P0 = 0xff;                //端口初始化
}

        //---- 数码管显示数字 -----
void DisplayDigits(uchar dat)
{
        uchar num1,num2;        //num3,num4;  显示几位开几位
       
        num1 = dat%10;                //个位
       
        if(dat <10)                        //一位数,十位是0,不显示
                num2 = 10;
        else                                //两位数及以上数
                num2 = dat/10%10;
       
        TM1650_Write(DIG1,Seg[num1]);                //第一位数码管地址0x68                //个位
        TM1650_Write(DIG2,Seg[num2]);                //第二位0x6a                                 //十位
//        TM1650_Write(DIG1,Seg[num3]);                //0x6c 用几位开几位
//        TM1650_Write(DIG2,Seg[num4]);                //0x6e
}


#include "All.h"

void main()
{       
        TM1650_Init();                        //初始化

        while(1)
        {
                DisplayDigits(47);        //举例47,5,123
                delay_1ms(500);
        }
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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