采用外部中断控制定时器,用两位数数码管显示60计时代码
时间: 2023-06-16 08:07:46 浏览: 174
这是一个基于单片机的计时器应用程序,使用外部中断控制定时器,并使用两个数码管显示计时值。以下是代码:
```c
#include <reg52.h>
sbit key = P3^2; // 外部中断键
sbit sda = P2^0; // I2C总线数据线
sbit scl = P2^1; // I2C总线时钟线
sbit D1 = P1^2; // 数码管1
sbit D2 = P1^3; // 数码管2
unsigned char second = 0; // 秒数
unsigned char minute = 0; // 分钟数
unsigned char flag = 0; // 标志位
void delay(int i) // 延时函数
{
int j, k;
for(j = 0; j < i; j++)
for(k = 0; k < 110; k++);
}
void display(unsigned char num) // 数码管显示函数
{
switch(num)
{
case 0: P0 = 0x3f; break;
case 1: P0 = 0x06; break;
case 2: P0 = 0x5b; break;
case 3: P0 = 0x4f; break;
case 4: P0 = 0x66; break;
case 5: P0 = 0x6d; break;
case 6: P0 = 0x7d; break;
case 7: P0 = 0x07; break;
case 8: P0 = 0x7f; break;
case 9: P0 = 0x6f; break;
default: break;
}
}
void timer0() interrupt 1 // 定时器0中断函数
{
TH0 = (65536 - 50000) / 256; // 重新赋值定时器高8位
TL0 = (65536 - 50000) % 256; // 重新赋值定时器低8位
flag = 1; // 设置标志位
}
void main()
{
EA = 1; // 打开总中断
ET0 = 1; // 打开定时器0中断
TMOD = 0x01; // 设置定时器0为模式1
TH0 = (65536 - 50000) / 256; // 初始化定时器高8位
TL0 = (65536 - 50000) % 256; // 初始化定时器低8位
TR0 = 1; // 启动定时器0
while(1)
{
if(flag == 1) // 如果标志位被设置
{
second++; // 秒数加1
if(second == 60) // 如果秒数达到60
{
second = 0; // 秒数清零
minute++; // 分钟数加1
}
if(minute == 60) // 如果分钟数达到60
{
minute = 0; // 分钟数清零
}
flag = 0; // 标志位清零
}
if(key == 0) // 如果外部中断键被按下
{
delay(10); // 延时去抖
if(key == 0) // 再次检测键是否被按下
{
while(key == 0); // 等待键松开
delay(10); // 延时去抖
if(key == 1) // 检测键是否松开
{
display(minute / 10); // 显示十位分钟数
D1 = 1; // 打开数码管1显示
D2 = 0; // 关闭数码管2显示
delay(5); // 短暂延时
display(minute % 10); // 显示个位分钟数
D1 = 0; // 关闭数码管1显示
D2 = 1; // 打开数码管2显示
delay(5); // 短暂延时
display(second / 10); // 显示十位秒数
D1 = 1; // 打开数码管1显示
D2 = 0; // 关闭数码管2显示
delay(5); // 短暂延时
display(second % 10); // 显示个位秒数
D1 = 0; // 关闭数码管1显示
D2 = 1; // 打开数码管2显示
}
}
}
}
}
```
注意:此代码仅供参考,具体实现要根据实际硬件环境进行调整。
阅读全文