1.可按鍵設置上中下限
2.有聲光報警
3.有風扇
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (19.07 KB, 下載次數: 76)
下載附件
2018-12-16 18:04 上傳
0.png (6.97 KB, 下載次數: 64)
下載附件
2018-12-16 18:04 上傳
0.png (13.12 KB, 下載次數: 60)
下載附件
2018-12-16 18:04 上傳
單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #include <math.h>
- #include "main.h"
- char code LED_display[14] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0XFF,0x89,0XC7}; //共陽數碼管段碼
- // 0 1 2 3 4 5 6 7 8 9 - H L
- char code bit_sel[4] = {0x01,0x02,0x04,0x08};
- char dis[4];
-
- unsigned char TL0_temp; /*暫存TL0的初值*/
- unsigned char TH0_temp; /*暫存TH0的初值*/
- #define INT_CLOCK 5 /*INT_CLOCK為定時值,單位為ms ,此處定義為5ms*/
- #define CRY_FREQUENCY 12000000 /*CRY_FREQUENCY為晶振頻率,單位為Hz*/
- bit flag = 0; //0-正溫度 1-負溫度
- sbit key1 = P3^2; //設置按鍵
- sbit key2 = P3^3; //增量按鍵
- sbit key3 = P3^4; //減量按鍵
- bit bKey1,bKey2,bKey3;
- uchar countSet = 0;
- sbit ledRed = P1^0; //紅燈
- sbit ledYellow = P1^1; //黃燈
- sbit ledGreen = P1^2; //綠燈
- sbit fan = P1^6; //風扇
- sbit beep = P1^5; //蜂鳴器
- char shutDowmH = 85; //關機溫度
- char SetH = 65; //高溫上限
- char SetL = 30; //低溫下限
- char alarm = 0;
- sbit DQ=P3^6; /* 18B20數據引腳*/
- #define temp_h P3|=0x40//單片機向DS18B20輸出高電平
- #define temp_l P3&=0xbf//單片機向DS18B20輸出低電平
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void Timer0_init()
- {
- unsigned long T0_temp; /*暫存T0的初始值 */
- T0_temp = 65536-((INT_CLOCK *CRY_FREQUENCY /1000)/12); /*T0初始值計算公式,參考教科書*/
- TL0_temp = T0_temp & 0xff;
- TH0_temp = T0_temp >> 8;
- TL0 = TL0_temp;
- TH0 = TH0_temp;
- TMOD |= 0x01;
- TR0 = 1;
- ET0 = 1;
- EA = 1; /*開定時器0中斷*/
- }
- void INT0_Init()
- {
- EX0 = 1;
- IT0 = 1;
- }
- void delay1ms(unsigned int ms)//延時1毫秒(不夠精確的)
- {
- unsigned int i,j;
- for(i=0;i<ms;i++)
- for(j=0;j<100;j++);
- }
- void keyScan()
- {
-
- if(!key2)
- {
- delay1ms(300);
- if(!key2)
- bKey2 = 1;
- }
- if(!key3)
- {
- delay1ms(300);
- if(!key3)
- bKey3 = 1;
- }
- }
- //數碼管顯示溫度值
- void displayTemp(uint temp)
- {
- uchar i;
- if(countSet == 0) //顯示實際的測試溫度
- {
- if(flag == 1) //負溫度
- {
-
- dis[0] = 11;
- dis[1] = 10;
- dis[2] = temp/100;
- dis[3] = temp%100/10;
- }
- else //正溫度
- {
-
- dis[0] = 11;
- dis[1] = temp/1000;
- dis[2] = temp%1000/100;
- dis[3] = temp%1000%100/10;
- }
- }
- else if(countSet == 1) //顯示設置的溫度下限
- {
- dis[0] = 1; //顯示'1'
-
- dis[1] = 10;
- dis[2] = SetL/10;
- dis[3] = SetL%10;
-
-
- }
- else if(countSet == 2) //顯示設置的溫度上限
- {
- dis[0] = 2; //顯示'2'
-
- dis[1] = 10;
- dis[2] = SetH/10;
- dis[3] = SetH%10;
- }
- else if(countSet == 3) //顯示設置的關機溫度
- {
- dis[0] = 3; //顯示'3'
-
- dis[1] = 10;
- dis[2] = shutDowmH/10;
- dis[3] = shutDowmH%10;
- }
- }
- /***********ds18b20延遲子函數(晶振12MHz )*******/
- void delayms(uint x)//延時1ms
- {
- uint y,z;
- for(y=x;y>0;y--)
- for(z=110;z>0;z--);
- }
- /**********ds18b20初始化函數**********************/
- void Ds18b20_reset()//DS18B20初始化
- {
- uchar count;
- uint i=2200;
- temp_l;
- for(count=240;count>0;count--);//延時480us
- temp_h;
- while(DQ&&(i>0)) i--;
- for(count=240;count>0;count--);//延時480us
- }
- /***********ds18b20讀一個字節(jié)**************/
- uchar Ds18b20_read()//從DS18B20讀一個字節(jié)
- {
- uchar i,count,dat;
- for(i=8;i>0;i--)
- {
- dat>>=1;
- temp_l;
- for(count=1;count>0;count--);
- temp_h;//此語句必須有,參考datasheet的P15
- for(count=1;count>0;count--);
- if(DQ)
- dat|=0x80;
- for(count=30;count>0;count--);
- }
- return dat;
- }
- /*************ds18b20寫一個字節(jié)****************/
- void Ds18b20_write(uchar dat)//向DS18B20寫一個字節(jié)
- {
- uchar count;
- uchar i;
- for(i=8;i>0;i--)
- {
- temp_l;
- for(count=1;count>0;count--);
-
- if(dat&0x01==0x01)
- temp_h;
- else
- temp_l;
- for(count=30;count>0;count--);
- temp_h;
- dat>>=1;
- }
- }
- /**************讀取ds18b20當前溫度************/
- uint ReadTemperature(void)
- {
- uint dat;
- uchar dat1,dat2;//保存讀出的溫度
- Ds18b20_reset();
- Ds18b20_write(0xcc);
- Ds18b20_write(0x44);//發(fā)送溫度轉換命令
- delayms(1000);//延時1s,等待溫度轉換完成
- Ds18b20_reset();
- Ds18b20_write(0xcc);
- Ds18b20_write(0xbe);//發(fā)送讀溫度寄存器命令
- dat1=Ds18b20_read();
- dat2=Ds18b20_read();
- if(dat2 >= 240) //負溫度
- {
- dat=(~(dat2*256+dat1)+1)*(0.0625*10);
- flag = 1;
- }
- else //正溫度
- {
- flag = 0;
- dat=(dat2*256+dat1)*(0.0625*10);
- }
- return dat;
- }
- void main()
- {
-
- uint temp;
- Timer0_init(); //定時器0初始化
- INT0_Init();
- EA = 1; //開總中斷
- fan = 0;
- countSet = 0;
- while(1)
- {
- if(countSet == 0)
- temp = ReadTemperature(); //采集DS18B20的溫度值
- if(flag == 1) //負溫度
- {
- ledYellow = 0; //黃燈亮
- ledRed = 1;
- ledGreen = 1;
- displayTemp(temp); //顯示溫度
- fan = 0;//風扇關閉
- alarm = 0;
- }
- else
- {
- if(temp/10 > shutDowmH)
- {
- dis[0] = 11;
- dis[1] = 11;
- dis[2] = 11;
- dis[3] = 11; //數碼管熄滅
- ledYellow = 1; //燈全熄滅
- ledRed = 1;
- ledGreen = 1;
- fan = 0; //風扇停轉
- alarm = 0;
- }
- else if(temp/10 > SetH)
- {
- displayTemp(temp); //顯示溫度
- ledYellow = 1; //指示燈變紅
- ledRed = 0;
- ledGreen = 1;
- fan = 1; //風扇開啟
- alarm = 1;
- }
- else if(temp/10 > SetL)
- {
- displayTemp(temp); //顯示溫度 或者設置
- ledYellow = 1; //指示燈變綠
- ledRed = 1;
- ledGreen = 0;
- fan = 1; //風扇開啟
- alarm = 0;
- }
- else
- {
- displayTemp(temp); //顯示溫度
- ledYellow = 0; //指示燈變黃
- ledRed = 1;
- ledGreen = 1;
- fan = 0; //風扇關閉
- alarm = 0;
- }
- }
- keyScan();
- if(bKey2) //溫度加
- {
- bKey2 = 0;
- if(countSet == 1) //設置低溫
- {
- if(SetL < SetH)
- SetL++;
- }
- if(countSet == 2) //設置高溫
- {
- if(SetH < shutDowmH)
- SetH++;
- }
- if(countSet == 3) //設置關機溫度
- {
- if(shutDowmH < 99)
- shutDowmH++;
- }
- }
- if(bKey3) //溫度減
- {
- bKey3 = 0;
- if(countSet == 1) //設置低溫
- {
- if(SetL > 0)
- SetL--;
- }
- if(countSet == 2) //設置高溫
- {
- if(SetH > SetL)
- SetH--;
- }
- if(countSet == 3) //設置關機溫度
- {
- if(shutDowmH > SetH)
- shutDowmH--;
- }
- }
-
- }
- }
- unsigned char count_5ms = 0;
- unsigned int count_5s = 0;
- void T0_interrupt(void) interrupt 1
- {
- TH0 += TH0_temp;
- TL0 += TL0_temp;
-
- count_5ms++;
- if(count_5ms >= 4)
- count_5ms = 0;
- P2 = 0X00;
- P0 = LED_display[dis[count_5ms]];
- P2 = bit_sel[count_5ms];
- if(alarm == 1)
- {
-
- if(count_5s < 1000)
- {
- count_5s++;
- beep = !beep;
- }
- }
- else
- count_5s = 0;
- }
- /*
- 外部中斷0服務處理函數,記錄“設置”按鍵按下的次數
- */
- void int_int0() interrupt 0
- {
- countSet++;
- if(countSet > 3)
- countSet = 0;
- }
復制代碼
51hei.png (11.38 KB, 下載次數: 55)
下載附件
2021-4-6 16:42 上傳
所有資料51hei提供下載:
CPU溫度控制(1).zip
(103.31 KB, 下載次數: 307)
2018-12-16 15:08 上傳
點擊文件名下載附件
程序 下載積分: 黑幣 -5
|