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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4839|回復: 1
打印 上一主題 下一主題
收起左側

51單片機+TLC2543+熱敏電阻溫度檢測源程序加電路原理圖

[復制鏈接]
跳轉到指定樓層
樓主
經典溫度檢測程序,親測可用
電路原理圖如下:

元件清單
1)    萬用板
2)    單片機
3)    40腳IC座
4)    LCD1602液晶
5)    16P排母座
6)    16P排針
7)    TLC2543
8)    20腳ic座
9)    熱敏電阻
10)    2p排座
11)    1K電阻*2
12)    2K電阻
13)    10k電阻*2
14)    104電容
15)    10uf電容
16)    30pf電容*2
17)    12M晶振
18)    輕觸按鍵*4
19)    8550三極管
20)    蜂鳴器
21)    5mm LED燈(紅色)
22)    5mm LED燈(綠色)
23)    103電位器
24)    自鎖開關
25)    DC電源插口
26)    焊錫若干
27)    導線若干
28)    USB電源線或電池盒

單片機源程序如下:
  1. #include<reg52.h>                                 //頭文件
  2. #include<intrins.h>
  3. #include"eeprom.h"                  //調用STC89C52單片機的EEPROM控制程序
  4. #include "math.h"
  5. #define uchar unsigned char                 //宏定義
  6. #define uint unsigned int                 //宏定義
  7. #define ulong unsigned long                 //宏定義

  8. #define LCD1602_dat P0                         //LCD1602的數據傳輸IO口


  9. sbit LCD1602_rs = P2^5; //LCD1602命令數據控制IO
  10. sbit LCD1602_rw = P2^6; //LCD1602讀寫IO控制
  11. sbit LCD1602_e  = P2^7;  //數據脈沖輸入

  12. sbit beep=P2^4;         //蜂鳴器IO
  13. sbit led_1=P2^1; //超上限指示燈
  14. sbit led_2=P2^0; //超下限指示燈

  15. sbit key_1=P3^2;//設置按鍵
  16. sbit key_2=P3^3;//加按鍵
  17. sbit key_3=P3^4;//減按鍵


  18. sbit TCL2543_EOC  = P1^0;         //轉換結束標志IO口
  19. sbit TCL2543_CLK  = P1^1;        //I/O時鐘輸入
  20. sbit TCL2543_ADIN = P1^2;         //串行數據輸入端
  21. sbit TCL2543_DOUT = P1^3;  //串行數據輸出端
  22. sbit TCL2543_CS   = P1^4;         //片選腳IO


  23. float zhi;        //暫存讀取的輸入變量

  24. int temp;        //讀取DS18B20的溫度數據
  25. char temp_h,temp_l;        //溫度上下限制存儲變量
  26. uchar state,ms;           //系統設置項變量、50ms定時變量

  27. bit s1,beep1;        //設置閃爍標志位、報警標志位

  28. ulong AD,AD_Data=0;
  29. uint num;

  30. void delay(uint T)                //系統延時程序
  31. {
  32.         while(T--);
  33. }


  34. /******************把數據保存到單片機內部eeprom中******************/
  35. void write_eeprom()
  36. {
  37.         SectorErase(0x2000);                          //清空
  38.         byte_write(0x2000,temp_h);
  39.         byte_write(0x2001,temp_l);
  40.         byte_write(0x2060,a_a);        
  41. }

  42. /******************把數據從單片機內部eeprom中讀出來*****************/
  43. void read_eeprom()
  44. {
  45.         temp_h=byte_read(0x2000);
  46.         temp_l=byte_read(0x2001);
  47.         a_a = byte_read(0x2060);
  48. }

  49. /**************開機自檢eeprom初始化*****************/
  50. void init_eeprom()
  51. {
  52.         read_eeprom();
  53.         if(a_a != 1||key_2==0)                //新的單片機初始單片機內問eeprom
  54.         {
  55.                 temp_h=35;
  56.                 temp_l=15;
  57.                
  58.                 a_a = 1;
  59.                 write_eeprom();           //保存數據
  60.         }        
  61. }



  62. // 其中 port 為通道: 通道0:port = 0x01 通道1:port = 0x02 通道2:port = 0x04 ...
  63. //    片子操作文本地址    http://wenku.baidu.com/link?url=WTp8rj93fYDbqM6kYbynkqTrI5MGQFQGtgk6aDrMMdfcB0K2Q9HIrVOs-SSSCLUMOKLOS31ENJAadBSdrVMHg_YxXPYcXWC7T0rb-rINptW
  64. uint read2543(unsigned char port) //讀取TCL2543對應模擬輸入口的AD數據,并返回數據
  65. {  
  66.         unsigned int i;  //上電時,EOC=“1”,CS=“1”
  67.         uint ad_value=0;  
  68.         TCL2543_CLK=0;   
  69.         TCL2543_CS=0;   //使能TCL2543片選
  70.         TCL2543_EOC=1;   
  71.         port<<=4;   
  72.         for(i=0;i<12;i++)      //讀取12位的模擬量的數字數據
  73.         {  
  74.                 if(TCL2543_DOUT) ad_value|=0x01;  //前次轉換結果的MSB即A11位數據輸出到Dout供讀數  
  75.                 TCL2543_ADIN=(bit)(port&0x80);   
  76.                 TCL2543_CLK=1;    //
  77.                 _nop_();  
  78.                 _nop_();   
  79.                 _nop_();  
  80.                 TCL2543_CLK=0;   
  81.                 _nop_();   
  82.                 _nop_();  
  83.                 _nop_();  
  84.                 port=port<<1;  
  85.                 ad_value=ad_value<<1;   
  86.         }
  87.         TCL2543_CS=1;   //鎖定片子
  88.         ad_value=ad_value>>1;   
  89.         return ad_value;          //返回讀取的AD值
  90. }
  91. /********************************************************************
  92. * 名稱 : LCD1602_write(uchar order,dat)
  93. * 功能 : 1602寫如數據函數
  94. * 輸入 : 輸入的命令值
  95. * 輸出 : 無
  96. ***********************************************************************/
  97. void LCD1602_write(uchar order,dat)                                  //1602 一個字節  處理
  98. {
  99.     LCD1602_e=0;
  100.     LCD1602_rs=order;
  101.     LCD1602_dat=dat;
  102.     LCD1602_rw=0;
  103.     LCD1602_e=1;
  104.     delay(1);
  105.     LCD1602_e=0;                                                                                                                                                                                                     
  106. }
  107. /********************************************************************
  108. * 名稱 : LCD1602_writebye(uchar *prointer)
  109. * 功能 : 1602寫入數據函數  指針式
  110. * 輸入 : 輸入的命令值
  111. * 輸出 : 無
  112. ***********************************************************************/
  113. void LCD1602_writebyte(uchar *prointer)                                   //1602 字符串    處理
  114. {
  115.     while(*prointer!='\0')
  116.     {
  117.         LCD1602_write(1,*prointer);
  118.         prointer++;
  119.     }
  120. }
  121. /********************************************************************
  122. * 名稱 : LCD1602_cls()
  123. * 功能 : 初始化1602液晶
  124. * 輸入 : 無
  125. * 輸出 : 無
  126. ***********************************************************************/
  127. void LCD1602_cls()                                                                         //1602 初始化
  128. {
  129.         LCD1602_write(0,0x01);     //1602 清屏 指令
  130.         delay(1500);
  131.         LCD1602_write(0,0x38);     // 功能設置 8位、5*7點陣
  132.         delay(1500);
  133.         LCD1602_write(0,0x0c);     //設置 光標   不顯示開關、不顯示光標、字符不閃爍
  134.         LCD1602_write(0,0x06);
  135.         LCD1602_write(0,0xd0);
  136.         delay(1500);
  137. }

  138. /********************************************************************
  139. * 名稱 : show()
  140. * 功能 : LCD1602液晶顯示程序
  141. * 輸入 : 無
  142. * 輸出 : 無
  143. ***********************************************************************/
  144. void show()                        //顯示數據
  145. {

  146.                 LCD1602_write(0,0x80);                   //顯示位置設定
  147.                 LCD1602_writebyte("Temp:");                //顯示當前溫度值
  148.                 if(temp>=0)                         //顯示溫度整數部分
  149.                 {
  150.                            if(temp>999)LCD1602_write(1,0x30+temp/1000%10);           
  151.                         else LCD1602_writebyte(" ");
  152.                         if(temp>99)LCD1602_write(1,0x30+temp/100%10);
  153.                         else LCD1602_writebyte(" ");
  154.                         LCD1602_write(1,0x30+temp/10%10);
  155.                         LCD1602_writebyte(".");
  156.                            LCD1602_write(1,0x30+temp%10);
  157.                 }else
  158.                 {
  159.                         LCD1602_writebyte("-");          //顯示溫度負數部分
  160.                         if(temp*-1>99)LCD1602_write(1,0x30+(temp*-1)/10%10);
  161.                         else LCD1602_writebyte(" ");
  162.                         LCD1602_write(1,0x30+(temp*-1)%10);        
  163.                         LCD1602_writebyte(".");
  164.                            LCD1602_write(1,0x30+temp%10);
  165.                 }
  166.                 LCD1602_write(1,0xdf);
  167.                 LCD1602_writebyte("C  ");



  168.                  LCD1602_write(0,0xC0);         //第二行顯示溫度上下限值
  169.                 LCD1602_writebyte("H:");
  170.                 if(state==1&&s1==1)                  //對應設置項設置時閃爍控制   //上限
  171.                 {
  172.                         LCD1602_writebyte("   ");
  173.                 }else                                           //顯示上限值
  174.                 {
  175.                         if(temp_h>=0)
  176.                         {
  177.                                    if(temp_h>99)LCD1602_write(1,0x30+temp_h/100%10);
  178.                                 else LCD1602_writebyte(" ");
  179.                                 if(temp_h>9)LCD1602_write(1,0x30+temp_h/10%10);
  180.                                 else LCD1602_writebyte(" ");
  181.                                 LCD1602_write(1,0x30+temp_h%10);
  182.                         }else
  183.                         {
  184.                                 LCD1602_writebyte("-");
  185.                                 if(temp_h*-1>9)LCD1602_write(1,0x30+(temp_h*-1)/10%10);
  186.                                 else LCD1602_writebyte(" ");
  187.                                 LCD1602_write(1,0x30+(temp_h*-1)%10);        
  188.                         }
  189.                 }
  190.                 LCD1602_write(1,0xdf);
  191.                 LCD1602_writebyte("C L:");
  192.                 if(state==2&&s1==1)          //對應設置項設置時閃爍控制   //下限
  193.                 {
  194.                         LCD1602_writebyte("   ");
  195.                 }else
  196.                 {
  197.                         if(temp_l>=0)                  //顯示下限值
  198.                         {
  199.                                    if(temp_l>99)LCD1602_write(1,0x30+temp_l/100%10);
  200.                                 else LCD1602_writebyte(" ");
  201.                                 if(temp_l>9)LCD1602_write(1,0x30+temp_l/10%10);
  202.                                 else LCD1602_writebyte(" ");
  203.                                 LCD1602_write(1,0x30+temp_l%10);
  204.                         }else
  205.                         {
  206.                                 LCD1602_writebyte("-");
  207.                                 if(temp_l*-1>9)LCD1602_write(1,0x30+(temp_l*-1)/10%10);
  208.                                 else LCD1602_writebyte(" ");
  209.                                 LCD1602_write(1,0x30+(temp_l*-1)%10);        
  210.                         }
  211.                 }
  212.                 LCD1602_write(1,0xdf);
  213.                 LCD1602_writebyte("C");
  214.         
  215. }

  216. /********************************************************************
  217. * 名稱 : proc()
  218. * 功能 : 系統指示燈與報警處理
  219. * 輸入 : 無
  220. * 輸出 : 無
  221. ***********************************************************************/
  222. void proc()
  223. {
  224.         if(temp>temp_h*10)         //如果當前溫度高于上限溫度
  225.         {
  226.                 led_1=0;          //對應指示燈點亮
  227.         }else                        //否則  熄滅
  228.         {
  229.                 led_1=1;         
  230.         }
  231.         if(temp<temp_l*10)        //如果當前溫度低于下限溫度
  232.         {
  233.                 led_2=0;          //對應指示燈點亮
  234.         }else                          //否則  熄滅
  235.         {
  236.                 led_2=1;        
  237.         }

  238.         if(temp>temp_h*10||temp<temp_l*10)         //如果當前溫度 值不處于  上下限溫度之間  這報警標志位值1   反之  置0   
  239.         {
  240.                 beep1=1;  //開始報警
  241.         }else
  242.         {
  243.                 beep1=0;  //停止報警
  244.         }
  245. }

  246. /********************************************************************
  247. * 名稱 : key()
  248. * 功能 : 系統控制按鍵控制檢測程序
  249. * 輸入 : 無
  250. * 輸出 : 無
  251. ***********************************************************************/
  252. void key()
  253. {

  254.         if(!key_1)        //判斷按鍵是否按下
  255.         {
  256.                 delay(888);         //延時去抖
  257.                 if(!key_1)        //再次判斷按鍵是否按下
  258.                 {
  259.                         state=(state+1)%3;                //切換設置項
  260.                         while(!key_1);                   //按鍵判斷釋放
  261.                 }
  262.         }
  263.         if(state!=0)                //如果系統非設置狀態   則
  264.         {
  265.                 if(!key_2)                //判斷按鍵是否按下//如果加按鍵按下  
  266.                 {
  267.                         delay(888);           //延時去抖
  268.                         if(!key_2)        //再次判斷按鍵是否按下
  269.                         {
  270.                                 while(!key_2) show();  //按鍵判斷釋放
  271.                                 switch(state) //判斷當前設置項
  272.                                 {
  273.                                         case 1:                                  //如果是上限設置
  274.                                         if(temp_h<99)temp_h++;
  275.                                         break;
  276.                                         case 2:                     //如果是下限設置
  277.                                         if(temp_h>temp_l+1)temp_l++;        
  278.                                         break;
  279.                                 }
  280.                                 write_eeprom();
  281.                         }
  282.                 }
  283.                 if(!key_3)        //判斷按鍵是否按下  如果減按鍵按下
  284.                 {
  285.                         delay(888);         //延時去抖
  286.                         if(!key_3)         //再次判斷按鍵是否按下
  287.                         {
  288.                                 while(!key_3) show();  //按鍵判斷釋放
  289.                                 switch(state)         //判斷當前設置項
  290.                                 {
  291.                                         case 1:                             //如果是上限設置
  292.                                         if(temp_h>temp_l+1)temp_h--;
  293.                                         break;
  294.                                         case 2:                           //如果是下限設置
  295.                                         if(temp_l>-40)temp_l--;
  296.                                         break;
  297.                                 }
  298.                                 write_eeprom();
  299.                         }
  300.                 }
  301.         }
  302. }


  303. /********************************************************************
  304. * 名稱 : float TempCalculate(float Rx,float B,float Revise,float BasicRx)
  305. * 功能 : 根據當前熱敏電阻的阻值、以及參數、通過Sin曲線求出當前系統的溫度值  并返回浮點型的溫度值
  306. * 輸入 : 無
  307. * 輸出 : 無
  308. ***********************************************************************/
  309. float TempCalculate(float Rx,float B,float Revise,float BasicRx){
  310. /*

  311. Rx:  熱敏電阻當前阻值
  312. B:   熱敏電阻參數B值
  313. Revise:  校正溫度
  314. BasicRx:  熱敏電阻25度時電阻(標稱電阻數值)


  315. 返回: 攝氏度

  316. */  


  317.     Rx = Rx / BasicRx;
  318.    
  319.     Rx = log(Rx);
  320.    
  321.     Rx = (Rx) / B;
  322.    
  323.     Rx = Rx + 0.003356;
  324.     Rx = 1 / Rx;
  325.     Rx = Rx - 273.13;  
  326.     Rx = Rx + Revise;
  327.    
  328.    
  329.     return Rx;
  330.   
  331. }
  332. /********************************************************************
  333. * 名稱 : void main()
  334. * 功能 : 系統主程序
  335. * 輸入 : 無
  336. * 輸出 : 無
  337. ***********************************************************************/
  338. void main()
  339. {
  340.         float Rad;         //生成運算暫存變量
  341.         LCD1602_cls();//LCD1602初始化程序調用
  342.         TMOD=0x01;         //定時器0初始化配置
  343.         TH0=0x4c;
  344.         TL0=0x00;         //定時初值賦值
  345.         ET0=1;                //定時器0中斷打開
  346.         TR0=1;           //打開定時器0
  347.         EA=1;                //打開總中斷
  348.         init_eeprom();
  349.         while(1)
  350.         {
  351.                 num++;
  352.                 AD=read2543(0);
  353.                 AD_Data=AD_Data+AD;
  354.                 if(num>=30)
  355.                 {
  356.                         num=0;
  357.                         AD_Data=AD_Data/30;
  358.                         zhi=(float)AD_Data/819.0;  //計算電壓值
  359. //                zhi=(float)read2543(0)/819.0;  //計算電壓值
  360.                 Rad=zhi/((5.0-zhi)/10000.0);   //計算熱敏電阻當前阻值
  361.                 //temp=(int)((temp * 0.2) +(TempCalculate(Rad,600.0,0,630) * 0.5)*10);//求出當前系統的當前溫度
  362.                         temp=(int)((0.19*Rad-86)*10);//求出當前系統的當前溫度
  363.                 //        temp=Rad;
  364.                         AD_Data=0;
  365.                 }

  366.                 show();                 //顯示函數
  367.                 key();                 //按鍵處理程序
  368.                 proc();                 //超限處理程序
  369.         }
  370. }

  371. /********************************************************************
  372. * 名稱 : void UART_1() interrupt 1
  373. * 功能 : 定時器0中斷服務程序
  374. * 輸入 : 無
  375. * 輸出 : 無
  376. ***********************************************************************/
  377. void UART_1() interrupt 1
  378. {
  379.         TH0=0x4c;        //重新賦值
  380.         TL0=0x00;
  381.         ms++;          //50ms定時變量計時
  382.         if(ms%5==0)          //區分250ms定時
  383.         {
  384.                 s1=!s1;                //閃爍標志位切換
  385.                 if(beep1==1) beep=!beep;  //判斷報警標志位是否報警   
  386.                 else        beep=1;
  387.         }

  388.         if(ms>19)        //1s定時
  389.         {
  390.                 ms=0;               
  391.         }
  392. }
