以51单片机为开发环境写一个满足以下条件的代码精确的0-59秒表,累加的时间间隔是精确的1s 模拟时钟显示:小时-分钟-秒,例如:12-45-35;
时间: 2024-03-18 19:41:27 浏览: 89
00~59的秒表_manufacturingnbc_00到59秒表功能_数码管00-59_数码管0-59_秒表;51单片机;C语
5星 · 资源好评率100%
好的,以下是满足您要求的51单片机代码:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code ledCode[] = { // 数码管编码表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
uchar time[3] = {0, 0, 0}; // 初始化时间为 00:00:00
uchar flag = 0; // 定时器标志位
void displayTime(); // 显示时间函数
void delay(uint n); // 延时函数
void main() {
TMOD = 0x01; // 设置定时器0为模式1
TH0 = 0xFC; // 初始值设为 65536-50000
TL0 = 0x18;
TR0 = 1; // 启动定时器
ET0 = 1; // 允许定时器0中断
EA = 1; // 全局中断允许
while (1) {
displayTime(); // 显示时间
}
}
void displayTime() {
uchar i;
uchar digit[3] = {0, 0, 0};
if (flag) { // 定时器标志位为1,表示1s到了
flag = 0; // 清零定时器标志位
time[2]++; // 秒钟加1
if (time[2] == 60) { // 秒钟满60,进位
time[2] = 0;
time[1]++;
if (time[1] == 60) { // 分钟满60,进位
time[1] = 0;
time[0]++;
if (time[0] == 24) { // 小时满24,清零
time[0] = 0;
}
}
}
}
digit[0] = time[0] / 10; // 小时十位
digit[1] = time[0] % 10; // 小时个位
digit[2] = time[1] / 10; // 分钟十位
for (i = 0; i < 3; i++) { // 分钟、秒钟十位和个位
digit[3 + i] = time[1 + i] % 10;
}
for (i = 0; i < 4; i++) { // 依次点亮数码管的四个位
P2 = 0x08 >> i; // 选择某一位数码管
P0 = ledCode[digit[i]]; // 显示该位数码
delay(2); // 延时一段时间,防止闪烁
P0 = 0x00; // 关闭该位数码
}
}
void delay(uint n) {
uint i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < 125; j++);
}
}
void timer0() interrupt 1 {
TH0 = 0xFC; // 重置定时器初始值
TL0 = 0x18;
flag = 1; // 定时器标志位置1
}
```
该代码使用定时器0实现了精确的0-59秒表,并且每间隔1秒就会更新时间并在数码管上显示,同时模拟显示了时钟,格式为 小时-分钟-秒,例如:12-45-35。
阅读全文