钻石会员
主题
帖子
积分13076
阅读权限50
注册时间2013-3-19
最后登录1970-1-1
在线时间 小时
|
15元5个包邮的血糖佼买了也有段时间了,一直吃灰,前阵某宝0.8元/片买了20片拆机的DS3231想想学学STM8吧,就找啊找。总找不到有现成的代码,就自己改吧。学了三天的STM,高手请忽略。
注:用模拟I2C驱动
- #ifndef __DS3231_wen_H__
- #define __DS3231_wen_H__
- #define uchar unsigned char
- #define uint unsigned int
- //**************************** defines *******************************/
- #define ADDRTC 0xd0 /* DS3231 slave address (write) */
- //#define DS3231_WriteAddress 0xD0 //器件写地址
- //#define DS3231_ReadAddress 0xD1 //器件读地址
- #define DS3231_SEC 0x00 //秒
- #define DS3231_MIN 0x01 //分
- #define DS3231_HOUR 0x02 //时
- #define DS3231_DAY 0x03 //星期
- #define DS3231_DATE 0x04 //日
- #define DS3231_MONTH 0x05 //月
- #define DS3231_YEAR 0x06 //年
- //闹铃1
- #define DS3231_Al1SEC 0x07 //秒
- #define DS3231_AL1MIN 0x08 //分
- #define DS3231_AL1HOUR 0x09 //时
- #define DS3231_AL1DAY 0x0A //星期/日
- //闹铃2
- #define DS3231_AL2MIN 0x0b //分
- #define DS3231_AL2HOUR 0x0c //时
- #define DS3231_AL2DAY 0x0d //星期/日
- #define DS3231_CONTROL 0x0e //控制寄存器
- #define DS3231_STATUS 0x0f //状态寄存器
- #define BSY 2 //忙
- #define OSF 7 //振荡器停止标志
- #define DS3231_XTAL 0x10 //晶体老化寄存器
- #define DS3231_TEMP_H 0x11 //温度寄存器高字节(8位)
- #define DS3231_TEMP_L 0x12 //温度寄存器低字节(高2位)
- /*********************** Function Prototypes **************************/
- void DS_INIT(void);
- u8 BCD2HEX(u8 val);
- u8 B_BCD(u8 val);
- void delay(u16 us);
- void Start(void);
- void Stop(void);
- void I2CACK(u8 a);
- void SendByte(u8 Dat);
- u8 ReceiveByte(u8 b);
- void I2cByteWrite(u8 device,u8 addr,u8 bytedata);
- u8 I2cByteRead(u8 device,u8 addr);
- void Readtime(void);
- void ModifyTime(u8 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec);
- void init_alrm();
- void Readtime();
- void ReadAlarm();
- void InitDS3231();
- uchar runnian();
- void autoweek();
- void Ttemp_read(); //读取DS3231温度数据函数
- void setsda(void);
- void clrsda(void);
- void get_show_time(void);
- #endif
复制代码- #include "ds3231_wen.h"
- u8 ack;
- uchar year,month,date,day,hour,minute,second,DTemp;
- uchar al1_min,al1_hour,al1_day,al2_min,al2_hour,al2_day;
- void DS_INIT(void)
- {
- GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Slow);
- GPIO_Init(GPIOE, GPIO_Pin_5, GPIO_Mode_Out_OD_HiZ_Slow);
- }
- #define SCL_H GPIOE->ODR|=1<<5
- #define SCL_L GPIOE->ODR&=~(1<<5)
- #define SDA_H GPIOD->ODR|=(1<<0)
- #define SDA_L GPIOD->ODR&=~(1<<0)
- #define SDA (GPIOD->IDR & 1<<0)
- u8 BCD2HEX(u8 val) //BCD转换为Byte
- {
- u8 i;
- i= val&0x0f;
- val >>= 4;
- val &= 0x0f;
- val *= 10;
- i += val;
-
- return i;
- }
- u8 B_BCD(u8 val)//B码转换为BCD码
- {
- u8 i,j,k;
- i=val/10;
- j=val%10;
- k=j+(i<<4);
- return k;
- }
- void delay(u16 us)
- {
- delay_us(us*7);
- }
- /************************START***************************/
- void Start(void)
- {
- SDA_H;
- delay(5);
- SCL_H;
- delay(5);
- SDA_L;
- delay(5);
- }
- /********************************************************/
- /************************STOP****************************/
- void Stop(void)
- {
- SDA_L;
- delay(5);
- SCL_H;
- delay(5);
- SDA_H;
- delay(5);
- }
- /********************************************************/
- /***********向I2C总线发送一个字节+接收一个ACK************/
- void SendByte(u8 Dat)
- {
- u8 i=0;
- u8 T_Data=0;
-
- setsda();//DDRD|=(1<<1);//输出
- SCL_L;
- delay(10);
- T_Data=Dat;
- for(i=0;i<8;i++)
- {
-
- if(T_Data&0x80)
- SDA_H;
- else
- SDA_L;
- delay(5);
- SCL_L;
- delay(5);
- SCL_H;
- delay(5);
- T_Data=T_Data<<1;
- SCL_L;
- delay(5);
- }
- SDA_H;//释放总线
- delay(5);
- SCL_L; /*********************/
- delay(5);//接收一个ACK,不做处理
- SCL_H; /*********************/
- delay(5);
- SCL_L;
- }
- /********************************************************/
- /**********从I2C总线上读取一个字节+发送一个ACK***********/
- u8 ReceiveByte(u8 b)
- {
- u8 i;
- u8 temp;
- u8 Dat=0;
- clrsda();//DDRD&=~(1<<1);//输入
- for(i=0;i<8;i++)
- {
- SCL_H;
- delay(5);
- Dat=Dat<<1;
- delay(5);
- if(SDA){temp=1;}
- else{temp=0;}
- if(temp)
- Dat|=0x01;
- else
- Dat|=0x00;
- delay(5);
- SCL_L;
- delay(5);
- }
- setsda();//DDRD|=(1<<1);//输出
-
- if(b)//每收一个数后发送ACK或nACK
- SDA_H;
- else
- SDA_L;
-
- delay(5);
- SCL_H;
- delay(5);
- SCL_L;
- delay(5);
- SDA_H; //释放总线
- delay(100);
- return Dat;
- }
- /****************************************************/
- /***********将一个字节写入DS3231指定的地址***********/
- void I2cByteWrite(u8 device,u8 addr,u8 bytedata)
- {
- Start();
- delay(5);
- SendByte(device);
- delay(5);
- SendByte(addr);
- delay(5);
- SendByte(bytedata);
- delay(5);
- Stop();
- }
- /****************************************************/
- /************从DS3231指定的地址读一个字节************/
- u8 I2cByteRead(u8 device,u8 addr)
- {
- u8 Dat=0;
-
- Start();
- SendByte(device);
- delay(5);
- SendByte(addr);
- delay(5);
- Start();//Restart
- SendByte(0xd1);//读数
- delay(5);
- Dat=ReceiveByte(1);//只接收一个字节,所以发nACK
- Stop();
- return Dat;
- }
- /***************************************************/
- /*********************读取时间**********************/
- void Readtime(void)
- {
- year=I2cByteRead(0xd0,0x06); //年
- month=I2cByteRead(0xd0,0x05); //月
- date=I2cByteRead(0xd0,0x04); //日
- hour=I2cByteRead(0xd0,0x02); //时
- minute=I2cByteRead(0xd0,0x01);//分
- second=I2cByteRead(0xd0,0x00);//秒
- }
- /***************************************************/
- /****************修改时间,BCD码输入*****************/
- void ModifyTime(u8 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec)
- {
- u8 temp=0;
-
- temp=B_BCD(yea);
- I2cByteWrite(0xD0,0x06,temp);//修改年
-
- temp=B_BCD(mon);
- I2cByteWrite(0xD0,0x05,temp);//修改月
-
- temp=B_BCD(da);
- I2cByteWrite(0xD0,0x04,temp);//修改日
-
- temp=B_BCD(hou);
- I2cByteWrite(0xD0,0x02,temp);//修改时
-
- temp=B_BCD(min);
- I2cByteWrite(0xD0,0x01,temp);//修改分
-
- temp=B_BCD(sec);
- I2cByteWrite(0xD0,0x00,temp);//修改秒
- }
- /****************************************************/
- /****************读取时间 计算 并显示****************/
- void get_show_time(void)
- {
- //year,month,date,hour,minute,second;
- year=I2cByteRead(0xd0,0x06); //年
- year=BCD2HEX(year);
- month=I2cByteRead(0xd0,0x05); //月
- month=BCD2HEX(month);
- date=I2cByteRead(0xd0,0x04); //日
- date=BCD2HEX(date);
-
- hour=I2cByteRead(0xd0,0x02); //时 24小时制
- hour&=0x3f;
- hour=BCD2HEX(hour);
- minute=I2cByteRead(0xd0,0x01); //分
- minute=BCD2HEX(minute);
-
-
- second=I2cByteRead(0xd0,0x00); //秒
- second=BCD2HEX(second);
- }
- void setsda(void)
- {
- GPIOD->DDR |= GPIO_Pin_0;
-
- }
- void clrsda(void)
- {
- GPIOD->DDR &= (uint8_t)(~(GPIO_Pin_0));
- }
- void InitDS3231()
- {
- SCL_H;
- delay_us(5);
- SDA_H;
- delay_us(5);
- I2cByteWrite(0xD0,DS3231_AL1DAY,0x81); //A1M4置位,时分秒匹配时闹钟响应
- I2cByteWrite(0xD0,DS3231_AL2DAY,0x81); //A2M4置位,时分匹配时闹钟响应
- I2cByteWrite(0xD0,DS3231_CONTROL,0x04); //中断允许,闹钟1和2关闭
- I2cByteWrite(0xD0,DS3231_STATUS,0x00); //32KHZ输出禁止,闹钟标志位清零
- }
复制代码 代码本人亲测通过。
|
评分
-
查看全部评分
|