用c语言编写51单片机可调节时钟
时间: 2023-11-30 12:02:21 浏览: 66
万年历_单片机万年历_C语言_万年历hex代码_51单片机_
好的,下面是一个简单的用C语言编写的可调节时钟程序,基于51单片机:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
uchar led[8]; // led数码管显示的值
uchar cnt = 0; // 计时器计数值
void delay(uint n) // 延时函数
{
uint i, j;
for (i = n; i > 0; i--)
for (j = 110; j > 0; j--);
}
void main()
{
TMOD = 0x01; // 设置计时器0为模式1
TH0 = 0xFC; // 定时50ms
TL0 = 0x18;
TR0 = 1; // 开始计时
ET0 = 1; // 打开计时器0中断
EA = 1; // 打开总中断
while (1)
{
uchar i;
for (i = 0; i < 8; i++) // 显示数码管
{
P0 = 0x00; // 关闭所有数码管
P1 = ~(1 << i); // 打开对应的数码管
P0 = table[led[i]]; // 显示对应的数值
delay(1); // 延时1ms
}
}
}
void timer0() interrupt 1 // 计时器0中断服务函数
{
TH0 = 0xFC; // 定时50ms
TL0 = 0x18;
cnt++;
if (cnt >= 20) // 1秒钟
{
cnt = 0;
led[0]++; // 秒加1
if (led[0] >= 10)
{
led[0] = 0;
led[1]++; // 分钟加1
if (led[1] >= 6)
{
led[1] = 0;
led[2]++; // 小时加1
if (led[2] >= 10)
{
led[2] = 0;
}
}
}
}
}
```
这个程序使用了定时器0来进行计时,每50ms触发一次中断服务函数,在中断服务函数中实现时间的计算和LED数码管的显示。其中,使用了一个led数组来存储需要显示的数值,每秒钟led[0]加1,如果led[0]大于等于10,则led[0]归零,led[1]加1,以此类推。在显示时,通过循环控制每个数码管的显示,对应的数值通过查表得到。
阅读全文