设计一个基于51单片机的秒表计时器,实现如下功能: 计时器的计时精度为百分之一秒,即0.01秒。 计时时间显示格式:hh.mm.ss.SS。其中:hh表示小时数,mm表示分钟数ss表示秒数SS表示百分秒数如“1.59.59.99”表示1小时59分59秒99分秒的代码
时间: 2023-12-10 16:38:04 浏览: 212
以下是基于51单片机的秒表计时器的代码:
```
#include <reg51.h>
#define uint unsigned int
uint tick_count = 0; // 计时器累计计数器
uint ss = 0; // 秒
uint mm = 0; // 分钟
uint hh = 0; // 小时
void delay_ms(uint x) // 延时函数,x为毫秒数
{
uint i, j;
for (i = x; i > 0; i--) {
for (j = 112; j > 0; j--);
}
}
void timer0_init() // 定时器0初始化函数
{
TMOD |= 0x01; // 设置为模式1(16位定时器)
TH0 = 0xFC; // 定时器初值为65536-10000=0xFC18
TL0 = 0x18;
ET0 = 1; // 开启定时器0中断
TR0 = 1; // 启动定时器0
}
void timer0_isr() interrupt 1 // 定时器0中断服务函数
{
TH0 = 0xFC;
TL0 = 0x18;
tick_count++; // 计时器累计计数器加1
}
void display_time() // 显示时间函数
{
uint i;
uint buf[8] = {0}; // 字符串缓存
buf[0] = hh / 10;
buf[1] = hh % 10;
buf[2] = mm / 10;
buf[3] = mm % 10;
buf[4] = ss / 10;
buf[5] = ss % 10;
buf[6] = tick_count / 10 % 10;
buf[7] = tick_count % 10;
for (i = 0; i < 8; i++) {
P0 = buf[i];
P2 &= 0x0F;
P2 |= i << 4;
delay_ms(2);
}
}
void main()
{
timer0_init();
while (1) {
if (tick_count >= 10000) { // 每10000次定时器中断为1秒
tick_count = 0;
ss++;
if (ss >= 60) {
ss = 0;
mm++;
if (mm >= 60) {
mm = 0;
hh++;
if (hh >= 24) {
hh = 0;
}
}
}
}
display_time(); // 显示时间
}
}
```
在此代码中,我们使用了定时器0来实现精确的计时。定时器0的时钟源为系统时钟12MHz,设置为模式1(16位定时器),初值为65536-10000=0xFC18,即定时10毫秒。每次定时器0中断服务函数被调用时,计时器累计计数器加1。当计时器累计计数器达到10000时,表示已经过去了1秒,此时秒数加1;当秒数达到60时,秒数清零,分钟数加1;当分钟数达到60时,分钟数清零,小时数加1;当小时数达到24时,小时数清零。
在显示时间函数中,我们将时间按照格式转换成字符串存储在缓存中,然后通过P0口输出数字,通过P2口控制数码管的位选。为了使数码管能够正常显示,我们还需要在每个位选之间加入一定的延时,这里我们使用了一个简单的延时函数```delay_ms```。
阅读全文