微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第49节:利用DS18B20做一个温控器

第49节:利用DS18B20做一个温控器

时间:11-22 来源:互联网 点击:

  1. (0xCC);
  2. ds_write_byte(0x44);
  3. ds18b20_reset(); //复位ds18b20的时序
  4. ds_write_byte(0xCC);
  5. ds_write_byte(0xBE);
  6. temper_L=ds_read_byte();
  7. temper_H=ds_read_byte();
  8. ds18b20_data=temper_H; //把两个字节合并成一个int数据类型
  9. ds18b20_data=ds18b20_data<8;
  10. ds18b20_data=ds18b20_data|temper_L;
  11. return ds18b20_data;
  12. }
  13. void ds18b20_reset() //复位ds18b20的时序
  14. {
  15. unsigned char x;
  16. dq_dr_sr=1;
  17. delay_short(8);
  18. dq_dr_sr=0;
  19. delay_short(80);
  20. dq_dr_sr=1;
  21. delay_short(14);
  22. x=dq_dr_sr;
  23. delay_short(20);
  24. }
  25. void ds_write_byte(unsigned char date) //写一个字节
  26. {
  27. unsigned chari;
  28. for(i=0;i<8;i++)
  29. {
  30. dq_dr_sr=0;
  31. dq_dr_sr=date&0x01;
  32. delay_short(5);
  33. dq_dr_sr=1;
  34. date=date>>1;
  35. }
  36. }
  37. unsigned char ds_read_byte(void ) //读一字节
  38. {
  39. unsigned char i;
  40. unsigned char date=0;
  41. for(i=0;i<8;i++)
  42. {
  43. dq_dr_sr=0;
  44. date=date>>1;
  45. dq_dr_sr=1;
  46. if(dq_dr_sr)
  47. {
  48. date=date|0x80;
  49. }
  50. delay_short(5);
  51. }
  52. return (date);
  53. }
  54. void display_service(void) //显示的窗口菜单服务程序
  55. {
  56. switch(ucWd)//因为本程序只有1个窗口,在实际项目中,此处的ucWd也可以省略不要
  57. {
  58. case 1:
  59. if(ucWd1Part1Update==1)//局部设定温度更新显示
  60. {
  61. ucWd1Part1Update=0;
  62. ucTemp8=10; //显示空
  63. if(ulSetTemper>=100)
  64. {
  65. ucTemp7=ulSetTemper%1000/100; //显示设定温度的百位
  66. }
  67. else
  68. {
  69. ucTemp7=10; //显示空
  70. }
  71. if(ulSetTemper>=10)
  72. {
  73. ucTemp6=ulSetTemper%100/10; //显示设定温度的十位
  74. }
  75. else
  76. {
  77. ucTemp6=10; //显示空
  78. }
  79. ucTemp5=ulSetTemper%10; //显示设定温度的个位
  80. ucDigShow8=ucTemp8; //数码管显示实际内容
  81. ucDigShow7=ucTemp7;
  82. ucDigShow6=ucTemp6;
  83. ucDigShow5=ucTemp5;
  84. }
  85. if(ucWd1Part2Update==1)//局部实际温度更新显示
  86. {
  87. if(ucSignFlag==0)//正数
  88. {
  89. ucTemp4=10; //显示空
  90. }
  91. else//负数,说明是零下多少度的情况下
  92. {
  93. ucTemp4=11; //显示负号-
  94. }
  95. if(ulCurrentTemper>=100)
  96. {
  97. ucTemp3=ulCurrentTemper%100/100; //显示实际温度的百位
  98. }
  99. else
  100. {
  101. ucTemp3=10; //显示空
  102. }
  103. if(ulCurrentTemper>=10)
  104. {
  105. ucTemp2=ulCurrentTemper%100/10;//显示实际温度的十位
  106. }
  107. else
  108. {
  109. ucTemp2=10;//显示空
  110. }
  111. ucTemp1=ulCurrentTemper%10; //显示实际温度的个数位
  112. ucDigShow4=ucTemp4; //数码管显示实际内容
  113. ucDigShow3=ucTemp3;
  114. ucDigShow2=ucTemp2;
  115. ucDigShow1=ucTemp1;
  116. }
  117. break;
  118. }
  119. }
  120. void key_scan(void)//按键扫描函数 放在定时中断里
  121. {
  122. if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  123. {
  124. ucKeyLock1=0; //按键自锁标志清零
  125. uiKeyTimeCnt1=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  126. }
  127. else if(ucKeyLock1==0)//有按键按下,且是第一次被按下
  128. {
  129. uiKeyTimeCnt1++; //累加定时中断次数
  130. if(uiKeyTimeCnt1>const_key_time1)
  131. {
  132. uiKeyTimeCnt1=0;
  133. ucKeyLock1=1;//自锁按键置位,避免一直触发
  134. ucKeySec=1; //触发1号键
  135. }
  136. }
  137. if(key_sr2==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  138. {
  139. ucKeyLock2=0; //按键自锁标志清零
  140. uiKeyTimeCnt2=0;//按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
  141. }
  142. else if(ucKeyLock2==0)//有按键按下,且是第一次被按下
  143. {
  144. uiKeyTimeCnt2++; //累加定时中断次数
  145. if(uiKeyTimeCnt2>const_key_time2)
  146. {
  147. uiKeyTimeCnt2=0;
  148. ucKeyLock2=1;//自锁按键置位,避免一直触发
  149. ucKeySec=2; //触发2号键
  150. }
  151. }
  152. }
  153. void key_service(void) //按键服务的应用程序
  154. {
  155. switch(ucKeySec) //按键服务状态切换
  156. {
  157. case 1:// 加按键 对应朱兆祺学习板的S1键
  158. switch(ucWd) //因为本程序只有1个窗口,在实际项目中,此处的ucWd也可以省略不要
  159. {
  160. case 1: //在窗口1下设置设定温度
  161. ulSetTemper++;

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top