一,DS1302时钟
DS1302时钟与C51连接通过三个引脚控制数据,分别为CE(片选),SCLK时钟信号线以及I\O数据的输入输出线。
控制寄存器的格式如下:第六位一般设置低电平,通过1-5位控制是哪个寄存器,比如00000秒寄存器,00001分寄存器,第0位控制读写操作。
让时间在数码管显示的时候,要先传输进去现在的时间,然后这个芯片在外部接有晶振下,会自己计算时间,这个实验关键是在于①控制单字节的读写,即每个字节传输时候,前期CE和CLK电平设置,传输中,读是下降沿触发,写是上升沿触发,最后后期对这俩信号高低电平的配置。②时间的输入以及读取,关键是其格式怎么在数码管显示,它这个芯片采用的是BCD码形式,因此比如a=25(BCD码),应该在数码管上显示,十位=a/16,个位=a%16,再转化为数码管的显示形式.也可以直接计算这个字节前4位和后四位的值,转化为数码管的格式直接显示,这种方法比较麻烦。
二,软件实现
读写操作:
#include "ds1302.h"
void ds1302_write_byte(u8 adress,u8 dat)
{
int i=0;
ds1302_CE=0;
_nop_();
ds1302_sclk=0;
_nop_();
ds1302_CE=1;
_nop_();
for(i=0;i<8;i++)//写地址
{
ds1302_I0=adress&0x01;
adress>>=1;
ds1302_sclk=1;
_nop_();
ds1302_sclk=0;
_nop_();
}
for(i=0;i<8;i++)//写数据
{
ds1302_I0=dat&0x01;
dat>>=1;
ds1302_sclk=1;
_nop_();
ds1302_sclk=0;
_nop_();
}
ds1302_CE=0;
_nop_();
}
u8 de1302_read_byte(u8 adress)
{
u8 de1302_read_byte_result=0,temp=0;
int i=0;
ds1302_CE=0;
_nop_();
ds1302_sclk=0;
_nop_();
ds1302_CE=1;
_nop_();
for(i=0;i<8;i++)//要读取的地址
{
ds1302_I0=adress&0x01;
adress>>=1;
ds1302_sclk=1;
_nop_();
ds1302_sclk=0;
_nop_();
}
for(i=0;i<8;i++)//读取数据
{
temp=ds1302_I0;
de1302_read_byte_result=(temp<<7)|(de1302_read_byte_result>>1);
ds1302_sclk=1;
_nop_();
ds1302_sclk=0;
_nop_();
}
ds1302_CE=0;
_nop_();
ds1302_sclk=1;
_nop_();
ds1302_I0=0;
_nop_();
ds1302_I0=1;
_nop_();
return de1302_read_byte_result;
}
void de1302_write_init(void)//时间的初始化
{
ds1302_write_byte(0x8E,0x00);//打开写寄存器
ds1302_write_byte(0x80,0x00);//秒寄存器
ds1302_write_byte(0x82,0x00);//分寄存器
ds1302_write_byte(0x84,0x00);//小时寄存器
ds1302_write_byte(0x8E,0x80);//关闭写寄存器,变为不可读
}
主函数:
void main(void)
{
u8 result[8];
u8 result_change=0;
de1302_write_init();//ʱ¼ä³õʼ»¯Ð´Èë
while(1)
{
result_change=de1302_read_byte(0x81);//Ãë¼Ä´æÆ÷
result[6]=xianshi_shuzhu[result_change/16];
result[7]=xianshi_shuzhu[result_change%16];
result[2]=0x40;
result_change=de1302_read_byte(0x83);//·Ö¼Ä´æÆ÷
result[3]=xianshi_shuzhu[result_change/16];
result[4]=xianshi_shuzhu[result_change%16];
result[5]=0x40;
result_change=de1302_read_byte(0x85);//Сʱ¼Ä´æÆ÷
result[0]=xianshi_shuzhu[result_change/16];
result[1]=xianshi_shuzhu[result_change%16];
smg_play(result);
}
}
总结:对比这三个实验IIC实现EPROM的读写,温度传感器,时钟显示,原理基本上都是通过时钟线,到对应的设备内部的寄存器中,来进行数据的读写操作,每次传输一个字节传输,温度传感器有一些不同,它不通过时钟线控制,直接用数据传输线,初始化,响应,读0读1,写0写1按照特定的格式进行判断,这样相对也比较麻烦,要控制高低电平的响应时间。三个实验都是进行数据的传输,传输的格式各有不同,针对不同格式进行转化,能够表达出来。