|
單片機(jī)學(xué)習(xí)編程,必須要將各種中斷方法靈活的運(yùn)用到系統(tǒng)中去,如鍵實(shí)時(shí)盤(pán)掃描,顯示,各種輸出等;兩鍵智能豆?jié){機(jī)程序集鍵盤(pán)實(shí)時(shí)掃描,LED指示,輸出為一體;其綜合了“定時(shí)中斷,獨(dú)立按鍵,顯示,定時(shí)”等各種功能;該程序是學(xué)習(xí)實(shí)用型編程的必要撐握的程序。本人通過(guò)實(shí)際調(diào)試,輸出效果良好,達(dá)到預(yù)期的要求。
本豆?jié){機(jī)編程功能要求:
1、當(dāng)機(jī)器通電后,干豆指示燈、濕豆指示燈、米糊指示燈,三燈同時(shí)以0.5秒的速度進(jìn)行閃亮,以指示正在處于待機(jī)中;
2,當(dāng)K1鍵按下,系統(tǒng)程序進(jìn)入三種可選功能模式,(打干豆、打顯豆、打米糊);這三種功能選擇由K1完成;
3、當(dāng)K1選定了其中一個(gè)工作模式,必須按下K2確認(rèn),然后系統(tǒng)程序立即進(jìn)入工作中;
4、當(dāng)用戶不想用上面選擇的工作模式時(shí),按下K2鍵退出工作,然后按K1鍵再次進(jìn)入工作模式選擇,然后再按K2確認(rèn)進(jìn)入本次想要的工作模式。
5、要求系統(tǒng)程序任何時(shí)間,程序都必須對(duì)鍵盤(pán)實(shí)時(shí)掃描,以確保用戶可以隨時(shí)重新選擇工作模式或停機(jī)。
6、要求每按下一次任意鍵蜂嗚器都有響聲,以表示按下成功;
7、要求統(tǒng)統(tǒng)模式工作完成后,要求程序回到待機(jī)狀態(tài),以指示工作完成,用戶可以喝豆?jié){了。
以下程序用SiWN開(kāi)發(fā)板驗(yàn)證調(diào)試完成。
////------------------兩鍵(三功能)智能豆?jié){機(jī)程序-------------OK 2012-7-28
////-----------------芯片STC12C5A60S2(青龍工作室)----------------
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
static uchar ID=0;
static uchar ID2=0;
static uint time=0;
static uchar nem=0;
sbit k1=P0^1;//-----功能選擇按鍵
sbit k2=P0^2;//-----確認(rèn)按鍵
sbit beep=P3^3;//---蜂嗚器
sbit LED_LE=P3^4;//-LED片選端
sbit HOT=P1^5;//----發(fā)熱管
sbit MM=P1^4;//-----電機(jī)
////////
sbit LED_gandou=P1^3;//----干豆指示燈
sbit LED_shidou=P1^2;//----濕豆指示燈
sbit LED_mihu=P1^1;//------米糊指示燈
////////-------------------------------延時(shí)
void delayms(uint yanshi)
{
uint a;
for(a=0;a<yanshi;a++);
}
///////-----------------------k2/(on/off)按鍵檢測(cè)
void k2_panduan()
{
if(!k2)
{
delayms(350);
if(!k2)
while(k2==0);
beep=0;
delayms(60000);
beep=1;
ID2++;
}
}
///////--------------------------------k1按鍵檢測(cè)
void k1_panduan()
{
if(!k1)
{
delayms(350);
if(!k1)
while(k1==0);
beep=0;
delayms(60000);
beep=1;
ID++;
}
}
///////--------------------------------功能程序---------
void start()
{
while(ID2<4)
{
if(ID==1)
{
LED_gandou=0;
LED_shidou=1;
LED_mihu=1;
////
k1_panduan();
if(!k2)
{
delayms(350);
while(k2==0);
beep=0;
delayms(60000);
beep=1;
while(time<401)
{
if(time<200)
{
TR1=1;
HOT=0;//發(fā)熱管接通
MM=1;
k2_panduan();
if(ID2==1)
{
ID2=0;
break;
}
}
///-----------------------------
if(time>200&&time<400)
{
TR1=1;
HOT=1;//發(fā)熱管斷開(kāi)
MM=0;
k2_panduan();
if(ID2==1)
{
ID2=0;
break;
}
}
///-----------------------------
}
HOT=1;
MM=1;
time=0;
TR1=0;
goto qinlong;
}
}
////**********************************************///
else if(ID==2)
{
LED_gandou=1;
LED_shidou=0;
LED_mihu=1;
////
k1_panduan();
if(!k2)
{
delayms(350);
while(k2==0);
beep=0;
delayms(60000);
beep=1;
while(time<401)
{
if(time<200)
{
TR1=1;
HOT=1;//發(fā)熱管斷開(kāi)
MM=0;
k2_panduan();
if(ID2==1)
{
ID2=0;
break;
}
}
//--------------------------
if(time>200&&time<400)
{
TR1=1;
HOT=0;//發(fā)熱管接通
MM=1;
k2_panduan();
if(ID2==1)
{
ID2=0;
break;
}
}
//--------------------------
}
HOT=1;
MM=1;
time=0;
TR1=0;
goto qinlong;
}
}
////**********************************************///
else if(ID==3)
{
LED_gandou=1;
LED_shidou=1;
LED_mihu=0;
////
k1_panduan();
if(!k2)
{
delayms(350);
while(k2==0);
beep=0;
delayms(60000);
beep=1;
while(time<401)
{
if(time<200)
{
TR1=1;
HOT=0;//發(fā)熱管斷開(kāi)
MM=0;
k2_panduan();
if(ID2==1)
{
ID2=0;
break;
}
}
////---------------------
if(time>200&&time<400)
{
TR1=1;
HOT=1;//發(fā)熱管斷開(kāi)
MM=1;
k2_panduan();
if(ID2==1)
{
ID2=0;
break;
}
}
///----------------------
}
HOT=1;
MM=1;
time=0;
TR1=0;
goto qinlong;
}
}
////-----------------------------
else if(ID==4)
ID=1;
}
qinlong:return;
}
/*---------------------------------------------*/
///////------------------------------------主程序
void main()
{
TMOD=0x11;
TH0=0x4c;
TL0=0x00;
IE=0x8a;
//-------------------------------
TH1=0x4c;
TL1=0x00;
TR0=1;
TR1=0;
//-------------------------------
LED_LE=0;
while(1)
{
if(!k1)
{
delayms(300);
if(!k1)
{
while(k1==0);
beep=0;
delayms(60000);
beep=1;
ID++;
start();//ID判斷
}
}
////============================
if(nem==10)
{
LED_gandou=~ LED_gandou;
LED_shidou=~LED_shidou;
LED_mihu=~LED_mihu;
nem=0;
}
}
////
}
/*---------------------定時(shí)中斷0--------------------*/
void Tmer_0() interrupt 1
{
TR0=0;
TH0=0x4c;
TL0=0x00;
nem++;
TR0=1;
}
///////////////////////定時(shí)中斷1/////////////////////
void Tmer_1() interrupt 3
{
TR1=0;
TH1=0x4c;
TL1=0x00;
time++;
TR1=1;
}
|
|