找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5454|回复: 6
收起左侧

51单片机代码如何改写成stm32?求高手指教

[复制链接]
ID:553796 发表于 2019-6-3 15:49 | 显示全部楼层 |阅读模式
我用的是德飞莱 七星虫系列的stm32f103主板,型号:尼莫M3S,想要连接心率传感器,但是这款传感器自带的调试程序是51单片机的,想改成arm的程序。自带程序中用51模拟了IIC接口,stm32主板自带IIC接口,我现在要把原51代码转换成arm代码,望各位指教
IMG_1116.JPG

stm32主板

stm32主板

心率传感器

心率传感器
IMG_1117.JPG

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

所有资料51hei提供下载:
MAX30100温度及ID功能测试程序.7z (13.93 KB, 下载次数: 10)
回复

使用道具 举报

ID:277550 发表于 2019-6-3 21:28 | 显示全部楼层


这芯片,网上能搜索到有STM32的程序
回复

使用道具 举报

ID:553796 发表于 2019-6-12 09:03 | 显示全部楼层
devcang 发表于 2019-6-3 21:28
这芯片,网上能搜索到有STM32的程序

不好意思,我在网上没有找到这个stm32的程序,你可以帮忙给我一下连接吗
回复

使用道具 举报

ID:155507 发表于 2019-6-12 18:39 | 显示全部楼层
鱼虾水族 发表于 2019-6-12 09:03
不好意思,我在网上没有找到这个stm32的程序,你可以帮忙给我一下连接吗


max30100血氧心率制作stm32源码 OLED显示
[urlhttp://www.51hei.com/bbs/dpj-97219-1.html[/url]

max30100血氧传感器开发资料 附arduino和stm32源码
http://www.51hei.com/bbs/dpj-99329-1.html
回复

使用道具 举报

ID:403420 发表于 2019-6-12 22:45 | 显示全部楼层
51改32,首先你要知道如何操作寄存器或者你要知道hal库
回复

使用道具 举报

ID:553796 发表于 2019-6-14 11:26 | 显示全部楼层
angmall 发表于 2019-6-12 18:39
max30100血氧心率制作stm32源码 OLED显示
http://www.51hei.com/bbs/dpj-97219-1.html[/url]

非常感谢
回复

使用道具 举报

ID:560954 发表于 2019-6-14 12:07 | 显示全部楼层
51移植到32不费什么事吧,将端口那些什么的修改一下,注意延时
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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