秒表题目要求:
应用AT89C51的定时器设计一个2位的LED数码显示作为“秒表”:显示时间为00~99s,每秒自动加1,设计一个“开始”键,按下“开始”键秒表开始计时。设计一个“复位”键,按下“复位”键后,秒表从0开始计时。
上电系统默认显示00
2.按下开始键,秒表计数开始
3.秒表到达99
4.按下复位从0开始
单片机源程序如下:
- #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 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;
- }
-
- }
- }
- 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 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 delay(uchar x) //延时子程序
- {
- int i,j;
- for(i=x;i>0l;i--)
- for(j=255;j>0;j--);
- }
复制代码
全部资料51hei下载地址:
0到99秒表数码管显示.rar
(265.93 KB, 下载次数: 367)
|