欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6745|回復: 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://m.raoushi.com/bbs/dpj-97219-1.html[/url]

max30100血氧傳感器開發資料 附arduino和stm32源碼
http://m.raoushi.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://m.raoushi.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 單片機教程網

快速回復 返回頂部 返回列表