久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1615|回復: 0
收起左側

基于89c1單片機的溫控程序

[復制鏈接]
ID:779690 發表于 2020-6-15 11:09 | 顯示全部樓層 |閱讀模式
51hei圖片20200615110759.jpg

  1. sbit DS=P3^7;//定義 DS18B20 接口
  2. sbit buzz=P3^6;//定義蜂鳴器
  3. sbit key1=P3^5;//選擇調整上限或者下限溫度
  4. sbit key2=P3^4;//溫度增加
  5. sbit key3=P3^3;//溫度減少
  6. sbit key4=P3^2;//顯示實際溫度并與上、 下限溫度比較
  7. sbit p23=P2^3;
  8. sbit p22=P2^2;
  9. sbit p21=P2^1;
  10. sbit p20=P2^0;
  11. uchar flag=1;
  12. uchar flag1=0;
  13. uchar flag2=0;
  14. static uint tmpH=5;
  15. static uint tmpL=-5;
  16. int tmp;//十六位
  17. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//7 段數碼管
  18. 段碼表共陽,0~9 和熄滅, 負的段碼值
  19. uchar data disp_buf[]={0x00,0x00,0x00,0x00}; //保存各個位上的數值
  20. //引腳及標志變量初始化
  21. void init()
  22. {
  23. key1=1;
  24. key2=1;
  25. key3=1;
  26. key4=1;
  27. flag1=0;
  28. flag2=0;
  29. }
  30. //串口初始化
  31. void init_com()
  32. {
  33. TMOD=0x20;//設置定時器方式 1, 用定時器設置串口波特率
  34. TH1=0xfd;// 裝入初值
  35. TL1=0xfd;
  36. TR1=1;//啟動定時器 1;TR1 為 TCON 中的第六位
  37. REN=1;//串口初始化, 運行串口接收
  38. SM0=0;
  39. SM1=1;//這兩行設置串口方式 1
  40. EA=1;//開啟總中斷
  41. ES=1;//打開串口中斷開關
  42. }
  43. void delay(uint x)
  44. {
  45. for(x;x>0;x--);
  46. }
  47. void Init_ds18b20()//初始化
  48. {
  49. unsigned char x=0;
  50. DS = 1; //DS 復位
  51. delay(8); //稍做延時
  52. DS = 0; //單片機將 DQ 拉低
  53. delay(80); //精確延時 大于 480us
  54. DS = 1; //拉高總線
  55. delay(5);
  56. x=DS; //稍做延時后 如果 x=0 則初始化成功 x=1 則初始化失敗
  57. delay(20);
  58. }
  59. void Write_ds18b20(uchar dat)
  60. {
  61. uchar i;
  62. for(i=0;i<8;i++)
  63. {
  64. DS=0;
  65. //_nop_();
  66. //_nop_();//啟動寫時許開始, 延時 2us
  67. if(dat&0x01)
  68. {
  69. DS=1;//發 1 狀態
  70. delay(10);//延時 60us
  71. }
  72. else //發 0 狀態
  73. {
  74. DS=0;
  75. delay(10);//延時 60us
  76. DS=1;//釋放總線
  77. _nop_();//回復時間延時 2us
  78. _nop_();
  79. }
  80. dat>>=1;
  81. }
  82. //delay(4);
  83. }
  84. uchar Read_ds18b20()
  85. {
  86. uchar i,dat=0;
  87. for(i=0;i<8;i++)
  88. {
  89. DS=1; //特別注意此處
  90. //_nop_();//延時 1us //特別注意此處
  91. delay(1); //特別注意此處
  92. DS=0;//啟動讀開始 //特別注意此處
  93. dat>>=1;
  94. DS=1;//釋放總線
  95. //delay(8);//延時 16us
  96. if(DS)
  97. dat=dat|0x80;
  98. delay(5);
  99. }
  100. return dat;
  101. }
  102. int ReadTemperature(void)
  103. {
  104. uchar a,b;//uchar 八位
  105. int temp; //十六位
  106. Init_ds18b20();
  107. Write_ds18b20(0xCC);// 跳過讀序號列號的操作
  108. Write_ds18b20(0x44);// 啟動溫度轉換
  109. delay(200);
  110. Init_ds18b20();
  111. Write_ds18b20(0xCC);//跳過讀序號列號的操作
  112. Write_ds18b20(0xBE);//讀取溫度寄存器等(共可讀 9 個寄存器) 前兩個就是溫度
  113. a=Read_ds18b20();//低 8 位
  114. b=Read_ds18b20();//高 8 位
  115. temp=b;
  116. temp=temp<<8;
  117. temp=temp+a;
  118. return temp;
  119. }
  120. void change()
  121. {
  122. int tp;
  123. if((tmp&0xf800)==0xf800)//溫度小于零度時
  124. {
  125. tp=tmp;
  126. tp=~tp+1;
  127. tmp=tp&0x000f;
  128. disp_buf[0]=(tmp&0x000f)*0.625+0.5;
  129. tp=tp>>4;
  130. tp=tp%100;
  131. disp_buf[2]=tp/10;
  132. disp_buf[1]=tp%10;
  133. if(disp_buf[2]==0)
  134. {
  135. disp_buf[3]=10;
  136. disp_buf[2]=11;
  137. }
  138. else
  139. {
  140. disp_buf[3]=11;
  141. }
  142. }
  143. else
  144. {
  145. disp_buf[0]=(tmp&0x000f)*0.625+0.5;//小數部分
  146. tp=tmp>>4;//整數部分
  147. disp_buf[3]=tp/100;//百位
  148. tp=tp%100;
  149. disp_buf[2]=tp/10;//十位
  150. disp_buf[1]=tp%10;//個位
  151. if(!disp_buf[3])
  152. {
  153. disp_buf[3]=10;
  154. if(!disp_buf[2])
  155. {
  156. disp_buf[2]=10;
  157. }
  158. }
  159. }
  160. }
  161. void delayms(uint v)//延時, 實現數碼管的動態顯示
  162. {
  163. uint m,n;
  164. for(m=v;m>0;m--)
  165. for(n=73;n>0;n--);
  166. }
  167. void display()//溫度顯示函數
  168. {
  169. p20=0;//開百位顯示
  170. P0=tab[disp_buf[3]];//顯示百位
  171. delayms(5);//延時
  172. p20=1;//關百位顯示
  173. p21=0;
  174. P0 =tab[disp_buf[2]];//顯示十位
  175. delayms(5);
  176. p21=1;
  177. p22=0;
  178. P0=tab[disp_buf[1]]&0x7f;//顯示個位,并帶小數點
  179. delayms(5);
  180. p22=1;
  181. p23=0;
  182. P0 =tab[disp_buf[0]];//顯示小數位
  183. delayms(5);
  184. p23=1;
  185. }
  186. int main()
  187. {
  188. uchar data pc[6];
  189. uint i;
  190. init();
  191. init_com();
  192. tmp=ReadTemperature();
  193. change();
  194. pc[1]=disp_buf[2]+'0';
  195. pc[2]=disp_buf[1]+'0';
  196. pc[3]='.';
  197. pc[4]=disp_buf[0]+'0';
  198. while(1)
  199. {
  200. if(flag==1)
  201. {
  202. ES=0;
  203. for(i=1;i<5;i++)
  204. {
  205. SBUF=pc[ i];
  206. while(!TI);
  207. TI=0;
  208. }
  209. ES=1;
  210. flag=0;
  211. }
  212. while((flag1==0)&&(flag2==0))//flag1=1 時調上限。flag1=2 時調下限
  213. {
  214. tmp=ReadTemperature();
  215. change();
  216. display();
  217. if(key1==0)//按下 1 鍵
  218. {
  219. delayms(100);
  220. flag1=1;
  221. key1 = 1;
  222. }
  223. }
  224. while(flag1==0&&flag2==1)
  225. {
  226. buzz=1;
  227. tmp=ReadTemperature();
  228. change();
  229. display();
  230. while(tmp>=tmpH||tmp<=tmpL)
  231. {
  232. tmp=ReadTemperature();
  233. change();
  234. display();
  235. buzz=0;
  236. }
  237. }
  238. while(flag1==1)
  239. {
  240. tmp=(tmpH<<4);
  241. change();
  242. while(flag1==1)
  243. {
  244. display();
  245. if(key2==0)//上限升高
  246. {
  247. tmpH++;
  248. tmp=(tmpH<<4);
  249. change();
  250. while(!key2)
  251. display();
  252. }
  253. if(key3==0)//上限降低
  254. {
  255. tmpH--;
  256. tmp=(tmpH<<4);
  257. change();
  258. while(!key3)
  259. display();
  260. }
  261. if(key1 == 0)//切換到調整下限模式
  262. {
  263. delayms(5);
  264. flag1=2;
  265. tmp=(tmpH<<4);
  266. while(!key1);
  267. }
  268. if(key4==0)//按下 key4,實際溫度與上限、 下限比較
  269. {
  270. flag1=0;
  271. flag2=1;
  272. //tmp=tmpH;
  273. while(!key4);
  274. }
  275. }
  276. }
  277. while(flag1==2)//調下限
  278. {
  279. tmp=(tmpL<<4);
  280. change();
  281. while(flag1==2)
  282. {
  283. display();
  284. if(key2==0)
  285. {
  286. tmpL++;
  287. tmp=(tmpL<<4);
  288. change();
  289. while(!key2)
  290. display();
  291. }
  292. if(key3==0)
  293. {
  294. tmpL--;
  295. tmp=(tmpL<<4);
  296. change();
  297. while(!key3)
  298. display();
  299. }
  300. if(key1==0)
  301. {
  302. flag1=1;
  303. tmp=(tmpL<<4);
  304. while(!key1);
  305. }
  306. if(key4==0)
  307. {
  308. flag1=0;
  309. flag2=1;
  310. //tmp=tmpL;
  311. while(!key4);
  312. }
  313. }
  314. }
  315. }
  316. return 0;
  317. }
