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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

恒流PT100溫度檢測報警裝置單片機程序與仿真 測溫范圍-99~400℃

  [復制鏈接]
跳轉到指定樓層
樓主
基于PT100的溫度檢測報警裝置仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


運放電源電壓必須得6V,否則輸出電壓不準。 AD轉換ADC0832的電壓需要為5V
數字式溫度計  測溫范圍,-99~400℃

(-100度測試)RV1=60Ω    顯示溫度-99.2度 誤差0.5度
(0度測試)RV1=100Ω    顯示溫度0.5度 ,誤差0.5度
(100度測試)RV1=140Ω    顯示溫度103.5度,誤差0.5度
(200度左右測試)RV1=180Ω    顯示溫度214.2度,誤差約0.5度
(300度左右測試)RV1=210Ω    顯示溫度292.8度,誤差約1度
(380度左右測試)RV1=240Ω    顯示溫度380度,誤差約0.5度

單片機源程序如下:
  1. /*一、主要功能:
  2. (1)PT100數字溫度計.
  3. (2)采集測溫范圍為-99 ℃~400 ℃.
  4. (3) 精度4度,誤差+-2度.
  5. (4)顯示模塊,采用4個LED數碼管顯示.
  6. (5) 蜂鳴器報警溫度大于50度報警。
  7. */
  8. #include<reg52.h>
  9. #include<intrins.h>
  10. #define uint unsigned int
  11. #define uchar unsigned char
  12. //-----------------------
  13. sbit SEG1=P2^0;                    //段碼位1
  14. sbit SEG2=P2^2;                    //段碼位2  
  15. sbit SEG3=P2^4;                    //段碼位3
  16. sbit SEG4=P2^6;                    //段碼位4

  17. sbit CS  = P1^0; //ADC0832片選
  18. sbit CLK = P1^1; //ADC0832時鐘
  19. sbit DIO = P1^2; //輸入輸出

  20. sbit BUZ = P3^0; //蜂鳴器報警設置

  21. uchar dispaly[3];         //顯示緩沖
  22. uchar tem[11]={10,10,20,13,11,11,15,21,18,29,11};
  23. uchar  ng;                                  //負號標志
  24. uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x58,0x00,0x40};//共陰數碼碼表01000000
  25.                  /* 0    1    2   3    4    5    6    7    8    9     C   無*/
  26. uchar Display_Digit[]={0,0,0,0};//待顯示的各溫度數位
  27. //延時
  28. //************************************************************************/
  29. // 函數: LCD_Delay()
  30. // 描述: 延時t ms函數
  31. // 參數: t
  32. // 返回: 無
  33. // 備注: 12MHZ       t=1延時時間約1ms
  34. // 版本:  2011/01/01      First version
  35. //************************************************************************/
  36. void Delay_ms(unsigned int t)//延時1ms
  37. {
  38.         unsigned int i,j;
  39.         for(i=0;i<t;i++)
  40.         for(j=0;j<120;j++)
  41.         ;
  42. }
  43. /*******************
  44. 中值濾波函數
  45. *********************/
  46. uchar median(uchar *dat,uchar num_d)  //需要排序的數組
  47. { uchar i,j,temp;
  48. for (i=0;i<num_d;i++) //采用冒泡法對采樣溫度進行排序
  49.         for (j=0;j<num_d-i;j++)
  50.         {
  51.                 if (dat[i]>dat[i+1])
  52.                 {
  53.                         temp=dat[i];
  54.                         dat[i]=dat[i+1];
  55.                         dat[i+1]=temp;
  56.                 }
  57.         }
  58. return(dat[(num_d-1)/2]); //取中值并返回
  59. }
  60. /*******************電阻值計算函數*********************/
  61. float account_res(void)
  62. {        uchar temp;
  63.         float temp_r,d;

  64.         temp=median(tem,11); //利用中值法求取中間值
  65.         d = temp*500.0/256;//采集到的PT100上的壓降
  66.         temp_r=d*3135/4096;//計算出電阻值 3300是R1
  67.         return(temp_r);
  68. }

  69. /*****************計算溫度函數*******************/
  70. float temperature(void)
  71. { float temp1,T_out;
  72. uchar temp2;

  73. temp1=account_res(); //計算Pt100阻值
  74. temp2=(uint)temp1; //取Pt100阻值高位
  75. if(temp2<100){ng=1;}else{ng=0;}//負溫度
  76. if(temp2<60) T_out=777;
  77.   else if(temp2<100) T_out=256.02-2.558*temp1; //若阻值在小于0℃到負99之間
  78.   else if(temp2<139) T_out=2.558*temp1-256.02; //若阻值在0~100℃之間
  79.   else if(temp2<177) T_out=2.637*temp1-267.01; //若阻值在100~200℃之間
  80.   else if(temp2<214) T_out=2.766*temp1-281.9; //若阻值在200~300℃之間
  81.   else if(temp2<250) T_out=2.865*temp1-300.94;  //若阻值在300~400℃之間
  82.   else if(temp2<260) T_out=2.81*temp1-300.94;  //若阻值在400℃之間
  83.   else if(temp2>260) T_out=777; //若阻值在大于400℃之間
  84.   return(T_out);
  85. }

  86. /*******************調整顯示數據函數*******************/
  87. void adj_t(void)
  88. {
  89.         float temp_v;
  90.         uint value;          
  91.         temp_v=10*temperature(); //利用計算溫度值
  92.         value=(uint)temp_v;
  93. if((value>500)&&(ng==0)){BUZ=0;}else{BUZ=1;}//蜂鳴器50度報警,開,關蜂鳴器

  94.         if(value==7770) //超出測量范圍
  95.         {         Display_Digit[0]=12; //顯示'E'
  96.                 Display_Digit[1]=12; //顯示'E'
  97.                 Display_Digit[2]=12; //顯示'E'
  98.                 Display_Digit[3]=12; //顯示'E'
  99.         }
  100.         else {  Display_Digit[3]=value/1000; //待顯示百位
  101.                     Display_Digit[2]=(value%1000)/100; //待顯示十位
  102.                     Display_Digit[1]=((value%1000)%100)/10; //待顯示個位
  103.                            Display_Digit[0]=(value%1000)%100%10; //待顯示小數
  104.                 if(Display_Digit[3]==0x00) { Display_Digit[3]=11; if(Display_Digit[2]==0) Display_Digit[2]=11; }
  105.         }
  106. }

  107. void DIS_SEG(void)//在LED上顯示數據
  108. {
  109.                         if(ng==1){P0=0x40;}else{P0=tab[Display_Digit[3]];}   // 數碼管顯示負數 或正的1000位
  110.                         SEG1=0;                    //片選1000位數碼管      
  111.                         Delay_ms(2);    //延時3ms
  112.             SEG1=1;                         //關閉1000位數碼管

  113.                         P0=tab[Display_Digit[2]]; //溫度100位     
  114.                         SEG2=0;                        //片選100位數碼管
  115.                         Delay_ms(2);    //延時3ms
  116.             SEG2=1;                 //關閉100位數碼管

  117.                         P0=(tab[Display_Digit[1]]+0x80); //溫度10位
  118.                         SEG3=0;                        //片選10位數碼管
  119.                         Delay_ms(2);    //延時3ms
  120.             SEG3=1;                 //關閉10位數碼管

  121.                     P0=tab[Display_Digit[0]];    //個數位
  122.                         SEG4=0;                        //片選個位數碼管
  123.                         Delay_ms(2);    //延時3ms
  124.             SEG4=1;                 //關閉個位數碼管
  125. }
  126. //------------------------------------------------------------------------
  127. //獲取指定通道的A/D轉換結果
  128. //------------------------------------------------------------------------
  129. uchar Get_AD_Result(void)
  130. {
  131.         uchar i,dat1=0,dat2=0;

  132.         CS  = 0; _nop_(); _nop_();                                                 //片選使能,低電平有效
  133.         CLK = 0; _nop_(); _nop_();                                                  //芯片時鐘輸入
  134.         DIO = 1; _nop_(); _nop_();
  135.         CLK = 1; _nop_(); _nop_();
  136.         //第1個下降沿之前,設DI=1/0
  137.         //選擇單端/差分(SGL/DIF)模式中的單端輸入模式       
  138.         CLK = 0;DIO = 1; _nop_(); _nop_();
  139.         CLK = 1;         _nop_(); _nop_();
  140.         //第2個下降沿之前,設置DI=0/1,選擇CHO/CH1

  141.         CLK = 0;DIO = 0; _nop_(); _nop_(); //通道0 內部電壓測試

  142.         CLK = 1;                 _nop_(); _nop_();
  143.         //第3個下降沿之前,設置DI=1
  144.         CLK = 0;DIO = 1; _nop_(); _nop_();
  145.    //第4-11個下降沿讀數據(MSB->LSB)
  146.         for(i=0;i<8;i++)
  147.         {
  148.                  CLK = 1; _nop_(); _nop_();
  149.                 CLK = 0; _nop_(); _nop_();
  150.                 dat1 = dat1 << 1 | DIO;               
  151.         }
  152.         //第11-18個下降沿讀數據(LSB->MSB)
  153.         for(i=0;i<8;i++)
  154.         {
  155.                 CLK = 1; _nop_(); _nop_();
  156.                 CLK = 0; _nop_(); _nop_();
  157.                  dat2 = dat2 << ((uchar)(DIO)<<i);
  158.         }
  159.         CS = 1;//取消片選一個周期結束
  160.         //如果MSB->LSB和LSB->MSB讀取的結果相同,則返回讀取的結果,否則返回0
  161.         return dat1;
  162. //        return (dat1 == dat2) ? dat1:0;//取消校驗
  163. }

  164. void main(void)
  165. {   uchar j;
  166.         BUZ=1;//關蜂鳴器
  167.         while(1)
  168.         {
  169.         tem[0]=Get_AD_Result(); //讀取溫度值存入緩沖區
  170.         tem[1]=Get_AD_Result(); //讀取溫度值存入緩沖區
  171.         tem[2]=Get_AD_Result(); //讀取溫度值存入緩沖區
  172.         tem[3]=Get_AD_Result(); //讀取溫度值存入緩沖區
  173.         tem[4]=Get_AD_Result(); //讀取溫度值存入緩沖區
  174.         tem[5]=Get_AD_Result(); //讀取溫度值存入緩沖區
  175.         tem[6]=Get_AD_Result(); //讀取溫度值存入緩沖區
  176.         tem[7]=Get_AD_Result(); //讀取溫度值存入緩沖區
  177.         tem[8]=Get_AD_Result();        //讀取溫度值存入緩沖區
  178.         tem[9]=Get_AD_Result(); //讀取溫度值存入緩沖區
  179.         tem[10]=Get_AD_Result();//讀取溫度值存入緩沖區       
  180.         adj_t();// 調整顯示數據函數//50度報警。
  181.         for(j=0;j<250;j++){DIS_SEG();}//顯示數據
  182.    }
  183. }
