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

標題: 基于單片機的溫度傳感器程序有問題 [打印本頁]

作者: 小小周周    時間: 2019-11-20 18:04
標題: 基于單片機的溫度傳感器程序有問題
基于單片機的溫度傳感器怎么使蜂鳴器報警??在線等解釋。這是我在網上找的程序,可是單片機溫度顯示到了32度了也不報警。

單片機源程序如下:
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit ds=P2^2;//溫度傳感器信號線
  6. sbit dula=P2^6;//數碼管段選線
  7. sbit wela=P2^7;//數碼管位選線
  8. sbit beep=P2^3;//蜂鳴器
  9. uint temp;//定義整型的溫度數據
  10. float f_temp;//定義浮點型的溫度數據
  11. uint warn_11=270;//定義溫度下限值 是溫度值乘以10后的結果
  12. uint warn_12=250;//定義溫度下限值
  13. uint warn_h1=300;//定義溫度上線值
  14. uint warn_h2=320;//定義溫度上線值
  15. sbit led0=P1^0;//控制發光二極管
  16. sbit led1=P1^1;
  17. sbit led2=P1^2;
  18. sbit led3=P1^3;
  19. unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
  20. 0x07,0x7f,0x6f,//帶小數點的0~9編碼
  21. 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
  22. 0x87,0xff,0xff,0xef};//不帶小數點的0~0編碼
  23. void delay(uint z)//延時函數
  24. {
  25. uint x,y;
  26. for(x=z;x>0;x--)
  27. for(y=110;y>0;y--);
  28. }
  29. void dsreset(void)//DS1820復位,初始化函數
  30. {
  31. uint i;
  32. ds=0;
  33. i=103;
  34. while(i>0)i--;
  35. ds=1;
  36. i=4;
  37. while(i>0)i--;
  38. }
  39. bit tempreadbit(void)//讀1位數據函數
  40. {
  41. uint i;
  42. bit dat;
  43. ds=0;i++;//i++起延時作用
  44. ds=1;i++;i++;
  45. dat=ds;
  46. i=8;while(i>0)i--;
  47. return(dat);
  48. }
  49. uchar tempread(void)//讀1個字節數據函數
  50. {
  51. uchar i,j,dat;
  52. dat=0;
  53. for(i=1;i<=8;i++)
  54. {
  55. j=tempreadbit();
  56. dat=(j<<7)|(dat>>1);//讀出的數據最低位在最前面,這樣剛好一個字節在dat里
  57. }
  58. return(dat);
  59. }
  60. void tempwritebyte(uchar dat)//想DS18B20寫一個字節數據函數
  61. {
  62. uint i;
  63. uchar j;
  64. bit testb;
  65. for(j=1;j<=8;j++)
  66. {
  67. testb=dat&0x01;
  68. dat=dat>>1;
  69. if(testb)//寫1
  70. {
  71. ds=0;
  72. i++;i++;
  73. ds=1;
  74. i=8;while(i>0)i--;
  75. }
  76. else
  77. {
  78. ds=0;
  79. i=8;while(i>0)i--;
  80. ds=1;
  81. i++;i++;
  82. }
  83. }
  84. }
  85. void tempchange(void)//DS18B20開始獲取溫度并轉換
  86. {
  87. dsreset();
  88. delay(1);
  89. tempwritebyte(0xcc);//寫跳過讀ROM指令
  90. tempwritebyte(0x44);//寫溫度轉換指令
  91. }
  92. uint get_temp()//讀取寄存器中存儲的溫度數據
  93. {
  94. uchar a,b;
  95. dsreset();
  96. delay(1);
  97. tempwritebyte(0xcc);
  98. tempwritebyte(0xbe);
  99. a=tempread();//讀低8位
  100. b=tempread();//讀高8位?
  101. temp=b;
  102. temp<<=8;//兩個字節組合為1個字
  103. temp=temp|a;
  104. f_temp=temp*0.0625;//溫度在寄存器中為12位,分辨率為0.0625度
  105. temp=f_temp*10+0.5;//乘以10表示小數點后面只取1位,加0.5是四舍五入
  106. f_temp=f_temp+0.05;
  107. return temp;//temp是整型
  108. }
  109. void display(uchar num,uchar dat)//數據顯示程序
  110. { //num是第幾個數碼管,dat是要顯示的數字
  111. uchar i;
  112. dula=0;
  113. P0=table[dat];//編碼賦給P0口
  114. dula=1;
  115. dula=0;
  116. wela=0;
  117. i=0xff;
  118. i=i&(~((0x01)<<(num)));//用i來存儲位選數據,只有一位為0
  119. P0=i;
  120. wela=1;
  121. wela=0;
  122. delay(1);
  123. }
  124. void dis_temp(uint t)//顯示溫度數值函數t傳遞的是整型的溫度值
  125. {
  126. uchar i;
  127. i=t/100;//除以100得到商,為溫度的十位
  128. display(0,i);//在第1個數碼管上顯示
  129. i=t%100/10;//100取余再除以10得到商,為溫度的個位
  130. display(1,i+10);//在第2個數碼管上顯示
  131. i=t%100%10;//100取余再用10取余,為溫度的小數位
  132. display(2,i);//在第3個數碼管上顯示
  133. }
  134. void warn(uint s,uchar led)//蜂鳴器報警,燈閃爍
  135. {//s控制音調,led控制燈
  136. uchar i;i=s;
  137. beep=0;//蜂鳴器響
  138. P1=~(led);//控制相應的燈亮
  139. while(i--)
  140. {
  141. dis_temp(get_temp());//用溫度顯示函數起到延時作用
  142. }
  143. beep=1;//蜂鳴器不響
  144. P1=0xff;//控制相應的燈滅
  145. i=s;
  146. while(i--)
  147. {
  148. dis_temp(get_temp());//用溫度顯示函數起到延時作用
  149. }
  150. }
  151. void deal(uint t)//溫度處理函數
  152. {
  153. uchar i;
  154. if((t>warn_12)&&(t<=warn_11))//大于25度小于27度
  155. {
  156. warn(40,0x01);//第1個燈亮,蜂鳴器發出滴?
  157. }
  158. else if(t<=warn_12)//小于25度
  159. {
  160. warn(10,0x03);//第1個和第2個燈亮,蜂鳴器發出滴
  161. }
  162. else if((t<warn_h2)&&(t>=warn_h1))//小于32度大于30度
  163. {
  164. warn(40,0x04);//第3個燈亮,蜂鳴器發出滴
  165. }
  166. else if(t>warn_h2)//大于32度
  167. {
  168. warn(10,0x0c);//第3,4個燈亮,蜂鳴器發出滴
  169. }
  170. else //在27度和30度之間時只是調用顯示函數延時
  171. {
  172. i=40;
  173. while(i--)
  174. {
  175. dis_temp(get_temp());
  176. }
  177. }
  178. }
  179. void init_com(void)//串口初始化函數
  180. {
  181. TMOD=0X20;
  182. PCON=0X00;
  183. SCON=0X50;
  184. TH1=0XFD;//波特率9600
  185. TL1=0XFD;
  186. TR1=1;
  187. }
  188. void comm(char*parr)//串口數據發送函數
  189. {
  190. do
  191. {
  192. SBUF=*parr++;//發送數據
  193. while(!TI);//等待發送完成標志為1
  194. TI=0;//標志清零
  195. }while(*parr);//保持循環直到字符為'\0'
  196. }
  197. void main()
  198. {
  199. uchar buff[4],i;
  200. dula=0;
  201. wela=0;
  202. init_com();
  203. while(1)
  204. {
  205. tempchange();//溫度轉換函數
  206. for(i=10;i>0;i--)
  207. {
  208. dis_temp(get_temp());//獲取溫度并顯示
  209. }
  210. deal(temp);//進行溫度處理
  211. sprintf(buff,"%f",f_temp);//將浮點型溫度格式轉化為字符型
  212. for(i=10;i>0;i--)
  213. {
  214. dis_temp(get_temp());//溫度顯示
  215. }
  216. comm(buff);//串口發送數據
  217. for(i=10;i>0;i--)
  218. {
  219. dis_temp(get_temp());//溫度顯示
  220. }
  221. }   
  222. }
復制代碼



作者: 166864646883    時間: 2019-11-21 09:43
先檢查蜂鳴器部分電路是否有問題,然后再檢查程序是否有錯
作者: wulin    時間: 2019-11-21 13:31
程序沒有問題,是你的硬件電路與程序不符導致異常。




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1