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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3714|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)模擬微波爐的控制器 ds18b20數(shù)據(jù)時(shí)不時(shí)跳一下

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
本帖最后由 迷失朋友 于 2018-3-4 20:48 編輯

我自己做一個(gè)模擬微波爐的控制器,大概就是用ds18b20提供的溫度控制步進(jìn)電機(jī),怎么我用ds18b20測(cè)溫?cái)?shù)據(jù)時(shí)不時(shí)跳一下然后又正常。有沒(méi)有人幫我看一下,可以回復(fù),也可以加我qq904784778。 微波爐.rar (28.5 KB, 下載次數(shù): 43)


單片機(jī)源程序如下:
  1. #include <reg51.h>
  2. #define  uint unsigned int
  3. #define  uchar unsigned char
  4. uchar codevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //七段數(shù)碼管顯示碼,顯示0~9
  5. uint tt=20;    // 為了計(jì)時(shí)一秒,定時(shí)器一次中斷為50ms,20*50ms=1s
  6. uint tmax=30;     //火力上限
  7. uint check=0;
  8. uint m;
  9. int count_s=0;    //時(shí)間
  10. sbit P10=P1^0;                //引腳定義
  11. sbit P11=P1^1;
  12. sbit P12=P1^2;
  13. sbit P13=P1^3;
  14. sbit P14=P1^4;
  15. sbit P15=P1^5;
  16. sbit P16=P1^6;
  17. sbit P17=P1^7;
  18. sbit P20=P2^0;
  19. sbit P21=P2^1;
  20. sbit P22=P2^2;
  21. sbit P23=P2^3;
  22. sbit P24=P2^4;
  23. sbit P25=P2^5;
  24. sbit P26=P2^6;
  25. sbit P30=P3^0;
  26. sbit P31=P3^1;
  27. sbit P32=P3^2;
  28. sbit P33=P3^3;
  29. sbit P34=P3^4;
  30. sbit P35=P3^5;
  31. sbit P36=P3^6;
  32. sbit P37=P3^7;
  33. sbit DQ=P2^7;   //定義DS18B20總線I/O
  34. sbit DP=P0^7;

  35. void Delay(uint i)//延時(shí)
  36. {
  37. while( i-- );
  38. }

  39. void T_initalize()
  40. {
  41.         EA=1;            //開(kāi)中斷
  42.         ET0=1;
  43.         ET1=1;           //定時(shí)器 中斷允許
  44.         TMOD=0x11;       //定時(shí)器T0 定時(shí)   方式一
  45.         TH0=0x3c;
  46.         TL0=0xaf;         //12M 晶振,65536-15536=50000,50000us*20=1000000us=1s
  47. }

  48. void Init_DS18B20(void)//初始化DS18B20
  49. {
  50.   uchar x=0;
  51.   DQ=1;
  52.   Delay(8);    //稍做延時(shí)
  53.   DQ=0;         //單片機(jī)將DQ拉低
  54.   Delay(80);   //精確延時(shí),大于480us
  55.   DQ=1;         //拉高總線
  56.   Delay(14);
  57.   x=DQ;           //稍做延時(shí)后,如果x=0則初始化成功,x=1則初始化失敗
  58.   Delay(20);
  59. }

  60. uchar Readonechar(void)//讀一個(gè)字節(jié)
  61. {
  62.   uchar i=0;
  63.   uchar dat=0;
  64.   for (i=8;i>0;i--)
  65.   {
  66.     DQ=0;     // 給脈沖信號(hào)
  67.     dat>>=1;
  68.     DQ=1;     // 給脈沖信號(hào)
  69.     if(DQ)
  70.     dat|=0x80;
  71.     Delay(4);
  72.   }
  73.   Delay(500);
  74.   return(dat);
  75. }

  76. void Writeonechar(uchar dat)//寫(xiě)一個(gè)字節(jié)
  77. {
  78.   uchar i=0;
  79.   for (i=8; i>0; i--)
  80.   {
  81.     DQ=0;
  82.     DQ=dat&0x01;
  83.     Delay(10);
  84.     DQ=1;
  85.     dat>>=1;
  86.   }
  87. }

  88. void Tmperature_change(void) //發(fā)送溫度轉(zhuǎn)換命令
  89. {
  90.   Init_DS18B20();
  91.   Writeonechar(0xCC);  //跳過(guò)讀序號(hào)列號(hào)的操作
  92.   Writeonechar(0x44);  //啟動(dòng)溫度轉(zhuǎn)換
  93. }

  94. uint Read_temperature(void)//讀取溫度
  95. {
  96.   uchar a=0;
  97.   uchar b=0;
  98.   uint t=0;
  99.   Tmperature_change();
  100.   Init_DS18B20();
  101.   Writeonechar(0xCC);  //跳過(guò)讀序號(hào)列號(hào)的操作
  102.   Writeonechar(0xBE);  //讀取溫度寄存器
  103.   a=Readonechar();     //讀低8位
  104.   b=Readonechar();    //讀高8位
  105.   t=b;
  106.   t<<=8;
  107.   t=t|a;
  108.   t=t*0.0625;
  109.   return(t);
  110. }

  111. void Display_temperature()//顯示溫度
  112. {
  113. uint f,g,h,i;
  114. i=Read_temperature();  //獲取溫度值
  115. f=i/100;               //百位
  116. g=i%100/10;            //十位
  117. h=i%10;                //個(gè)位
  118. m=i;
  119. P24=1,P25=1,P26=1;
  120. P0=codevalue[h];   //顯示個(gè)位  
  121. P24=1,P25=1,P26=0;      
  122. Delay(160);  
  123. P24=1,P25=1,P26=1;
  124. P0=codevalue[g];    //顯示十位
  125. P24=1;P25=0;P26=1;
  126. Delay(160);
  127. P24=1,P25=1,P26=1;
  128. P0=codevalue[f];    //顯示百位
  129. P24=0,P25=1,P26=1;
  130. Delay(160);
  131. P24=1,P25=1,P26=1;
  132. }

  133. void Display_time()//顯示時(shí)間
  134. {
  135. uint a,b,c,d;
  136. a=count_s/600;             //取分的十位
  137. b=(count_s/60)%10;         //取分的個(gè)位                                 
  138. c=(count_s%60)/10;         //取秒的十位
  139. d=(count_s%60)%10;                  //取秒的個(gè)位
  140. P20=1,P21=1,P22=1,P23=1;
  141. P0=codevalue[d];           //顯示秒的個(gè)位
  142. P20=1,P21=1,P22=1,P23=0;
  143. Delay(150);
  144. P20=1,P21=1,P22=1,P23=1;
  145. P0=codevalue[c];           //顯示秒的十位
  146. P20=1,P21=1,P22=0,P23=1;
  147. Delay(160);
  148. P20=1,P21=1,P22=1,P23=1;
  149. P0=codevalue[b];           //顯示分的個(gè)位
  150. P20=1,P21=0,P22=1,P23=1;
  151. Delay(160);
  152. P20=1,P21=1,P22=1,P23=1;
  153. P0=codevalue[a];           //顯示分的十位
  154. P20=0,P21=1,P22=1,P23=0;
  155. Delay(160);
  156. P20=1,P21=1,P22=1,P23=1;
  157. }

  158. void Display_initalize()
  159. {
  160. P2=0xff;
  161. P0=0x40;
  162. P20=0,P21=1,P22=1,P23=1,P24=1,P25=1,P26=1;
  163. Delay(120);
  164. P2=0xff;
  165. P0=0x40;
  166. P20=1,P21=0,P22=1,P23=1,P24=1,P25=1,P26=1;
  167. Delay(120);
  168. P2=0xff;
  169. P0=0x40;
  170. P20=1,P21=1,P22=0,P23=1,P24=1,P25=1,P26=1;
  171. Delay(120);
  172. P2=0xff;
  173. P0=0x40;
  174. P20=1,P21=1,P22=1,P23=0,P24=1,P25=1,P26=1;
  175. Delay(120);
  176. P2=0xff;
  177. P0=0x40;
  178. P20=0,P21=1,P22=1,P23=1,P24=0,P25=1,P26=1;
  179. Delay(120);
  180. P2=0xff;
  181. P0=0x40;
  182. P20=0,P21=1,P22=1,P23=1,P24=1,P25=0,P26=1;
  183. Delay(120);
  184. P2=0xff;
  185. P0=0x40;
  186. P20=0,P21=1,P22=1,P23=1,P24=1,P25=1,P26=0;
  187. Delay(120);
  188. P2=0xff;
  189. }

  190. void Motor()//電機(jī)
  191. {
  192. if(check==1)
  193. {
  194. P33=1,P34=0,P35=0,P36=0;
  195. Delay(100);
  196. P33=0,P34=1,P35=0,P36=0;
  197. Delay(100);
  198. P33=0,P34=0,P35=1,P36=0;
  199. Delay(100);
  200. P33=0,P34=0,P35=0,P36=1;
  201. Delay(100);
  202. }
  203. }

  204. void Temperature_check()//溫度檢測(cè)
  205. {if(check==1)
  206. {
  207. if(m<=tmax)
  208. P17=0;
  209. if(m>tmax)
  210. P17=1;
  211. }
  212. }

  213. void Key_scan()//鍵位掃描
  214. {   
  215.         if(!P10)
  216.         {
  217.          Delay(150);
  218.                 if(!P10)
  219.                 count_s+=60;      //時(shí)間+1分
  220.         if (count_s>6000)
  221.             count_s=0;
  222.         }
  223.         
  224.     if(!P11)
  225.         {
  226.          Delay(150);
  227.                 if(!P11)
  228.                 count_s-=60;       //時(shí)間-1分
  229.         if (count_s<0)
  230.             count_s=0;
  231.         }

  232.         if(!P12)
  233.         {
  234.          Delay(150);
  235.                 if(!P12)
  236.                 tmax=50;      //小火
  237.         }

  238.         if(!P13)
  239.         {
  240.          Delay(150);
  241.                 if(!P13)
  242.             tmax=80;      //中火

  243.         }

  244.         if(!P14)
  245.         {
  246.          Delay(150);
  247.                 if(!P14)
  248.                 tmax=120;    //大火

  249.         }

  250.         if(!P15)
  251.         {
  252.          Delay(150);
  253.                 if(!P15)
  254.                 {
  255.                  P22=1;
  256.          if(count_s==0)          //如果沒(méi)有設(shè)定時(shí)間,不加熱,定時(shí)器不工作
  257.             TR0=0;
  258.          else                    //如果已經(jīng)設(shè)定時(shí)間,則開(kāi)始計(jì)時(shí),開(kāi)始加熱
  259.                     {                  
  260.             T_initalize();
  261.             TR0=1;
  262.             check=1;
  263.             P17=0;
  264.             }
  265.                 }

  266.         }

  267.         if(!P16)               //停止加熱,終止定時(shí)器
  268.         {
  269.          Delay(150);
  270.                 if(!P16)
  271.                 {P17=1;
  272.                  TR0=0;
  273.          check=0;
  274.                 }
  275.         }
  276. }

  277. void t0() interrupt 1//定時(shí)
  278. {        
  279.     TR0=0;
  280.     TH0=0x3c;
  281.         TL0=0xaf;
  282.     tt--;
  283.         if (tt==0)
  284.                 {tt=20;
  285.                 count_s--;  //時(shí)間-1S
  286.         if (count_s==0)  //如果定時(shí)已到
  287.             {
  288.                          P17=1;      //停止加熱,定時(shí)器終止
  289.              TR0=0;
  290.                          check=0;
  291.              P37=0;
  292.                          Delay(500);
  293.                          P37=1;
  294.                          P37=0;
  295.                          Delay(500);
  296.                          P37=1;
  297.                          P37=0;
  298.                          Delay(500);
  299.                          P37=1;
  300.             }
  301.         else
  302.             TR0=1;        //繼續(xù)定時(shí)
  303.                 }
  304.     else
  305.         TR0=1;
  306.            
  307. }

  308. void main()
  309. {
  310. uint j;
  311. P37=0;
  312. Delay(500);
  313. P37=1;
  314. Read_temperature();
  315. for(j=0;j<100;j++)
  316. {
  317. Display_initalize();
  318. }

  319. while(1)
  320. {
  321. Key_scan();
  322. Display_temperature();
  323. Display_time();
  324. Temperature_check();
  325. }
  326. }
