找回密码
 立即注册

QQ登录

只需一步,快速开始

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

如何在虚拟终端同步显示数码管的一位数字?

[复制链接]
跳转到指定楼层
楼主
#include <reg51.h>

// 函数声明
void Timer0_Init(void);
void UART_Init(void);
void Send_Current_Number(void);  // 专门用于发送当前数字的函数

// 数码管编码
unsigned char code LED7Code[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

unsigned char currentNum = 0;
unsigned char timer50ms = 0;

// 定时器初始化
void Timer0_Init() {
    TMOD = 0x21;    // 定时器0模式1,定时器1模式2
    TH0 = 0x3C;     // 50ms定时值(12MHz)
    TL0 = 0xB0;
    ET0 = 1;        // 允许定时器0中断
    EA = 1;         // 总中断允许
    TR0 = 1;        // 启动定时器0
}

// 串口初始化
void UART_Init() {
    SCON = 0x50;    // 模式1,允许接收
    TH1 = 0xFD;     // 9600波特率(12MHz)
    TL1 = 0xFD;
    TR1 = 1;        // 启动定时器1
}

// 专用数字发送函数
void Send_Current_Number(void) {
         
    SBUF = currentNum + '0';  
    while(!TI);     // 等待发送完成
    TI = 0;         // 清除发送标志
}

// 定时器中断
void Timer0_ISR() interrupt 1 {
    TH0 = 0x3C;     // 重装定时值
    TL0 = 0xB0;

    if(++timer50ms >= 10) {  // 0.5秒到达
        timer50ms = 0;

        // 更新显示
                       
        P1 = LED7Code[currentNum];

        // 发送当前数字
        Send_Current_Number();

        // 数字循环
        currentNum++;
        if(currentNum > 9) currentNum = 0;
    }
}

void main() {
    P1 = LED7Code[0];  // 初始显示0
    currentNum = 0;    // 显式初始化

    UART_Init();      // 初始化串口
    Timer0_Init();    // 初始化定时器

    // 初始发送数字0
    Send_Current_Number();

    while(1);         // 主循环
}





屏幕截图 2025-06-07 185835.png (75.95 KB, 下载次数: 0)

屏幕截图 2025-06-07 185835.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:275826 发表于 2025-6-8 18:27 | 只看该作者
单片机晶振设置错误
回复

使用道具 举报

板凳
ID:1153086 发表于 2025-6-8 23:14 | 只看该作者
tyrl800 发表于 2025-6-8 18:27
单片机晶振设置错误

编辑属性里是12MHz的,代码里设置的也是12MHz的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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