stc89c52电子时钟程序
时间: 2023-10-09 19:08:51 浏览: 296
以下是一个简单的STC89C52电子时钟程序,实现了显示当前时间和日期的功能:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[] = {
0xC0, // "0"
0xF9, // "1"
0xA4, // "2"
0xB0, // "3"
0x99, // "4"
0x92, // "5"
0x82, // "6"
0xF8, // "7"
0x80, // "8"
0x90, // "9"
0xFF, // 空
0xBF, // "-"
0x7F, // "_"
};
sbit SDA = P1 ^ 0;
sbit SCL = P1 ^ 1;
uchar second, minute, hour, day, month, year;
void delay(uint xms) {
uint i, j;
for (i = xms; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
void IIC_Start() {
SDA = 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
SCL = 0;
}
void IIC_Stop() {
SDA = 0;
_nop_();
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
SDA = 1;
}
void IIC_SendByte(uchar dat) {
uchar i;
for (i = 0; i < 8; i++) {
if ((dat & 0x80) == 0x80) {
SDA = 1;
} else {
SDA = 0;
}
dat <<= 1;
_nop_();
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
SCL = 0;
}
}
uchar IIC_ReadByte() {
uchar i, dat = 0;
SDA = 1;
for (i = 0; i < 8; i++) {
dat <<= 1;
SCL = 1;
_nop_();
_nop_();
_nop_();
if (SDA) {
dat |= 0x01;
}
SCL = 0;
_nop_();
_nop_();
_nop_();
}
return dat;
}
void Write_RTC(uchar addr, uchar dat) {
IIC_Start();
IIC_SendByte(0xD0);
IIC_SendByte(addr);
IIC_SendByte(dat);
IIC_Stop();
}
uchar Read_RTC(uchar addr) {
uchar dat;
IIC_Start();
IIC_SendByte(0xD0);
IIC_SendByte(addr);
IIC_Start();
IIC_SendByte(0xD1);
dat = IIC_ReadByte();
IIC_Stop();
return dat;
}
void Init_RTC() {
Write_RTC(0x0E, 0x00);
Write_RTC(0x01, 0x00);
Write_RTC(0x02, 0x00);
Write_RTC(0x03, 0x01);
Write_RTC(0x04, 0x01);
Write_RTC(0x05, 0x21);
Write_RTC(0x06, 0x01);
}
void Read_Time() {
second = Read_RTC(0x00);
minute = Read_RTC(0x01);
hour = Read_RTC(0x02);
day = Read_RTC(0x04);
month = Read_RTC(0x05);
year = Read_RTC(0x06);
}
void Display_Time() {
uchar i, j;
uchar time[8];
time[0] = hour / 10;
time[1] = hour % 10;
time[2] = minute / 10;
time[3] = minute % 10;
time[4] = second / 10;
time[5] = second % 10;
time[6] = month / 10;
time[7] = month % 10;
for (i = 0; i < 8; i++) {
P0 = table[time[i]];
for (j = 0; j < 100; j++) {
_nop_();
}
P0 = table[12];
}
}
void main() {
Init_RTC();
while (1) {
Read_Time();
Display_Time();
delay(1000);
}
}
```
该程序使用了STC89C52单片机和DS1307实时时钟芯片,通过IIC总线通信获取当前时间和日期,并且使用共阴数码管显示出来。
程序中的`table`数组定义了数字0到9、减号、下划线和空格对应的数码管段码。`IIC_Start()`、`IIC_Stop()`、`IIC_SendByte()`和`IIC_ReadByte()`函数分别实现了IIC总线的起始、停止、发送一个字节和接收一个字节的操作。`Init_RTC()`函数初始化DS1307芯片,设置初始时间为2021年1月1日0时0分0秒。`Read_Time()`函数从DS1307芯片中读取当前的时间和日期。`Display_Time()`函数将读取到的时间和日期分别转换成数字并且显示在数码管上,每个数字之间会有一个空格。程序中的`delay()`函数实现了简单的延时功能,用于控制时间的更新速度。
该程序可以通过连接到电脑的串口调试助手来观察程序的运行情况和调试错误。
阅读全文