這是一個完整的用51系列單片機做的媚眼激活儀的代碼,有這方面需要的朋友可以看看,代碼已經測試成功。
/*
項目名稱:單片機媚眼激活儀器
相關知識點:單片機驅動發熱器件,數碼管顯示,按鍵操作等。
程序開發:http://www.zg4o1577.cn單片機教程網。
*/
#include < reg51.H>
#define uint unsigned int
#define uchar unsigned char
#define duan P0 //將P1口段顯示定義為duan標號
#define keyio P3 //將P3口設為按鍵檢測的端口
uchar time,guannum,guantime1,guantime2;//time為分鐘值,光顯示時間值
uint b; //50MS為1次,則1分鐘為1200次即可
bit xsd,onandoff; //小數點閃爍位變量,開關機變量標志位
sbit xuanled=P2^3;
sbit guanled=P2^5;
sbit rfled=P2^7;//三個指示燈位控制
sbit xsdbit=P0^6;// 小數點實際硬件輸出引腳定義
sbit gewela=P2^0;//個位數碼管位控制
sbit shiwela=P2^1;//十位數碼管鎖定位控制
sbit guanout=P1^0;//光譜輸出
sbit rfout=P1^1; //RF發熱頭輸驅動
sbit xuanout=P1^2; //旋磁輸出
sbit fmqout=P1^3;
uchar code tab[]={0x48,0xee,0x54,0x64,0xe2,0x61,0x41,0xec,0x40,0x60,0xf7};//數碼管段顯示編碼0~9,待編寫
void chushi(void); //進入主函數時初始化
void key(void); //按鍵檢測
void display(uchar time);//數碼管顯示處理程序
void chushi1(void); //進行大循環函數初始化處理
void delay(uchar num)//延時模塊程序
{
uchar c,d;
for(c=num;c>0;c--)
for(d=40;d>0;d--);
}
void main() //主函數程序體
{
uchar a;
chushi();
while(1)
{
chushi1();
key(); //按鍵檢測
if(keyio!=0xff)
fmqout=0;
else fmqout=1;
if(onandoff!=0)
{
for(a=100;a>0;a--)
{
duan=tab[10]; //開段顯示,顯示中間筆段
gewela=0;
shiwela=0;
delay(10);
gewela=1;
shiwela=1;
}
while(onandoff!=0)
{
display(time);
key();
if(time==0&&b>=1000)
fmqout=xsd;
else if(keyio==0xff)
fmqout=1;
else fmqout=0;
}
for(a=200;a>0;a--)
display(time);
}
}
}
void time0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
b++;
if(b==1200)
{
b=0;
if(time!=0)
time--;
else onandoff=0; //置零標志位
}
if(b%10==0)
xsd=~xsd; //小數點的位變量按1S的周期進行變化
if(guannum==2||guannum==3)
{
guantime2--;
if(guantime2==0)
{
guantime2=guantime1;
guanout=~guanout;
}
}
}
void chushi(void) //進主MAIN函數體時直接初始化
{
TMOD=0x01; //定時器定時模式
TH0=0x3c;
TL0=0xb0;
ET0=1;
EA=1;
TR0=1;
xuanled=1;
guanled=1;
rfled=1;
}
void chushi1(void) //對大循環的初始化
{
time=30; //開機時時間初值為30分鐘
guanout=0; //光譜輸出為低電平
rfout=0; //RF發熱頭輸驅動為低電平
xuanout=0; //旋磁輸出低電平
guannum=0; //待機時,光譜為0狀態
xuanled=1;
guanled=1;
rfled=1;
duan=tab[10]; //開段顯示,顯示中間筆段
gewela=0;
shiwela=0;
delay(2);
gewela=1;
shiwela=1;
}
void key(void) //按鍵檢測模塊
{
uchar a,num1;
keyio=0xff;
if(keyio!=0xff)
{
fmqout=0;
if(onandoff!=0)
{
for(a=100;a>0;a--)
display(time);
}
else
{ for(a=20;a>0;a--)
{
duan=tab[10]; //開段顯示,顯示中間筆段
gewela=0;
shiwela=0;
delay(2);
gewela=1;
shiwela=1;
}
}
if(keyio!=0xff)
{
num1=keyio;
switch(num1)
{
case 0xfe: onandoff=~onandoff; //開關機
break;
case 0xfd: b=0;
if((onandoff!=0)&&(time!=99)) //時間加
time++;
break;
case 0xfb: b=0;
if((onandoff!=0)&&(time!=0)) //時間減
time--;
break;
case 0xf7: if(onandoff!=0)
{
xuanout=~xuanout; //旋磁轉動變量變化
if(xuanout!=0)
xuanled=0;
else xuanled=1;
}
break;
case 0xef: if(onandoff!=0) //光譜輸出變量變化
{
guannum++;
if(guannum==4)
guannum=0;
if(guannum!=0)
guanled=0;
else guanled=1;
if(guannum==1)
guanout=1;
else if(guannum==2)
guantime1=guantime2=15;
else if(guannum==3)
guantime1=guantime2=8;
else guanout=0;
}
break;
case 0xdf: if(onandoff!=0) //RF發熱變量變化
{
rfout=~rfout;
if(rfout!=0)
rfled=0;
else rfled=1;
}
break;
default:break;
}
}
}
}
void display(uchar min)//數碼管顯示模塊
{
uchar ge,shi;
shi=min/10;
ge=min%10;
duan=tab[shi];
shiwela=0;
delay(5);
shiwela=1;
duan=tab[ge];
xsdbit=xsd;
gewela=0;
delay(5);
gewela=1;
}