这一阶段一直在学习宋雪松老师的书,感觉写的很棒,在普中开发板上写了DS1302的时钟(虽然很渣,自带的时钟芯片还有问题),心血来潮买了个时钟模块DS2321,买来不会用 卖家提供的是Arduino的程序,源程序网上很多,但总想自己写,看了半天的DS2321时序图恍然大悟——这不是IIC时序么,赶紧把之前写的IIC文件拿过来,写了个下载进去,时钟不动,检查了一下是器件地址多加了<<1,改完走的一溜一溜的,程序名字是DS1302,因为是从1302改过来的,名字懒得改,并不是挂羊头卖狗肉 可以放心食用
实物图
单片机源程序如下:
- #include <reg52.h>
- #include<intrins.h>
- typedef unsigned int u16;
- typedef unsigned char u8;
- struct sTime
- {
- u16 year;
- u8 mon;
- u8 day;
- u8 hour;
- u8 min;
- u8 sec;
- u8 week;
- };
- extern void I2CStar();
- extern void I2CStop();
- extern bit I2CWrite(u16 dat);
- extern u8 I2CReadNAK();
- extern u8 I2CReadACK();
- void DS1302Read(u8 *buf,u8 addr,u8 len) //读EEPROM中duo字节
- {
- do{
- I2CStar();
- if(I2CWrite(0xD0))
- {
- break;
- }
- I2CStop();
- }while(1);
- I2CWrite(addr);
- I2CStar();
- I2CWrite((0xD0)|0x01); //寻址,读操作
- while(len>1)
- {
- *buf++=I2CReadACK();
- len--;
- }
- *buf=I2CReadNAK(); //读一个字节
- I2CStop();
- }
- void DS1302Write(u8 *buf,u8 addr,u8 len)
- {
- while(len>0)
- {
- do{
- I2CStar();
- if(I2CWrite(0xD0))
- {
- break;
- }
- I2CStop();
- }while(1);
- I2CWrite(addr);
- while(len>0)
- {
- I2CWrite(*buf++);
- len--;
- addr++;
- if((addr&0x07)==0)
- {
- break;
- }
- }
- I2CStop();
- }
- }
- void GetRealTime(struct sTime *time)
- {
- u8 buf[8];
-
- DS1302Read(buf,0x00,7);
- time->year=buf[6]+0x2000;
- time->mon=buf[5];
- time->day=buf[4];
- time->week=buf[3];
- time->hour=buf[2];
- time->min=buf[1];
- time->sec=buf[0];
- }
- void SetRealTime(struct sTime *time)
- {
- u8 buf[8];
- buf[7]=0;
- buf[6]=time->year;
- buf[5]=time->mon;
- buf[4]=time->day;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
DS3231可校时,1602.zip
(327.15 KB, 下载次数: 373)
|