復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:96682 發(fā)表于 2018-3-5 13:19 | 只看該作者
軟件仿真改改就好并非實(shí)際電路

204016kzxt66464pt77r77.png (206.36 KB, 下載次數(shù): 21)

204016kzxt66464pt77r77.png
回復(fù)

使用道具 舉報(bào)

板凳
ID:250518 發(fā)表于 2018-3-6 11:24 | 只看該作者
本帖最后由 迷失朋友 于 2018-3-6 19:18 編輯
wc86110 發(fā)表于 2018-3-5 13:19
軟件仿真改改就好并非實(shí)際電路

還是不行哦,還是會(huì)跳。
回復(fù)

使用道具 舉報(bào)

地板
ID:337139 發(fā)表于 2021-9-10 10:36 | 只看該作者
先調(diào)試DS18B20,然后再去調(diào)主程序控制部分,這樣可能會(huì)好點(diǎn)。
回復(fù)

使用道具 舉報(bào)

5#
ID:94031 發(fā)表于 2021-9-10 11:13 | 只看該作者
仿真的東西不要認(rèn)得太真,和實(shí)際不是一回事,有這個(gè)時(shí)間,搭電路學(xué)習(xí)更有價(jià)值。
回復(fù)

使用道具 舉報(bào)

6#
ID:844772 發(fā)表于 2021-9-10 11:34 | 只看該作者
我大致看了,因?yàn)槭悄M的,所以可以排除干擾,覺(jué)得應(yīng)該是你定時(shí)中斷導(dǎo)致的問(wèn)題,你在讀溫度的時(shí)候,要關(guān)中斷,讀完再開(kāi),它速度很快的,基本不影響計(jì)時(shí)。
就是加在 Readonechar(void) Writeonechar(uchar dat)兩個(gè)函數(shù)。
回復(fù)

