写一份关于51单片机的实时时钟显示年月日周时分秒c++程序
时间: 2024-03-13 09:48:02 浏览: 59
好的,下面是一份基于51单片机的实时时钟显示年月日周时分秒的C++程序:
```c++
#include <reg51.h>
#include <intrins.h> //包含_nop_()函数,用于延时
#define uchar unsigned char
#define uint unsigned int
uchar code wday[] = {"Sun Mon Tue Wed Thu Fri Sat"}; //星期数组
uchar code mon_table[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; //月份天数
uchar year = 2021; //初始年份为2021年
uchar month = 1; //初始月份为1月
uchar day = 1; //初始日期为1日
uchar hour = 0; //初始小时为0时
uchar minute = 0; //初始分钟为0分
uchar second = 0; //初始秒钟为0秒
void delay(uint i)
{
while(i--);
}
void write_com(uchar com)
{
P0 = com;
RS = 0;
RW = 0;
EN = 1;
delay(1);
EN = 0;
}
void write_data(uchar dat)
{
P0 = dat;
RS = 1;
RW = 0;
EN = 1;
delay(1);
EN = 0;
}
void init()
{
write_com(0x38); //16*2显示,5*7点阵,8位数据
write_com(0x0c); //开显示不显示光标
write_com(0x06); //字符不动,地址自动加1
write_com(0x01); //清屏
}
void init_time() //初始化时钟
{
uchar i;
for(i=0;i<20;i++) //20次循环,每次循环1s,共20s
{
write_com(0x80); //地址指向第一行第一个字符
write_data('T');
write_data('i');
write_data('m');
write_data('e');
write_com(0x8f); //地址指向第二行最后一个字符
write_data(i/10+0x30); //取十位数
write_data(i%10+0x30); //取个位数
delay(1000); //延时1s
}
}
void init_ds1302() //初始化DS1302时钟芯片
{
uchar i;
CE = 0;
CLK = 0;
DSIO = 0;
CLK = 1;
for(i=0;i<8;i++)
{
CLK = 0;
_nop_();
_nop_();
CLK = 1;
}
}
void write_ds1302_byte(uchar dat) //向DS1302写入一个字节
{
uchar i;
for(i=0;i<8;i++)
{
DSIO = dat & 0x01;
dat >>= 1;
CLK = 0;
_nop_();
_nop_();
CLK = 1;
}
}
void write_ds1302(uchar addr,uchar dat) //向DS1302写入一个寄存器
{
CE = 0;
CLK = 0;
CE = 1;
_nop_();
write_ds1302_byte(addr);
write_ds1302_byte(dat);
CE = 0;
}
uchar read_ds1302(uchar addr) //从DS1302读取一个寄存器
{
uchar i,dat = 0;
CE = 0;
CLK = 0;
CE = 1;
_nop_();
write_ds1302_byte(addr|0x01);
for(i=0;i<8;i++)
{
dat >>= 1;
if(DSIO)
{
dat |= 0x80;
}
CLK = 0;
_nop_();
_nop_();
CLK = 1;
}
CE = 0;
return dat;
}
void set_time() //设置时间
{
uchar temp;
year = 2021; //初始年份为2021年
month = 1; //初始月份为1月
day = 1; //初始日期为1日
hour = 0; //初始小时为0时
minute = 0; //初始分钟为0分
second = 0; //初始秒钟为0秒
write_ds1302(0x8e,0x00); //禁止写保护
write_ds1302(0x80,0x00); //关闭时钟计数
write_ds1302(0x8e,0x80); //使能写保护
write_ds1302(0x8e,0x00); //禁止写保护
write_ds1302(0x80,0x80); //打开时钟计数
write_ds1302(0x8e,0x80); //使能写保护
}
void get_time() //获取时间
{
uchar temp;
year = read_ds1302(0x8d); //读取年份
month = read_ds1302(0x89); //读取月份
day = read_ds1302(0x87); //读取日期
hour = read_ds1302(0x85); //读取小时
minute = read_ds1302(0x83); //读取分钟
second = read_ds1302(0x81); //读取秒钟
temp = read_ds1302(0x86); //读取星期
write_com(0xcf);
write_data(wday[temp*4]);
write_data(wday[temp*4+1]);
write_data(wday[temp*4+2]);
write_data(wday[temp*4+3]);
}
void display_time() //显示时间
{
write_com(0x80); //地址指向第一行第一个字符
write_data(year/1000+0x30); //取千位数
write_data(year%1000/100+0x30); //取百位数
write_data(year%100/10+0x30); //取十位数
write_data(year%10+0x30); //取个位数
write_data('/');
write_data(month/10+0x30); //取十位数
write_data(month%10+0x30); //取个位数
write_data('/');
write_data(day/10+0x30); //取十位数
write_data(day%10+0x30); //取个位数
write_data(' ');
write_data(' ');
write_data(' ');
write_com(0x87); //地址指向第二行第八个字符
write_data(hour/10+0x30); //取十位数
write_data(hour%10+0x30); //取个位数
write_data(':');
write_data(minute/10+0x30); //取十位数
write_data(minute%10+0x30); //取个位数
write_data(':');
write_data(second/10+0x30); //取十位数
write_data(second%10+0x30); //取个位数
}
void main()
{
init(); //初始化LCD
init_time(); //显示欢迎信息
init_ds1302(); //初始化DS1302时钟芯片
set_time(); //设置时间
while(1)
{
get_time(); //获取时间
display_time(); //显示时间
delay(1000); //延时1s
}
}
```
需要注意的是,这份程序中使用了DS1302时钟芯片,需要先将其接好并初始化。同时,需要连接LCD显示屏,并在程序中正确设置引脚。
阅读全文