- //宏定義
- #define uchar unsigned char
- #define uint unsigned int
- //包含頭文件
- #include <reg52.h>
- #include <18b20.h>
- #include <stdlib.h>
- #include <intrins.h>
- #include <eeprom52.h>
- #include <lcd1602.h>
- #define Imax 14000 //此處為晶振為11.0592時的取值,
- #define Imin 8000 //如用其它頻率的晶振時,
- #define Inum1 1450 //要改變相應的取值。
- #define Inum2 700
- #define Inum3 3000
- sbit K1=P1^0;
- sbit K2=P1^1;
- sbit K3=P1^2; //按鍵定義
- sbit BUZZ=P1^4;
- sbit PWM=P2^0; //PWM輸出
- unsigned char Im[4]={0x00,0x00,0x00,0x00};//紅外編碼
- //uchar displaydata[4]; //顯示暫存數組
- //全局變量
- char f,dang,count,count1,a_a; //檔位
- unsigned long m,Tc;
- unsigned char IrOK; //定義紅外工作變量
- void jisuan(); //聲明計算函數
- uchar mode;
- char sec_b=0;
- bit flag_b=0;
- uint TH,TL; //上下限變量
- uchar baif,suiji;
- uchar code zhuanhuan[4]={0,3,5,10};//轉換數組
- /*ascii碼*/
- unsigned char mun_char_table[]={"0123456789abcdef- "};
- unsigned char temp_table[] ={"L:00.0C H:00.0C"};
- unsigned char temp_set_table[]={"D:0 T:00.0C"};
- void write_eeprom() //內部eeprom寫函數
- {
- SectorErase(0x2000); //清空
- SectorErase(0x2c00);
- SectorErase(0x2e00);
- byte_write(0x2c00,TH/256);
- byte_write(0x2c01,TH%256);
- byte_write(0x2c02,TL/256);
- byte_write(0x2c03,TL%256); //將上下限數據保存到eeprom
- byte_write(0x2c04,dang);
- byte_write(0x2c05,mode);
- byte_write(0x2060,0x01);
-
- }
- /******************把數據從單片機內部eeprom中讀出來*****************/
- void read_eeprom()
- {
- mode = byte_read(0x2c05);
- dang = byte_read(0x2c04);
- TH = byte_read(0x2c00)*256+byte_read(0x2c01);
- TL = byte_read(0x2c02)*256+byte_read(0x2c03);
- a_a = byte_read(0x2060);
-
- }
- /**************開機自檢eeprom初始化*****************/
- void init_eeprom()
- {
- a_a = byte_read(0x2060);
- if(a_a != 1) //新的單片機初始單片機內問eeprom
- {
-
- a_a = 1;
- write_eeprom(); //保存數據
- }
- }
- /*********************************************************/
- //毫秒級的延時函數,time是要延時的毫秒數
- /*********************************************************/
- void delay(uint time)
- {
- uint i,j;
- for(i=0;i<time;i++)
- for(j=0;j<110;j++);
- }
- void display() //顯示函數
- {
- lcd_char_write(7,1,mun_char_table[disdata[1]]);
- lcd_char_write(8,1,mun_char_table[disdata[2]]);
- lcd_char_write(10,1,mun_char_table[disdata[3]]);
- lcd_char_write(2,1,mun_char_table[dang]);
- lcd_char_write(2,0,mun_char_table[TL%1000/100]);
- lcd_char_write(3,0,mun_char_table[TL%100/10]);
- lcd_char_write(5,0,mun_char_table[TL%10]);
- lcd_char_write(11,0,mun_char_table[TH%1000/100]);
- lcd_char_write(12,0,mun_char_table[TH%100/10]);
- lcd_char_write(14,0,mun_char_table[TH%10]);
- }
- void key() //按鍵函數
- {
- if(K1==0) //按鍵1按下或者遙控器上的按鍵按下
- {
- delay(5); //延時去抖
- if(K1==0) //再次判斷按鍵按下
- {
- BUZZ=0;
- delay(20);
- BUZZ=1; //按鍵音
- mode++; //模式加
- if(mode>4) //模式加到大于4
- mode=0; //模式清零
- // Im[2]=0;
- IrOK=0; //變量清零
- write_eeprom(); //寫入eeprom數據
- while(!K1); //按鍵釋放
- }
- }
- if(K2==0)
- {
- delay(5);
- if(K2==0)
- {
- BUZZ=0;
- delay(20);
- BUZZ=1;
- if(mode==0) //模式等于1時
- {
- TH++; //上限加
- if(TH>999) //上限加到大于99.9度
-
- TH=TL+1; //上限等于下限加一
- }
- else if(mode==1) //模式等于2時
- {
- TL++; //下限加
- if(TL>=TH) //下限加到大于等于上限
- TL=TH-1; //下限等于上限減一
- }
- else if(mode==3) //模式等于3時
- {
- dang++; //檔位加一
- if(dang>3) //檔位大于3時
- dang=0; //檔位清零
- }
- //Im[2]=0;
- //IrOK=0; //紅外變量清零
- write_eeprom(); //寫入eeprom數據
- while(!K2); //按鍵釋放
- }
- }
- if(K3==0)
- {
- delay(5);
- if(K3==0)
- {
- BUZZ=0;
- delay(20);
- BUZZ=1;
- if(mode==0)
- {
- TH--;
- if(TH<=TL)
- TH=TL+1;
- }
- else if(mode==1)
- {
- TL--;
- if(TL>=TH)
- TL=TH-1;
- }
- else if(mode==3)
- {
- dang++;
- if(dang>3)
- dang=0;
- }
- //Im[2]=0;
- //IrOK=0;
- write_eeprom();
- while(!K3);
- }
- }
- }
- void jisuan() //計算函數
- {
- if(mode==0||mode==1||mode==2) //模式0、1、2
- {
- if(tvalue<=TL) //溫度小于下限時
- PWM=1; //關閉輸出,占空比0%
- else if(tvalue>=TH) //溫度大于等于上限
- PWM=0; //打開輸出,占空比100%
- else //其他狀態時
- {
- if(tvalue<(TL+(TH-TL)/2))
- {
- baif=15; //占空比控制變量
- if(count1>baif) //根據變量判斷占空比大小pwm=0.3
- PWM=1; //關閉風扇
- else
- PWM=0; //打開風扇*/
- }
- else
- {
- baif=25; //占空比控制變量
- if(count1>baif) //根據變量判斷占空比大小pwm=0.3
- PWM=1; //關閉風扇
- else
- PWM=0; //打開風扇*/
- }
- }
- }
- else if(mode==3) //模式3時
- {
- if(count1>(zhuanhuan[dang]*5)) //根據檔位計算出占空比
- PWM=1;
- else
- PWM=0;
- }
- }
- void main() //主函數
- {
- /*uint count; //定義變量
- unsigned int i=0,j=0;
- EA=1; //打開中斷總開關
- EX1=1; //打開外部中斷1
- IT1=1; //下降沿有效
- TMOD=0x11; //定時器工作方式
- TR0=0; //關閉T0
- TH0=0;
- TL0=0; //初值0
- ET1=1; //T1允許中斷
- TR1=1; //T1打開中斷
- TH1=0xfc;
- TL1=0x18; //T1初值1ms
- mode=0; //初始模式0
- TH=300;
- TL=200; //上下限初始值
- init_eeprom(); //初始化eeprom
- read_eeprom(); //讀取eeprom數據
-
- lcd_system_reset(); //LCD1602 初始化
- for (i=0;i<16;i++) lcd_char_write(i,0,temp_table[i]);
- for (j=0;j<12;j++) lcd_char_write(j,1,temp_set_table[j]);
- while(1) //進入循環
- {
- jisuan(); //計算函數
- count++; //變量加
- if(count>200) //加到大于200
- {
- count=0; //清零
- TR1=0; //關閉定時器T1
- read_wendu(); //讀取溫度
- TR1=1; //打開定時器T1
- }
- jisuan(); //計算函數
- display(); //顯示函數 */
- while(1) key(); //按鍵函數
- //jisuan(); //計算函數
- // }
- }
- void timer1() interrupt 3 //定時器T1工作函數
- {
- TH1=0xfc;
- TL1=0x18; //重新賦初值
- count1++; //加
- if(count1>50)
- {
- count1=0;
-
- }
- }
- void intersvr1(void) interrupt 2 //紅外工作函數
- {
- TR0=1;
- Tc=TH0*256+TL0;//提取中斷時間間隔時長
- TH0=0;
- TL0=0; //定時中斷重新置零
- if((Tc>Imin)&&(Tc<Imax))
- {
- m=0;
- f=1;
- return;
- } //找到啟始碼
- if(f==1)
- {
- if(Tc>Inum1&&Tc<Inum3)
- {
- Im[m/8]=Im[m/8]>>1|0x80; m++;
- }
- if(Tc>Inum2&&Tc<Inum1)
- {
- Im[m/8]=Im[m/8]>>1; m++; //取碼
- }
- if(m==32)
- {
- m=0;
- f=0;
-
- if(Im[2]==~Im[3])
- {
- IrOK=1;
- TR0=0;
- }
- else
- {
- IrOK=0; //取碼完成后判斷讀碼是否正確
- }
- }
- //準備讀下一碼
- }
- }
復制代碼
|