|
|
//實(shí)現(xiàn)了:按下RD按鍵運(yùn)行流水燈,按下WR運(yùn)行數(shù)碼管靜態(tài)顯示,按下TD運(yùn)行計(jì)時(shí)(當(dāng)加到99時(shí)蜂鳴器響),按下TD運(yùn)行溫度傳感器顯示當(dāng)前溫度
#include<reg52.h>
#include <intrins.h> //因?yàn)橐玫絚orol這一關(guān)鍵字
#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; //數(shù)碼管
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);
}
}
//-------------------------函數(shù)聲明
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();
//-----調(diào)試開(kāi)關(guān)-------------1
#define led1
#define smg1
#define jishi1
void jianche() //檢測(cè)按鍵
{
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開(kāi)始計(jì),否則會(huì)記憶自動(dòng)繼續(xù)
// if(pweibolu==0) {delay(5);if(pweibolu==0) while(!pweibolu); didi(1);XX=4;}
}
//-----------------------------主函數(shù)
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; //開(kāi)總中斷
EX0=1; //開(kāi)外部中斷0 INT0
EX1=1; //開(kāi)外部中斷1 INT1 手動(dòng)去中斷即外部中斷只有2個(gè)。T0和T1是定時(shí)器的中斷
TCON=0x01; //設(shè)為跳變沿觸發(fā)方式,即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--) //循環(huán)8次
{
P1=temp;
temp=_crol_(temp,1); //移動(dòng)
delay(100);
jianche();
if(XX!=1)break;
}
temp=0x7f; //注意這一句,如果沒(méi)有這一句,下面的語(yǔ)句循環(huán)是循環(huán)了,卻沒(méi)東西出來(lái)
for (a=8;a>0;a--) //循環(huán)8次,即流水燈8個(gè)循環(huán)8次即可點(diǎn)亮8個(gè)
{
P1=temp;
temp=_crol_(temp,-1); //移動(dòng)
delay(100);
jianche();
if(XX!=1)break;
}
}
#endif
#ifdef smg1
void smg()
{
uchar num;
wela=1;
P0=0xea; //11101010 只要1、3、5數(shù)碼管亮
wela=0;
for(num=0;num<16;num++)
{
if(XX!=2)break; //增加按鍵檢測(cè)靈敏度
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;
} //帶參數(shù)bai,shi,ge給調(diào)用函數(shù)
disp(shi,ge); //這句放在上面的括號(hào)內(nèi)會(huì)出現(xiàn)只顯法個(gè)位,十位百位均顯不出耿
if(temp2==99){delay(50);didi(1);temp2=0; }
}
auto jishi()
{
// if(INT1==0)TR0=1; //51的很奇怪,程序是對(duì)的??,可運(yùn)行會(huì)出錯(cuò);中斷出錯(cuò)
// 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++;
}
|
|