//實現了:按下RD按鍵運行流水燈,按下WR運行數碼管靜態顯示,按下TD運行計時(當加到99時蜂鳴器響),按下TD運行溫度傳感器顯示當前溫度
#include<reg52.h>
#include <intrins.h> //因為要用到corol這一關鍵字
#define uint unsigned int
#define uchar unsigned char
const unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
//------------------位定義
sbit d1=P1^0; //LED燈
sbit d2=P1^1;
sbit d3=P1^2;
sbit d4=P1^4;
sbit FM=P2^3;
sbit dula=P2^5; //數碼管
sbit wela=P2^6;
sbit pled=P3^7; //按鍵
sbit psmg=P3^6;
sbit pjishi=P3^5;
//sbit pweibolu=P3^4;
//------------------------變量
uint XX=0,tt=0;
uchar temp,a,temp2;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void didi(uchar u)
{
uchar j;
for(j=u;j>0;j--)
{
FM=0;delay(100);
FM=1;delay(110);
}
}
//-------------------------函數聲明
void init();
void ledinit();
void smginit();
void jishiinit();
//void weiboluinit();
void jianche();
void led();
void smg();
void disp(uchar shi,uchar ge);
void dodo();
auto jishi();
//-----調試開關-------------1
#define led1
#define smg1
#define jishi1
void jianche() //檢測按鍵
{
if(pled==0) {delay(5);if(pled==0) while(!pled); didi(1);XX=1;}
if(psmg==0) {delay(5);if(psmg==0) while(!psmg); didi(1);XX=2;}
if(pjishi==0) {delay(5);if(pjishi==0) while(!pjishi); didi(1);XX=3;tt=0;temp2=0;} //加上temp2=0清空,從0開始計,否則會記憶自動繼續
// if(pweibolu==0) {delay(5);if(pweibolu==0) while(!pweibolu); didi(1);XX=4;}
}
//-----------------------------主函數
void main()
{
init();
while(1)
{
jianche();
/*
if(XX==1)led();
if(XX==2)smg();
if(XX==3)jishi();
if(XX==4)weibolu();
*/
switch(XX)
{
case 1:led();break;
case 2:smg();break;
case 3:jishi();break;
}
}
}

//-----------------------初始化
void init()
{
EA=1; //開總中斷
EX0=1; //開外部中斷0 INT0
EX1=1; //開外部中斷1 INT1 手動去中斷即外部中斷只有2個。T0和T1是定時器的中斷
TCON=0x01; //設為跳變沿觸發方式,即IT0=1;
#ifdef jishi1
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
#endif
}
//----------------------
#ifdef led1
void led()
{
//uchar temp,a;
#endif
temp=0xfe;
for (a=8;a>0;a--) //循環8次
{
P1=temp;
temp=_crol_(temp,1); //移動
delay(100);
jianche();
if(XX!=1)break;
}
temp=0x7f; //注意這一句,如果沒有這一句,下面的語句循環是循環了,卻沒東西出來
for (a=8;a>0;a--) //循環8次,即流水燈8個循環8次即可點亮8個
{
P1=temp;
temp=_crol_(temp,-1); //移動
delay(100);
jianche();
if(XX!=1)break;
}
}
#endif
#ifdef smg1
void smg()
{
uchar num;
wela=1;
P0=0xea; //11101010 只要1、3、5數碼管亮
wela=0;
for(num=0;num<16;num++)
{
if(XX!=2)break; //增加按鍵檢測靈敏度
dula=1;
P0=table[num];
if(XX!=2)break;
dula=0;
delay(350);
jianche();
if(XX!=2)break;
delay(350);
}
}
#endif
#ifdef jishi1
void disp(uchar shi,uchar ge)
{
dula=1;
P0=table[shi];
dula=0;
wela=1;
P0=0x4;
wela=0;
delay(1);
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=0x08;
wela=0;
delay(1);
}
void dodo()
{
uchar shi,ge;
if(tt==20)
{
tt=0;
temp2++;
shi=temp2/10;
ge=temp2%10;
} //帶參數bai,shi,ge給調用函數
disp(shi,ge); //這句放在上面的括號內會出現只顯法個位,十位百位均顯不出耿
if(temp2==99){delay(50);didi(1);temp2=0; }
}
auto jishi()
{
// if(INT1==0)TR0=1; //51的很奇怪,程序是對的??,可運行會出錯;中斷出錯
// if(INT0==0)TR0=0;
dodo();
}
#endif
#ifdef weibolu1
void weiboluinit()
{
}
#endif
//-----------------中斷---------------------------------------------
void tming0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}
|