AT89c51电子钟代码
时间: 2023-07-09 19:51:21 浏览: 45
以下是一个基于AT89C51的电子时钟的代码示例:
```c
#include <reg51.h>
// 定义数码管显示的端口和引脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit DIO=P2^0;
sbit SCLK=P2^1;
unsigned char code table[]={
// 数码管显示0~9的编码
// 逆序为了方便处理
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f
};
unsigned char hour=12; // 小时数
unsigned char minute=0; // 分钟数
unsigned char second=0; // 秒数
void delay(unsigned int i) {
while (i--);
}
void writeByte(unsigned char dat){
unsigned char i;
for (i=0; i<8; i++){
// 向74HC595写入一个字节
SCLK=0;
DIO=(dat&0x80)>>7;
dat<<=1;
SCLK=1;
}
}
void writeCmd(unsigned char cmd){
// 写入命令,先写入高四位,再写入低四位
LSA=0; LSB=0; LSC=0;
writeByte(table[cmd>>4]);
LSA=1; LSB=0; LSC=0;
writeByte(table[cmd&0x0f]);
}
void writeData(unsigned char dat){
// 写入数据,先写入高四位,再写入低四位
LSA=0; LSB=0; LSC=1;
writeByte(table[dat>>4]);
LSA=1; LSB=0; LSC=1;
writeByte(table[dat&0x0f]);
}
void display(unsigned char hour, unsigned char minute){
writeCmd(0x80); // 光标移到第一位
writeData(hour/10); // 显示小时的十位数
writeData(hour%10); // 显示小时的个位数
writeData(10); // 冒号
writeData(minute/10); // 显示分钟的十位数
writeData(minute%10); // 显示分钟的个位数
}
void Timer0Init(){
TMOD|=0x01; // 定时器0工作在模式1(16位自动重装载)
TH0=0xfc; // 定时器初值,用于1ms中断
TL0=0x18;
ET0=1; // 使能定时器0中断
TR0=1; // 启动定时器0
EA=1; // 全局中断使能
}
void Timer0() interrupt 1{
TH0=0xfc; // 重新赋值,用于下一次中断
TL0=0x18;
second++; // 秒数加1
if (second>=60){ // 如果秒数达到60,分钟数加1,秒数清零
second=0;
minute++;
if (minute>=60){ // 如果分钟数达到60,小时数加1,分钟数清零
minute=0;
hour++;
if (hour>=24) hour=0; // 如果小时数达到24,重置为0
}
}
}
void init(){
writeCmd(0x38); // 初始化
writeCmd(0x0c); // 开显示
writeCmd(0x06); // 光标右移
writeCmd(0x01); // 清屏
}
void main(){
Timer0Init(); // 初始化定时器0
init(); // 初始化
while (1){
display(hour,minute); // 显示时间
delay(50000); // 延时
}
}
```
这个代码和前面的AT89C52代码类似,但是使用了定时器0来实现秒数的计时。在`Timer0Init`函数中,将定时器0配置为模式1(16位自动重装载),并设置初值用于1ms中断,然后使能定时器0中断和全局中断。在`Timer0`函数中,每次定时器0中断,将秒数加1,如果秒数达到60,分钟数加1,秒数清零,如果分钟数达到60,小时数加1,分钟数清零,如果小时数达到24,重置为0。