電熱毯控制用,C51程序AT89S51,可定時控制溫度,并根據(jù)設(shè)定檔位自動調(diào)節(jié)輸出
- #include <AT89X51.H>//6MHz
- #define uchar unsigned char
- #define uint unsigned int
- #define reset() {WDT=0x1e;WDT=0xe1;}//看門狗復(fù)位宏定義
- sfr WDT=0xa6; //定義看門狗寄存器
- uchar code DATA_7SEG[10]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f};/*0~9的數(shù)碼管段碼*/
- //============================================================
- uchar data deda; /*100mS計數(shù)單元*/
- uchar data sec; //計時秒
- uchar data min; //計時分
- char data set_min; //設(shè)定分
- uchar data cnt_5s;
- uchar data ram_flag;
- char data powout_flag;
- bit work_status;
- bit flag_500ms;
- bit bz_flag=0; //蜂鳴標(biāo)志
- bit startflag_5s; //5S標(biāo)志
- bit start_flag;
- bit pout_flag;
- //===========================================================
- sbit h_pow_out=P2^7; //驅(qū)動H
- sbit m_pow_out=P2^6; //驅(qū)動M
- sbit l_pow_out=P2^5; //驅(qū)動L
- sbit g_x1=P2^2; //個位顯示
- sbit g_x2=P2^3;
- sbit s_x1=P2^0; //十位顯示
- sbit s_x2=P2^1;
- sbit r_led=P3^1;
- sbit g_led=P3^0;
- sbit on_off_key=P3^2;
- sbit timeinc_key=P3^3;
- sbit timedec_key=P3^4;
- sbit pow_sel_key=P3^5;
- sbit run_stop_key=P3^6;
- sbit bz_out=P2^4;
- //==================================================
- void init(void)
- {
- sec=min=set_min=0;
- cnt_5s=0;
- powout_flag=0;
- work_status=0;
- flag_500ms=0;
- bz_flag=0;
- startflag_5s=0;
- start_flag=0;
- pout_flag=0;
- }
- /*=========定時器T0初始化======*/
- void init_timer0()
- {
- TMOD=0x11;//T0、T1方式1
- TH0=-(50235/256);//100mS初值
- TL0=-(50235%256);
- ET0=1;TR0=1; //T0開中斷,啟動T0
- }
- //======================================================
- /*延時k*1mS子函數(shù)*/
- void delay(uint k)
- {
- uint i,j;
- for(i=0;i<k;i++){reset()
- for(j=0;j<60;j++)
- {;}}
- }
- /*定時器T1初始化*/
- void init_timer1()
- {
- TH1=-(2500/256); //5mS初值
- TL1=-(2500%256);
- ET1=1; TR1=1; //T1開中斷,啟動T1
- }
- //======================================================
- /*100mS定時中斷服務(wù)子函數(shù)*/
- void timer0(void) interrupt 1 using 1
- {
- TH0=-(50235/256);// 重裝定時初值
- TL0=-(50235%256);
- deda++; //計時單元遞加
- if(startflag_5s)cnt_5s++;//啟動5秒計時
- if(deda>=10){sec++;deda=0;}// 秒加1
- if(cnt_5s>=50){pout_flag=1;cnt_5s=50;}//5秒到,輸出標(biāo)志置位,
- //同時5秒計時值固定為5秒
- if(sec>=60){set_min--;sec=0;}//60秒到,設(shè)定分遞減
- if(set_min<=0)set_min=0;// 最小為0
- if((set_min==0)&&(work_status==0)){startflag_5s=0;}// 若設(shè)定分為0且工作狀態(tài)為0,
- //5秒啟動標(biāo)志復(fù)位
- else {startflag_5s=1;}// 否則5秒啟動標(biāo)志置位
- if((set_min<=3)&&(work_status==0))bz_flag=1;// 若設(shè)定分小于3且工作狀態(tài)為0,
- //蜂鳴器啟動標(biāo)志置位
- else bz_flag=0; //否則蜂鳴器啟動標(biāo)志復(fù)位
- }
- //===========================================================
- /*T1 5ms定時中斷服務(wù)子*/
- void timer1(void) interrupt 3 using 2
- {static bit RL;static uchar cnt500;
- cnt500++;if(cnt500==100){cnt500=0;flag_500ms=!flag_500ms;}// 每0.5秒,標(biāo)志取反
- RL=!RL;
- TH1=-(2500/256);// 重裝5mS定時初值
- TL1=-(2500%256);
- if(start_flag)// 若系統(tǒng)啟動
- {if(work_status==0)// 若自動時控工作
- { if(RL){P1=DATA_7SEG[set_min/10];// 點亮十位數(shù)碼管
- s_x1=0;s_x2=0;g_x1=1;g_x2=1;}
- else{P1=DATA_7SEG[set_min%10];// 點亮個位數(shù)碼管
- s_x1=1;s_x2=1;g_x1=0;g_x2=0;}
- }
- //===========================================
- else//否則處于持續(xù)工作時
- { if(flag_500ms){if(RL){P1=0x40;s_x1=0;s_x2=0;// 點亮g段
- g_x1=1;g_x2=1;}
- else {P1=0x40;s_x1=1;s_x2=1;// 點亮g段
- g_x1=0;g_x2=0;}
- }
- else{P1=0x00;s_x1=1;s_x2=1;g_x1=1;g_x2=1;}
- }
- }
- else {P1=0x00;s_x1=1;s_x2=1;g_x1=1;g_x2=1;} // 若系統(tǒng)關(guān)閉,熄滅數(shù)碼管
- }
- /**************************************************/
- void key(void) //掃描時間設(shè)定鍵
- {uchar temp,ss;
- delay(10);
- ss=P3;P3=0xff;
- if(P3!=0xff)
- {delay(10);temp=P3;P3=ss;
- if(temp==0xfb){start_flag=!start_flag;ram_flag=0x55;delay(300);}// 按下開/關(guān)鍵,
- //系統(tǒng)啟動標(biāo)志取反,同時防干擾標(biāo)志寫入55H
- if(start_flag) //若處于開機狀態(tài),根據(jù)按鍵狀態(tài),進(jìn)行功能散轉(zhuǎn)
- {
- switch(temp)
- {
-
- case 0xf7:{set_min++;bz_flag=0;startflag_5s=1;cnt_5s=0;// 設(shè)定分遞增
- if(set_min>=60)set_min=60;delay(300);}break;
- case 0xef:{set_min--;bz_flag=0;startflag_5s=1;cnt_5s=0;// 設(shè)定分遞減
- if(set_min<=00)set_min=0;delay(300);}break;
- case 0xdf:{powout_flag++;if(powout_flag>=3)powout_flag=0;// 切換
- //輸出功率
- delay(300);}break;
- case 0xbf:{work_status=!work_status;delay(300);}break;// 選擇自動時控
- //或持續(xù)工作
- default:break;
- }
- }
- else //否則處于關(guān)機狀態(tài),設(shè)定分清零
- {set_min=0;}
- //===================================
- if(work_status==0){if(set_min>0)startflag_5s=1;// 工作狀態(tài)為0,
- //當(dāng)設(shè)定分大于0,啟動5秒標(biāo)志
- else startflag_5s=0;}
- else {startflag_5s=1;}// 工作狀態(tài)為1,也啟動5秒標(biāo)志
- }
- }
- /**************************************/
- void power_out(uchar powout_flag)// 切換高中低三檔溫度
- {
- if(pout_flag==1)
- {
- switch(powout_flag)
- {
- case 0:m_pow_out=0;h_pow_out=1;l_pow_out=1;break;
- case 1:h_pow_out=0;m_pow_out=1;l_pow_out=1;break;
- case 2:l_pow_out=0;m_pow_out=1;h_pow_out=1;break;
- default:break;
- }
- }
- else {m_pow_out=1;h_pow_out=1;l_pow_out=1;}
- if(start_flag==0)
- {m_pow_out=1;h_pow_out=1;l_pow_out=1;pout_flag=0;bz_flag=0;bz_out=1;}
- if(work_status==1)startflag_5s=1;
- else {if(set_min==0)
- {m_pow_out=1;h_pow_out=1;l_pow_out=1;
- pout_flag=0;bz_flag=0;bz_out=1;startflag_5s=0;}
- }
- //=====================================================
- if((bz_flag)&&(pout_flag)){if(flag_500ms)bz_out=0;else bz_out=1;}
- else bz_out=1;
- }
- /*******************************************************/
- /*主函數(shù)*/
- void main()
- {
- if(ram_flag!=0x55)init();//上電時初始化
- init_timer0(); //定時器T0初始化
- init_timer1(); //定時器T1初始化
- EA=1; //開總中斷
-
- while(1) //無限循環(huán)
- {
- if(!start_flag){g_led=0;r_led=1;}// 系統(tǒng)關(guān)閉,綠燈亮,紅燈滅
- else {g_led=1;r_led=0;}// 否則系統(tǒng)啟動,紅燈亮,綠燈滅
- key(); //掃描按鍵
- power_out(powout_flag); //調(diào)用功率切換子函數(shù)
- reset() //看門狗復(fù)位
- }
- }
復(fù)制代碼 |