基于51单片机的定时器产生0.01S的用数码管显示的电子秒表的代码
时间: 2024-02-17 19:01:13 浏览: 81
以下是基于51单片机的定时器产生0.01S的用数码管显示的电子秒表的代码,供参考:
```
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示表
uchar cnt = 0; // 计数器,0.01秒一次
uchar second = 0; // 秒数
uchar minute = 0; // 分钟数
uchar hour = 0; // 小时数
uchar flag = 0; // 计时标志位,0表示停止计时,1表示正在计时
void delay(uint t) // 延时函数
{
uint i, j;
for (i = t; i > 0; i--)
for (j = 110; j > 0; j--);
}
void display() // 数码管显示函数
{
uchar i;
uchar code num[] = {hour / 10, hour % 10, minute / 10, minute % 10, second / 10, second % 10}; // 将时间转换为显示格式
for (i = 0; i < 6; i++) // 数码管扫描循环
{
P2 = 0x7f; // 关闭所有数码管
P0 = table[num[i]]; // 设置当前数码管的显示值
P2 = ~(1 << i); // 打开当前数码管
delay(1); // 延时一段时间,以保证显示稳定
}
}
void timer0() interrupt 1 // 定时器0中断服务程序,每10ms执行一次
{
TH0 = 0xff; // 重新设置定时器初值
TL0 = 0x9c;
cnt++; // 计数器加1
if (cnt >= 100) // 1秒钟到达
{
cnt = 0; // 计数器清零
if (flag) // 如果正在计时
{
second++; // 秒数加1
if (second >= 60) // 分钟数到达
{
second = 0; // 秒数清零
minute++; // 分钟数加1
if (minute >= 60) // 小时数到达
{
minute = 0; // 分钟数清零
hour++; // 小时数加1
if (hour >= 24) // 超过一天,从头开始计时
{
hour = 0; // 小时数清零
}
}
}
}
}
}
void main()
{
TMOD = 0x01; // 定时器0工作在模式1(16位定时器)下
TH0 = 0xff; // 定时器初值为65536-1000=64536(10ms)
TL0 = 0x9c;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
P2 = 0x7f; // 初始化数码管
P0 = 0x00;
while (1)
{
display(); // 数码管显示
if (P1 == 0xfe) // 如果P1.0被按下
{
flag = 1; // 开始计时
}
if (P1 == 0xfd) // 如果P1.1被按下
{
flag = 0; // 停止计时
}
if (P1 == 0xfb) // 如果P1.2被按下
{
flag = 0; // 停止计时
hour = 0; // 小时数清零
minute = 0; // 分钟数清零
second = 0; // 秒数清零
}
}
}
```
在上述代码中,使用了定时器0来产生10ms的中断,通过计数器实现0.01秒的计时。在中断服务程序中,更新计时器计数值,并将计数值转换为数码管显示格式。在主函数中,初始化数码管,启动定时器,并进入循环等待状态。在循环中不断检测是否有按键按下,若有按键按下,则相应地执行相应的操作,如开始计时、暂停计时、复位计时等。在数码管显示时,通过数码管的扫描方式和显示格式,保证显示正确。
阅读全文