一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 4175|回复: 20
收起左侧

[STM8/STM32] STM8L152(5D-1血糖仪)用DS3231驱动代码

[复制链接]
发表于 2016-7-23 15:23 | 显示全部楼层 |阅读模式
15元5个包邮的血糖佼买了也有段时间了,一直吃灰,前阵某宝0.8元/片买了20片拆机的DS3231想想学学STM8吧,就找啊找。总找不到有现成的代码,就自己改吧。学了三天的STM,高手请忽略。
注:用模拟I2C驱动
  1. #ifndef __DS3231_wen_H__
  2. #define __DS3231_wen_H__

  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. //**************************** defines *******************************/
  6. #define ADDRTC  0xd0    /* DS3231 slave address (write) */
  7. //#define DS3231_WriteAddress 0xD0    //器件写地址
  8. //#define DS3231_ReadAddress  0xD1    //器件读地址

  9. #define DS3231_SEC        0x00    //秒
  10. #define DS3231_MIN        0x01    //分
  11. #define DS3231_HOUR        0x02    //时
  12. #define DS3231_DAY        0x03    //星期
  13. #define DS3231_DATE        0x04    //日
  14. #define DS3231_MONTH 0x05    //月
  15. #define DS3231_YEAR        0x06    //年
  16. //闹铃1            
  17. #define DS3231_Al1SEC        0x07    //秒
  18. #define DS3231_AL1MIN        0x08    //分
  19. #define DS3231_AL1HOUR        0x09    //时
  20. #define DS3231_AL1DAY        0x0A    //星期/日
  21. //闹铃2
  22. #define DS3231_AL2MIN        0x0b    //分
  23. #define DS3231_AL2HOUR        0x0c    //时
  24. #define DS3231_AL2DAY        0x0d    //星期/日
  25. #define DS3231_CONTROL        0x0e    //控制寄存器
  26. #define DS3231_STATUS        0x0f    //状态寄存器


  27. #define BSY             2       //忙
  28. #define OSF             7       //振荡器停止标志
  29. #define DS3231_XTAL     0x10    //晶体老化寄存器
  30. #define DS3231_TEMP_H        0x11    //温度寄存器高字节(8位)
  31. #define DS3231_TEMP_L        0x12    //温度寄存器低字节(高2位)  


  32. /*********************** Function Prototypes **************************/
  33. void DS_INIT(void);
  34. u8 BCD2HEX(u8 val);
  35. u8 B_BCD(u8 val);
  36. void delay(u16 us);
  37. void Start(void);
  38. void Stop(void);
  39. void        I2CACK(u8 a);
  40. void SendByte(u8 Dat);
  41. u8 ReceiveByte(u8 b);
  42. void I2cByteWrite(u8 device,u8 addr,u8 bytedata);
  43. u8 I2cByteRead(u8 device,u8 addr);
  44. void Readtime(void);
  45. void ModifyTime(u8 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec);
  46. void    init_alrm();
  47. void        Readtime();
  48. void        ReadAlarm();

  49. void        InitDS3231();
  50. uchar        runnian();
  51. void        autoweek();
  52. void    Ttemp_read(); //读取DS3231温度数据函数
  53. void setsda(void);
  54. void clrsda(void);
  55. void get_show_time(void);

  56. #endif
