登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 51单片机技术学习

[复制链接]
发表于 2022-1-25 17:55:30 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 51单片机技术学习
学习安排: 1月25日尝试实验交通灯代码
开始时间: 2022-01-25
结束时间: 2022-01-25
注意:本程序中LED动态扫描函数必须使用
if  
else if
语句,使用switch语句或简写语句数码管和LED小灯不会亮或者会闪一下直接熄灭,具体原因不知为何,可能是照抄金沙滩代码出现单片机型号不同所致;
此外按住回车键和ESC键会使倒计时数字从第五位和第六位转移到第一位和第二位(算是小发现)
#include <reg52.h>

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

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
};
bit flag1s=1;
unsigned char T0RH=0;
unsigned char T0RL=0;

void ConfigTimer0(unsigned int ms);
void TrafficLight();
void main()
{
        EA=1;
        ENLED=0;
        ConfigTimer0(1);
       
        while(1)
        {
                if(flag1s==1)
                {
                        flag1s=0;
                        TrafficLight();
                }
        }
}
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 TrafficLight()
{
        static unsigned char color=2;
        static unsigned char timer=0;
       
        if(timer==0)
        {
                switch(color)
                {
                        case 0:
                                color=1;
                          timer=2;
                          LedBuff[6]=0xE7;
                          break;
                        case 1:
                                color=2;
                          timer=29;
                          LedBuff[6]=0xFC;
                          break;
                        case 2:
                                color=0;
                          timer=39;
                          LedBuff[6]=0x3F;
                          break;
                        default:
                                break;
                }
        }
        else
        {
                timer--;
        }
        LedBuff[0]=LedChar[timer%10];
        LedBuff[1]=LedChar[timer/10];
       
        LedBuff[2]=0xFF;
        LedBuff[3]=0xFF;
        LedBuff[4]=0xFF;
        LedBuff[5]=0xFF;
}
void LedScan()
{
        static unsigned char i=0;
        P0=0xFF;
        if(i==0)
        {ADDR0=1;ADDR1=0;ADDR2=1;i++0=LedBuff[0];}
        else if(i==1)
                                        {ADDR0=0;ADDR1=0;ADDR2=1;i++0=LedBuff[1];}
        else if(i==2)
                                        {ADDR0=1;ADDR1=1;ADDR2=0;i++0=LedBuff[2];}
        else if(i==3)
                                        {ADDR0=0;ADDR1=1;ADDR2=0;i++0=LedBuff[3];}
        else if(i==4)
                                        {ADDR0=1;ADDR1=0;ADDR2=0;i++0=LedBuff[4];}
        else if(i==5)
                                        {ADDR0=0;ADDR1=0;ADDR2=1;i++0=LedBuff[5];}
        else if(i==6)
                                        {ADDR0=0;ADDR1=1;ADDR2=1;i=00=LedBuff[6];}
}
void InterruptTimer0() interrupt 1
{
        static unsigned int tmr1s=0;
       
        TH0=T0RH;
        TL0=T0RL;
        LedScan();
        tmr1s++;
        if(tmr1s>=1000)
        {
                tmr1s=0;
                flag1s=1;
        }
}

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

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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