//实现了:按下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++;
}
|