登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 串口综合

[复制链接]
发表于 2022-1-29 12:26:13 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 51单片机
学习安排: 尝试用串口结合之前所学内容
开始时间: 2022-01-28
结束时间: 2022-01-29
此程序用串口控制单片机进行流水灯,蜂鸣器,数码管计时。输入1,进行流水灯,输入2,流水灯停止在流水的最后一位,输入3,打开蜂鸣器,输入4,关闭蜂鸣器,输入5,打开数码管计时,输入6,计时停止,输入7,计时归零。
程序如下

#include<reg52.h>

sbit ENLED = P1^1;
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit BUZZ = P1^3;

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 R = 0;
                unsigned char T0RH = 0;
                unsigned char T0RL = 0;
                unsigned char a = 0;
                unsigned long n = 0;
                unsigned long sec = 0;
                unsigned char o;                  
               
void ConfigTimer0(unsigned int ms);
void ConfigUART(unsigned int baud);
               
void main()
{
                EA = 1;
                ENLED = 0;
                ConfigTimer0(1);
                ConfigUART(9600);
                BUZZ = 1;
    while(1)
                {
                n = sec;
                for(a = 0;a<=5;a++)
                {
                LedBuff[a] = LedChar[n%10];
                n = n/10;
                }
                }
}

                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 LSD()
{
                static unsigned char cnt = 0;
                static unsigned int i = 0;
if(R == 1)
                {
                ADDR0 = 0;
                ADDR1 = 1;
                ADDR2 = 1;
                i++;
                if(i>=500)
                {
                i = 0;
                if(cnt<=7)
                {
                P0 = ~(0x01<<cnt);
    cnt++;
                o = P0;
                }
    if(cnt == 8)
                {
                cnt = 0;
                }
                }
                }
if(R == 2)
                {
                P0 = o;
                }
}
void FMQ()
{
                ADDR0 = 1;
                ADDR1 = 1;
                ADDR2 = 1;
if(R == 3)
                {
                BUZZ = ~BUZZ;
                }
if(R == 4)
                {
                BUZZ = 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 SMG()
{                static unsigned int d = 0;
if(R == 5)
{

                d++;
                if(d>=1000)
                {
                d = 0;
                sec++;
                }
                LedScan();
}
if(R == 6)
{
    d = 0;
                LedScan();
}
if(R == 7)
{
    d = 0;
                sec = 0;
                LedScan();
}
}
void InterruptTimer0() interrupt 1
{
     TH0 = T0RH;
                 TR0 = T0RL;
                 LSD();
                 FMQ();
                 SMG();
}

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


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

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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