復制代碼
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 性在线| www.色.com| 夜夜夜操 | 性一交一乱一伦视频免费观看 | 亚洲综合首页 | 免费在线观看av网站 | 国产精品久久久久久久久久久久午夜片 | 亚洲精品视频在线观看免费 | 亚洲精品黄色 | 国产免费一区二区三区免费视频 | 久久99视频 | 成人精品国产一区二区4080 | 日韩成人在线免费观看 | 做a的各种视频 | 久久久久国产精品一区二区 | 日韩一二区在线 | www.干| 97国产精品视频人人做人人爱 | 欧美精品国产精品 | 91在线一区二区三区 | 亚洲国产精品久久 | 久久久久久亚洲欧洲 | 欧美一区二区三区久久精品视 | 成人免费毛片在线观看 | 精品国产18久久久久久二百 | 欧美日韩在线一区二区 | 亚洲三区在线 | 国产乱码精品一区二区三区忘忧草 | 久久精品亚洲 | 精品欧美一区二区精品久久 | 免费午夜电影 | 国产成人a亚洲精品 | 成人婷婷| 国产人久久人人人人爽 | 精品久久久久久久久久久久久 | 99精品视频一区二区三区 | 日本免费一区二区三区视频 | 久久黄色精品视频 | 男女爱爱网站 | 日韩网站免费观看 | 激情网站 |