本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
/****************************************************************************
*
* 程序名称:DS1302时钟芯片的运用
*
* 作者: 王新
*
* QQ : 327289421
*
* DS1302的操作步:(1)向DS1302写一个字节的内容
* (2)从DS1302当前设定的地址读取一个字节的内容
* (3)从DS1302指定的地址写入一个字节的内容
* (4)从DS1302指定的地址读出一个字节的内容
* (5)初始化写入DS1302时钟寄存器的值(主程序中只需调用一次即可)
* (6)读取时间数据,并保存在结构体中
* (7)
*
*
****************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void init(); //初始化
void delay(uint z);//延时
void lcd_write_com(uchar lcd_com);// 液晶写命令
void lcd_write_data(uchar lcd_data);//液晶写数据
void Write_Ds1302_Byte(unsigned char temp) ;//ds1302写数据
void Write_Ds1302( unsigned char address,unsigned char dat );//往ds1302固定地址写数据
unsigned char Read_Ds1302 ( unsigned char address );//读取ds1302固定地址的数据
void write_add_data(uchar add,uchar date); //往液晶的固定地址写数据
void Set_ds1302(void); //ds1302初始化设置
sbit ds1302_sclk=P2^4;
sbit ds1302_io=P2^5;
sbit ds1302_rst=P2^3;
sbit lcd_rs=P2^0;
sbit lcd_rw=P2^1;
sbit lcd_en=P2^2;
uchar code table1[]="2009/11/21";
uchar code table2[]="11:35:59";
uchar code ds1302_init[]={0x3a,0x3b,0x17,0x1e,0x06,0x03,0x09};
void lcd_write_com(uchar lcd_com)//液晶写命令
{
lcd_rs=0;
lcd_rw=0;
P0=lcd_com;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
void lcd_write_data(uchar lcd_data)//液晶写数据
{
lcd_rs=1;
lcd_rw=0;
P0=lcd_data;
delay(5);
lcd_en=1;
delay(5);
lcd_en=0;
}
void init()//初始化
{
uchar i,b;
lcd_write_com(0x01); //清屏
lcd_write_com(0x06);//输入方式设置
lcd_write_com(0x0c);//显示开关设置
lcd_write_com(0x3f);//功能设置
lcd_write_com(0x80+3);//开始地址设置
for (i=0;i<10;i++)
{
lcd_write_data(table1);
}
lcd_write_com(0x80+0X40+4);//开始地址设置
for (b=0;b<8;b++)
{
lcd_write_data(table2);
}
}
void delay(uint z)
{
uint x,y;
for (x=z;x>0;x--)
for (y=125;y>0;y--);
}
void write_add_data(uchar add,uchar date) //往液晶的固定地址写数据
{
lcd_write_com(0x80+add);//地址开始
lcd_write_data(0x30+date);//写数据
}
void main()
{
uchar a1,a2,b1,b2,c1,c2;
uchar d1,d2,e1,e2,f1,f2;
init();
Set_ds1302();
while(1)
{
a1=Read_Ds1302(0x81)/16; //miao
a2=Read_Ds1302(0x81)&0x0f;
b1=Read_Ds1302(0x83)/16; //fen
b2=Read_Ds1302(0x83)&0x0f;
c1=Read_Ds1302(0x85)/16; //shi
c2=Read_Ds1302(0x85)&0x0f;
d1=Read_Ds1302(0x87)/16; //ri
d2=Read_Ds1302(0x87)&0x0f;
e1=Read_Ds1302(0x89)/16; //yue
e2=Read_Ds1302(0x89)&0x0f;
f1=Read_Ds1302(0x8d)/16; //nian
f2=Read_Ds1302(0x8d)&0x0f;
write_add_data(12,d2);// ri
write_add_data(11,d1);
write_add_data(9,e2); // yue
write_add_data(8,e1);
write_add_data(6,f2);// nian
write_add_data(5,f1);
write_add_data(0x40+11,a2);// miao
write_add_data(0x40+10,a1);
write_add_data(0x40+8,b2); // fen
write_add_data(0x40+7,b1);
write_add_data(0x40+5,c2);// shi
write_add_data(0x40+4,c1);
}
}
void Write_Ds1302_Byte(unsigned char temp) //向DS1302写一个字节的内容
{
unsigned char i;
for (i=0;i<8;i++) //循环8次 写入数据
{
ds1302_sclk=0;
ds1302_io=temp&0x01; //每次传输低字节
temp>>=1; //右移一位
ds1302_sclk=1;
}
}
/****************************************************************************/
void Write_Ds1302( unsigned char address,unsigned char dat )
{
ds1302_rst=0;
delay(5);// _nop_();
ds1302_sclk=0;
delay(5);// _nop_();
ds1302_rst=1;
delay(5);// _nop_(); //启动
Write_Ds1302_Byte(address); //发送地址
delay(5);// _nop_();
Write_Ds1302_Byte(dat); //发送数据
ds1302_rst=0; //恢复
}
/****************************************************************************/
unsigned char Read_Ds1302( unsigned char address ) // 从DS1302当前设定的地址读、写 取一个字节的内容//
{
unsigned char i,temp=0x00;
ds1302_rst=0;
delay(5);// _nop_();
ds1302_sclk=0;
delay(5);// _nop_();
ds1302_rst=1;
delay(5);// _nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++) //循环8次 读取数据
{
if(ds1302_io)
temp|=0x80; //每次传输低字节
ds1302_sclk=0;
temp>>=1; //右移一位
ds1302_sclk=1;
}
ds1302_rst=0;
delay(5);// _nop_(); //以下为DS1302复位的稳定时间
ds1302_rst=0;
ds1302_sclk=0;
delay(5);// _nop_();
ds1302_io=0;
ds1302_sclk=1;
delay(5);// _nop_();
ds1302_io=1;
ds1302_sclk=0;
delay(5);// _nop_();
return (temp); //返回
}
void Set_ds1302(void) //设定 日历 初始化写入DS1302时钟寄存器的值
{
unsigned char tmp,aa,aa1,aa2,aa3,aa4,aa5,aa6,aa7;
tmp=ds1302_init[0]/10;//BCD码转换成十进制数
aa=ds1302_init[0]%10;
aa1=aa+tmp*16;
tmp=ds1302_init[1]/10;//BCD码转换成十进制数
aa=ds1302_init[1]%10;
aa2=aa+tmp*16;
tmp=ds1302_init[2]/10;//BCD码转换成十进制数
aa=ds1302_init[2]%10;
aa3=aa+tmp*16;
tmp=ds1302_init[3]/10;//BCD码转换成十进制数
aa=ds1302_init[3]%10;
aa4=aa+tmp*16;
tmp=ds1302_init[4]/10;//BCD码转换成十进制数
aa=ds1302_init[4]%10;
aa5=aa+tmp*16;
tmp=ds1302_init[5]/10;//BCD码转换成十进制数
aa=ds1302_init[5]%10;
aa6=aa+tmp*16;
tmp=ds1302_init[6]/10;//BCD码转换成十进制数
aa=ds1302_init[6]%10;
aa7=aa+tmp*16;
Write_Ds1302(0x8E,0X00); //允许写
Write_Ds1302(0x80,aa1); //miao
Write_Ds1302(0x82,aa2); //fen
Write_Ds1302(0x84,aa3); //shi
Write_Ds1302(0x86,aa4); //ri
Write_Ds1302(0x88,aa5); //yue
// Write_Ds1302(0x8a,aa7);
Write_Ds1302(0x8c,aa7); //nian
Write_Ds1302(0x8E,0x80);//写保护
}
|