|
各位前輩們,你們好!我是一個(gè)初學(xué)單片機(jī)的新手,我需要完成一個(gè)項(xiàng)目,但是遇到了一些問題,所以想請教一下前輩們。
如下:
用AT89C51單片機(jī)設(shè)計(jì)一個(gè)2位的 LED 數(shù)碼顯示作為“秒表”:顯示時(shí)間為00-99秒,每秒自動(dòng)加1,另設(shè)計(jì)一個(gè)“開始”鍵和一個(gè)“復(fù)位”鍵,一個(gè)“設(shè)置”按鍵,一個(gè)蜂鳴器。
要求:
(1)具備計(jì)時(shí)功能,每秒自動(dòng)加一,實(shí)現(xiàn)00-99秒顯示。
(2)按下復(fù)位鍵后,時(shí)間清零。
(3)按下設(shè)置按鍵后,可以通過開始鍵和復(fù)位鍵對定時(shí)時(shí)間的十位和個(gè)位進(jìn)行加減設(shè)置,當(dāng)?shù)竭_(dá)定時(shí)時(shí)間時(shí),蜂鳴器滴答報(bào)警。
我想請教的問題是:要求中的第(3)小問,要怎么樣才能實(shí)現(xiàn)呢?希望能得到前輩們的幫助,謝謝!
1.png (43.72 KB, 下載次數(shù): 28)
下載附件
2022-5-9 21:53 上傳
代碼如下:
- #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;//復(fù)位
- void delay(uchar x) //延時(shí)子程序
- {
- int i,j;
- for(i=x;i>0l;i--)
- for(j=255;j>0;j--);
- }
- 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 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 main()
- {
- init();
- while(1)
- {
- timer0();
- display();
- if(KEY1 == 0)//開始
- {
- if(TR0 == 0)
- {
- t = 0;
- num = 0;
- TR0=1;
- }
- }
- else if(KEY2 == 0)//復(fù)位
- {
- TR0 = 0;
- TF0 = 0;
- t = 0;
- num = 0;
- TR0=1;
- }
-
- }
- }
復(fù)制代碼
|
|