这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 漓东e学堂 » 【11.16】10号作业千辛万苦更新- -。

共11条 2/2 1 2 跳转至
菜鸟
2016-01-29 20:51:45     打赏
11楼

课堂上老师已经给了我们DS18B20使用的代码,即当用手触摸温度传感器,串口助手那里就可以读出当前温度,所以将这个代码与之前LED灯颜色改变的代码整合起来


view plaincopy to clipboardprint?

  1. #include "stdio.h"
  2. #include "stm32f10x.h"
  3. int fputc(int ch,FILE *f);
  4. /********************RCC配置*********************/
  5. void RCC_Configuration(void)
  6. {
  7. GPIO_InitTypeDef  GPIO_InitStructure;
  8. ErrorStatus HSEStartUpStatus;
  9. RCC_DeInit();
  10. RCC_HSEConfig(RCC_HSE_ON);
  11. HSEStartUpStatus = RCC_WaitForHSEStartUp();
  12. if(HSEStartUpStatus==SUCCESS)
  13. {
  14. RCC_HCLKConfig(RCC_SYSCLK_Div1);
  15. RCC_PCLK1Config(RCC_HCLK_Div2);
  16. RCC_PCLK2Config(RCC_HCLK_Div1);
  17. RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//*设置PLL输入时钟源8x9=72M
  18. RCC_PLLCmd(ENABLE);//*打开PLL:
  19. while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//*等待PLL工作:
  20. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//*设置系统时钟
  21. while(RCC_GetSYSCLKSource() != 0x08);
  22. }
  23. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
  24. /**蜂鸣器*/
  25. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);
  26. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  27. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //#管脚号  关闭蜂鸣器
  28. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //#输出速度
  29. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //#输入输出模式(推挽输出)
  30. GPIO_Init(GPIOD, &GPIO_InitStructure); //#初始化
  31. GPIO_ResetBits(GPIOD,GPIO_Pin_2);
  32. }
  33. void delay_us(u32 n) //延时函数
  34. {
  35. u8 j;
  36. while(n--)
  37. for(j=0;j<10;j++);
  38. }
  39. void delay_ms(u32 n) //延时函数
  40. {
  41. while(n--)
  42. delay_us(1000);
  43. }
  44. /*****************************GPIO初始********************************/
  45. void GPIO_Inits(void)
  46. { /*结构体初始化及开启外设时钟*/
  47. GPIO_InitTypeDef  GPIO_InitStructure;
  48. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  49. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  50. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  51. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  52. /*GPIOA--RGB初始化*/
  53. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
  54. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  55. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  56. GPIO_Init(GPIOA,&GPIO_InitStructure);
  57. GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3)
  58. }
  59. /**************************DS18B20**********************/
  60. uint8_t DS18B20_Init(void)
  61. {
  62. GPIO_InitTypeDef GPIO_InitStructure;
  63. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  64. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  65. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  66. GPIO_Init(GPIOC, &GPIO_InitStructure);
  67. Set_B20();
  68. DS18B20_Rst();
  69. return DS18B20_Presence ();
  70. }
  71. static void DS18B20_Mode_IPU(void)
  72. {
  73. GPIO_InitTypeDef GPIO_InitStructure;
  74. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  75. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  76. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  77. GPIO_Init(GPIOC, &GPIO_InitStructure);
  78. }
  79. static void DS18B20_Mode_Out_PP(void)
  80. {
  81. GPIO_InitTypeDef GPIO_InitStructure;
  82. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  83. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  84. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  85. GPIO_Init(GPIOC, &GPIO_InitStructure);
  86. }
  87. static void DS18B20_Rst(void)
  88. {
  89. /* 主机设置为输出 */
  90. DS18B20_Mode_Out_PP();
  91. Reset_B20() ;
  92. delay_us(700);
  93. Set_B20()   ;
  94. delay_us(15);
  95. }
  96. static uint8_t DS18B20_Presence(void)
  97. {
  98. uint8_t pulse_time = 0;
  99. /* 主机设置为上拉输入 */
  100. DS18B20_Mode_IPU();
  101. while( Read_B20() && pulse_time<100 )
  102. {
  103. pulse_time++;
  104. delay_us(1);
  105. }
  106. /* 经过100us后,存在脉冲都还没有到来*/
  107. if( pulse_time >=100 )
  108. return 1;
  109. else
  110. pulse_time = 0;
  111. /* 存在脉冲到来,且存在的时间不能超过240us */
  112. while( !Read_B20() && pulse_time<240 )
  113. {
  114. pulse_time++;
  115. delay_us(1);
  116. }
  117. if( pulse_time >=240 )
  118. return 1;
  119. else
  120. return 0;
  121. }
  122. static uint8_t DS18B20_ReadBit(void)
  123. {
  124. uint8_t dat;
  125. /* 读0和读1的时间至少要大于60us */
  126. DS18B20_Mode_Out_PP();
  127. Reset_B20();
  128. delay_us(10);
  129. DS18B20_Mode_IPU();
  130. //Delay_us(2);
  131. if( Read_B20() == SET )
  132. dat = 1;
  133. else
  134. dat = 0;
  135. delay_us(45);
  136. return dat;
  137. }
  138. static uint8_t DS18B20_ReadByte(void)
  139. {
  140. uint8_t i, j, dat = 0;
  141. for(i=0; i<8; i++)
  142. {
  143. j = DS18B20_ReadBit();
  144. dat = (dat) | (j<
  145. }
  146. return dat;
  147. }
  148. static void DS18B20_WriteByte(uint8_t dat)
  149. {
  150. uint8_t i, testb;
  151. DS18B20_Mode_Out_PP();
  152. for( i=0; i<8; i++ )
  153. {
  154. testb = dat&0x01;
  155. dat = dat>>1;
  156. /* 写0和写1的时间至少要大于60us */
  157. if (testb)
  158. {
  159. Reset_B20();
  160. /* 1us < 这个延时 < 15us */
  161. delay_us(8);
  162. Set_B20();
  163. delay_us(58);
  164. }
  165. else
  166. {
  167. Reset_B20();
  168. /* 60us < Tx 0 < 120us */
  169. delay_us(70);
  170. Set_B20();
  171. delay_us(2);
  172. }
  173. }
  174. }
  175. static void DS18B20_SkipRom ( void )
  176. {
  177. DS18B20_Rst();
  178. DS18B20_Presence();
  179. DS18B20_WriteByte(0XCC); /* 跳过 ROM */
  180. }
  181. static void DS18B20_MatchRom ( void )
  182. {
  183. DS18B20_Rst();
  184. DS18B20_Presence();
  185. DS18B20_WriteByte(0X55); /* 匹配 ROM */
  186. }
  187. float DS18B20_GetTemp_SkipRom ( void )
  188. {
  189. uint8_t tpmsb, tplsb;
  190. short s_tem;
  191. float f_tem;
  192. DS18B20_SkipRom ();
  193. DS18B20_WriteByte(0X44); /* 开始转换 */
  194. DS18B20_SkipRom ();
  195. DS18B20_WriteByte(0XBE); /* 读温度值 */
  196. tplsb = DS18B20_ReadByte();
  197. tpmsb = DS18B20_ReadByte();
  198. s_tem = tpmsb<<8;
  199. s_tem = s_tem | tplsb;
  200. if( s_tem < 0 ) /* 负温度 */
  201. f_tem = (~s_tem+1) * 0.0625;
  202. else
  203. f_tem = s_tem * 0.0625;
  204. return f_tem;
  205. }
  206. void DS18B20_ReadId ( uint8_t * ds18b20_id )
  207. {
  208. uint8_t uc;
  209. DS18B20_WriteByte(0x33); //读取序列号
  210. for ( uc = 0; uc < 8; uc ++ )
  211. ds18b20_id [ uc ] = DS18B20_ReadByte();
  212. }
  213. float DS18B20_GetTemp_MatchRom ( uint8_t * ds18b20_id )
  214. {
  215. uint8_t tpmsb, tplsb, i;
  216. short s_tem;
  217. float f_tem;
  218. DS18B20_MatchRom (); //匹配ROM
  219. for(i=0;i<8;i++)
  220. DS18B20_WriteByte ( ds18b20_id [ i ] );
  221. DS18B20_WriteByte(0X44); /* 开始转换 */
  222. DS18B20_MatchRom (); //匹配ROM
  223. for(i=0;i<8;i++)
  224. DS18B20_WriteByte ( ds18b20_id [ i ] );
  225. DS18B20_WriteByte(0XBE); /* 读温度值 */
  226. tplsb = DS18B20_ReadByte();
  227. tpmsb = DS18B20_ReadByte();
  228. s_tem = tpmsb<<8;
  229. s_tem = s_tem | tplsb;
  230. if( s_tem < 0 ) /* 负温度 */
  231. f_tem = (~s_tem+1) * 0.0625;
  232. else
  233. f_tem = s_tem * 0.0625;
  234. return f_tem;
  235. }
  236. int main()
  237. {
  238. uint8_t uc, ucDs18b20Id [ 8 ];
  239. RCC_Configuration();
  240. GPIO_Inits();
  241. USART_int(9600);
  242. while( DS18B20_Init() )
  243. printf("\r\n no ds18b20 exit \r\n");
  244. printf("\r\n Yes ds18b20 \r\n");
  245. DS18B20_ReadId ( ucDs18b20Id  ); // 读取 DS18B20 的序列号
  246. printf("\r\nDS18B20的序列号是: 0x");
  247. for ( uc = 0; uc < 8; uc ++ ) // 打印 DS18B20 的序列号
  248. printf ( "%.2x", ucDs18b20Id [ uc ] );
  249. for(;;)
  250. {
  251. static unsigned int i=0;
  252. float a,b;
  253. if(i==10)
  254. {
  255. printf ( "\r\n第10秒:温度: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) ); // 打印通过 DS18B20 序列号获取的温度值
  256. a=DS18B20_GetTemp_MatchRom ( ucDs18b20Id );
  257. delay_ms(1000); /* 1s 读取一次温度值 */
  258. i++;
  259. }
  260. else{}
  261. if(i<10)
  262. {
  263. printf ( "\r\n温度: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) ); // 打印通过 DS18B20 序列号获取的温度值
  264. delay_ms(1000); /* 1s 读取一次温度值 */
  265. i++;
  266. }
  267. if(i>10)
  268. {
  269. printf ( "\r\n10秒后:温度: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) ); // 打印通过 DS18B20 序列号获取的温度值
  270. b=DS18B20_GetTemp_MatchRom ( ucDs18b20Id );
  271. delay_ms(1000); /* 1s 读取一次温度值 */
  272. i++;
  273. if((b-a)>0.9)
  274. {GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
  275. }
  276. else{}
  277. if((b-a)<0.9)
  278. {
  279. GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
  280. }
  281. else{}
  282. }
  283. else{}
  284. }
  285. }
  286. int fputc(int ch,FILE *f)
  287. {
  288. USART_SendData(USART1, (uint8_t) ch);
  289. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  290. {}
  291. return ch;
  292. }



共11条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]