/*------------------------------------- 超聲波測距器單片機程序 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; }
|