各位前辈们,你们好!我是一个初学单片机的新手,我需要完成一个项目,但是遇到了一些问题,所以想请教一下前辈们。
如下:
用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;
- }
-
- }
- }
复制代码
|