超声波倒车节制器的手艺要求 1.在现有样品只能显示测试距离功能的根蒂根底上增添继电器用来节制电机断电(串励系统)或者启动它励(它励系统)同时有声光报警。数位显示可以保留作为选装件。 2.节制器应在离障碍物99~5cm时启动(感应探头至障碍物的距离)。应该做到出厂可调以适应客户需求。 3.产品工作电压12V,主机应自力封装,做到防尘防水抗电磁干扰。 4.每套系统有2或者3只探头,所有附件与主机的邻接均采用插接器,以便维护保养。 5.以上要求为姑且定制,有问题两边协商解决。 补充:欠压继电器12v断电电路;距离<5CM,继电器12v割断电机,软件C措辞代码,硬件建造成品电路板。 //超声波测距系统,2008.5.5// //89s51,数显,99CM-5CM,声光报警,继电器欠压珍爱,继电器5CM继电器节制电机断电。// //工作电压12v输入,3路数码管显示距离。// #include "reg51.h" #include #define uchar unsigned char #define uint unsigned int #define ulong unsigned long sbit transfer="P1"^0; sbit receiver="P3"^2; sbit speak="P1"^1; sbit relay="P3"^1; //继电器节制接口 /*数码管位选节制*/ sbit ledwei0=P2^4; sbit ledwei1=P2^5; sbit ledwei2=P2^6; uchar TimerH,TimerL; //争夺测量准时器的值 ulong realTimer; //存放真测量时辰 ulong real_dis; //存放测量距离 uint dis_flag; //距离较劲争论标记位 uint alarm_flag100=0; //用于报警 uint alarm_flag50=0; uint alarm_flag20=0; uint alarm_flag10=0; uint wei0,wei1,wei2,wei3; uchar ledflag="0"; //数码管标记位,用于刷新 uchar send_flag=0; uchar count="0"; //准时器T0计数 uchar ledcode[11]={0x18, 0x7B, 0x2C, 0x29, 0x4B, 0x89, 0x88, 0x3B, 0x08, 0x09,0xff};//连络硬件译码 /*延时函数*/ void delay(uint count) //延时 { while(count--); } /*超声波发送函数--40KHZ*/ void CLK40K() { uchar i="4"; //发送的波形数量=(i/2) // ET1=0; TR0=1; //START TIME0,同时发送40KHZ方波 do { transfer=~transfer; _nop_ (); _nop_ (); _nop_ (); _nop_ (); _nop_ (); _nop_ (); _nop_ (); _nop_ (); _nop_ (); } while(--i); } /*距离测量函数*/ void distance(void) { realTimer=TimerH*256+TimerL; real_dis=realTimer*164/10000; //单位cm //if(real_dis<=10) //real_dis=10; //real_dis=103; wei0=real_dis%10; wei1=(real_dis/10)%10; wei2=(real_dis/100)%10; //wei3=real_dis/1000; } /*显示刷新函数函数*/ void display(void) { switch(ledflag) { case 0:P0=ledcode[wei0];ledwei0=0;ledwei1=1;ledwei2=1;break; case 1:P0=ledcode[wei1];ledwei0=1;ledwei1=0;ledwei2=1;break; case 2:P0=ledcode[wei2]; if(wei2<=0) { ledwei0=1;ledwei1=1;ledwei2=1; } else { ledwei0=1;ledwei1=1;ledwei2=0; } break; //case 3:P0=ledcode[wei3];break; } ledflag++; if(ledflag==3) ledflag=0; delay(0x80); } /*报警处理函数*/ void alarm_light(void) { if(real_dis<=10) { relay="0"; //封闭电机 speak="1"; } else if(real_dis<20) { if(alarm_flag20>=1) { speak^=1; alarm_flag20=0; } } else if(real_dis<50) { if(alarm_flag50>=2) { speak^=1; alarm_flag50=0; } } else if(real_dis<100) { if(alarm_flag100>=4) { speak^=1; alarm_flag100=0; } } else { speak="1"; } }
/*系统初始化法度*/ void init()//系统初始化 { TMOD=0X11; //初始化准时器T0,T1用于发生40hz发射波 TH0=0x00; TL0=0x00; TH1=0x00; TL1=0x00; TF1=0; PX0=1; ET1=1; EA=1; TR1=1; //启动准时器1 IT0=0; //外部低电平触发体式技俩
} void int0(void) interrupt 0 //封闭计数器,存计数值,置标记 { EA="0"; //封闭中止 EX0=0; //关外部中止 TimerL="TL0"; //争夺数值 TimerH="TH0"; TR0=0; //封闭准时器0 TH0=0x00; TL0=0x00; dis_flag=1; //距离较劲争论标记 //speak=1; // distance(); //调用距离较劲争论函数
} void time1(void) interrupt 3 { TF1=0; TH0=0x00; TL0=0x00; TH1=0x00; TL1=0x00; send_flag=1; //开启领受回波中止 } /*系统主函数*/ void main() { init(); //系统初始化 real_dis=150;//y预设初值,防止开机未发射超声波,电机锁死 delay(0x40); while(1) { if(send_flag==1) { /* 报警级别计数*/ alarm_flag100++; alarm_flag50++; alarm_flag20++; alarm_flag10++; /* 报警级别计数*/
send_flag=0; count++; if(count==5) { count=0; CLK40K(); //TR1=1; //??? delay(0x40); //延时,避斥地射的直达声波旗子暗记,可腔调节测量的最小距离 EX0=1; } } if(dis_flag==1) { dis_flag=0; //speak=0; distance(); EA="1"; } display(); //调用显示函数 alarm_light(); } } |