復制代碼

所有資料51hei提供下載:
51heiPT100.zip (125.77 KB, 下載次數: 235)


評分

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

查看全部評分

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

使用道具 舉報

來自 2#
ID:328014 發表于 2020-6-30 14:49 | 只看該作者

樓上 可以用啊,


運放電源電壓必須得6V,否則輸出電壓不準。 AD轉換ADC0832的電壓需要為5V
(-100度測試)RV1=60Ω    顯示溫度-99.2度 誤差0.5度
(0度測試)RV1=100Ω    顯示溫度0.5度 ,誤差0.5度
(100度測試)RV1=140Ω    顯示溫度103.5度,誤差0.5度
(200度左右測試)RV1=180Ω    顯示溫度214.2度,誤差約0.5度
(300度左右測試)RV1=210Ω    顯示溫度292.8度,誤差約1度
(380度左右測試)RV1=240Ω    顯示溫度380度,誤差約0.5度


回復

使用道具 舉報

板凳
ID:683006 發表于 2020-6-30 14:43 | 只看該作者
這個如何使用呢?還一不小心下了兩次,扣了兩次
回復

使用道具 舉報

地板
ID:800656 發表于 2020-7-9 21:41 | 只看該作者
?PT100在哪
回復

使用道具 舉報

5#
ID:548707 發表于 2021-5-20 17:37 | 只看該作者
大佬,請問這個有多路巡檢的嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九99久久 | 一区二区中文字幕 | 色永久| 正在播放亚洲 | 丁香五月缴情综合网 | 精品国产18久久久久久二百 | 久久成人18免费网站 | 91视频18 | 色综合激情 | 日韩成人 | 嫩草黄色影院 | 精品欧美一区二区三区久久久 | 久草欧美视频 | 欧美性生交大片免费 | 中文字幕日韩欧美一区二区三区 | 国产精品久久久久久久久久久久久 | 精品欧美一区二区精品久久 | 国产成人精品一区二 | 超碰在线播 | 亚洲一区二区三区在线 | 二区欧美 | 精品国产免费人成在线观看 | 久久午夜国产精品www忘忧草 | 久久亚| 午夜资源 | 国产精品日韩欧美一区二区 | 91在线播 | 国产四区 | 成人欧美一区二区三区色青冈 | 国产精品久久久久久亚洲调教 | 久久精品com | 日韩精品无码一区二区三区 | 99久久免费精品视频 | 在线视频国产一区 | 日日操夜夜操视频 | 美女天堂 | 成人精品毛片国产亚洲av十九禁 | 天天爽一爽 | 7777久久| 天天综合久久 | avtt国产 |