复制代码
  1. #include "ds3231_wen.h"

  2. u8 ack;
  3. uchar year,month,date,day,hour,minute,second,DTemp;
  4. uchar al1_min,al1_hour,al1_day,al2_min,al2_hour,al2_day;

  5. void DS_INIT(void)
  6. {
  7.   GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_Out_OD_HiZ_Slow);
  8.   GPIO_Init(GPIOE, GPIO_Pin_5, GPIO_Mode_Out_OD_HiZ_Slow);
  9. }

  10. #define SCL_H  GPIOE->ODR|=1<<5
  11. #define SCL_L  GPIOE->ODR&=~(1<<5)
  12. #define SDA_H  GPIOD->ODR|=(1<<0)
  13. #define SDA_L  GPIOD->ODR&=~(1<<0)
  14. #define SDA   (GPIOD->IDR & 1<<0)

  15. u8 BCD2HEX(u8 val)   //BCD转换为Byte
  16. {
  17.     u8 i;
  18.     i= val&0x0f;
  19.     val >>= 4;
  20.     val &= 0x0f;
  21.     val *= 10;
  22.     i += val;
  23.    
  24.     return i;
  25. }
  26. u8 B_BCD(u8 val)//B码转换为BCD码
  27. {
  28.   u8 i,j,k;
  29.   i=val/10;
  30.   j=val%10;
  31.   k=j+(i<<4);
  32.   return k;
  33. }
  34. void delay(u16 us)
  35. {
  36.    delay_us(us*7);
  37. }
  38. /************************START***************************/
  39. void Start(void)
  40. {
  41.   SDA_H;
  42.   delay(5);
  43.   SCL_H;
  44.   delay(5);
  45.   SDA_L;
  46.   delay(5);
  47. }
  48. /********************************************************/
  49. /************************STOP****************************/
  50. void Stop(void)
  51. {
  52.   SDA_L;
  53.   delay(5);
  54.   SCL_H;
  55.   delay(5);
  56.   SDA_H;
  57.   delay(5);
  58. }
  59. /********************************************************/
  60. /***********向I2C总线发送一个字节+接收一个ACK************/
  61. void SendByte(u8 Dat)
  62. {
  63.   u8 i=0;
  64.   u8 T_Data=0;
  65.   
  66.   setsda();//DDRD|=(1<<1);//输出
  67.   SCL_L;
  68.   delay(10);
  69.   T_Data=Dat;
  70.   for(i=0;i<8;i++)
  71.     {           
  72.   
  73.           if(T_Data&0x80)
  74.             SDA_H;
  75.           else
  76.             SDA_L;
  77.           delay(5);
  78.          SCL_L;
  79.           delay(5);
  80.           SCL_H;
  81.           delay(5);
  82.           T_Data=T_Data<<1;
  83.           SCL_L;
  84.           delay(5);
  85.    }
  86.   SDA_H;//释放总线
  87.   delay(5);
  88.   SCL_L;     /*********************/
  89.   delay(5);//接收一个ACK,不做处理
  90.   SCL_H;     /*********************/
  91.   delay(5);
  92.   SCL_L;
  93. }
  94. /********************************************************/
  95. /**********从I2C总线上读取一个字节+发送一个ACK***********/
  96. u8 ReceiveByte(u8 b)
  97. {
  98.   u8 i;
  99.   u8 temp;
  100.   u8 Dat=0;
  101.   clrsda();//DDRD&=~(1<<1);//输入
  102.   for(i=0;i<8;i++)
  103.     {
  104.           SCL_H;
  105.       delay(5);
  106.           Dat=Dat<<1;
  107.           delay(5);
  108.     if(SDA){temp=1;}
  109.     else{temp=0;}
  110.           if(temp)
  111.             Dat|=0x01;
  112.           else
  113.             Dat|=0x00;
  114.          delay(5);
  115.          SCL_L;
  116.           delay(5);
  117.     }
  118.   setsda();//DDRD|=(1<<1);//输出
  119.   
  120.   if(b)//每收一个数后发送ACK或nACK
  121.     SDA_H;
  122.   else
  123.     SDA_L;
  124.         
  125.   delay(5);
  126.   SCL_H;
  127.   delay(5);
  128.   SCL_L;
  129.   delay(5);
  130.   SDA_H;        //释放总线
  131.   delay(100);
  132.   return Dat;
  133. }
  134. /****************************************************/
  135. /***********将一个字节写入DS3231指定的地址***********/
  136. void I2cByteWrite(u8 device,u8 addr,u8 bytedata)
  137. {
  138.   Start();
  139.   delay(5);
  140.   SendByte(device);
  141.   delay(5);
  142.   SendByte(addr);
  143.   delay(5);
  144.   SendByte(bytedata);
  145.   delay(5);
  146.   Stop();
  147. }
  148. /****************************************************/
  149. /************从DS3231指定的地址读一个字节************/
  150. u8 I2cByteRead(u8 device,u8 addr)
  151. {
  152.   u8 Dat=0;
  153.   
  154.   Start();
  155.   SendByte(device);
  156.   delay(5);
  157.   SendByte(addr);
  158.   delay(5);
  159.   Start();//Restart
  160.   SendByte(0xd1);//读数
  161.   delay(5);
  162.   Dat=ReceiveByte(1);//只接收一个字节,所以发nACK
  163.   Stop();
  164.   return Dat;
  165. }
  166. /***************************************************/
  167. /*********************读取时间**********************/
  168. void Readtime(void)
  169. {
  170.   year=I2cByteRead(0xd0,0x06);  //年
  171.   month=I2cByteRead(0xd0,0x05); //月
  172.   date=I2cByteRead(0xd0,0x04);  //日
  173.   hour=I2cByteRead(0xd0,0x02);  //时
  174.   minute=I2cByteRead(0xd0,0x01);//分
  175.   second=I2cByteRead(0xd0,0x00);//秒
  176. }
  177. /***************************************************/
  178. /****************修改时间,BCD码输入*****************/
  179. void ModifyTime(u8 yea,u8 mon,u8 da,u8 hou,u8 min,u8 sec)
  180. {
  181.   u8 temp=0;
  182.   
  183.   temp=B_BCD(yea);
  184.   I2cByteWrite(0xD0,0x06,temp);//修改年
  185.   
  186.   temp=B_BCD(mon);
  187.   I2cByteWrite(0xD0,0x05,temp);//修改月
  188.    
  189.   temp=B_BCD(da);
  190.   I2cByteWrite(0xD0,0x04,temp);//修改日
  191.   
  192.   temp=B_BCD(hou);
  193.   I2cByteWrite(0xD0,0x02,temp);//修改时
  194.   
  195.   temp=B_BCD(min);
  196.   I2cByteWrite(0xD0,0x01,temp);//修改分
  197.   
  198.   temp=B_BCD(sec);
  199.   I2cByteWrite(0xD0,0x00,temp);//修改秒
  200. }
  201. /****************************************************/
  202. /****************读取时间 计算 并显示****************/
  203. void get_show_time(void)
  204. {
  205.   //year,month,date,hour,minute,second;
  206.   year=I2cByteRead(0xd0,0x06);  //年
  207.   year=BCD2HEX(year);

  208.   month=I2cByteRead(0xd0,0x05);  //月
  209.   month=BCD2HEX(month);

  210.   date=I2cByteRead(0xd0,0x04);  //日
  211.   date=BCD2HEX(date);
  212.    
  213.   hour=I2cByteRead(0xd0,0x02);  //时 24小时制
  214.   hour&=0x3f;                  
  215.   hour=BCD2HEX(hour);

  216.   minute=I2cByteRead(0xd0,0x01);  //分
  217.   minute=BCD2HEX(minute);
  218.    
  219.    
  220.   second=I2cByteRead(0xd0,0x00);  //秒
  221.   second=BCD2HEX(second);
  222. }
  223. void setsda(void)
  224. {
  225.   GPIOD->DDR |= GPIO_Pin_0;
  226.   
  227. }

  228. void clrsda(void)
  229. {
  230.   GPIOD->DDR &= (uint8_t)(~(GPIO_Pin_0));
  231. }
  232. void InitDS3231()
  233. {
  234.   SCL_H;
  235.   delay_us(5);
  236.   SDA_H;
  237.   delay_us(5);
  238.   I2cByteWrite(0xD0,DS3231_AL1DAY,0x81);        //A1M4置位,时分秒匹配时闹钟响应
  239.   I2cByteWrite(0xD0,DS3231_AL2DAY,0x81);        //A2M4置位,时分匹配时闹钟响应
  240.   I2cByteWrite(0xD0,DS3231_CONTROL,0x04);        //中断允许,闹钟1和2关闭
  241.   I2cByteWrite(0xD0,DS3231_STATUS,0x00);        //32KHZ输出禁止,闹钟标志位清零

  242. }
