LanQiao比赛单片机专用板——CT107D把玩笔记(三)
2017-03-21 本文已影响73人
W_Honor
新入门的看官请点击此处目录:
学习完数字温度传感器DS18B20,我想应该对单总线I2C(此处是平方)有了初步的了解。下面来迎击一下常用时钟芯片DS1302(这是重点!!!)。
首先,大体介绍一下该芯片。
DS1302是DALLS公司推出的涓流充电时钟芯片,内置一个实时时钟/日历和31字节静态RAM,其通过简单的串行口总线与单片机相连。该芯片提供年、月、日、时、分、秒的信息,时间格式可以设置为24小时式或12小时式。
主要硬件参数:
- 三根通信线路:RET(复位)脚,IO(数据)脚,SCLK(时钟)脚
- 能计算2100年之前的时间
- 31*8位暂存数据寄存器RAM
- 工作电压:2.0V~5.5V
- 工作电流:2.0V时,小于300nA
- 读写时钟有两种数据传输方式:单字节传送和多字节传送
- 8脚DIP封装
DS1302芯片的大体参数就介绍到这里,让我们重点看一下参赛板子上的DS1302。
上电路原理图:
DS1302电路原理图.png弄清楚各个管脚的作用后,我们再看一下内部寄存器的部分命令和功能。
DS1302内部寄存器地址及命令.png以上是DS1302的31个RAM寄存器。我们可以在主机掉电时,把数据写入其中,只要芯片的备用电池还在工作,数据就不会丢失。
再来看一下重要的地址命令字:
DS1302地址命令字.png从上图可以清楚地知道,80h~91h地址代表的不同概念,只要从不同的地址读写相应的数据就可以准确地表达想要的时间数据了。
要想开始编程还需要清楚芯片的工作时序:
读时序:
读时序图.png写时序:
写时序图.png以上标明的CE引脚实质为RST(复位)引脚。
好了,逐步分析完DS1302寄存器地址命令和操作时序,我们就可以下手编程了。
话不多说,直接贴上大赛御用的驱动程序:
uchar code ds[]={55,59,23,10,10,1,16};//55秒59分23时10日10月星期一16年
uchar shijian[7];
//初始化DS1302
void dsinit(void)
{
uchar i;
uchar add=0x80;//首地址
write(0x8e,0x00);//清除写保护
for(i=0;i<7;i++)
{
write(add,ds[i]);//设置初值
add=add+2;
}
write(0x8e,0x80);//打开写保护
}
//写一个字节
void writebyte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SCLK=0;
IO=dat&0x01;
SCLK=1;
dat>>=1;
}
}
//写函数
void write(uchar add,uchar dat)
{
uchar num;
CE=0;
SCLK=0;
CE=1;
writebyte(add);
num=(dat/10<<4)|(dat%10);// 55
writebyte(num);
CE=0;
}
//从DS1302读时间
void readtime(void)
{
uchar i;
uchar add=0x81;//首地址
write(0x8e,0x00);//清除写保护(可以配置寄存器)
for(i=0;i<7;i++)
{
shijian[i]=read(add);//读出的时间存放在数组中
add=add+2;//地址加2
}
write(0x8e,0x80);//关闭写保护
}
//读取时间并转换格式
uchar read(uchar add)
{
uchar i,temp;
uchar dat1,dat2;
CE=0;
SCLK=0;
CE=1;
writebyte(add);
for(i=0;i<8;i++)
{
SCLK=0;
temp>>=1;
if(IO)
{
temp|=0x80;
}
SCLK=1;
}
IO=0;
dat1=temp/16; //0XFF 1111 1111
dat2=temp%16;
temp=dat1*10+dat2;//BCD码换算成10进制数
return temp;
}
以上程序的大体思路可以看做:初始化,写字节,写字符,读字节,读字符和时间码转换。
利用好该驱动程序就可以“为所欲为”了~~~~