給大家發一個用單片機做的小旋磁美容儀的c語言代碼。99分鐘可調倒計顯示控制關機設置,同時,有蜂鳴器倒數十秒蜂叫及按鍵時鳴叫,時間顯示數碼管里有小數點按一秒周期閃爍的程序控制,按鍵為P1端中的P1。0及P1。1做為行線,P1。2~P1。5為列線,按鍵分別為開關機,時間加減,占空比調節加減鍵兩組共四個按鍵,有兩路實際輸出占空比端口,標號為:hotout 和 xuanout 兩個引腳,為數碼管顯示檔位狀態,控制時以外部硬件低電平時間長使輸出功率大的基準而進行調節,0檔時輸出為高電平,8檔(最高檔)時輸出為低電平低,其它從1~7檔時,以占空比為準。且每一檔的增量不是線性的,只為配合外部硬件的啟動電平要求,低幾檔導通量較大些。本程序為單片機網http://www.zg4o1577.cn 會員“狼圖騰”嘔心瀝血的的原創作品,所有的c語言代碼都已經測試通過,并且做成了成品投入到了實際的使用中,希望能對大家有所幫助有問題可聯系作者幫忙處理的。
#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;//小數點的位顯示,根據實際情況決定
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;//開關機、小數點、加熱、旋轉標志位
uchar time; //分鐘值
uint d; //計分鐘變量
bit fmq;
uchar hot,hot1,hotoff,hotoff1,hotled; //加熱波形處理相關變量
uchar xuan,xuan1,xuanoff,xuanoff1,xuanled; //旋轉相關變量
bit biaobit0,biaobit1,biaobit2,biaobit3;// 控制波形占空時的循環條件標志位//以下為延時子程序
void delay(uint a)
{
uchar c,d;
for(c=a;c>0;c--)
for(d=80;d>0;d--);
}
//以下為顯示函數
void display(uchar x,uchar y,uchar k)
{
uchar ge,shi; //對傳遞時間函數進行分解
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; //有按鍵按動時即使計數值初始為0
if(time!=99)
{
time++;
}
break; case 3: d=0; //有按鍵按動時即使計數值初始為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;//打開四路數碼管位顯示控制
delay(1);
}
hotla=1;
shila=1;
gela=1;
xuanla=1;//關閉四路數碼管位顯示控制
}
P1=0xfc;
num=P1;
if(num!=0xfc)
{ P1=0xfe;
num=P1;
if(num!=0xfe)
{
switch(num)
{
case 0xfa: num1=7; break;//旋轉減
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;//打開四路數碼管位顯示控制
delay(2);
}
hotla=1;
shila=1;
gela=1;
xuanla=1;//關閉四路數碼管位顯示控制
}
openbit=~openbit;//改變開關機標志位
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);//開機即可改變相關變量值,條件為開機后使能 }
} 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;//使起始狀態為停機等待狀態
TMOD=0x11; //定義定時器工作模式
IP=0x08; //定時器1設置為最高中斷級別
TH0=0x3c;
TL0=0xb0; //進入裝初值
TH1=0xff;
TL1=0xe0;//進入裝初值
ET0=1;
ET1=1;
EA=1; //定時中斷至此全部打開開始運作。
while(1)
{
hotout=1;
xuanout=1;//將輸出都置為0輸出狀態,待機狀態 TR0=0;
TR1=0;//將返回的定時器全部關閉,避免不必要的誤動作
duan=0xfe; //待機時顯示的筆段控制
hotla=0;
shila=0;
gela=0;
xuanla=0;//打開四路數碼管位顯示控制
delay(1); //顯示維持時間設定
hotla=1;
shila=1;
gela=1;
xuanla=1;//關閉四路數碼管位顯示控制
if(P1!=0xfc)
fmqbit=0;
else fmqbit=1; //對按鍵掃描進行檢測,得出判斷蜂鳴器的鳴叫結果。 key(); //按鍵檢測函數調用
if(openbit!=0)
{
d=0; //秒鐘計時值置0狀態
TR0=1;
TR1=1;
hot=0;
hot1=hot;
hotoff=t-hot;
hotoff1=hotoff; //將熱控制的初值給予設定 xuan=0;
xuan1=xuan;
xuanoff=t-xuan;
xuanoff1=xuanoff; //將旋轉控制的初值給予設定 biaobit0=0;
biaobit1=1;
biaobit2=0;
biaobit3=1; hotled=0; //將熱輸出顯示值及狀態設置為0狀態
xuanled=0; //旋轉,效果同上 time=30; //時間初值設置為30分鐘整
while(openbit!=0)
{
key(); //按鍵檢測函數
if((time==0)&&(d>=1000))
{fmqbit=xsd;} //倒計至最后10秒時進行鳴叫
else
{
if(P1==0xfc)
fmqbit=1;
else fmqbit=0; //對按鍵掃描進行檢測,得出判斷蜂鳴器的鳴叫結果。
}
display(time,hotled,xuanled);//調用顯示函數
}
}
}}
與hotandxuan10區別于bing1 和bing0兩個變量取消,同時定時中斷1的程序體全部加以代碼優化,解決掉原程序執行過程中中斷停留時間過長,影響數碼管顯示,閃爍的問題,同時處理掉按鍵在開至最高檔時檢測靈敏度下降問題.