这几天学习了单片机led数字灯的控制,及定时器的控制
定时器主要通过两个寄存器进行操作,TMOD寄存器中有gate,C/T,M1M0,分别控制启动方式,是定时器还是计时器,定时器的计数方式。TCON寄存器中有TR0和TR1,分别为计时器0和1的开关,在对定时器初始化,之后还需与中断系统配合,即打开中断总开关(EA=1),打开相对应计时器的中断开关,还有中断的程序的书写(记得对计时器初识化)
led灯的控制分为静态与动态,静态就是简单的通过段选和位选使灯发出相对应的数字
动态显示是用极快的速度使不同的灯亮不同的内容,要用到延迟函数等,另外动态显示要注意先控制段选,清空P0口之后,再控制位选。
以下是许多练习中的一个(计时器显示)
#include <reg52.h> #define uchar unsigned char int a=0; uchar count,bai,shi,ge; sbit wela=P2^7; sbit dula=P2^6; unsigned char code table[]= {0x3f,0x06,0x5b,0x4f, ?0x66,0x6d,0x7d,0x07, ?0x7f,0x6f,0x77,0x7c, ?0x39,0x5e,0x79,0x71};
void sleep(int a); void display(uchar bai,uchar shi,uchar ge); int main() { ? ?TMOD=0x01; ? ?TR0=1; ? ?TH0=(65536-50000)/256; ? ?TL0=(65536-50000)%256; ? ?EA=1; ? ?ET0=1; ? ?wela=0; ? ?dula=0; ? ?while(1) ? ? { ? ? ? ? ? ? ? ?if(count==20) ? ? ? ? ? { ? ? ? ? ? ? ?count=0; ? ? ? ? ? ? ?a++; ? ? ? ? ? ? ?if(a==999) ? ? ? ? ? ? ? {a=0;} ? ? ? ? ? ? ?bai=a/100; ? ? ? ? ? ? ?shi=(a/10)%10; ? ? ? ? ? ? ?ge=a%10; ?? ? ? ? ? ? } ? ? ?? ? ? ? display(bai,shi,ge); ? ? } ? ?return 0; } void timer0() interrupt 1 { ? ?TH0=(65536-50000)/256; ? ?TL0=(65536-50000)%256; ? ?count++; } void display(uchar bai,uchar shi,uchar ge) { ? ?dula=1; ? ?P0=table[bai]; ? ?dula=0;? ? ?P0=0xff;? ? ?wela=1; ? ?P0=0xfe; ? ?wela=0; ? ?sleep(1);
? ?dula=1; ? ?P0=table[shi]; ? ?dula=0;? ? ?P0=0xff; ? ?wela=1; ? ?P0=0xfd; ? ?wela=0; ? ?sleep(1);
? ?dula=1; ? ?P0=table[ge]; ? ?dula=0; ? ?P0=0xff; ? ?wela=1; ? ?P0=0xfb; ? ?wela=0; ? ? ? ? ? ?sleep(1); } void sleep(int a) { ? ? int x,y; ? ? for(x=a;x>0;x--) ? ? ? ?for(y=110;y>0;y--); }
|