以51单片机为开发环境写一个满足以下条件的代码,精确的0-59秒表,累加的时间间隔是精确的1s 1、做精确的0-59秒表,即是累加的时间间隔是精确的1s,用定时器实现; 2、模拟时钟显示:小时-分钟-秒,例如:12-45-35; 3、在模拟时钟的基础上增加调整按键,将初始化时间调整为,当前准确时间,按钮设置几个不限定,2个,3个或者其他都可以;
时间: 2024-03-18 20:41:22 浏览: 186
好的,以下是满足您要求的51单片机代码:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit key1 = P3^1; // 调整时间按键1
sbit key2 = P3^2; // 调整时间按键2
sbit key3 = P3^3; // 调整时间按键3
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(); // 显示时间
if (key1 == 0) { // 按键1按下,将时间调整为当前时间
time[0] = TH0 / 3600; // 小时
time[1] = (TH0 % 3600) / 60; // 分钟
time[2] = TH0 % 60; // 秒钟
while (!key1); // 等待按键释放
}
if (key2 == 0) { // 按键2按下,将时间调整为 00:00:00
time[0] = 0;
time[1] = 0;
time[2] = 0;
TH0 = 0xFC; // 重置定时器初始值
TL0 = 0x18;
while (!key2); // 等待按键释放
}
if (key3 == 0) { // 按键3按下,将时间调整为 23:59:59
time[0] = 23;
time[1] = 59;
time[2] = 59;
TH0 = 0x3C;
TL0 = 0xAF;
while (!key3); // 等待按键释放
}
}
}
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秒就会更新时间并在数码管上显示,同时增加了三个按键用于调整时间。其中,按键1用于将时间调整为当前时间,按键2用于将时间调整为 00:00:00,按键3用于将时间调整为 23:59:59。
阅读全文