找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3524|回复: 1
打印 上一主题 下一主题
收起左侧

MAX30100温度及ID功能测试单片机源程序

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. //-------------------------------------------------------------------------------------//
  2. //程序名:          MAX30100测试程序                  
  3. //版本:            V2.0                                             
  4. //编写者:          无锡日晨物联科技                 
  5. //资料下载:       http://pan.baidu.com/s/1miNGWha
  6. //功能:            测试MAX30100的ID及温度部分功能。
  7. //-------------------------------------------------------------------------------------//
  8. //RCWL-0530模块与51接口连接:
  9. // 1:VCC   --〉   1.8V-5.5V电源
  10. // 2:SCL   --〉   P3.5
  11. // 3:SDA   --〉   P3.7
  12. // 4:INT   --〉   NC
  13. // 5:IRD   --〉   NC
  14. // 6:RD    --〉   NC
  15. // 7:GND   --〉   地
  16. //-------------------------------------------------------------------------------------//
  17. # include <reg52.h>
  18. # include <stdio.h>
  19. # include <intrins.h>
  20. //定义IIC接口
  21. sbit IIC_SCL    =P3^5;     //IIC的SCL
  22. sbit IIC_SDA    =P3^7;     //IIC的SDA
  23. bit  IIC_ACK;              //IIC的ACK
  24. int  rda;                  //IIC读出
  25. //-------------------------------------------------------------------------------------//
  26. //函数:    delayms()
  27. //功能:    延时程序
  28. //-------------------------------------------------------------------------------------//
  29. void delayms(unsigned int ms)
  30. {
  31.         unsigned char i=100,j;
  32.         for(;ms;ms--)
  33.         {
  34.                 while(--i)
  35.                 {
  36.                         j=10;
  37.                         while(--j);
  38.                 }
  39.         }
  40. }
  41. //-------------------------------------------------------------------------------------//
  42. //函数:    void iic_start();
  43. //功能:    I2C总线开始
  44. //-------------------------------------------------------------------------------------//
  45. //   SCL   --- --- ___
  46. //   SDA   --- ___ ___
  47. void iic_start()
  48. {  
  49. IIC_SDA=1;
  50. _nop_();
  51. _nop_();
  52. IIC_SCL=1;         
  53. _nop_();
  54. _nop_();
  55. IIC_SDA=0;
  56. _nop_();
  57. _nop_();
  58. IIC_SCL=0;
  59. _nop_();
  60. _nop_();
  61. }
  62. //-------------------------------------------------------------------------------------//
  63. //函数:    void iic_stop();
  64. //功能:    I2C总线结束
  65. //需定义:
  66. //-------------------------------------------------------------------------------------//
  67. //   SCL   ___ --- ---
  68. //   SDA   ___ ___ ---
  69. void iic_stop()
  70. {  
  71. IIC_SCL=0;
  72. _nop_();
  73. _nop_();
  74. IIC_SDA=0;
  75. _nop_();
  76. _nop_();
  77. IIC_SCL=1;
  78. _nop_();
  79. _nop_();
  80. IIC_SDA=1;
  81. _nop_();
  82. _nop_();
  83. }
  84. //-------------------------------------------------------------------------------------//
  85. //函数:    void iic_sendbyte(unsigned char c);
  86. //功能:    发送 8_BIT 数据
  87. //-------------------------------------------------------------------------------------//
  88. void iic_sendbyte(unsigned char c)
  89. {
  90. unsigned char bitcnt;
  91. for(bitcnt=0;bitcnt<8;bitcnt++)
  92. {
  93. if((c<<bitcnt)&0x80)
  94. IIC_SDA=1;
  95. else
  96. IIC_SDA=0;
  97. _nop_();
  98. _nop_();
  99. IIC_SCL=1;
  100. _nop_();
  101. _nop_();
  102. IIC_SCL=0;
  103. }
  104. _nop_();
  105. _nop_();
  106. IIC_SDA=1;
  107. _nop_();
  108. _nop_();
  109. IIC_SCL=1;
  110. _nop_();
  111. _nop_();
  112. if(IIC_SDA==0)
  113. IIC_ACK=0;
  114. else
  115. IIC_ACK=1;
  116. IIC_SCL=0;
  117. _nop_();
  118. _nop_();
  119. }
  120. //-------------------------------------------------------------------------------------//
  121. //函数:    int iic_rcvbyte_nack();
  122. //功能:    接收 8_BIT 数据  最后ack信号
  123. //-------------------------------------------------------------------------------------//
  124. int iic_rcvbyte_nack()
  125. {
  126. unsigned char retc;
  127. unsigned char bitcnt;
  128. retc=0;
  129. IIC_SDA=1;
  130. for(bitcnt=0;bitcnt<8;bitcnt++)
  131. {
  132. _nop_();
  133. _nop_();
  134. IIC_SCL=0;
  135. _nop_();
  136. _nop_();
  137. IIC_SCL=1;
  138. _nop_();
  139. _nop_();
  140. retc=retc<<1;
  141. if(IIC_SDA==1)
  142. retc=retc+1;
  143. _nop_();
  144. _nop_();
  145. }
  146. //给出NACK信号
  147. _nop_();
  148. _nop_();
  149. IIC_SCL=0;
  150. _nop_();
  151. _nop_();
  152. IIC_SDA=1;
  153. _nop_();
  154. _nop_();
  155. IIC_SCL=1;
  156. _nop_();
  157. _nop_();
  158. IIC_SCL=0;
  159. _nop_();
  160. _nop_();
  161. return(retc);
  162. }
  163. //-------------------------------------------------------------------------------------//
  164. //函数:    int iic_rcvbyte_ack();
  165. //功能:    接收 8_BIT 数据 最后ack信号
  166. //-------------------------------------------------------------------------------------//
  167. int iic_rcvbyte_ack()
  168. {
  169. unsigned char retc;
  170. unsigned char bitcnt;
  171. retc=0;
  172. IIC_SDA=1;
  173. for(bitcnt=0;bitcnt<8;bitcnt++)
  174. {
  175. _nop_();
  176. _nop_();
  177. IIC_SCL=0;
  178. _nop_();
  179. _nop_();
  180. IIC_SCL=1;
  181. _nop_();
  182. _nop_();
  183. retc=retc<<1;
  184. if(IIC_SDA==1)
  185. retc=retc+1;
  186. _nop_();
  187. _nop_();
  188. }
  189. //给出ACK信号
  190. _nop_();
  191. _nop_();
  192. IIC_SCL=0;
  193. _nop_();
  194. _nop_();
  195. IIC_SDA=0;
  196. _nop_();
  197. _nop_();
  198. IIC_SCL=1;
  199. _nop_();
  200. _nop_();
  201. IIC_SCL=0;
  202. _nop_();
  203. _nop_();
  204. return(retc);
  205. }
  206. //-------------------------------------------------------------------------------------//
  207. //函数:      wr_max30100_one_data()
  208. //功能:      写一位max30100数据
  209. //address:   芯片从地址
  210. //saddress:  写寄存器地址
  211. //w_data:    待写数据
  212. //-------------------------------------------------------------------------------------//
  213. void wr_max30100_one_data(int address,int saddress,int w_data )
  214. {
  215. _nop_();
  216. iic_start();
  217. _nop_();
  218. iic_sendbyte(address);
  219. _nop_();
  220. iic_sendbyte(saddress);
  221. _nop_();
  222. iic_sendbyte(w_data);
  223. _nop_();
  224. iic_stop();
  225. _nop_();
  226. }
  227. //-------------------------------------------------------------------------------------//
  228. //函数:      rd_max30100_one_data()
  229. //功能:      读一位max30100数据
  230. //address:   芯片从地址
  231. //saddress:  读寄存器地址
  232. //rda:       读出的数据
  233. //-------------------------------------------------------------------------------------//
  234. void rd_max30100_one_data(int address,int saddress)
  235. {
  236. iic_start();
  237. _nop_();
  238. iic_sendbyte(address);
  239. _nop_();
  240. iic_sendbyte(saddress);
  241. _nop_();
  242. address=address+1;
  243. _nop_();
  244. iic_start();
  245. _nop_();
  246. iic_sendbyte(address);
  247. _nop_();
  248. rda=iic_rcvbyte_nack();
  249. _nop_();
  250. iic_stop();
  251. }
  252. //-------------------------------------------------------------------------------------//
  253. //函数:      主程序
  254. //功能:      读max30100内部温度
  255. //-------------------------------------------------------------------------------------//
  256. main()
  257. {
  258. double temp,temp1,temp2;
  259. //temp       测量温度
  260. //temp1      30100整数部分温度
  261. //temp2      30100小数部分温度
  262. TMOD=0x21;                  
  263. SCON=0x50;
  264. TH1=0xFD;
  265. TL1=0xFD;
  266. TR1=1;                          
  267. TI=1;   
  268. //设置51的波特率为 9600 N 8 1
  269. //51主频为11.0592MHz STC的MCU注意要选择外部晶体振荡
  270. while(1)
  271. {
  272. //复位芯片,设置模式
  273. wr_max30100_one_data(0xae,0x06,0x0b);  
  274. //读芯片ID
  275. rd_max30100_one_data(0xae,0xff);            // 读出芯片ID
  276. printf("MAX30100 ID =%d\n",rda);            // 串口显示
  277. //点亮芯片LED
  278. wr_max30100_one_data(0xae,0x07,0x43);       // 设置电流,点亮LED
  279. delayms(10);   
  280. //温度功能测试
  281. wr_max30100_one_data(0xae,0x09,0x66);       // 0X06地址B3位TEMP_EN置1
  282. delayms(50);                                // 等待温度转换完成,不等待,读出数据有误
  283. rd_max30100_one_data(0xae,0x16);            // 读出温度信号
  284. printf("temp1=%d\n",rda);                   // 串口显示
  285. temp1=rda;
  286. rd_max30100_one_data(0xae,0x17);            // 读出温度小数部分数据
  287. printf("temp2=%d\n",rda);                   // 串口显示
  288. temp2=rda;
  289. temp=temp1+(temp2*0.0625);                  // 计算温度,小数部分最小温度值0.0625
  290. printf("当前温度=%.4f\n",temp);             // 串口显示当前温度
  291. delayms(100);  
  292. printf("\n");                               // 串口显示当前温度
  293. }
  294. }
复制代码

所有资料51hei提供下载:
RCWL-0530(MAX30100心率-血氧模块).pdf (654.72 KB, 下载次数: 37)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:489708 发表于 2019-3-13 09:58 | 只看该作者
用个测心率的模块,例程只有测温度和查看ID,真的是XX狗了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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