单片机弄一个计时器使周期为50ms的方波切此计时器在0~59秒范围内循环计时时,每次增加一秒。当复位键有效时,该计时器清零时不再计时。当复位键无效时,当使能键有效时该计时器开始计时,当使能键无效时该计时器暂停计时且使用两位数码管动态显示计时值
时间: 2023-05-20 13:02:35 浏览: 146
以下是实现单片机计时器的代码:
```c
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit en = P3^0; // 使能键
sbit rst = P3^1; // 复位键
sbit beep = P3^2; // 蜂鸣器
sbit dula = P2^6; // 第一位数码管
sbit wela = P2^7; // 第二位数码管
uchar code table[] = { // 数码管显示表
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
uint cnt = 0; // 计时器计数器
uint t = 0; // 计时器计时值
void delay(uint x) { // 延时函数
uint i, j;
for (i = x; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display() { // 数码管显示函数
uchar shi, ge;
shi = t / 10;
ge = t % 10;
P0 = table[shi];
dula = 0;
dula = 1;
P0 = table[ge];
dula = 1;
dula = 0;
}
void timer0() interrupt 1 { // 定时器0中断函数
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
cnt++;
if (cnt == 20) { // 50ms * 20 = 1s
cnt = 0;
t++;
if (t == 60) t = 0;
display();
}
}
void main() {
TMOD = 0x01; // 定时器0工作模式1
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
EA = 1; // 总中断允许
ET0 = 1; // 定时器0中断允许
TR0 = 1; // 定时器0启动
while (1) {
if (rst == 0) { // 复位键有效
t = 0;
cnt = 0;
display();
while (rst == 0);
}
if (en == 0) { // 使能键有效
TR0 = 1; // 计时器开始计时
beep = 1; // 蜂鸣器响
} else { // 使能键无效
TR0 = 0; // 计时器暂停计时
beep = 0; // 蜂鸣器不响
}
}
}
```
这个程序使用定时器0来实现计时器功能,每50ms触发一次中断,计数器加1,当计数器累加到20时,即1s,计时值加1,同时使用两位数码管动态显示计时值。复位键有效时,计时器清零并停止计时,使能键有效时,计时器开始计时并蜂鸣器响,使能键无效时,计时器暂停计时并蜂鸣器不响。
阅读全文