51单片机数码管秒表计时c语言
时间: 2023-12-02 17:40:58 浏览: 196
51单片机定时器时钟c语言
5星 · 资源好评率100%
以下是51单片机数码管秒表计时的C语言代码,其中使用了定时器和中断服务函数实现秒表计时和数码管的动态显示:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; // 数码管显示0~9的编码
uchar second = 0; // 秒数
uchar minute = 0; // 分钟数
uchar hour = 0; // 小时数
void delay(uint i) // 延时函数
{
while (i--);
}
void display() // 数码管动态显示函数
{
uchar i;
for (i = 0; i < 8; i++) // 依次点亮每个数码管
{
switch (i) // 根据i的值选择要显示的数码管
{
case 0:
P2 = 0xfe; // 1111 1110,点亮第1个数码管
P0 = table[hour / 10]; // 显示小时的十位数
break;
case 1:
P2 = 0xfd; // 1111 1101,点亮第2个数码管
P0 = table[hour % 10]; // 显示小时的个位数
break;
case 2:
P2 = 0xfb; // 1111 1011,点亮第3个数码管
P0 = table[minute / 10]; // 显示分钟的十位数
break;
case 3:
P2 = 0xf7; // 1111 0111,点亮第4个数码管
P0 = table[minute % 10]; // 显示分钟的个位数
break;
case 4:
P2 = 0xef; // 1110 1111,点亮第5个数码管
P0 = table[second / 10]; // 显示秒钟的十位数
break;
case 5:
P2 = 0xdf; // 1101 1111,点亮第6个数码管
P0 = table[second % 10]; // 显示秒钟的个位数
break;
default:
break;
}
delay(100); // 延时一段时间,使数码管显示出来
P0 = 0x00; // 关闭数码管
}
}
void timer0() interrupt 1 // 定时器0中断服务函数
{
TH0 = (65536 - 50000) / 256; // 重新赋初值,定时50ms
TL0 = (65536 - 50000) % 256;
second++; // 秒数加1
if (second == 60) // 如果秒数达到60,则进位到分钟
{
second = 0;
minute++;
if (minute == 60) // 如果分钟达到60,则进位到小时
{
minute = 0;
hour++;
if (hour == 24) // 如果小时达到24,则清零
{
hour = 0;
}
}
}
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1
TH0 = (65536 - 50000) / 256; // 给定时器赋初值,定时50ms
TL0 = (65536 - 50000) % 256;
EA = 1; // 开启总中断
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
while (1)
{
display(); // 数码管动态显示
}
}
```
阅读全文