使用道具 舉報(bào)

7#
ID:965016 發(fā)表于 2021-9-10 14:58 | 只看該作者
可能程序哪里有bug
回復(fù)

使用道具 舉報(bào)

8#
ID:517951 發(fā)表于 2021-9-11 11:27 | 只看該作者
仿真的東西還需用實(shí)物樣品來(lái)驗(yàn)證,仿真通過(guò)了樣品可能還會(huì)有問(wèn)題。
回復(fù)

使用道具 舉報(bào)

9#
ID:731755 發(fā)表于 2021-9-11 13:16 來(lái)自觸屏版 | 只看該作者
同意樓上的大師們,最好用實(shí)物來(lái)驗(yàn)證,我買(mǎi)的學(xué)習(xí)板,都是在板上驗(yàn)證的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区三区久久 | 国产在线播放一区二区三区 | 资源首页二三区 | 久久人人爽人人爽 | 亚洲 欧美 综合 | 久久精品欧美一区二区三区不卡 | 自拍中文字幕 | 日韩亚洲视频 | 精品久久香蕉国产线看观看亚洲 | 欧美一区二区小视频 | 亚洲美女一区 | 欧美日韩精品国产 | 成人免费一区二区 | 亚洲一区二区三区免费在线观看 | www.色综合 | 黄色一级片视频 | 伦理午夜电影免费观看 | 欧美日韩国产一区二区三区 | 成人在线一区二区 | av免费网址 | 欧美一区二区三区久久精品 | 毛片av免费在线观看 | 日本在线综合 | 亚洲高清在线免费观看 | 国产精品久久久av | 国产精品毛片一区二区三区 | 人人艹人人爽 | 2018国产大陆天天弄 | 日本三级电影在线看 | 欧美aaaaa| 国产激情偷乱视频一区二区三区 | 午夜视频网站 | 国产精品免费一区二区三区四区 | 欧美成人第一页 | 欧美成人一区二区三区 | 国产精品欧美一区二区 | 日本久久精 | 91一区二区三区 | 国产精品一区二区三级 | 久久伊人在 | 成人三级av |