可预置定时时钟用c51单片机程序
时间: 2023-11-02 08:06:23 浏览: 47
以下是一个用C语言编写的可预置定时时钟程序,适用于C51单片机:
```c
#include <reg51.h>
// 定义LED灯端口
sbit LED = P1^0;
// 定义按键端口
sbit KEY1 = P3^2;
sbit KEY2 = P3^3;
sbit KEY3 = P3^4;
unsigned char count = 0; // 定时器计数器
unsigned char hour = 0; // 小时数
unsigned char minute = 0; // 分钟数
unsigned char second = 0; // 秒数
unsigned char mode = 0; // 工作模式
// 定时器0中断服务程序
void T0_ISR() interrupt 1
{
TH0 = 0xFC;
TL0 = 0x67; // 定时1ms
count++; // 计数器加1
if (count == 20) // 20次计数,1s到达
{
count = 0;
second++; // 秒数加1
if (second == 60)
{
second = 0;
minute++; // 分钟数加1
if (minute == 60)
{
minute = 0;
hour++; // 小时数加1
if (hour == 24)
{
hour = 0;
}
}
}
}
}
// 检测按键函数
void key_scan()
{
if (KEY1 == 0) // 按下KEY1,设置小时数
{
delay(10); // 延时去抖动
if (KEY1 == 0)
{
hour++;
if (hour == 24)
{
hour = 0;
}
while (!KEY1); // 等待KEY1松开
}
}
if (KEY2 == 0) // 按下KEY2,设置分钟数
{
delay(10); // 延时去抖动
if (KEY2 == 0)
{
minute++;
if (minute == 60)
{
minute = 0;
}
while (!KEY2); // 等待KEY2松开
}
}
if (KEY3 == 0) // 按下KEY3,切换工作模式
{
delay(10); // 延时去抖动
if (KEY3 == 0)
{
mode++;
if (mode == 3)
{
mode = 0;
}
while (!KEY3); // 等待KEY3松开
}
}
}
// 显示函数
void display()
{
switch (mode)
{
case 0: // 显示时间
LED = 1;
P0 = hour / 10;
delay(5);
LED = 0;
LED = 1;
P0 = hour % 10;
delay(5);
LED = 0;
LED = 1;
P0 = minute / 10;
delay(5);
LED = 0;
LED = 1;
P0 = minute % 10;
delay(5);
LED = 0;
break;
case 1: // 显示小时数
LED = 1;
P0 = hour / 10;
delay(5);
LED = 0;
LED = 1;
P0 = hour % 10;
delay(5);
LED = 0;
break;
case 2: // 显示分钟数
LED = 1;
P0 = minute / 10;
delay(5);
LED = 0;
LED = 1;
P0 = minute % 10;
delay(5);
LED = 0;
break;
}
}
// 延时函数
void delay(unsigned int i)
{
unsigned int j, k;
for (j = 0; j < i; j++)
{
for (k = 0; k < 125; k++);
}
}
// 主函数
void main()
{
TMOD = 0x01; // 定时器0工作在16位定时模式
TH0 = 0xFC;
TL0 = 0x67; // 定时1ms
ET0 = 1; // 开定时器0中断
EA = 1; // 开总中断
TR0 = 1; // 启动定时器0
while (1)
{
key_scan(); // 检测按键
display(); // 显示
}
}
```
这个程序使用了定时器0中断来实现计时功能,并且通过按键控制时钟的设置和显示模式。程序中使用了P1.0作为LED灯端口,P3.2、P3.3、P3.4作为按键端口,可以根据实际需求进行修改。