51单片机CL3641AH实时显示时间代码
时间: 2023-07-02 11:23:20 浏览: 136
以下是基于51单片机CL3641AH的实时显示时间代码,供参考:
```
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK=P3^4; //时钟引脚
sbit DIO=P3^5; //数据引脚
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管显示表
void delay(uint z) //延时函数,z为延时时间
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=110;y>0;y--);
}
}
void write_byte(uchar dat) //写入一个字节的数据
{
uchar i;
for(i=0;i<8;i++)
{
CLK=0;
DIO=dat&0x01;
dat>>=1;
CLK=1;
}
}
void write_address(uchar addr) //写入地址
{
CLK=0;
DIO=1;
CLK=1;
CLK=0;
DIO=1;
CLK=1;
CLK=0;
DIO=0;
CLK=1;
write_byte(addr);
CLK=0;
DIO=1;
CLK=1;
}
void init_ds1302(void) //初始化DS1302时钟芯片
{
uchar i;
write_address(0x8e); //写保护
write_byte(0x00);
write_address(0x90); //关闭写保护
write_byte(0x00);
for(i=0;i<8;i++)
{
write_address(0x80|i); //写入时钟芯片寄存器
write_byte(0x00);
}
}
void write_ds1302(uchar addr,uchar dat) //写入时钟芯片数据
{
write_address(0x8e); //写保护
write_byte(0x00);
write_address(addr);
write_byte(dat);
write_address(0x80); //关闭写保护
write_byte(0x00);
}
uchar read_ds1302(uchar addr) //读取时钟芯片数据
{
uchar i,dat;
write_address(0x8e); //写保护
write_byte(0x00);
write_address(addr);
for(i=0;i<8;i++)
{
CLK=0;
dat|=((uchar)DIO<<i);
CLK=1;
}
write_address(0x80); //关闭写保护
write_byte(0x00);
return dat;
}
void display_time(void) //显示时间
{
uchar i;
uchar time[8]={0};
for(i=0;i<7;i++)
{
time[i]=read_ds1302(0x81+i); //读取时钟芯片时间数据
}
write_address(0xc0); //设置显示地址
write_byte(table[time[1]&0x0f]); //显示十位小时
write_byte(table[time[1]>>4]); //显示个位小时
write_byte(0x40); //显示冒号
write_byte(table[time[2]&0x0f]); //显示十位分钟
write_byte(table[time[2]>>4]); //显示个位分钟
}
void main(void)
{
init_ds1302(); //初始化DS1302时钟芯片
while(1)
{
display_time(); //显示时间
delay(100); //延时100ms
}
}
```
该代码使用了DS1302时钟芯片来获取时间数据,使用了数码管显示表进行数码管的显示。具体实现过程中需要连接电路、编写相应的函数来控制DS1302时钟芯片和数码管的显示。