![]() |
尋跡避障程序 #include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit RM1=P0^0; sbit RM2=P0^1;//右電機 sbit LM1=P0^2; sbit LM2=P0^3;//左電機 sbit bzh=P2^6; sbit RAD=P0^6;//紅外接收右電機轉 sbit LBD=P0^7;//紅外接收左電機轉 sbit rs=P3^5;// LCD的RS sbit rw=P3^6;// LCD的R/W sbit en=P3^7;// LCD的E void lcd_string(uchar *strpoint); void delay(uint a) { uint b,c; for(b=a;b>0;b--) for(c=120;c>0;c--); } uchar i=0; void checkbusy()//檢查LCD忙 { uchar dat; rs=0; //rs=1為數據,=0為命令. rw=1; //rw=1為讀,=0為寫. do { P1=0x00; en=1; //E信號下降沿鎖存DB7~DBO dat=P1; //讀入P1的值 en=0; //鎖存 dat=0x80 & dat; //BUSY:1內部在工作,0正常狀態 }while(!(dat==0x00));rw=0; } void sentcom(uchar com) { checkbusy(); //檢查Busy rs=0; en=0; P1=com; delay(5); en=1; delay(5); en=0; } void sentdata(uchar date) //寫數據 { checkbusy(); rs=1; en=0; P1=date; delay(5); en=1; delay(5); en=0; } //初始化 LCM void lcd_init() { sentcom(0x38);//功能設置,一次送8位數據,基本指令集 sentcom(0x0C);//0000,1100 整體顯示,游標off,游標位置off sentcom(0x01);//0000,0001 清DDRAM sentcom(0x02);//0000,0010 DDRAM地址歸位 sentcom(0x80);//1000,0000 設定DDRAM 7位地址000,0000到地址計數器AC } void lcd_string(char*strpoint)//在當前顯示位置顯示LCD字符串 { register i=0; while(strpoint[ i]!=0){ sentdata(strpoint[ i]); i++; } } void stop() { lcd_init(); sentcom(0x80); lcd_string("現代創新實訓室 ");//C編譯系統本省也具有轉換功能,所以也可以這樣寫 sentcom(0x90); lcd_string("尋跡避障一體小車"); sentcom(0x88); lcd_string("--指導:"); sentcom(0x98); lcd_string("--設計: "); } void tracing() { sentcom(0x80); lcd_string("現代創新實訓室 "); sentcom(0x90); lcd_string("--指導:"); sentcom(0x88); lcd_string("--設計: "); sentcom(0x98); lcd_string(" 小車尋跡中---"); } void bypass() { sentcom(0x80); lcd_string("現代創新實訓室 "); sentcom(0x90); lcd_string("--指導:"); sentcom(0x88); lcd_string("--設計: "); sentcom(0x98); lcd_string(" 小車避障中---"); } void find() {tracing(); while(bzh==1) { if(LBD&&RAD==1) { RM1=1;LM1=1; RM2=0;LM2=0; } if(RAD==0) { RM1=0;LM1=1; RM2=0;LM2=0; if(LBD==0) { RM1=1;LM1=1; RM2=0;LM2=0; delay(i); } } if(LBD==0) { RM1=1;LM1=0; RM2=0;LM2=0; if(RAD==0) { RM1=1;LM1=1; RM2=0;LM2=0; delay(i); } } } } void bizhan() { bypass(); if(bzh==0) { RM1=1;LM1=0; RM2=0;LM2=1; delay(100); } } void main() { stop(); delay(2000); while(1) { find(); bizhan(); } } 來自基于51單片機制作的避障尋跡小車 |
你搜一下,論壇有一堆可參考 基于51單片機制作的避障尋跡小車 http://www.zg4o1577.cn/bbs/dpj-210555-1.html 尋跡避障小車電路、程序、電路分析、設計下載 http://www.zg4o1577.cn/bbs/dpj-78319-1.html |