基于51单片机的ADC热敏电阻测温系统proteus仿真
生活随笔
收集整理的這篇文章主要介紹了
基于51单片机的ADC热敏电阻测温系统proteus仿真
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
硬件設計
(末尾附文件)
代碼設計
#include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit CS =P1^0; sbit CLK=P1^1; sbit DIO =P1^2; sbit K_H=P1^3; sbit K_L=P1^4; sbit LED_U=P1^5; sbit LED_D=P1^6; sbit SOUNDER=P1^7; sbit K_T =P3^1; sbit K_U =P3^2; sbit K_D =P3^3; uint i,j,m,n,H,L,T,num,date,a=0,b=0;void Delay10ms(unsigned int c) //延遲為10ms的延遲函數,用于按鍵的延遲去抖 {unsigned char a, b;for (;c>0;c--){for (b=38;b>0;b--){for (a=130;a>0;a--);}} }uchar code table[]={//共陰數碼管段碼"0~f" 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};uchar data dis_buf[4];uchar code Temp[201]={//溫度:0-200 對應的ADC值 255.9, 255.8, 255.7, 255.6, 255.5, 255.4, 255.3, 255.2, 255.1, 254.1, 253.1, 252.1, 251.0, 249.9, 248.7, 247.6, 246.4, 245.1, 243.8, 242.5, 241.1, 239.8, 238.3, 236.9, 235.4, 233.8, 232.2, 230.6, 229.0, 227.3, 225.6, 223.8, 222.0, 220.2, 218.4, 216.5, 214.6, 212.6, 210.6, 208.6, 206.6, 204.5, 202.5, 200.4, 198.2, 196.1, 193.9, 191.7, 189.5, 187.3, 185.1, 182.8, 180.6, 178.3, 176.0, 173.8, 171.5, 169.2, 166.9, 164.6, 162.3, 160.1, 157.8, 155.5, 153.2, 151.0, 148.7, 146.5, 144.3, 142.1, 139.9, 137.7, 135.6, 133.4, 131.3, 129.2, 127.1, 125.1, 123.0, 121.0, 119.1, 117.1, 115.2, 113.2, 111.4, 109.5, 107.7, 105.9, 104.1, 102.4, 100.6, 98.9 , 97.3 , 95.7 , 94.0 , 92.5 , 90.9 , 89.4 , 87.9 , 86.4 , 85.0 , 83.6 , 82.2 , 80.9 , 79.5 , 78.2 , 77.0 , 75.7 , 74.5 , 72.7 , 72.1 , 71.0 , 69.9 , 68.8 , 67.7 , 66.6 , 65.6 , 64.6 , 63.6 , 62.7 , 61.7 , 60.8 , 59.9 , 59.0 , 58.2 , 57.4 , 56.5 , 55.7 , 55.0 , 54.2 , 53.5 , 52.7 , 52.0 , 51.3 , 50.7 , 50.0 , 49.4 , 48.7 , 48.1 , 47.5 , 46.9 , 46.4 , 45.8 , 45.3 , 44.7 , 44.2 , 43.7 , 43.2 , 42.7 , 42.3 , 41.8 , 41.3 , 40.9 , 40.5 , 40.1 , 39.6 , 39.2 , 38.9 , 38.5 , 38.1 , 37.7 , 37.4 , 37.0 , 36.7 , 36.4 , 36.0 , 35.7 , 35.4 , 35.1 , 34.8 , 34.5 , 34.3 , 34.0 , 33.7 , 33.5 , 33.2 , 33.0 , 32.7 , 32.5 , 32.3 , 32.0 , 31.8 , 31.6 , 31.4 , 31.2 , 31.0 , 30.8 , 30.6 , 30.4 , 30.2 , 30.0 , 29.9 , 29.7 , 29.9 , 29.7 , 29.5 , 29.0 , 28.9 , 28.7 , 28.6 , 28.4 , }; uchar ADC0832() {uchar aaa,temp;CS=1; //一個轉換周期開始CLK=0; //為第一個脈沖作準備CS=0; //CS置0,片選有效DIO=1; //DIO置1,規定的起始信號CLK=1; //第一個脈沖CLK=0; //第一個脈沖的下降沿,此前DIO必須是高電平DIO=1; //DIO置1, 通道選擇信號CLK=1; //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數據用于選擇通道,這里選通道CH0CLK=0; //第二個脈沖下降沿DIO=0; //DI置0,選擇通道0CLK=1; //第三個脈沖CLK=0; //第三個脈沖下降沿DIO=1; //第三個脈沖下沉之后,輸入端DIO失去作用,應置1CLK=1; //第四個脈沖for(aaa=0;aaa<8;aaa++) //高位在前{CLK=1; //第四個脈沖CLK=0;temp<<=1; //將下面儲存的低位數據向右移temp|=(uchar)DIO; //將輸出數據DIO通過或運算儲存在dat最低位}CS=1; //片選無效return temp; //將讀的數據返回 }void delay(uint n) {uint i,j;for(i=n;i>0;i--)for(j=30;j>0;j--); } void LED_SOUND() //LED和蜂鳴器的報警顯示 {LED_U=0;LED_D=0;SOUNDER=0;if(T>=H) //溫度高于上限紅色LED燈亮,同時蜂鳴器報警{LED_U=1;SOUNDER=1;}if(T<=L) //溫度低于下限黃燈點亮,同時蜂鳴器報警{LED_D=1;SOUNDER=1;} }void xianshi() //用于數碼管顯示的函數 {static uchar i=0;P0=0x00;P2=~(0x01<<i);delay(1);P0=dis_buf[i];i++;i%=4; }void main() {LED_U=0;EX0=1; IT0=1; EX1=1; IT1=1;EA=1;while(1){ for(j=0;j<5;j++) //多次采集求平均值,用于防止顯示時值的不穩定{num+=ADC0832(); date=num/5;}j=0;num=0;for(i=0;i<201;i++) //用于判斷ADC值在那個值的范圍內,然后輸出數組值,也就是對應的溫度值{if(date<=Temp[i]&&date>Temp[i+1]){T=i;break;}}dis_buf[0]=table[T/100]; //個位顯示dis_buf[1]=table[T/10%10]; //十位顯示dis_buf[2]=table[T%10]; //百位顯示dis_buf[3]=0x39; //顯示“C”xianshi();delay(1);if(K_H==0) //按鍵是否按下{Delay10ms(1); //按鍵的延遲去抖if(K_H==0){while(1) //用于顯示上限的報警數值{H=20+a;dis_buf[0]=0x76; dis_buf[1]=table[H/100];dis_buf[2]=table[H/10%10];dis_buf[3]=table[H%10];xianshi();if(K_H==0) //再次按下按鍵,跳出調節上限的顯示界面,繼續顯示溫度{Delay10ms(1);if(K_H==0)break; } } }}if(K_L==0) //按鍵是否按下{Delay10ms(1); //按鍵的延遲去抖if(K_L==0){while(1) //用于顯示下限的報警數值{ L=10+b;dis_buf[0]=0x38; dis_buf[1]=table[L/100];dis_buf[2]=table[L/10%10];dis_buf[3]=table[L%10];xianshi();if(K_L==0) //再次按下按鍵,跳出調節下限的顯示界面,繼續顯示溫度{Delay10ms(1);if(K_L==0)break;}}}}LED_SOUND(); //報警函數 } }鏈接:https://pan.baidu.com/s/1Yy83ipKPZ-IMFislOAGWQA
提取碼:j3z9
總結
以上是生活随笔為你收集整理的基于51单片机的ADC热敏电阻测温系统proteus仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电子设计教程40:软启动电路-串联NTC
- 下一篇: 0608