寻迹小车控制与驱动模块原理图
寻迹小车寻迹模块原理图
实现的程序代码:
#include #include"intrins.h" #define uint unsigned int #define uchar unsigned char #define CM 2.6 uchar dis1[]={"Path:0000.0cm"}; uchar dis2[]={"Time:00min 00.0s"}; uchar dispbuf[10]; void delay(uchar x); void delayms(uint t); void dianji_control(); void display(uchar location,uchar *ptr); void zhuan180(); void stop(); void xunji(); void bujiu1(); void beep(); sbit Beep=P2^7; sbit rs=P2^4; sbit rw=P2^5; sbit ep=P2^6; sbit RX=P3^7; sbit TX=P3^6; uchar xiaozuo,dazuo,zhixian,xiaoyou,dayou,flag,bujiuzuo,bujiuyou,bujiu,count; uchar temp,buffer,dis_flag,n,m,min=0,zhijiao,zuozhi,youzhi; uint sec=0,z,y,a; uint barrier=0; float time; float s=0.0,s_left,s_right; void delayms(uint t) { uint i,j; for(i=t;i>0;i--) for(j=125;j>0;j--); } void delay(uchar x)// { uchar i; while(x--) { for (i = 0; i<5; i++) {;} } } void NOP() { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } lcd_wcmd(uchar cmd) { // 写入指令数据到LCD rs = 0; rw = 0; ep = 0; _nop_(); _nop_(); P0 = cmd; delayms(5); ep = 1; delayms(5); ep = 0; } lcd_wdat(uchar dat) { //写入字符显示数据到LCD rs = 1; rw = 0; ep = 0; P0 = dat; delayms(5); ep = 1; delayms(5); ep = 0; } lcd_init() { //LCD初始化设定 lcd_wcmd(0x38); // delayms(5); lcd_wcmd(0x0c); // delayms(5); lcd_wcmd(0x06); // delayms(5); lcd_wcmd(0x01); //清除LCD的显示内容 delayms(5); } void shuju_chuli() { uint path; s=(s_left+s_right)/2; path=s*10; dis1[5]='0'+path/10000; dis1[6]='0'+path%10000/1000; dis1[7]='0'+path%1000/100; dis1[8]='0'+path%100/10; dis1[10]='0'+path%10; dis2[5]='0'+min/10; dis2[6]='0'+min%10; dis2[11]='0'+sec/100; dis2[12]='0'+sec%100/10; dis2[14]='0'+sec%10; } void display(uchar location,uchar *ptr) { while((*ptr)!='\\0') { lcd_wcmd(0x80+location); lcd_wdat(*ptr++); location++; } } void beep()//蜂鸣器 { unsigned char i,j; for(j=0;j<3;j++) { for (i=0;i<200;i++) { delayms(1); Beep=!Beep; //BEEP取反 } Beep=1; //关闭蜂鸣器 delayms(1000); } } void zuo90() { uint i;uchar j; i=y; while(y<=(i+12)) { P2=0XF0; j=P1&0xff; if((j==0x27)&&(y>=(i+7)))break; P2=0xf4; _nop_();_nop_(); } P2=0XF5;delayms(10);flag=0;zhixian=1;bujiu=2;zuozhi=0;youzhi=0; } void you90() { uint i;uchar j; i=z; while(z<=(i+12)) { P2=0XF0; j=P1&0xff; if(((j==0x27))&&(z>=(i+7)))break; P2=0xf1; _nop_();_nop_(); } P2=0XF5;delayms(10);flag=0;zhixian=1;bujiu=2;zuozhi=0;youzhi=0; } void zhuan180() { uint i=0; uchar j; i=y; while((y<=i+7)) { P2=0XF0; j=P1&0xff; if((j==0x27)&&(y>=(i+6)))break; P2=0xf9; _nop_(); } P2=0XF5;delayms(10);flag=0;zhixian=1;bujiu=2; } void stop() { P2=0XF0;EA=0;TR0=0; shuju_chuli(); display(0,dis1); display(0x40,dis2); beep(); } void bujiu1() { if(bujiu==1) { if(bujiuzuo==1) { P2=0Xf5;delay(5); P2=0Xf4;delay(count); } else if(bujiuyou==1) { P2=0Xf5;delay(5); P2=0Xf1;delay(count); } count++; if(count>=13){count=13;} } if(bujiu==0) { a++; if(a>=220) { a=0; TR0=0;P2=0XF0; zhuan180(); TR0=1; } } } void state() { temp=P1&0xff; switch(temp) { case 0x27:zhixian=1;a=0;flag=0;bujiu=0;break; case 0x47:xiaozuo=1;a=0;flag=1;bujiu=0;break; case 0x67:xiaozuo=1;a=0;flag=1;bujiu=0;break; case 0x37:xiaoyou=1;a=0;flag=1;bujiu=0;break; case 0x17:xiaoyou=1;a=0;flag=1;bujiu=0;break; case 0x87:dazuo=1;a=0;flag=2;bujiu=1;bujiuzuo=1;bujiuyou=0;count=10;break; case 0xc7:dazuo=1;a=0;flag=2;bujiu=1;bujiuzuo=1;bujiuyou=0;count=10;break; case 0x0f:dayou=1;a=0;flag=2;bujiu=1;bujiuyou=1;bujiuzuo=0;count=10;break; case 0x1f:dayou=1;a=0;flag=2;bujiu=1;bujiuyou=1;bujiuzuo=0;count=10;break; case 0xe7:zuozhi=1;break; case 0xf7:zuozhi=1;break; case 0xff:zuozhi=0;youzhi=0;zhijiao=0;you90();break; case 0x3f:youzhi=1;break; case 0x7f:youzhi=1;break; case 0x07:bujiu1();break; //case 0x77:m++;if(m>=2){m=0;stop();};break; } } void speed_left()interrupt 0 { s_left+=CM; z++; } void right_left()interrupt 2 { s_right+=CM; y++; } void t0()interrupt 1 { TH0=(65536-90)/256; TL0=(65536-90)%256; P2=0XF0; state();delay(10); if((zuozhi==1)||(youzhi==1)) { zhijiao++; if(zhijiao==16) { zhijiao=0; if(zuozhi==1){zuo90();} if(youzhi==1){you90();} } } if(TR0==0)return; if(zhixian==1) { TR1=1; if(flag!=0) {zhixian=0;} P2=0XF5; delay(20); } if(xiaozuo==1) { TR1=1; if(flag!=1) {xiaozuo=0;} else { P2=0Xf5;delay(12); P2=0Xf4;delay(6); } } if(xiaoyou==1) { TR1=1; if(flag!=1) {xiaoyou=0;} else { P2=0Xf5;delay(12); P2=0Xf1;delay(6); } } if(dazuo==1) { TR1=1; if(flag!=2) {dazuo=0;} else { P2=0Xf5;delay(8); P2=0Xf4;delay(12); } } if(dayou==1) { TR1=1; if(flag!=2) {dayou=0;} else { P2=0Xf5;delay(8); P2=0Xf1;delay(12); } } } void t1()interrupt 3 { unsigned int i=0; TH1=(65536-50000)/256; TL1=(65536-50000)%256; n++; if(n>=2) { n=0; sec++; if(sec>=600) { sec=0; min++; if(min>=60) {min=0;} } } } main() { TMOD=0X11; P2=0Xff; P1=0xff; TH1=(65536-50000)/256; TL1=(65536-50000)%256; TH0=(65536-90)/256; TL0=(65536-90)%256; IE=0Xaf; IP=0X0d; IT0=1; IT1=1; lcd_init();// 初始化LCD delayms(10); display(0,dis1); display(0x40,dis2); TR0=1; while(1); }