本帖最后由 wdyy559 于 2013-4-9 19:41 编辑
用面包版连好
电路了,但是就是没有效果,不知道是给我的原理图错了,还是代码错了,各位大侠有完整的资料吗?分享我一下可以不,感激不尽啊(下面是源代码,有错吗?有没有可以用的程序借我试试)
times New Roman"> #include <AT89x51.H> //器件配置文件 #include <intrins.h> #define RX P0_0 #define TX P0_1 #define BEEP P0_2 unsigned int time=0; unsigned int timer=0; unsigned char posit=0; unsigned int k; bit flag_beep; unsigned long S=0; bit flag =0; unsigned char const discode[] ={0x05,0xDD,0x46,0x54,0x9C,0x34,0x24,0x5D,0x04,0x14,0xfe}; unsigned char const positon[4]={ 0x04,0x10,0x40,0x80}; unsigned char disbuff[4] ={ 0,0,0,0,};void DIDI(); void Display(void) //扫描数码管 { if(posit==0) {P2=(discode[disbuff[posit]])&0xfb;} else {P2=discode[disbuff[posit]];} P1=~positon[posit]; if(++posit>=4) posit=0; } void Conut(void) { time=TH0*256+TL0; TH0=0; TL0=0; //time=23529; S=(time*0.17); //算出来是CM if((S>=7000)||flag==1) //超出测量范围显示“-” { flag=0; flag_beep=0; disbuff[0]=10; //“-” disbuff[1]=10; //“-” disbuff[2]=10; //“-” disbuff[3]=10; //“-” BEEP=1; } else { disbuff[0]=S/1000; disbuff[1]=S/100%10; disbuff[2]=S/10%10; disbuff[3]=S%10; } } void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围 { flag=1; //中断溢出标志 } void zd3() interrupt 3 //T1中断用来扫描数码管和计800 ms启动模块 { TH1=0xf8; TL1=0x30; Display(); DIDI(); timer++; if(timer>=400) { timer=0; TX=1; //800 ms 启动一次模块 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; } } void main( void ) { TMOD=0x11; //设T0为方式1,GATE=1; TH0=0; TL0=0; TH1=0xf8; //2 MS定时 TL1=0x30; ET0=1; //允许T0中断 ET1=1; //允许T1中断 TR1=1; //开启定时器 EA=1; //开启总中断 while(1) { while(!RX); //当RX为零时等待 TR0=1; //开启计数 while(RX); //当RX为1计数并等待 TR0=0; //关闭计数 Conut(); //计算 } } void DIDI() { if(S<1000) { BEEP=0; } else { k++; // if(k>=500) // { // k=0; // flag_beep=!flag_beep; //} if((S>=1000)&&(S<2000))//1 m~2 m { if(k>=500) { k=0; flag_beep=!flag_beep; } } if((S>=2000)&&(S<3000))//2 m~3 m { if(k>=300) { k=0; flag_beep=!flag_beep; } } if((S>=3000)&&(S<4000))//3 m~4 m { if(k>=200) { k=0; flag_beep=!flag_beep; } } if((S>=4000)&&(S<=5000))//4 m~5 m { if(k>=100) { k=0; flag_beep=!flag_beep; } } if(flag_beep) BEEP=0; else BEEP=1; } }
一周热门 更多>