綜合運用測控儀器設計相關章節(jié)基礎知識,設計一套溫度測量控制裝置。
2.思路分析
設計單片機(AT89C52)最小系統(tǒng),并在此基礎上完成對溫度傳感器DS18B20的讀寫操作,實現(xiàn)溫度測量功能和實時顯示功能,并通過設計外部電路使系統(tǒng)具備溫度上下限設置、對超過(低于)設置溫度值的狀態(tài)進行報警和相應控制操作。
3.系統(tǒng)功能
(1)采集溫度,并通過LED數(shù)碼管顯示當前溫度。LED數(shù)碼管顯示溫度格式為四位,精確度可達±0.1℃。例如:27℃顯示為27.0。
(2)通過按鍵可自由設定溫度的上下限,并能在LED數(shù)碼管顯示設定的溫度上下限值。
(3)通過控制三極管的導通與否來控制繼電器的通斷,繼而控制外部加熱(電烙鐵升溫)和制冷(電風扇降溫)裝置,使環(huán)境溫度保持在設定溫度范圍內。
(4)具有溫度報警裝置。當溫度高于上限值,紅燈亮起;或者低于下限值,黃燈亮起,并發(fā)出報警聲。
4.protues原理圖
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ=P3^0;
- sbit en=P1^0;
- sbit add=P1^1; //加1
- sbit jian=P1^2; //減1
- sbit warm=P1^5; //加熱
- sbit cool=P1^7; //制冷
- uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //共陽極
- uchar code smg_we[]={0x08,0x04,0x02,0x01};
- uchar uflag,max=35,min=20,k;
- uint value,b_value;
- /*** 小延時函數(shù) ***/
- void delay(uint i)
- {
- while(i--);
- }
- /*** 延時函數(shù) ***/
- void delay_ms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- /*** DS18B20初始化函數(shù) ***/
- void init_ds18b20()
- {
- uchar presence;
- DQ=0;
- delay(60);
- DQ=1;
- delay(5);
- presence=DQ;
- delay(20);
- }
- /*** 寫入一個字節(jié) ***/
- void write_ds18b20(uchar value)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- DQ=0;
- DQ=value&0x01;
- delay(5);
- DQ=1;
- value>>=1;
- }
- delay(4);
- }
- /*** 讀出一個字節(jié)函數(shù) ***/
- uchar read_ds18b20()
- {
- uchar j,val;
- for(j=0;j<8;j++)
- {
- DQ=0;
- val>>=1; //讀數(shù)先讀最低位,故右移
- DQ=1;
- if(DQ)
- val|=0x80;
- delay(4);
- }
- return val;
- }
- /*** 讀溫度函數(shù) ***/
- uint read_temperature()
- {
- uchar a,a0,flag;
- uint b;
- uint temp;
- init_ds18b20(); //開始轉化數(shù)據(jù)
- write_ds18b20(0xcc);
- write_ds18b20(0x44);
- delay(300);
- init_ds18b20(); //每操作一次都初始化并且至少有一條ROM指令
- write_ds18b20(0xcc);
- write_ds18b20(0xbe); //讀數(shù)據(jù)允許
- a=read_ds18b20(); //低8位
- a0=read_ds18b20(); //高8位
- flag=a0&0xf8;
- b=a0*256+a;
- if(flag==0xf8)
- {
- uflag=0;
- temp=(~b+1)*0.625; // 負數(shù)取反再加1
- }
- else
- {
- uflag=1;
- temp=b*0.625;
- }
- return temp;
- }
- /*** 顯示當前溫度 ***/
- void display()
- {
- uchar i;
- value=read_temperature();
- b_value=value/10; //實時溫度
- if(uflag==1)
- {
- for(i=0;i<4;i++)
- {
- P2=smg_we[i];
- delay(10);
- switch(i)
- {
- case 0:P0=smg_du[value/1000];break;
- case 1:P0=smg_du[value%1000/100];break;
- case 2:P0=smg_du[value%100/10]&0x7f;break;
- case 3:P0=smg_du[value%10];break;
- default: break;
- }
- delay(950);
- }
- }
- else
- {
- for(i=0;i<4;i++)
- {
- P2=smg_we[i];
- delay(10);
- switch(i)
- {
- case 0:P0=smg_du[10];break; //寫“-”號
- case 1:P0=smg_du[value%1000/100];break;
- case 2:P0=smg_du[value%100/10]&0x7f;break;
- case 3:P0=smg_du[value%10];break;
- default: break;
- }
- delay(950);
- }
- }
- if(b_value>max) cool=0; //降溫
- else cool=1;
- if(b_value<min) warm=0; //加熱
- else warm=1;
- }
- /*** 按鍵處理 ***/
- void keyscan()
- {
- en=1;
- if(en==0)
- {
- delay_ms(6); //5~10ms
- if(en==0)
- {
- k++;
- if(k==3) k=0;
- while(!en);
- }
- }
- }
- /*** 調節(jié)上下限時的顯示 ***/
- void con_display(uchar dat)
- {
- uchar i;
- for(i=2;i<4;i++)
- {
- P2=smg_we[i];
- delay(10);
- switch(i)
- {
- case 2:P0=smg_du[dat/10];break;
- case 3:P0=smg_du[dat%10];break;
- default: break;
- }
- delay(950);
- }
- }
- /*** 加熱與降溫 ***/
- void control()
- {
- if(k==1) //控制MAX
- {
- con_display(max);
- add=1; //+1
- if(add==0)
- {
- delay_ms(6); //5~10ms
- if(add==0)
- {
- max++;
- while(!add);
- }
- }
- jian=1; //-1
- if(jian==0)
- {
- delay_ms(6); //5~10ms
- if(jian==0)
- {
- max--;
- while(!jian);
- }
- }
- }
- if(k==2) //控制MIN
- {
- con_display(min);
- add=1; //+1
- if(add==0)
- {
- delay_ms(6); //5~10ms
- if(add==0)
- {
- min++;
- while(!add);
- }
- }
- jian=1; //-1
- if(jian==0)
- {
- delay_ms(6); //5~10ms
- if(jian==0)
- {
- min--;
- while(!jian);
- }
- }
- }
- }
- /*** 主函數(shù) ***/
- void main()
- {
- while(1)
- {
- keyscan();
- if(k==0)
- display(); //顯示當前溫度
- else control(); //控制時顯示
- }
- }
復制代碼
仿真程序51hei下載地址:
溫度測量控制.zip
(146.09 KB, 下載次數(shù): 36)
2021-7-8 15:27 上傳
點擊文件名下載附件
keil程序和protues仿真
|