/*------------------------------------- 超声波测距器单片机程序 MCU AT89C51 XAL 12MHz 2009.5.25 #include<at89x51.h> #include<intrins.h> #define uchar unsigned unsigned char #define uint unsigned int #define ulong unsigned long uchar code tab[]={0x18,0x7b,0x2c,0x29,0x4b,0x89, 0x 88, 0x3b, 0x 08, 0x 09, 0x f f, 0x 8e};//段码 data uchar testok,num,keynum1,mao; data uchar dispram[4]={0,0,0,0};//显示初值 data uine i; data ulong time,baojing; sbit set=P2^0;//定义位寻址,设置键 sbit add=P2^1;//加 sbit dec= P2^2;//减 sbit ok= P2^3;//确定键 dalay(uchar t)//延时子程序 { uchar I; for(i=0;i<t;i++) for(j=0;j<10;j++) } init()//定时器初始化、启动超声波发送 { uchar i=4; TH0=0; TL0=0; TR0=1; while(i--) { P1_0=~p1_0 dalay(1); } } display()//显示子程序 { uchar i,temp=0xef; for{i=0;i<4;i++} { P2=temp; if(mao==1&&keynum-1==i) P0=0xff;//灭 else p0=tab[dispram];//亮,送显示数据 temp=_crol_(temp,1); delay(10); P2=0xff; } } viod shanshuo()//闪烁 { if(keynum1<1) { keynum1++; mao=1; } else { keynum1++; mao=0; if(keynum1==2) keynum1=0; } } void keyscan()//键盘扫描 { if(set==0)//设置键 delay(10); if(set==0) { while(!set); delay(10); while(!set); keynum++;//键值加1 EX0=0; //管定时器0和外部中断1 ET0=0; if(keynum==5) keynum=1; } if(keynum!=0) { if(add==0) //增加 delay(10); if(add==0) { while(!add); delay(10); while(!add); dispram[keynum-1]++; //对应的缓冲区值加1 if(dispram[keynum-1]==10) dispram[keynum-1]=0; } if(dec==0) //值减 delay(10); if(dec=0) { while(!dec); delay(10); while(idec; if(dispram[keynum-1]== 0) dispram[keynum-1]=10; dispram[keynum-1]--;//对应的缓冲区值减1 } } if(ok==0)//确定键 delay(10); if(ok==0) { while(!ok) delay(10); while(!ok); keynum=0; baojing=dispram[3]*1000+dispram[2]*100+dispram[1]*10+disprm[0];//取出设置的报警值 EX0=1; ET0=1; } } /*主程序*/ void main(viod) { TMOD=0x01;//定时器0模式1 IE=0x80;//开总中断,相当于EA=1; while(1) { testok=0; if(keynum!=0) shanshuo(); else{ inie();//启动定时器0和超声波发送 EX0=1;//开外部中断0 ET0=1;//开定时器0中断 while(!testok)display(); } keyscan(); if(1==teskok) { time=TH0; time=(time<<8)/TL0;//取出定时器0值 time*=172; time/=10000;//变为厘米 if(time<baojing) P1_1=0;//报警 else P1_1=1; dispram[0]=(uchar)(time%10);//距离计算送显示缓冲 time/=10; dispram[1]=(uchar)(time%10); time/=10; dispram[2]=(uchar)(time%10); dispram[3]=(uchar)(time%10); } if(2==testok)//超时显示OFF { dispram[0]=11; dispram[1]=11; dispram[2]=0; dispram[3]=10; } for(i=0;i<300;i++) display(); } } /*超声接收程序(外中断0)*/ void cs_r(void) interrupt 0 { TR0=0; ET0=0; EX0=0; testok=1; } /*超时清除程序(内中断T0)*/ void overtime(void)interrupt 1 { EX0=0; ET0=0; TR0=0; testok=2; }
|