用51单片机写一个程序采用定时器设计一个秒表,可以通过按键启动、停止秒表工作,秒表计时范围为i四位数,通过数码管显示时间。
时间: 2023-06-09 22:05:06 浏览: 494
好的,您的问题是如何用 51 单片机写一个程序采用定时器设计一个秒表,可以通过按键启动、停止秒表工作,秒表计时范围为四位数,通过数码管显示时间。
以下是一个简单的解决方案,仅供参考:
1. 首先,需要设置定时器,用于定时器中断,并统计时间。
2. 然后,需要设置外部中断,对应于开始/停止按键。
3. 在定时器中断函数中,每次计时器中断触发时,时间加一。
4. 在外部中断函数中,按下按键开始计时,再次按下按键停止计时。
5. 在主函数中,使用数码管输出时间。
下面是大致程序框架:
```c
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit start_stop=P1^0; //开始/停止按键
sbit uart=P1^1; //串口
uint time; //计时器
uchar flag; //开始/停止标志
void init(); //初始化
void display(uint t); //显示函数
void delay_ms(uint t); //延时函数
void time_interrupt() interrupt 1 //定时器中断函数
{
TH0=0xfc; //定时器初值
TL0=0x67;
time++; //时间加一
}
void external_interrupt() interrupt 0 //外部中断函数
{
if(flag==1) //停止计时
{
flag=0;
TR0=0; //关闭定时器
}
else //开始计时
{
flag=1;
TR0=1; //开启定时器
}
}
void main()
{
init();
while(1)
{
display(time); //输出计时结果
}
}
void init()
{
TMOD=0x01; //定时器0工作方式1
TH0=0xfc; //定时器初值
TL0=0x67;
EA=1; //开启总中断
ET0=1; //开启定时器中断
EX0=1; //开启外部中断
IT0=1; //外部中断为下降沿触发
time=0; //时间初值
flag=0; //开始/停止标志
}
void display(uint t)
{
uchar i;
uchar code number[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管对应的编码
uchar digit[4]={0,0,0,0}; //四位数码管的值
digit[0]=t/1000; //千位
digit[1]=t/100%10; //百位
digit[2]=t/10%10; //十位
digit[3]=t%10; //个位
for(i=0;i<4;i++)
{
P0=number[digit[i]]; //输出段码
P2=0x0f&(0x01<<i); //选择位码
delay_ms(10); //延时
}
}
void delay_ms(uint t) //延时函数
{
uchar i,j;
while(t--)
{
for(i=0;i<26;i++)
{
for(j=0;j<27;j++)
{
_nop_();
}
}
}
}
```
阅读全文