復制代碼

所有資料51hei提供下載:
溫度檢測資料.7z (46.05 KB, 下載次數: 104)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:849468 發表于 2021-11-22 18:52 來自手機 | 只看該作者
想問問求出當前溫度那個公式哪來的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: chinese中国真实乱对白 | 国产91色在线 | 亚洲 | 影音先锋久久 | 激情小视频 | 国产精品久久久久久妇女6080 | 超碰在线影院 | 日本视频在线 | 日韩一区二区三区在线观看 | 亚洲激情视频在线 | 亚洲免费在线视频 | 国产成人午夜电影网 | 久久国产成人 | 精品国产不卡一区二区三区 | 亚洲成人二区 | 久久精品免费看 | 国产精品不卡一区 | 免费成人高清在线视频 | 欧美一区二区在线 | 久精品久久 | 国产精品一区一区三区 | 91玖玖 | 亚洲福利网 | 国产一区二区欧美 | 成av在线 | 在线91 | 91精品国产一区二区三区 | 99re在线视频免费观看 | 国产日韩精品一区二区 | 欧美专区日韩专区 | 中文字幕一区二区三区日韩精品 | 91xxx在线观看 | 69性欧美高清影院 | 日韩激情免费 | 中文字幕第7页 | 欧美一区二区三区在线观看 | 中文字幕av一区二区三区 | 久久久中文 | 国产精品久久久久久久久久 | 青青草一区二区 | 男女视频免费 | 天天干天天干 |