各位前輩們,你們好!我是一個初學單片機的新手,我需要完成一個項目,但是遇到了一些問題,所以想請教一下前輩們。
如下:
用AT89C51單片機設計一個2位的 LED 數碼顯示作為“秒表”:顯示時間為00-99秒,每秒自動加1,另設計一個“開始”鍵和一個“復位”鍵,一個“設置”按鍵,一個蜂鳴器。
要求:
(1)具備計時功能,每秒自動加一,實現00-99秒顯示。
(2)按下復位鍵后,時間清零。
(3)按下設置按鍵后,可以通過開始鍵和復位鍵對定時時間的十位和個位進行加減設置,當到達定時時間時,蜂鳴器滴答報警。
我想請教的問題是:要求中的第(3)小問,要怎么樣才能實現呢?希望能得到前輩們的幫助,謝謝!
代碼如下:
- #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};
- uchar num,t,shi,ge;
- void init();
- void timer0();
- void display();
- void delay(uchar);
- sbit KEY1 = P3^6;//開始
- sbit KEY2 = P3^7;//復位
- void delay(uchar x) //延時子程序
- {
- int i,j;
- for(i=x;i>0l;i--)
- for(j=255;j>0;j--);
- }
- void display() //顯示
- {
- if(num >= 99)
- {
- //num = 0; // 數據顯示限制 最大為99
- if(TR0)
- TR0 = 0;
- }
- shi=num/10; //顯示拆分
- ge=num%10;
- P2=0X00; //顯示消影
- P0=0XFF;
- P2=0x01; //顯示第一位
- LED=tab[shi];
- delay(5);//延時
- P2=0X00; //顯示消影
- P0=0XFF;
- P2=0x02; //顯示第二位
- LED=tab[ge];
- delay(5);//延時
- }
- void init()//定時器初始化部分
- {
- num=t=0; //清楚數據
- TMOD=0x01; //定時器初始化
- TH0=(65536-15536)/256;//定時器賦初值 定時50ms
- TL0=(65536-15536)%256;
- EA=1;
- ET0=1;
- }
- void timer0()
- {
- if(TF0==1) //查詢溢出的時間
- {
- TF0=0; //清楚溢出標志
- t++;
- if(t==20) //累計時間到1S
- {
- t=0;
- num++;
- }
- }
- }
- void main()
- {
- init();
- while(1)
- {
- timer0();
- display();
- if(KEY1 == 0)//開始
- {
- if(TR0 == 0)
- {
- t = 0;
- num = 0;
- TR0=1;
- }
- }
- else if(KEY2 == 0)//復位
- {
- TR0 = 0;
- TF0 = 0;
- t = 0;
- num = 0;
- TR0=1;
- }
-
- }
- }
復制代碼
|