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

QQ登錄

只需一步,快速開始

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

ds18b20溫度檢測(cè)程序帶電路圖和pcb文件

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:66060 發(fā)表于 2016-4-24 09:39 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
ds18b20電路圖和pcb文件:

溫度檢測(cè)的所有資料:

全部資料(壓縮包)下載:
溫度檢測(cè)程序帶電路圖仿真.rar (741.23 KB, 下載次數(shù): 99)

  1. #include <STC15F2K60S2.H>
  2. #include "intrins.h"

  3. #define FOSC    18432000L
  4. #define BAUD    9600

  5. typedef unsigned char BYTE;
  6. typedef unsigned int WORD;

  7. #define     URMD    0           //0:使用定時(shí)器2作為波特率發(fā)生器
  8.                                 //1:使用定時(shí)器1的模式0(16位自動(dòng)重載模式)作為波特率發(fā)生器
  9.                                 //2:使用定時(shí)器1的模式2(8位自動(dòng)重載模式)作為波特率發(fā)生器

  10. sfr ADC_LOW2    =   0xBE;           //ADC低2位結(jié)果

  11. #define SDAT                 P00                         //595數(shù)據(jù)口
  12. #define SHCP                 P01                                //595時(shí)鐘口
  13. #define STCP                 P02                                //595數(shù)據(jù)輸出脈沖口
  14. #define K1                   P33
  15. #define K2                   P34
  16. #define K3                   P35
  17. #define K4                   P36
  18. #define delay1                 P07                                //繼電器1
  19. #define delay2                 P06                                //繼電器2
  20. #define DPL                 14                                //顯示L時(shí)數(shù)據(jù)下標(biāo)
  21. #define DPH                 12                                //顯示H時(shí)數(shù)據(jù)下標(biāo)
  22. #define DPt                 15                                //顯示t時(shí)數(shù)據(jù)下標(biāo)

  23. #define ADC_POWER   0x80            //ADC電源控制位
  24. #define ADC_FLAG    0x10            //ADC完成標(biāo)志
  25. #define ADC_START   0x08            //ADC起始控制位
  26. #define ADC_SPEEDLL 0x00            //540個(gè)時(shí)鐘
  27. #define ADC_SPEEDL  0x20            //360個(gè)時(shí)鐘
  28. #define ADC_SPEEDH  0x40            //180個(gè)時(shí)鐘
  29. #define ADC_SPEEDHH 0x60            //90個(gè)時(shí)鐘

  30. unsigned char code dispTab[]={
  31. //0   1    2        3         4          5           6        7         8          9           -    滅         H          h           L        t
  32. 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0xff,0x89,0x8b,0xc7,0x87};
  33. unsigned int ad_value[11]={0};
  34. unsigned char testflag=0,testnumber=0;
  35. //按鍵檢測(cè)標(biāo)志位
  36. bit flag1,flag2,flag3,flag4;
  37. //按鍵值  0 1 2 3 4
  38. unsigned char key_value=0;
  39. BYTE ch= 7;                                                         //ADC通道號(hào)
  40. unsigned char data dispBuf[4]={1,2,3,4};
  41. //  0:等待運(yùn)行狀態(tài)   1:設(shè)定下限報(bào)警   2:設(shè)定工作溫度   3:設(shè)定上限報(bào)警   4:工作狀態(tài)
  42. unsigned char system_status=0;
  43. //定義變量      下限報(bào)警         上限報(bào)警           工作溫度                   當(dāng)前溫度
  44. unsigned int l_limit_alarm=0,h_limit_alarm=3000,working_temperature=2200,current_temperature=0;
  45. //下限報(bào)警標(biāo)志   上限報(bào)警標(biāo)志
  46. bit LL_flag,HH_flag;

  47. void InitUart();
  48. void SendData(BYTE dat);
  49. void Delay(WORD n);
  50. void InitADC();
  51. void disp(unsigned char data * dispBuf,unsigned char n);


  52. void key_processing()
  53. {
  54.         static unsigned int set_value=0;
  55.          if(system_status==0)
  56.          {
  57.                  if(key_value==1){system_status=1;set_value=l_limit_alarm/10;}
  58.                  if(key_value==4){system_status=4;}
  59.                  key_value=0;
  60.                  disp(dispBuf, 4);
  61.          }
  62.          if(system_status==1)
  63.          {
  64.                  if(key_value==1)
  65.                 {
  66.                         system_status=2;
  67.                         l_limit_alarm=set_value*10;
  68.                         set_value=working_temperature/10;
  69.                 }
  70.                 if(key_value==2){if(set_value<300)set_value++;}
  71.                 if(key_value==3){if(set_value>0)  set_value--;}
  72. //                if(system_status!=2)
  73. //                {
  74.                         dispBuf[0]=DPL;
  75.                         dispBuf[1]=set_value/100;
  76.                         dispBuf[2]=set_value%100/10;
  77.                         dispBuf[3]=set_value%10;
  78. //                }
  79.                 key_value=0;
  80.         }
  81.         if(system_status==2)
  82.         {
  83.                 if(key_value==1)
  84.                         {
  85.                                 system_status=3;
  86.                                 working_temperature=set_value*10;
  87.                                 set_value=h_limit_alarm/10;
  88.                         }
  89.                 if(key_value==2){if(set_value<300)set_value++;}
  90.                 if(key_value==3){if(set_value>0)  set_value--;}
  91. //                if(system_status!=3)
  92. //                {
  93.                         dispBuf[0]=DPt;
  94.                         dispBuf[1]=set_value/100;
  95.                         dispBuf[2]=set_value%100/10;
  96.                         dispBuf[3]=set_value%10;
  97. //                }
  98.                 key_value=0;
  99.         }
  100.         if(system_status==3)
  101.         {
  102.                 if(key_value==1)
  103.                         {
  104.                         system_status=0;
  105.                         h_limit_alarm=set_value*10;
  106.                         }
  107.                 if(key_value==2){if(set_value<300)set_value++;}
  108.                 if(key_value==3){if(set_value>0)  set_value--;}
  109. //                if(system_status!=0)
  110. //                {
  111.                         dispBuf[0]=DPH;
  112.                         dispBuf[1]=set_value/100;
  113.                         dispBuf[2]=set_value%100/10;
  114.                         dispBuf[3]=set_value%10;
  115. //                }
  116.                 key_value=0;
  117.         }
  118.         if(system_status==4)
  119.         {
  120.                 if(key_value==4)system_status=0;
  121.         }                                                               
  122.         key_value=0;
  123. }
  124. void key_test()
  125. {
  126.          if(K1==0)flag1=1;
  127.          if(K2==0)flag2=1;
  128.          if(K3==0)flag3=1;
  129.          if(K4==0)flag4=1;
  130.          if((K1==1)&&(flag1==1)){key_value=1;flag1=0;}
  131.          if((K2==1)&&(flag2==1)){key_value=2;flag1=0;}
  132.          if((K3==1)&&(flag3==1)){key_value=3;flag1=0;}
  133.          if((K4==1)&&(flag4==1)){key_value=4;flag1=0;}
  134. }
  135. void calculate_temperature()
  136. {
  137.         unsigned char i=0;
  138.         ad_value[10]=0;
  139.         for(i=0;i<10;i++)ad_value[10]+=ad_value[i];
  140.         ad_value[10]/=10;
  141.         current_temperature=ad_value[10]=ad_value[10]*3.0435;
  142.         if(system_status==0||system_status==4)
  143.         {
  144.                 dispBuf[0]=ad_value[10]/100;
  145.                 dispBuf[1]=ad_value[10]%1000/100;
  146.                 dispBuf[2]=ad_value[10]%100/10;
  147.                 dispBuf[3]=ad_value[10]%10;
  148.         }
  149. }


  150. void Timer0Init(void)
  151. {
  152.         AUXR |= 0x80;
  153.         TMOD &= 0xF0;
  154.         TL0 = 0x00;
  155.         TH0 = 0x28;
  156.         TF0 = 0;
  157.         TR0 = 1;
  158.         ET0=1;
  159. }
  160. void tm0_isr() interrupt 1 using 1
  161. {
  162.         static unsigned char f=0;
  163.         f++;
  164.         if(f%10==0)ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  165.         if(f==200)
  166.         {
  167.         if(LL_flag)P25^=1;
  168.         else P25=1;
  169.         if(HH_flag)P26^=1;
  170.         else P26=1;
  171.         f=0;
  172.         }
  173. }

  174. void sendData_595(unsigned char sendDat)
  175. {        unsigned char i;
  176.          for(i=0;i<8;i++)
  177.         {        if((sendDat&0x01)==0) SDAT=0;
  178.                  else  SDAT=1;
  179.                 _nop_();
  180.                 SHCP=0;
  181.                 _nop_();
  182.                 SHCP=1;
  183.                 sendDat=sendDat>>1;
  184.         }
  185. }
  186. void disp(unsigned char data * dispBuf,unsigned char n)
  187. {        unsigned char c,i;
  188.          for(i=0;i<n;i++)
  189.         {c=dispBuf[i];
  190.          if(i!=2)
  191.          sendData_595(dispTab[c]);
  192.          else sendData_595(dispTab[c]&0x7f);
  193.         }
  194.         STCP=0;
  195.         STCP=1;
  196. }

  197. /*----------------------------
  198. ADC中斷服務(wù)程序
  199. ----------------------------*/
  200. void adc_isr() interrupt 5 using 2
  201. {
  202.     ADC_CONTR &= !ADC_FLAG;         //清除ADC中斷標(biāo)志

  203.     SendData(ch);                   //顯示通道號(hào)
  204.     SendData(ADC_RES);              //讀取高8位結(jié)果并發(fā)送到串口

  205.     SendData(ADC_LOW2);           //顯示低2位結(jié)果

  206.     ad_value[testnumber]=ADC_RES;
  207.         ad_value[testnumber]<<=2;
  208.         ad_value[testnumber]+=ADC_LOW2;
  209.         testnumber++;
  210.         if(testnumber>=10) testnumber=0;
  211.         testflag=1;
  212. }

  213. /*----------------------------
  214. 初始化ADC
  215. ----------------------------*/
  216. void InitADC()
  217. {
  218.     P1ASF = 0xff;                   //設(shè)置P1口為AD口
  219.     ADC_RES = 0;                    //清除結(jié)果寄存器
  220.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
  221.     Delay(2);                       //ADC上電并延時(shí)
  222. }

  223. /*----------------------------
  224. 初始化串口
  225. ----------------------------*/
  226. void InitUart()
  227. {
  228.     SCON = 0x5a;                //設(shè)置串口為8位可變波特率
  229. #if URMD == 0
  230.     T2L = 0xd8;                 //設(shè)置波特率重裝值
  231.     T2H = 0xff;                 //115200 bps(65536-18432000/4/115200)
  232.     AUXR = 0x14;                //T2為1T模式, 并啟動(dòng)定時(shí)器2
  233.     AUXR |= 0x01;               //選擇定時(shí)器2為串口1的波特率發(fā)生器
  234. #elif URMD == 1
  235.     AUXR = 0x40;                //定時(shí)器1為1T模式
  236.     TMOD = 0x00;                //定時(shí)器1為模式0(16位自動(dòng)重載)
  237.     TL1 = 0xd8;                 //設(shè)置波特率重裝值
  238.     TH1 = 0xff;                 //115200 bps(65536-18432000/4/115200)
  239.     TR1 = 1;                    //定時(shí)器1開始啟動(dòng)
  240. #else
  241.     TMOD = 0x20;                //設(shè)置定時(shí)器1為8位自動(dòng)重裝載模式
  242.     AUXR = 0x40;                //定時(shí)器1為1T模式
  243.     TH1 = TL1 = 0xfb;           //115200 bps(256 - 18432000/32/115200)
  244.     TR1 = 1;
  245. #endif
  246. }

  247. /*----------------------------
  248. 發(fā)送串口數(shù)據(jù)
  249. ----------------------------*/
  250. void SendData(BYTE dat)
  251. {
  252.     while (!TI);                    //等待前一個(gè)數(shù)據(jù)發(fā)送完成
  253.     TI = 0;                         //清除發(fā)送標(biāo)志
  254.     SBUF = dat;                     //發(fā)送當(dāng)前數(shù)據(jù)
  255. }

  256. /*----------------------------
  257. 軟件延時(shí)
  258. ----------------------------*/
  259. void Delay(WORD n)
  260. {
  261.     WORD x;

  262.     while (n--)
  263.     {
  264.         x = 5000;
  265.         while (x--);
  266.     }
  267. }

  268. /*-----------------------------------------
  269. 主函數(shù)
  270. ------------------------------------------*/
  271. void main()
  272. {
  273.         unsigned char i=0;
  274.         InitUart();                                  //初始化串口
  275.         InitADC();                                  //初始化ADC
  276.         Timer0Init();                          
  277.         IE |=0xa0;                                  //使能ADC中斷   開始AD轉(zhuǎn)換
  278.         disp(dispBuf,4);
  279.         while(1)
  280.         {
  281.                 key_test();
  282.                 if(key_value!=0){key_processing();}
  283.                 if(testflag==1)
  284.                         {
  285.                                         testflag=0;
  286.                                         calculate_temperature();
  287.                                         disp(dispBuf, 4);
  288.                                         if(system_status==4)
  289.                                         {
  290.                                                 if(current_temperature<l_limit_alarm)
  291.                                                         {LL_flag=1;delay1=1;}                                //下限報(bào)警標(biāo)志位   下限報(bào)警繼電器吸合
  292.                                                 else {LL_flag=0;delay1=0;}                                //清除報(bào)警標(biāo)志位   釋放繼電器
  293.                                                 if(current_temperature>h_limit_alarm)        
  294.                                                         {HH_flag=1;delay2=1;}                                //上限報(bào)警標(biāo)志位   上限報(bào)警繼電器吸合
  295.                                                 else {HH_flag=0;delay2=0;}                                //清除報(bào)警標(biāo)志位   釋放繼電器
  296.                                         }
  297.                         }
  298.         }
  299. }
復(fù)制代碼

評(píng)分

參與人數(shù) 2黑幣 +51 收起 理由
追光的人 + 1
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:102702 發(fā)表于 2017-5-17 11:38 | 只看該作者
樓主有制作過實(shí)物嗎?帶繼電器開關(guān)的嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:309882 發(fā)表于 2018-4-17 11:03 | 只看該作者
學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

地板
ID:322933 發(fā)表于 2018-10-18 16:47 | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

5#
ID:412814 發(fā)表于 2018-11-3 19:56 | 只看該作者
挺好的資料,下載看看,感謝樓主
回復(fù)

使用道具 舉報(bào)

6#
ID:432346 發(fā)表于 2018-11-24 14:08 | 只看該作者

感謝樓主分享!
回復(fù)

使用道具 舉報(bào)

7#
ID:432346 發(fā)表于 2018-11-24 14:09 | 只看該作者
謝謝樓主的分享!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表