用51单片机写一个秒表程序
时间: 2023-05-24 07:06:51 浏览: 205
本程序使用Keil C的软件开发工具,实现了一个基本的秒表功能。代码如下:
```
#include <reg51.h>
#define FREQ 12000000UL // 单片机频率
// 计时器溢出次数
unsigned int seconds = 0;
// 计时锁定标志位
unsigned char lock = 0;
// 计时器溢出中断处理函数
void timer0_isr() interrupt 1
{
seconds++; // 计时器溢出,增加一秒
TH0 = (65536 - (FREQ/12)) / 256; // 重新赋初值,使定时器
TL0 = (65536 - (FREQ/12)) % 256; // 模式为定时模式
}
// 设置定时器
void timer_setup()
{
TMOD = 0x01; // 定时器0,模式1
TH0 = (65536 - (FREQ/12)) / 256; // 定时器初值
TL0 = (65536 - (FREQ/12)) % 256;
TR0 = 1; // 启动定时器
ET0 = 1; // 允许定时器溢出中断
EA = 1; // 全局中断使能
}
// 清除定时器
void timer_clear()
{
TH0 = (65536 - (FREQ/12)) / 256; // 设置初值
TL0 = (65536 - (FREQ/12)) % 256;
seconds = 0; // 清除秒数
lock = 0; // 清除锁定标志位
}
// 主函数
void main()
{
timer_setup(); // 初始化定时器
while(1) // 主循环
{
if(P3_7 == 0) // 判断是否按下按钮
{
while(P3_7 == 0); // 等待按钮松开
lock = !lock; // 切换锁定标志位
}
if(lock == 0) // 锁定标志位为0,即计时未锁定状态
{
// 以下代码用于显示计时器的时间
unsigned int t = seconds % 60;
unsigned int m = (seconds / 60) % 60;
unsigned int h = seconds / 3600;
P0 = t % 10; // 显示秒的个位数
P1 = t / 10; // 显示秒的十位数
P2 = m % 10; // 显示分的个位数
P3 = m / 10; // 显示分的十位数
P4 = h % 10; // 显示时的个位数
P5 = h / 10; // 显示时的十位数
}
else // 锁定标志位为1,即计时已锁定状态
{
P0 = 0;
P1 = 0;
P2 = 0;
P3 = 0;
P4 = 0; // 显示0
P5 = 0;
if(P3_6 == 0) // 判断是否按下重置按钮
{
while(P3_6 == 0); // 等待按钮松开
timer_clear(); // 清除计时器
}
}
}
}
```
程序采用计时器中断的方式记录时间,按照秒为单位进行计时。程序中使用了六个LED灯分别表示秒、分、时的时间。程序运行时,检测到P3_7口的按键按下,则锁定计时器,再按一次则解锁计时器,当计时器锁定时,可以通过按下P3_6口的按键来清除计时器并且可以重新开始计数。
阅读全文