用keil5编程软件写出是适用于AT89C51单片机的代码:秒表系统设计:设计个2位LED数码显示秒表”,显示时间为00一99秒,每秒自动加,另设让一个“开始暂停按键”(按一次开始计时,再按一次停止计时)和一个“复位”键
时间: 2024-03-18 16:39:27 浏览: 237
好的,以下是适用于AT89C51单片机的秒表系统设计代码:
```c
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^0; // 开始暂停按键
sbit key2=P3^1; // 复位按键
sbit dula=P2^6; // 双位数码管段选
sbit wela=P2^7; // 双位数码管位选
uchar code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 数码管段码0~9
uint time=0; // 秒表计时变量,时间以1秒为单位
bit flag=0; // 秒表开始暂停标志位,0表示暂停,1表示开始
bit reset=0; // 秒表复位标志位,1表示复位
// 延时函数
void delay(uint i)
{
while(i--);
}
// 显示函数
void display(uchar num, uchar pos)
{
P0=smgduan[num];
if(pos==1)
{
dula=0;
_nop_();
_nop_();
_nop_();
dula=1;
}
else if(pos==2)
{
dula=0;
_nop_();
_nop_();
_nop_();
dula=1;
wela=0;
_nop_();
_nop_();
_nop_();
wela=1;
}
}
// 按键扫描函数
uchar keyscan()
{
if(key1==0) // 判断开始暂停按键是否按下
{
delay(1000); // 延时去抖动
if(key1==0) // 再次确认按键是否按下
{
while(!key1); // 等待按键松开
flag=~flag; // 开始暂停标志位取反
}
}
if(key2==0) // 判断复位按键是否按下
{
delay(1000); // 延时去抖动
if(key2==0) // 再次确认按键是否按下
{
while(!key2); // 等待按键松开
reset=1; // 复位标志位置1
}
}
return 0;
}
// 主函数
void main()
{
TMOD=0x01; // 定时器0工作在模式1
TH0=(65536-45872)/256; // 定时器0初值设置,定时1秒
TL0=(65536-45872)%256;
ET0=1; // 打开定时器0中断
TR0=1; // 启动定时器0
EA=1; // 打开总中断
while(1)
{
if(reset) // 判断复位标志位是否为1
{
time=0; // 复位秒表
reset=0; // 复位标志位清零
}
keyscan(); // 按键扫描
if(flag) // 判断开始暂停标志位是否为1
{
display(time%10, 1); // 显示个位数码管
display(time/10, 2); // 显示十位数码管
}
}
}
// 定时器0中断服务函数
void timer0() interrupt 1
{
TH0=(65536-45872)/256; // 定时器0初值设置,定时1秒
TL0=(65536-45872)%256;
if(flag) // 判断开始暂停标志位是否为1
{
time++; // 秒表计时变量加1
}
}
```
这个代码实现了一个2位LED数码显示秒表,显示时间为00一99秒,每秒自动加,另设让一个“开始暂停按键”(按一次开始计时,再按一次停止计时)和一个“复位”键。建议你将代码拷贝到Keil5编译软件中进行编译,再将程序下载到AT89C51单片机中进行测试。
阅读全文