数码之家

 找回密码
 立即注册
搜索
查看: 304|回复: 10

[C51] STC15W1K16S+TM1652+6位共阴数码管点亮问题

[复制链接]
发表于 2025-4-1 09:04:33 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
手头有一个STC15W1K16S和一个TM1652驱动的6位共阴数码管,想用DEEPSEEK做的程序点亮,但怎么也这不起来,有高手帮忙看下程序哪有问题

程序如下:
#include <STC15.H>
#include <intrins.h>

// 硬件定义
sbit TM1652_SDA = P1^7;  // 数据线连接P1.7

// TM1652指令集
#define TM1652_ADDR_AUTO  0x40  // 地址自动递增模式
#define TM1652_ADDR_FIXED 0x44  // 固定地址模式
#define TM1652_DISPLAY_ON 0x88  // 显示开 + 亮度设置(0-7)

// YK3661AS数码管段码表(共阴)
const unsigned char SegCode[] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F, // 9
    0x00  // 全灭(自定义)
};

// 延时函数(适配2.5MHz晶振)
void DelayUS(unsigned int us) {
    while(us--) {
        _nop_(); _nop_(); _nop_(); _nop_();
    }
}

void DelayMS(unsigned int ms) {
    unsigned int i, j;
    for(i=0; i<ms; i++)
        for(j=0; j<1141; j++);
}

// TM1652通信协议
void TM1652_Start() {
    TM1652_SDA = 1; DelayUS(5);
    TM1652_SDA = 0; DelayUS(5);
}

void TM1652_Stop() {
    TM1652_SDA = 0; DelayUS(5);
    TM1652_SDA = 1; DelayUS(5);
}

void TM1652_WriteByte(unsigned char dat) {
    unsigned char i;
    for(i=0; i<8; i++) {
        TM1652_SDA = (dat & 0x01);
        dat >>= 1;
        DelayUS(5);
    }
    TM1652_SDA = 1; // 释放总线等待ACK
    DelayUS(5);
}

// TM1652初始化
void TM1652_Init() {
    TM1652_Start();
    TM1652_WriteByte(TM1652_ADDR_AUTO); // 启用地址自动递增
    TM1652_Stop();
   
    TM1652_Start();
    TM1652_WriteByte(TM1652_DISPLAY_ON | 0x07); // 显示开 + 最高亮度
    TM1652_Stop();
}

// 显示6位内容(传入段码数组)
void TM1652_Display(unsigned char *seg_data) {
    unsigned char i;
    TM1652_Start();
    TM1652_WriteByte(0xC0); // 起始地址为第一个数码管
   
    for(i=0; i<6; i++) {
        TM1652_WriteByte(seg_data);
    }
    TM1652_Stop();
}

void main() {
    unsigned char disp_buf[6] = {0};
    unsigned char num = 0;
   
    // 初始化TM1652
    TM1652_Init();
   
    while(1) {
        // 填充显示缓冲区(示例:显示递增数字)
        disp_buf[0] = SegCode[(num+0) % 10];
        disp_buf[1] = SegCode[(num+1) % 10];
        disp_buf[2] = SegCode[(num+2) % 10];
        disp_buf[3] = SegCode[(num+3) % 10];
        disp_buf[4] = SegCode[(num+4) % 10];
        disp_buf[5] = SegCode[(num+5) % 10];
        
        // 更新显示
        TM1652_Display(disp_buf);
        
        // 数字递增(0-9循环)
        num++;
        if(num >= 10) num = 0;
        
        // 延时500ms
        DelayMS(500);
    }
}
先谢谢了
发表于 2025-4-1 13:04:26 | 显示全部楼层
我搜百度发现这个帖子不错:“TM1652段码屏芯片全解析——概况,性能,MCU连接,样例代码”感觉它把TM1652说的挺透彻,只是他的代码是32位单片机的不能直接用在STC上,但修改例程也是学习过程,也可以复制代码贴到deepseek上让它改成C51程序,但也不用过分相信deepseek给出的代码,貌似挺工整的但很多时候会有问题,我最近玩温湿度传感器用了几次deepseek给出的代码发现都不能实现控制。
回复 支持 反对

使用道具 举报

发表于 2025-4-1 13:29:03 | 显示全部楼层
这说明 deepseek 的代码只能作参考,有时是不能直接用的
回复 支持 反对

使用道具 举报

发表于 2025-4-1 13:29:43 | 显示全部楼层
用过1650 1637 1638 就是没有用过1652
回复 支持 反对

使用道具 举报

发表于 2025-4-1 13:33:13 | 显示全部楼层
百度了一下,TM1652采用单线帧数据传送,估计延时需要精确些,就像18B20
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-1 18:05:52 | 显示全部楼层
慕名而来 发表于 2025-4-1 13:04
我搜百度发现这个帖子不错:“TM1652段码屏芯片全解析——概况,性能,MCU连接,样例代码”感觉它把TM1652 ...

谢谢,有空看看.主要是刚接触单片机,想一口吃个胖子直接看结果!如果从零开始学估计1年2年也亮不起来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-1 18:06:46 | 显示全部楼层
lmn2005 发表于 2025-4-1 13:29
这说明 deepseek 的代码只能作参考,有时是不能直接用的

看来直接抄不是个办法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-1 18:08:00 | 显示全部楼层
lmn2005 发表于 2025-4-1 13:29
用过1650 1637 1638 就是没有用过1652

TM1652只用一个数据脚就可以实现控制,但不会用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-1 18:09:08 | 显示全部楼层
lmn2005 发表于 2025-4-1 13:33
百度了一下,TM1652采用单线帧数据传送,估计延时需要精确些,就像18B20

好的,有空参考一下18B20
回复 支持 反对

使用道具 举报

发表于 2025-4-2 11:01:42 | 显示全部楼层
lmn2005 发表于 2025-4-1 13:29
这说明 deepseek 的代码只能作参考,有时是不能直接用的

我觉得一些简单的诸如点灯、驱动LED数码管这些简单的应该没问题,但涉及按时序写代码的东西就不太靠谱了,或许我用的这种AI在线的电脑端APP不专业的原因吧。
回复 支持 反对

使用道具 举报

发表于 2025-4-2 11:57:25 | 显示全部楼层
tsdj 发表于 2025-4-1 18:09
好的,有空参考一下18B20

具体得看TM1652手册吧,因为它的通讯协议跟18B20有差别的
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-2 04:27 , Processed in 0.156001 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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