电路图如图1所示,通过51单片机的P1作为段口,P0作为位口构成2位LED动态显示的硬件电路。P2.0、P2.1连接两个按键K0、K1分别用于调整初始时间的+1和-1,P3.0连接LED灯,P3.2连接复位按键,P3.3连接启动按键。 要求实现一倒计时秒表,启动后显示初始时间20,可以调整初始时间。调整结束后按下启动键,开始倒计时。在倒计时过程中调整初始时间按键无效。倒计时时间到,显示00,并且LED灯亮。整个过程中都可以复位,复位后显示初始时间,LED灯灭。图1 倒计时秒表的电路原理图
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg51.h>
- unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管 0-9
- sbit led=P3^0;
- sbit s1=P0^0;
- sbit s2=P0^1;
- sbit k0=P2^0;
- sbit k1=P2^1;
- int sec=0,i,a,b=20,key1;
- /*-----延迟函数-------*/
- void delay(int z)
- {
- while(z-->0);
- }
- /*-----显示函数-------*/
- void display(int n)
- {
- if(n>0)
- {
- s2=1;s1=0; //显示十位
- P1=tab[n/10]; //除10,取十位数值
- delay(100); //延迟显示
- s1=1;s2=0; //显示个位
- P1=tab[n%10]; //求余,取个位数值
- delay(100); //延迟
- }
- else
- { //当输入值小于0,显示0
- s2=1;s1=0; //显示十位
- P1=tab[0]; //除10,取十位数值
- delay(100); //延迟
- s1=1;s2=0; //显示个位
- P1=tab[0]; //求余,取个位数值
- delay(100); //延迟显示
- }
- }
- /*-----外部中断0中断服务函数----------*/
- void RESET() interrupt 0
- {
- sec=0; //恢复初始值
- b=20; //恢复初始值
- TR0=0; //关闭定时器
-
- }
- /*-----外部中断1中断服务函数----------*/
- void START() interrupt 2
- {
- TR0=1; //打开定时器
- }
- /*-----定时器T0服务函数,计时功能----------*/
- void timer0() interrupt 1
- {
- i--; //50ms时间到
- TH0=(65536-50000)/256; //存放高8位,50ms
- TL0=(65536-50000)%256; //存放低8位
- if(i==0)
- {
- i=20; //1s计数
- sec++; //软件计数1s
- }
- }
- /*------键值扫描函数----------*/
- void key()
- {
- k0=1;k1=1; //读按键
- key1=P2; //将P2的值赋值给key1
- key1=key1&0x03; //屏蔽高6位,保留k0,k1的值
- while(key1!=0x03) //判断是否有按键按下
- {
- delay(600); //消抖动
- key1=P2;
- key1=key1&0X03;
- while(key1!=0x03) //当有按键按下时
- {
- if(k0==0) b=b+1; //按下k0按键时,初始值加1
- else b=b-1; //按下k1按键时,初始值减1
- k0=1;k1=1; //判断按键是否抬起
- key1=P2; //重新将P2的值赋值给key1
- key1=key1&0x03;
- while(key1!=0x03) //判断是否有按键按下
- {
- key1=P2;
- key1=key1&0x03;
- }
- }
- }
- }
- /*------主函数----------*/
- void main()
- {
- TMOD=0X01; //设定定时器0工作,工作方式1
- TH0=(65536-50000)/256; //存放高8位,50ms
- TL0=(65536-50000)%256; //存放低8位
- IT0=1;IT1=1; //外部中断选择下降沿触发
- IE=0X87; //开启INT0,INT1,T0
- PX0=1; //设定INT0为高优先级
- led=1; //初始灯熄灭
- TR0=0; //初始计数停止
- i=2;
- while(1)
- {
- a=b-sec; //将增计时变为减计时
- if(TR0==0) //当定时器关闭时开启键值扫描
- {key();}
- display(a); //显示函数
- if(a<=0)
- {
- led=0; //当减计时为0时,报警灯点亮
- }
- else
- {
- led=1; //当减计时不为0时,报警灯熄灭
- }
- }
- }
复制代码
所有资料51hei提供下载:
单片机系统实验.rar
(41.61 KB, 下载次数: 62)
|