這一階段一直在學習宋雪松老師的書,感覺寫的很棒,在普中開發板上寫了DS1302的時鐘(雖然很渣,自帶的時鐘芯片還有問題),心血來潮買了個時鐘模塊DS2321,買來不會用 賣家提供的是Arduino的程序,源程序網上很多,但總想自己寫,看了半天的DS2321時序圖恍然大悟——這不是IIC時序么,趕緊把之前寫的IIC文件拿過來,寫了個下載進去,時鐘不動,檢查了一下是器件地址多加了<<1,改完走的一溜一溜的,程序名字是DS1302,因為是從1302改過來的,名字懶得改,并不是掛羊頭賣狗肉 可以放心食用
IMG20171212154803.jpg (3.58 MB, 下載次數: 100)
下載附件
實物圖
2017-12-12 15:49 上傳
單片機源程序如下:
- #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)
2017-12-12 15:46 上傳
點擊文件名下載附件
原理圖,源程序 下載積分: 黑幣 -5
|