|
程序功能是按鍵一次,A燈亮,B燈滅,再按鍵第二次,A燈滅,B燈亮,第三按,A,B燈都不亮,進(jìn)入掉電模式,三檔循環(huán)。但是按鍵很不靈活,時(shí)行時(shí)不行,求大俠指點(diǎn),以下是程序
#include<reg51.h> // 包含51單片機(jī)寄存器定義的頭文件
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char ID; //儲(chǔ)存流水燈的流動(dòng)速度
sfr P3M1=0xb1;
sfr P3M0=0xb2;
sfr AUXR=0x8e;
sfr CLK_DIV= 0x97; //時(shí)鐘分頻寄存器
sfr INT_CLKO = 0x8F; //外部中斷與時(shí)鐘輸出控制寄存器
//sfr IP=0xB8;
sbit INT3 = P3^5; //INT3引腳定義
bit FLAG;
sbit S1=P3^5; //位定義S1為P3.5
sbit LED1=P3^2;
sbit LED2=P3^3;
sbit LED3=P3^4;
/**************************************************************
函數(shù)功能:延時(shí)子程序
**************************************************************/
void Delay20ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 216;
k = 35;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/**************************************************************
函數(shù)功能:主函數(shù)
**************************************************************/
void main(void)
{
CLK_DIV = 0x00; //系統(tǒng)時(shí)鐘為內(nèi)部R/C振蕩時(shí)鐘
// PT0=0;
LED1=0;
LED2=0;
LED3=0;
P3M0 = 0x00;
P3M1 = 0x00;
INT_CLKO |= 0x20; //(EX3 = 1)使能INT3下降沿中斷
AUXR|=0x80; //定時(shí)器時(shí)鐘1T模式
//AUXR &= 0x7f; //定時(shí)器時(shí)鐘12T模式
//TMOD=0x00; //使用定時(shí)器T0的模式0
TMOD &= 0xF0;
TH0=0xF7; //定時(shí)器T0賦初值,每200微妙來(lái)1次中斷請(qǐng)求
TL0=0x5C;
TR0=1; //定時(shí)器T0開(kāi)始運(yùn)行
TF0 = 0; //清除TF0標(biāo)志
EA=1; //開(kāi)總中斷
ET0=1; //定時(shí)器T0中斷允許
ID=0;
while(1)
{
switch(ID)
{
case 0: INT_CLKO |= 0x20;
ET0=0;
PCON |= 0x02; //將STOP(PCON.1)置1,MCU將進(jìn)入掉電模式
_nop_(); //此時(shí)CPU無(wú)時(shí)鐘,不執(zhí)行指令,且所欲外設(shè)停止工作
_nop_(); //外部中斷信號(hào)和外部復(fù)位信號(hào)可以終止掉電模式
_nop_();
_nop_();
LED1=0; //0010 0100 P32
LED2=0;
LED3=0;
break;
case 1: INT_CLKO &= 0xDF;
LED1=0; //0010 1000 P33
LED2=0;
LED3=0;
break;
case 2: INT_CLKO &= 0xDF;
LED1=1; //0010 1000 P33
LED2=0;
LED3=0;
break;
case 3: INT_CLKO &= 0xDF;
LED1=0;
LED2=1;
LED3=0;
break;
}
}
}
/**************************************************************
函數(shù)功能:定時(shí)器T0的中斷服務(wù)子程序,進(jìn)行鍵盤掃描
**************************************************************/
void intersev(void) interrupt 1 using 1
{
TR0=0; //關(guān)閉定時(shí)器T0
S1=1;
if(S1==0) //如果是按鍵S1按下
{
Delay20ms(); //延時(shí)20ms,軟件消抖
if(S1==0) //如果是按鍵S1按下
ID=ID+1;
while(!S1);
}
if(ID==4)
ID=0;
TR0=1; //啟動(dòng)定時(shí)器T0
}
//中斷服務(wù)程序
void exint3() interrupt 11
{
PCON=0x00;
ET0=1;
ID=1;
S1=1;
LED1=0;
LED2=0;
LED3=0;
// INT_CLKO &= 0xDF; //若需要手動(dòng)清除中斷標(biāo)志,可先關(guān)閉中斷,此時(shí)系統(tǒng)會(huì)自動(dòng)清除內(nèi)部的中斷標(biāo)志
// INT_CLKO |= 0x20; //然后再開(kāi)中斷即可
} |
|