秒表題目要求: 應(yīng)用AT89C51的定時(shí)器設(shè)計(jì)一個(gè)2位的LED數(shù)碼顯示作為“秒表”:顯示時(shí)間為00~99s,每秒自動(dòng)加1,設(shè)計(jì)一個(gè)“開(kāi)始”鍵,按下“開(kāi)始”鍵秒表開(kāi)始計(jì)時(shí)。設(shè)計(jì)一個(gè)“復(fù)位”鍵,按下“復(fù)位” 鍵后,秒表從0開(kāi)始計(jì)時(shí)。
- 按下開(kāi)始鍵,秒表計(jì)數(shù)開(kāi)始
單片機(jī)源程序如下: - #include "reg51.h"
- #define uchar unsigned char
- #define uint unsingned int
- #define LED P0
- uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數(shù)碼管碼表
- uchar num,t,shi,ge;
- //------------------------------------
- void init();//定時(shí)器初始化
- void timer0();//
- void display();//顯示
- void delay(uchar);
-
- sbit KEY1 = P3^6;//開(kāi)始
- sbit KEY2 = P3^7;//復(fù)位
-
- void main()//主函數(shù)入口
- {
- init();//初始化
- while(1)
- {
- timer0();//查詢時(shí)間
- display();//顯示
- if(KEY1 == 0)//開(kāi)始
- {
- if(TR0 == 0)//定時(shí)器沒(méi)有打開(kāi)的時(shí)候
- {
- t = 0;
- num = 0;
- TR0=1;
- }
- }
- else if(KEY2 == 0)//復(fù)位
- {
- TR0 = 0; //關(guān)閉定時(shí)器
- TF0 = 0;//清楚時(shí)間溢出標(biāo)志
- t = 0;
- num = 0;
- TR0=1;
- }
-
- }
- }
-
- void init()//定時(shí)器初始化部分
- {
- num=t=0; //清楚數(shù)據(jù)
- TMOD=0x01; //定時(shí)器初始化
- TH0=(65536-15536)/256;//定時(shí)器賦初值 定時(shí)50ms
- TL0=(65536-15536)%256;
- EA=1;
- ET0=1;
- }
-
- void timer0()
- {
- if(TF0==1) //查詢溢出的時(shí)間
- {
- TF0=0; //清楚溢出標(biāo)志
- t++;
- if(t==20) //累計(jì)時(shí)間到1S
- {
- t=0;
- num++;
- }
- }
- }
-
- void display() //顯示
- {
- if(num >= 99)
- {
- //num = 0; // 數(shù)據(jù)顯示限制 最大為99
- if(TR0)
- TR0 = 0;
- }
- shi=num/10; //顯示拆分
- ge=num%10;
- P2=0X00; //顯示消影
- P0=0XFF;
- P2=0x01; //顯示第一位
- LED=tab[shi];
- delay(5);//延時(shí)
- P2=0X00; //顯示消影
- P0=0XFF;
- P2=0x02; //顯示第二位
- LED=tab[ge];
- delay(5);//延時(shí)
- }
- void delay(uchar x) //延時(shí)子程序
- {
- int i,j;
- for(i=x;i>0l;i--)
- for(j=255;j>0;j--);
- }
復(fù)制代碼
|