|
給大家發(fā)一個用單片機做的小旋磁美容儀的c語言代碼。99分鐘可調(diào)倒計顯示控制關(guān)機設(shè)置,同時,有蜂鳴器倒數(shù)十秒蜂叫及按鍵時鳴叫,時間顯示數(shù)碼管里有小數(shù)點按一秒周期閃爍的程序控制,按鍵為P1端中的P1。0及P1。1做為行線,P1。2~P1。5為列線,按鍵分別為開關(guān)機,時間加減,占空比調(diào)節(jié)加減鍵兩組共四個按鍵,有兩路實際輸出占空比端口,標號為:hotout 和 xuanout 兩個引腳,為數(shù)碼管顯示檔位狀態(tài),控制時以外部硬件低電平時間長使輸出功率大的基準而進行調(diào)節(jié),0檔時輸出為高電平,8檔(最高檔)時輸出為低電平低,其它從1~7檔時,以占空比為準。且每一檔的增量不是線性的,只為配合外部硬件的啟動電平要求,低幾檔導(dǎo)通量較大些
#include < reg51.H> #define uint unsigned int #define uchar unsigned char #define duan P0 #define ton 2 #define t 20 uchar code tab[]={0x09,0x5f,0x2a,0x1a,0x5c,0x98,0x88,0x1f,0x08,0x18}; sbit xsd_display=P0^3;//小數(shù)點的位顯示,根據(jù)實際情況決定 sbit shila=P2^4; sbit gela=P2^5; sbit hotla=P2^6; sbit xuanla=P2^7; sbit hotout=P2^0; sbit xuanout=P2^1; sbit fmqbit=P2^2; bit openbit,xsd;//開關(guān)機、小數(shù)點、加熱、旋轉(zhuǎn)標志位 uchar time; //分鐘值 uint d; //計分鐘變量 bit fmq; uchar hot,hot1,hotoff,hotoff1,hotled; //加熱波形處理相關(guān)變量 uchar xuan,xuan1,xuanoff,xuanoff1,xuanled; //旋轉(zhuǎn)相關(guān)變量 bit biaobit0,biaobit1,biaobit2,biaobit3;// 控制波形占空時的循環(huán)條件標志位//以下為延時子程序 void delay(uint a) { uchar c,d; for(c=a;c>0;c--) for(d=80;d>0;d--); } //以下為顯示函數(shù) void display(uchar x,uchar y,uchar k) { uchar ge,shi; //對傳遞時間函數(shù)進行分解 shi=x/10; ge=x%10; duan=tab[shi]; shila=0; delay(2); shila=1; duan=tab[ge]; gela=0; xsd_display=xsd; delay(2); gela=1; duan=tab[y]; hotla=0; delay(2); hotla=1; duan=tab[k]; xuanla=0; delay(2); xuanla=1;// duan_display=0xff; }//以下為變量改變處理程序 void bianlian(uchar xy) { switch(xy) { case 2: d=0; //有按鍵按動時即使計數(shù)值初始為0 if(time!=99) { time++; } break; case 3: d=0; //有按鍵按動時即使計數(shù)值初始為0 if(time!=0) { time--; } break; case 4: if(hotled!=8) { hotled++; if(hotled==8) biaobit0=1; else biaobit0=0; if(hotled==0) biaobit1=1; else biaobit1=0; if(hotled<5) { hot=hot+3; } else { hot=hot+ton; } hot1=hot; hotoff=t-hot; hotoff1=hotoff; } break; case 5:if(hotled!=0) { hotled--; if(hotled==8) biaobit0=1; else biaobit0=0; if(hotled==0) biaobit1=1; else biaobit1=0; if(hotled<4) { hot=hot-3; } else { hot=hot-ton; } hot1=hot; hotoff=t-hot; hotoff1=hotoff; } break; case 6: if(xuanled!=8) { xuanled++; if(xuanled==8) biaobit2=1; else biaobit2=0; if(xuanled==0) biaobit3=1; else biaobit3=0; if(xuanled==1) xuan=xuan+6; else xuan=xuan+ton; xuan1=xuan; xuanoff=t-xuan; xuanoff1=xuanoff; } break; case 7: if(xuanled!=0) { if(xuanled==1) xuan=xuan-6; else xuan=xuan-ton; xuan1=xuan; xuanoff=t-xuan; xuanoff1=xuanoff; xuanled--; if(xuanled==8) biaobit2=1; else biaobit2=0; if(xuanled==0) biaobit3=1; else biaobit3=0; } default:break; } } //以下為按鍵檢測子程序 void key(void) { uchar num,num1=0; uint a; P1=0xfc; num=P1; if(num!=0xfc) { fmqbit=0; //檢測按鍵有輸入鍵值時使蜂鳴器鳴叫 if(openbit!=0) { for(a=17;a>0;a--) { display(time,hotled,xuanled); } } else { for(a=200;a>0;a--) { duan=0xfe; //此處隨便加入值 shila=0; gela=0; hotla=0; xuanla=0;//打開四路數(shù)碼管位顯示控制 delay(1); } hotla=1; shila=1; gela=1; xuanla=1;//關(guān)閉四路數(shù)碼管位顯示控制 } P1=0xfc; num=P1; if(num!=0xfc) { P1=0xfe; num=P1; if(num!=0xfe) { switch(num) { case 0xfa: num1=7; break;//旋轉(zhuǎn)減 case 0xf6: num1=5; break;//hot 減 case 0xee: num1=3; break;//時間減 case 0xde: if(openbit!=0) { for(a=40;a>0;a--) display(time,hotled,xuanled); } else { for(a=400;a>0;a--) { duan=0xfe; //此處隨便加入值 hotla=0; shila=0; gela=0; xuanla=0;//打開四路數(shù)碼管位顯示控制 delay(2); } hotla=1; shila=1; gela=1; xuanla=1;//關(guān)閉四路數(shù)碼管位顯示控制 } openbit=~openbit;//改變開關(guān)機標志位 default:break; } } else { P1=0xfd; num=P1; switch(num) { case 0xf9: num1=6; break; case 0xf5: num1=4; break; case 0xed: num1=2; break; default: break; } } if(openbit!=0) bianlian(num1);//開機即可改變相關(guān)變量值,條件為開機后使能 } } P1=0xfc; }//以下為定時0中斷程序,定時時間為50MS void time0_int(void) interrupt 1 { TH0=0x3c; TL0=0xb0; //進入裝初值 d++; fmq=~fmq; if(d%10==0) xsd=~xsd; if(d==1200) { d=0; if(time!=0) time--; //此處停機變量處理已OK了。 else openbit=0; } }//以下為定時1中斷程序,定時時間為1000US void time1_int(void) interrupt 3 { TH1=0xff; TL1=0xe0;//進入裝初值if(openbit!=0) { if(hot1) { hot1--; if(hot1==0) { hotoff1=hotoff; if(biaobit0!=0) hotout=0; else hotout=1; } } if(hotoff1) { hotoff1--; if(hotoff1==0) { hot1=hot; if(biaobit1!=0) hotout=1; else hotout=0; } } if(xuan1) { xuan1--; if(xuan1==0) { xuanoff1=xuanoff; if(biaobit2!=0) xuanout=0; else xuanout=1; } } if(xuanoff1) { xuanoff1--; if(xuanoff1==0) { xuan1=xuan; if(biaobit3!=0) xuanout=1; else xuanout=0; } } } } void main(void) { P1=0xfc; openbit=0;//使起始狀態(tài)為停機等待狀態(tài) TMOD=0x11; //定義定時器工作模式 IP=0x08; //定時器1設(shè)置為最高中斷級別 TH0=0x3c; TL0=0xb0; //進入裝初值 TH1=0xff; TL1=0xe0;//進入裝初值 ET0=1; ET1=1; EA=1; //定時中斷至此全部打開開始運作。 while(1) { hotout=1; xuanout=1;//將輸出都置為0輸出狀態(tài),待機狀態(tài) TR0=0; TR1=0;//將返回的定時器全部關(guān)閉,避免不必要的誤動作 duan=0xfe; //待機時顯示的筆段控制 hotla=0; shila=0; gela=0; xuanla=0;//打開四路數(shù)碼管位顯示控制 delay(1); //顯示維持時間設(shè)定 hotla=1; shila=1; gela=1; xuanla=1;//關(guān)閉四路數(shù)碼管位顯示控制
if(P1!=0xfc) fmqbit=0; else fmqbit=1; //對按鍵掃描進行檢測,得出判斷蜂鳴器的鳴叫結(jié)果。 key(); //按鍵檢測函數(shù)調(diào)用 if(openbit!=0) { d=0; //秒鐘計時值置0狀態(tài) TR0=1; TR1=1; hot=0; hot1=hot; hotoff=t-hot; hotoff1=hotoff; //將熱控制的初值給予設(shè)定 xuan=0; xuan1=xuan; xuanoff=t-xuan; xuanoff1=xuanoff; //將旋轉(zhuǎn)控制的初值給予設(shè)定 biaobit0=0; biaobit1=1; biaobit2=0; biaobit3=1; hotled=0; //將熱輸出顯示值及狀態(tài)設(shè)置為0狀態(tài) xuanled=0; //旋轉(zhuǎn),效果同上 time=30; //時間初值設(shè)置為30分鐘整 while(openbit!=0) { key(); //按鍵檢測函數(shù) if((time==0)&&(d>=1000)) {fmqbit=xsd;} //倒計至最后10秒時進行鳴叫 else { if(P1==0xfc) fmqbit=1; else fmqbit=0; //對按鍵掃描進行檢測,得出判斷蜂鳴器的鳴叫結(jié)果。 } display(time,hotled,xuanled);//調(diào)用顯示函數(shù) } } }} 與hotandxuan10區(qū)別于bing1 和bing0兩個變量取消,同時定時中斷1的程序體全部加以代碼優(yōu)化,解決掉原程序執(zhí)行過程中中斷停留時間過長,影響數(shù)碼管顯示,閃爍的問題,同時處理掉按鍵在開至最高檔時檢測靈敏度下降問題. |