万年历单片机c语言,c51单片机万年历的c程序
时间: 2023-10-09 07:11:13 浏览: 153
以下是一个基于C51单片机的万年历程序,其中使用了DS1302实时时钟芯片。请注意,这只是一个简单的代码示例,实际的实现可能需要根据具体的硬件和需求进行调整。
```c
#include<reg52.h> //单片机头文件
#include"ds1302.h" //DS1302驱动头文件
#define uint unsigned int //定义无符号整型
#define uchar unsigned char //定义无符号字符型
uchar code NUM[12][8]={{0,0,0,0,0,0,1,1}, //数字0的点阵
{0,0,1,1,1,1,1,1}, //数字1的点阵
{0,0,0,1,0,0,0,1}, //数字2的点阵
{0,0,0,1,0,0,1,1}, //数字3的点阵
{0,0,1,1,0,0,1,1}, //数字4的点阵
{0,0,1,0,0,0,1,1}, //数字5的点阵
{0,0,1,0,0,0,0,1}, //数字6的点阵
{0,0,0,1,1,0,1,1}, //数字7的点阵
{0,0,0,0,0,0,0,1}, //数字8的点阵
{0,0,0,0,0,0,1,1}, //数字9的点阵
{0,0,0,1,1,1,1,1}, //数字10的点阵
{0,0,1,1,1,1,1,0}};//数字11的点阵
uchar code WEEK[7][8]={{0,1,0,0,0,0,0,0}, //星期一的点阵
{0,1,0,0,0,0,0,1}, //星期二的点阵
{0,1,0,0,0,0,1,0}, //星期三的点阵
{0,1,0,0,0,0,1,1}, //星期四的点阵
{0,1,0,0,0,1,0,0}, //星期五的点阵
{0,1,0,0,0,1,0,1}, //星期六的点阵
{0,1,0,0,0,1,1,0}};//星期日的点阵
uchar year,month,day,hour,minute,second,week; //定义年、月、日、时、分、秒、星期变量
void delay(uint xms) //延时函数,延时x毫秒
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void write_8(uchar dat,uchar y) //写一个8位数码管的数据
{
uchar i;
P2=y;
for(i=0;i<8;i++)
{
P0=NUM[dat][i];
delay(1); //延时1毫秒
P0=0x00;
}
}
void write_date() //写日期
{
write_8(year/10,0x08); //写年的十位数
write_8(year%10,0x04); //写年的个位数
write_8(11,0x02); //写“-”
write_8(month/10,0x01); //写月的十位数
write_8(month%10,0x00); //写月的个位数
write_8(11,0x02); //写“-”
write_8(day/10,0x0c); //写日的十位数
write_8(day%10,0x0e); //写日的个位数
}
void write_time() //写时间
{
write_8(hour/10,0x08); //写时的十位数
write_8(hour%10,0x04); //写时的个位数
write_8(10,0x02); //写“:”
write_8(minute/10,0x01); //写分的十位数
write_8(minute%10,0x00); //写分的个位数
write_8(10,0x02); //写“:”
write_8(second/10,0x0c); //写秒的十位数
write_8(second%10,0x0e); //写秒的个位数
}
void write_week() //写星期
{
write_8(10,0x06); //写“星期”
write_8(WEEK[week][0],0x0d); //写星期的第一个字符
write_8(WEEK[week][1],0x0e); //写星期的第二个字符
}
void main()
{
ds_init(); //DS1302初始化
while(1)
{
year=ds_get(6); //读取年
month=ds_get(4); //读取月
day=ds_get(3); //读取日
week=ds_get(2); //读取星期
hour=ds_get(0); //读取时
minute=ds_get(1); //读取分
second=ds_get(2); //读取秒
write_date(); //写日期
write_time(); //写时间
write_week(); //写星期
delay(500); //延时500毫秒
}
}
```
需要注意的是,上述代码中使用了一个名为“ds1302.h”的头文件,其中包含了DS1302实时时钟芯片的驱动程序。以下是该头文件的示例代码:
```c
#ifndef _DS1302_H_
#define _DS1302_H_
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS1302_SCLK=P3^5;
sbit DS1302_IO=P3^4;
sbit DS1302_RST=P3^3;
void ds_writebyte(uchar dat) //向DS1302写入一个字节的数据
{
uchar i;
for(i=0;i<8;i++)
{
DS1302_SCLK=0;
if(dat&0x01)
DS1302_IO=1;
else
DS1302_IO=0;
dat>>=1;
DS1302_SCLK=1;
}
}
uchar ds_readbyte() //从DS1302读取一个字节的数据
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
dat>>=1;
if(DS1302_IO)
dat|=0x80;
DS1302_SCLK=0;
DS1302_SCLK=1;
}
return dat;
}
void ds_init() //DS1302初始化
{
DS1302_RST=0;
ds_writebyte(0x8e); //写入控制命令
ds_writebyte(0x00); //禁止写保护
DS1302_RST=1;
}
void ds_set(uchar reg,uchar dat) //向DS1302写入一个寄存器的数据
{
DS1302_RST=0;
ds_writebyte(reg|0x80); //写入寄存器地址
ds_writebyte(dat); //写入寄存器数据
DS1302_RST=1;
}
uchar ds_get(uchar reg) //从DS1302读取一个寄存器的数据
{
uchar dat;
DS1302_RST=0;
ds_writebyte(reg); //写入寄存器地址
dat=ds_readbyte(); //读取寄存器数据
DS1302_RST=1;
return dat;
}
#endif
```
请注意,在使用上述代码前,需要根据具体的硬件连接情况进行调整。同时,该代码只是一个简单的示例,实际使用时还需要考虑更多的因素,如时区、夏令时等。
阅读全文