复制代码
代码本人亲测通过。

评分

参与人数 1一乐金币 +6 收起 理由
huojunan + 6 很给力!

查看全部评分

 楼主| 发表于 2016-7-23 15:47 | 显示全部楼层
上点图片吧。由于我喜欢用字库,还没接上字库,12864小字还不能显示。

小字还没接上字库芯片

小字还没接上字库芯片

血糖仪底板与ST7576LCD12864

血糖仪底板与ST7576LCD12864


0.8元的DS3231搭棚法接上

0.8元的DS3231搭棚法接上
发表于 2016-7-23 16:02 | 显示全部楼层
要是用 原血糖仪的 屏 才好.
发表于 2016-7-23 16:10 | 显示全部楼层
楼主厉害 3天就出成果啊
发表于 2016-7-23 17:53 | 显示全部楼层
为啥不用片上I2C?
发表于 2016-7-23 17:55 | 显示全部楼层
只用了stm确实有点可惜!!
 楼主| 发表于 2016-7-23 20:05 | 显示全部楼层
风铃夜思雨 发表于 2016-7-23 16:02
要是用 原血糖仪的 屏 才好.

用啥屏自己决定呀。原屏的好像有同学发布过的。
 楼主| 发表于 2016-7-23 20:06 | 显示全部楼层
luckroll 发表于 2016-7-23 16:10
楼主厉害 3天就出成果啊

快退休了,多学点退休后有东西玩。
 楼主| 发表于 2016-7-23 20:07 | 显示全部楼层

试过,调不通,也没上示波器了。希望赐教。
 楼主| 发表于 2016-7-23 20:08 | 显示全部楼层
100abc 发表于 2016-7-23 17:55
只用了stm确实有点可惜!!

没觉得可惜,我们是玩不是出产品。

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-10 19:20 , Processed in 0.072852 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表