ds18b20電路圖和pcb文件:
0.png (80.58 KB, 下載次數: 151)
下載附件
2016-4-24 20:05 上傳
溫度檢測的所有資料:
0.png (63.19 KB, 下載次數: 113)
下載附件
2016-4-24 20:04 上傳
全部資料(壓縮包)下載:
溫度檢測程序帶電路圖仿真.rar
(741.23 KB, 下載次數: 99)
2016-4-24 09:39 上傳
點擊文件名下載附件
PCB 下載積分: 黑幣 -5
- #include <STC15F2K60S2.H>
- #include "intrins.h"
- #define FOSC 18432000L
- #define BAUD 9600
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- #define URMD 0 //0:使用定時器2作為波特率發生器
- //1:使用定時器1的模式0(16位自動重載模式)作為波特率發生器
- //2:使用定時器1的模式2(8位自動重載模式)作為波特率發生器
- sfr ADC_LOW2 = 0xBE; //ADC低2位結果
- #define SDAT P00 //595數據口
- #define SHCP P01 //595時鐘口
- #define STCP P02 //595數據輸出脈沖口
- #define K1 P33
- #define K2 P34
- #define K3 P35
- #define K4 P36
- #define delay1 P07 //繼電器1
- #define delay2 P06 //繼電器2
- #define DPL 14 //顯示L時數據下標
- #define DPH 12 //顯示H時數據下標
- #define DPt 15 //顯示t時數據下標
- #define ADC_POWER 0x80 //ADC電源控制位
- #define ADC_FLAG 0x10 //ADC完成標志
- #define ADC_START 0x08 //ADC起始控制位
- #define ADC_SPEEDLL 0x00 //540個時鐘
- #define ADC_SPEEDL 0x20 //360個時鐘
- #define ADC_SPEEDH 0x40 //180個時鐘
- #define ADC_SPEEDHH 0x60 //90個時鐘
- unsigned char code dispTab[]={
- //0 1 2 3 4 5 6 7 8 9 - 滅 H h L t
- 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0xff,0x89,0x8b,0xc7,0x87};
- unsigned int ad_value[11]={0};
- unsigned char testflag=0,testnumber=0;
- //按鍵檢測標志位
- bit flag1,flag2,flag3,flag4;
- //按鍵值 0 1 2 3 4
- unsigned char key_value=0;
- BYTE ch= 7; //ADC通道號
- unsigned char data dispBuf[4]={1,2,3,4};
- // 0:等待運行狀態 1:設定下限報警 2:設定工作溫度 3:設定上限報警 4:工作狀態
- unsigned char system_status=0;
- //定義變量 下限報警 上限報警 工作溫度 當前溫度
- unsigned int l_limit_alarm=0,h_limit_alarm=3000,working_temperature=2200,current_temperature=0;
- //下限報警標志 上限報警標志
- bit LL_flag,HH_flag;
- void InitUart();
- void SendData(BYTE dat);
- void Delay(WORD n);
- void InitADC();
- void disp(unsigned char data * dispBuf,unsigned char n);
- void key_processing()
- {
- static unsigned int set_value=0;
- if(system_status==0)
- {
- if(key_value==1){system_status=1;set_value=l_limit_alarm/10;}
- if(key_value==4){system_status=4;}
- key_value=0;
- disp(dispBuf, 4);
- }
- if(system_status==1)
- {
- if(key_value==1)
- {
- system_status=2;
- l_limit_alarm=set_value*10;
- set_value=working_temperature/10;
- }
- if(key_value==2){if(set_value<300)set_value++;}
- if(key_value==3){if(set_value>0) set_value--;}
- // if(system_status!=2)
- // {
- dispBuf[0]=DPL;
- dispBuf[1]=set_value/100;
- dispBuf[2]=set_value%100/10;
- dispBuf[3]=set_value%10;
- // }
- key_value=0;
- }
- if(system_status==2)
- {
- if(key_value==1)
- {
- system_status=3;
- working_temperature=set_value*10;
- set_value=h_limit_alarm/10;
- }
- if(key_value==2){if(set_value<300)set_value++;}
- if(key_value==3){if(set_value>0) set_value--;}
- // if(system_status!=3)
- // {
- dispBuf[0]=DPt;
- dispBuf[1]=set_value/100;
- dispBuf[2]=set_value%100/10;
- dispBuf[3]=set_value%10;
- // }
- key_value=0;
- }
- if(system_status==3)
- {
- if(key_value==1)
- {
- system_status=0;
- h_limit_alarm=set_value*10;
- }
- if(key_value==2){if(set_value<300)set_value++;}
- if(key_value==3){if(set_value>0) set_value--;}
- // if(system_status!=0)
- // {
- dispBuf[0]=DPH;
- dispBuf[1]=set_value/100;
- dispBuf[2]=set_value%100/10;
- dispBuf[3]=set_value%10;
- // }
- key_value=0;
- }
- if(system_status==4)
- {
- if(key_value==4)system_status=0;
- }
- key_value=0;
- }
- void key_test()
- {
- if(K1==0)flag1=1;
- if(K2==0)flag2=1;
- if(K3==0)flag3=1;
- if(K4==0)flag4=1;
- if((K1==1)&&(flag1==1)){key_value=1;flag1=0;}
- if((K2==1)&&(flag2==1)){key_value=2;flag1=0;}
- if((K3==1)&&(flag3==1)){key_value=3;flag1=0;}
- if((K4==1)&&(flag4==1)){key_value=4;flag1=0;}
- }
- void calculate_temperature()
- {
- unsigned char i=0;
- ad_value[10]=0;
- for(i=0;i<10;i++)ad_value[10]+=ad_value[i];
- ad_value[10]/=10;
- current_temperature=ad_value[10]=ad_value[10]*3.0435;
- if(system_status==0||system_status==4)
- {
- dispBuf[0]=ad_value[10]/100;
- dispBuf[1]=ad_value[10]%1000/100;
- dispBuf[2]=ad_value[10]%100/10;
- dispBuf[3]=ad_value[10]%10;
- }
- }
- void Timer0Init(void)
- {
- AUXR |= 0x80;
- TMOD &= 0xF0;
- TL0 = 0x00;
- TH0 = 0x28;
- TF0 = 0;
- TR0 = 1;
- ET0=1;
- }
- void tm0_isr() interrupt 1 using 1
- {
- static unsigned char f=0;
- f++;
- if(f%10==0)ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
- if(f==200)
- {
- if(LL_flag)P25^=1;
- else P25=1;
- if(HH_flag)P26^=1;
- else P26=1;
- f=0;
- }
- }
- void sendData_595(unsigned char sendDat)
- { unsigned char i;
- for(i=0;i<8;i++)
- { if((sendDat&0x01)==0) SDAT=0;
- else SDAT=1;
- _nop_();
- SHCP=0;
- _nop_();
- SHCP=1;
- sendDat=sendDat>>1;
- }
- }
- void disp(unsigned char data * dispBuf,unsigned char n)
- { unsigned char c,i;
- for(i=0;i<n;i++)
- {c=dispBuf[i];
- if(i!=2)
- sendData_595(dispTab[c]);
- else sendData_595(dispTab[c]&0x7f);
- }
- STCP=0;
- STCP=1;
- }
- /*----------------------------
- ADC中斷服務程序
- ----------------------------*/
- void adc_isr() interrupt 5 using 2
- {
- ADC_CONTR &= !ADC_FLAG; //清除ADC中斷標志
- SendData(ch); //顯示通道號
- SendData(ADC_RES); //讀取高8位結果并發送到串口
- SendData(ADC_LOW2); //顯示低2位結果
- ad_value[testnumber]=ADC_RES;
- ad_value[testnumber]<<=2;
- ad_value[testnumber]+=ADC_LOW2;
- testnumber++;
- if(testnumber>=10) testnumber=0;
- testflag=1;
- }
- /*----------------------------
- 初始化ADC
- ----------------------------*/
- void InitADC()
- {
- P1ASF = 0xff; //設置P1口為AD口
- ADC_RES = 0; //清除結果寄存器
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
- Delay(2); //ADC上電并延時
- }
- /*----------------------------
- 初始化串口
- ----------------------------*/
- void InitUart()
- {
- SCON = 0x5a; //設置串口為8位可變波特率
- #if URMD == 0
- T2L = 0xd8; //設置波特率重裝值
- T2H = 0xff; //115200 bps(65536-18432000/4/115200)
- AUXR = 0x14; //T2為1T模式, 并啟動定時器2
- AUXR |= 0x01; //選擇定時器2為串口1的波特率發生器
- #elif URMD == 1
- AUXR = 0x40; //定時器1為1T模式
- TMOD = 0x00; //定時器1為模式0(16位自動重載)
- TL1 = 0xd8; //設置波特率重裝值
- TH1 = 0xff; //115200 bps(65536-18432000/4/115200)
- TR1 = 1; //定時器1開始啟動
- #else
- TMOD = 0x20; //設置定時器1為8位自動重裝載模式
- AUXR = 0x40; //定時器1為1T模式
- TH1 = TL1 = 0xfb; //115200 bps(256 - 18432000/32/115200)
- TR1 = 1;
- #endif
- }
- /*----------------------------
- 發送串口數據
- ----------------------------*/
- void SendData(BYTE dat)
- {
- while (!TI); //等待前一個數據發送完成
- TI = 0; //清除發送標志
- SBUF = dat; //發送當前數據
- }
- /*----------------------------
- 軟件延時
- ----------------------------*/
- void Delay(WORD n)
- {
- WORD x;
- while (n--)
- {
- x = 5000;
- while (x--);
- }
- }
- /*-----------------------------------------
- 主函數
- ------------------------------------------*/
- void main()
- {
- unsigned char i=0;
- InitUart(); //初始化串口
- InitADC(); //初始化ADC
- Timer0Init();
- IE |=0xa0; //使能ADC中斷 開始AD轉換
- disp(dispBuf,4);
- while(1)
- {
- key_test();
- if(key_value!=0){key_processing();}
- if(testflag==1)
- {
- testflag=0;
- calculate_temperature();
- disp(dispBuf, 4);
- if(system_status==4)
- {
- if(current_temperature<l_limit_alarm)
- {LL_flag=1;delay1=1;} //下限報警標志位 下限報警繼電器吸合
- else {LL_flag=0;delay1=0;} //清除報警標志位 釋放繼電器
- if(current_temperature>h_limit_alarm)
- {HH_flag=1;delay2=1;} //上限報警標志位 上限報警繼電器吸合
- else {HH_flag=0;delay2=0;} //清除報警標志位 釋放繼電器
- }
- }
- }
- }
復制代碼 |