万年历_单片机万年历_LED1602_ds1302的代码
时间: 2023-06-14 07:08:21 浏览: 313
以下是基于单片机、LED1602和DS1302的万年历代码,你可以参考一下:
```c
#include <reg52.h> //头文件,引用51单片机的寄存器定义
sbit SCL=P3^6; //定义DS1302通信引脚
sbit SDA=P3^4;
sbit RST=P3^5;
void delay_us(unsigned char i) //延时函数,i为延时时间
{
while(i--);
}
void delay_ms(unsigned int i)
{
unsigned char j,k;
for(k=0;k<i;k++)
for(j=0;j<120;j++);
}
void ds1302_writebyte(unsigned char dat) //向DS1302写入一个字节
{
unsigned char i;
for(i=0;i<8;i++)
{
SDA=dat&0x01; //先送最低位
dat>>=1; //右移一位,将次低位变为最低位
SCL=0; //拉低时钟线
delay_us(1); //延时1us
SCL=1; //拉高时钟线
delay_us(1);
}
}
unsigned char ds1302_readbyte() //从DS1302读取一个字节
{
unsigned char i,dat=0;
for(i=0;i<8;i++)
{
dat>>=1;
SCL=0;
delay_us(1);
if(SDA) //如果数据线为高电平,dat的最高位为1
dat|=0x80;
SCL=1;
delay_us(1);
}
return dat;
}
void ds1302_write(unsigned char addr,unsigned char dat) //向DS1302写入一个字节
{
RST=0;
delay_us(2);
RST=1;
ds1302_writebyte(addr);
ds1302_writebyte(dat);
RST=0;
}
unsigned char ds1302_read(unsigned char addr) //从DS1302读取一个字节
{
unsigned char dat;
RST=0;
delay_us(2);
RST=1;
ds1302_writebyte(addr);
dat=ds1302_readbyte();
RST=0;
return dat;
}
void init_ds1302() //初始化DS1302
{
ds1302_write(0x8e,0x00); //关闭写保护
ds1302_write(0x80,0x01); //控制寄存器,禁止写保护
ds1302_write(0x81,0x00); //秒归零
ds1302_write(0x84,0x00); //日归零
ds1302_write(0x8e,0x80); //打开写保护
}
void lcd_write_cmd(unsigned char cmd) //向LCD发送指令
{
P2=cmd;
P1&=0xf8;
P1|=0x04;
delay_ms(1);
P1&=0xfb;
delay_ms(1);
}
void lcd_write_data(unsigned char dat) //向LCD发送数据
{
P2=dat;
P1&=0xf8;
P1|=0x05;
delay_ms(1);
P1&=0xfb;
delay_ms(1);
}
void lcd_init() //LCD初始化
{
lcd_write_cmd(0x38); //设置8位数据总线,2行显示,5x7点阵字符
lcd_write_cmd(0x0c); //显示器开,光标关,光标移动关
lcd_write_cmd(0x06); //字符输入时,光标右移,整屏不移
lcd_write_cmd(0x01); //清屏
}
void lcd_display(unsigned char *p) //显示字符函数
{
unsigned char i;
lcd_write_cmd(0x80);
for(i=0;i<16;i++)
{
if(*p=='\0')
break;
lcd_write_data(*p++);
}
lcd_write_cmd(0x80+0x40);
for(i=0;i<16;i++)
{
if(*p=='\0')
break;
lcd_write_data(*p++);
}
}
void main()
{
unsigned char date[17];
unsigned char year,month,day,week,hour,minute,second;
lcd_init();
init_ds1302();
while(1)
{
second=ds1302_read(0x81); //读取秒
minute=ds1302_read(0x83); //读取分
hour=ds1302_read(0x85); //读取时
week=ds1302_read(0x86); //读取星期
day=ds1302_read(0x87); //读取日
month=ds1302_read(0x88); //读取月
year=ds1302_read(0x89); //读取年
date[0]=(year/10)+'0'; //转换为字符
date[1]=(year%10)+'0';
date[2]='-';
date[3]=(month/10)+'0';
date[4]=(month%10)+'0';
date[5]='-';
date[6]=(day/10)+'0';
date[7]=(day%10)+'0';
date[8]=' ';
date[9]=(week%10)+'0';
date[10]=' ';
date[11]=(hour/10)+'0';
date[12]=(hour%10)+'0';
date[13]=':';
date[14]=(minute/10)+'0';
date[15]=(minute%10)+'0';
date[16]='\0';
lcd_display(date); //显示日期时间
}
}
```
注意:以上代码只是一个简单的示例,真实的万年历代码要根据需要进行修改和完善。
阅读全文