找回密码
 立即注册

QQ登录

只需一步,快速开始

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

串口助手实现流水灯和数码管

[复制链接]
跳转到指定楼层
楼主
ID:1105996 发表于 2023-12-24 12:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有人能帮我改一下程序吗,真不会
要求如下:利用串口助手,通过串口助手发送0,则流水灯左移,同时数码管显示管显示0。发送1,则流水灯右移,同时数码管显示管显示1。发送2,则流水灯中间向两端发散,同时数码管显示管显示2。发送3,则流水灯全灭,同时数码管显示管显示3。发送4,则流水灯全亮,同时数码管显示管显示4。

#include <reg52.h>

sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned char code LedChar[] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[7] =
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned char T0RH = 0;  
unsigned char T0RL = 0;
unsigned char RxdByte = 0;
unsigned char flag200ms = 0;  
unsigned char flagLight = 1;  

void ConfigTimer0(unsigned int ms);
void ConfigUART(unsigned int baud);
void FlowingLight();

void main()
{
    EA = 1;      
    ENLED = 0;  
    ADDR3 = 1;
    ConfigTimer0(1);  
    ConfigUART(9600);

    while (1)
    {
        if (flagLight == 0)
        {
            LedBuff[6] = 0xFF;
        }
        else
        {
            if (flag200ms != 0)
            {
                flag200ms = 0;
                FlowingLight();
            }
        }        LedBuff[0] = LedChar[RxdByte & 0x0F];
        LedBuff[1] = LedChar[RxdByte >> 4];
    }
}void FlowingLight()
{
    static unsigned char dir = 0;   
    static unsigned char shift = 0x01;

    LedBuff[6] = ~shift;   
    if (dir == 0)            
    {
        shift = shift << 1;
        if (shift == 0x80)  
        {
            dir = 1;
        }
    }
    else                    
    {
        shift = shift >> 1;  
        if (shift == 0x01)
        {
            dir = 0;
        }
    }
}void ConfigTimer0(unsigned int ms)
{
    unsigned long tmp;

    tmp = 11059200 / 12;   
    tmp = (tmp * ms) / 1000;
    tmp = 65536 - tmp;
    tmp = tmp + 13;      
    T0RH = (unsigned char)(tmp>>8);
    T0RL = (unsigned char)tmp;
    TMOD &= 0xF0;  
    TMOD |= 0x01;
    TH0 = T0RH;  
    TL0 = T0RL;
    ET0 = 1;      
    TR0 = 1;      
}
void ConfigUART(unsigned int baud)
{
    SCON  = 0x50;  
    TMOD &= 0x0F;
    TMOD |= 0x20;
    TH1 = 256 - (11059200/12/32)/baud;
    TL1 = TH1;  
    ET1 = 0;   
    ES  = 1;      
    TR1 = 1;   
}void LedScan()
{
    static unsigned char i = 0;

    P0 = 0xFF;         
    P1 = (P1 & 0xF8) | i;
    P0 = LedBuff[i];      
    if (i < 6)            
        i++;
    else
        i = 0;
}void InterruptTimer0() interrupt 1
{
    static unsigned char tmr200ms = 0;

    TH0 = T0RH;
    TL0 = T0RL;
    LedScan();  
    tmr200ms++;
    if (tmr200ms >= 200)
    {
        tmr200ms = 0;
        flag200ms = 1;
    }
}void InterruptUART() interrupt 4
{
    if (RI)
    {
        RI = 0;
        RxdByte = SBUF;
        SBUF = RxdByte;

        flagLight = !flagLight;
    }
    if (TI)
    {
        TI = 0;
    }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2023-12-24 14:06 | 只看该作者
LedBuff[7] = 这一行都少了一个"{"   串口中断服务程序要把按收到的数据进行分类选择相应流水灯的控制,同时设置显示缓冲区的数据,显示程序由定时计数器负责显示缓 冲区的内容即可
回复

使用道具 举报

板凳
ID:1105996 发表于 2023-12-24 16:05 | 只看该作者
csmyldl 发表于 2023-12-24 14:06
LedBuff[7] = 这一行都少了一个"{"   串口中断服务程序要把按收到的数据进行分类选择相应流水灯的控制,同 ...

那个{是我复制时不小心删掉的,我是不知道怎么把上面那段程序改为要求那种的
回复

使用道具 举报

地板
ID:161164 发表于 2023-12-25 22:41 | 只看该作者
电路图呢?没有电路图改不了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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