51单片机双位数码管简易秒表计时器代码
时间: 2023-10-11 15:08:39 浏览: 266
由于不知道具体使用的是哪款51单片机,以下是基于STC89C52RC的双位数码管简易秒表计时器代码。
```
#include <reg52.h>
sbit D1 = P1^0; // 数码管位选控制引脚
sbit D2 = P1^1;
sbit D3 = P1^2;
sbit D4 = P1^3;
unsigned char code table[] = { // 数码管段码表
0x3f, // 0
0x06, // 1
0x5b, // 2
0x4f, // 3
0x66, // 4
0x6d, // 5
0x7d, // 6
0x07, // 7
0x7f, // 8
0x6f // 9
};
unsigned int second = 0; // 秒数计数变量
void delay(unsigned int t) { // 延时函数
unsigned int i, j;
for (i = t; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void display(unsigned char num) { // 数码管显示函数
switch (num) {
case 0: P0 = table[0]; break;
case 1: P0 = table[1]; break;
case 2: P0 = table[2]; break;
case 3: P0 = table[3]; break;
case 4: P0 = table[4]; break;
case 5: P0 = table[5]; break;
case 6: P0 = table[6]; break;
case 7: P0 = table[7]; break;
case 8: P0 = table[8]; break;
case 9: P0 = table[9]; break;
}
}
void main() {
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0x4c; // 计时1ms
TL0 = 0x00;
ET0 = 1; // 允许定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
while (1) {
D1 = 1;
display(second / 10); // 显示十位数
D1 = 0;
D2 = 1;
display(second % 10); // 显示个位数
D2 = 0;
D3 = 1;
display(second / 100); // 显示百位数(暂不使用)
D3 = 0;
D4 = 1;
display(second / 1000); // 显示千位数(暂不使用)
D4 = 0;
}
}
void timer0() interrupt 1 { // 定时器0中断服务程序
TH0 = 0x4c;
TL0 = 0x00;
second++; // 每1ms计数器加1
if (second >= 9999) { // 秒数最多计到9999秒
second = 0;
}
}
```
该代码使用定时器0中断实现1ms的计时,从而每1ms计数器加1,最终得到秒数计数变量second。在主函数中,通过数码管显示函数display()显示秒数的十位数和个位数。同时,为了方便扩展,还留有显示百位数和千位数的代码,但目前暂时不使用。
可以根据需要自行修改数码管显示的引脚控制和显示的位数。
阅读全文