登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 利用串口将数字显示到数码管

[复制链接]
发表于 2022-1-29 12:08:01 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 51单片机
学习安排: 串口学习
开始时间: 2022-01-28
结束时间: 2022-01-28
利用串口显示数字到数码管

程序如下

#include<reg52.h>
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ENLED = P1^1;

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 RxdByte = 0;
                unsigned char T0RH = 0;
                unsigned char T0RL = 0;
               
void ConfigTimer0(unsigned int ms);
void ConfigUART(unsigned int baud);
               
void main()
{
                EA = 1;
                ENLED = 0;
                ConfigTimer0(1);
                ConfigUART(9600);
               
    while(1)
                {
                LedBuff[0] = LedChar[RxdByte & 0x0F];
                LedBuff[1] = LedChar[RxdByte>>4];
                }
}

                void ConfigTimer0(unsigned int ms)
                {
                unsigned long tmp;

    tmp = 32768000/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 = 255-(32768000/12/32)/baud;
    TL1 = TH1;
    ET1 = 0;
    ES = 1;
    TR1 = 1;
}

void LedScan()
{
    static unsigned char i = 0;

    P0 = 0xFF;
    switch(i)
    {
                 
     case 0:ADDR2 = 0;ADDR1 = 0;ADDR0 = 0;i++0 = LedBuff[5];break;
                 case 1:ADDR2 = 0;ADDR1 = 0;ADDR0 = 1;i++0 = LedBuff[4];break;
                 case 2:ADDR2 = 0;ADDR1 = 1;ADDR0 = 0;i++0 = LedBuff[3];break;
     case 3:ADDR2 = 0;ADDR1 = 1;ADDR0 = 1;i++0 = LedBuff[2];break;
                 case 4:ADDR2 = 1;ADDR1 = 0;ADDR0 = 0;i++0 = LedBuff[1];break;
     case 5:ADDR2 = 1;ADDR1 = 0;ADDR0 = 1;i++0 = LedBuff[0];break;
                 case 6:ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;i = 00 = LedBuff[6];break;
     default: break;
                }
}

void InterruptTimer0() interrupt 1
{
     TH0 = T0RH;
                 TR0 = T0RL;
                 LedScan();
               
}

void InterruptUART() interrupt 4
{
     if(RI)
{
     RI = 0;
                 RxdByte = SBUF;
                 SBUF = RxdByte;
}
     if(TI)
                 {
                 TI = 0;
                 }
}

好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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