簡介:整理了紅外避障電動小車C51程序,僅供參考,希望對正在學習的你有用。
#include"reg51.h"
#include #define uchar unsigned char #define uint unsigned int #define left_infrare 0 #define right_infrare 1 #define dj_state1 0X5F //前進 #define dj_state2 0X4F //右轉 #define dj_state3 0X1F //左轉 #define dj_state4 0X0F //后退 #define dj_state5 0XfF //停車 #define light_off 0x0f //關轉向燈 #define left_light 0X5F //左轉向燈 兩個是5f #define right_light 0XaF //右轉向燈0xaf,兩個是0xbf #define back_light 0XcF //剎車燈即后燈 #define front_light 0x3f //前燈 #define light_on 0xff //開所有燈 #define true 1 #define false 0 #define LCD_Data P0 #define Busy 0x80 //用于檢測LCD狀態字中的Busy標識 sbit c=P1^2; //轉向燈使能端 uchar code talk1[]={"backward"}; uchar code talk2[]={"forward"}; uchar code talk3[]={"Turnleft"}; uchar code talk4[]={"Turn right"}; uchar flage =0x00; sbit ledcs=P1^2; //74H573的片選信號 //sbit left_led=P0^2; //左紅外發射管 //sbit right_led=P0^3; //右紅外發射管 sbit LCD_RS = P1^5; //LCD定義引腳 sbit LCD_RW = P1^6; // sbit LCD_E = P1^7 ; void Delay5Ms(void) { uint TempCyc = 5552; while(TempCyc--); } //400ms延時 void Delay400Ms(void) {uchar TempCycA = 5; uint TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); } } //LCD讀狀態 unsigned char ReadStatusLCD(void) { LCD_Data = 0xFF; LCD_RS = 0; LCD_RW = 1; LCD_E = 0; LCD_E = 0; LCD_E = 1; while (LCD_Data & Busy); //檢測忙信號 return(LCD_Data); } //LCD寫數據 void WriteDataLCD(unsigned char WDLCD ) { ReadStatusLCD(); //檢測忙 LCD_Data = WDLCD; LCD_RS=1; LCD_RW =0; LCD_E = 0; //若晶振速度太高可以在這后加小的延時 LCD_E = 0; //延時 ,為了安全 LCD_E = 0; //延時 LCD_E = 1; } //LCD寫指令 void WriteCommandLCD(unsigned char WCLCD,BuysC) { if (BuysC) ReadStatusLCD(); //根據需要檢測忙,BuysC為0時忽略忙檢測 LCD_Data = WCLCD; LCD_RS= 0; LCD_RW= 0; LCD_E = 0; //延時 ,為了安全 LCD_E = 0; LCD_E = 0; //延時 LCD_E = 1; } void LCDInit(void) //LCD初始化 { Delay400Ms(); LCD_Data = 0; WriteCommandLCD(0x38,0); //三次顯示模式設置,不檢測忙信號 Delay5Ms(); WriteCommandLCD(0x38,0); Delay5Ms(); WriteCommandLCD(0x38,0); Delay5Ms(); WriteCommandLCD(0x38,1); //顯示模式設置,開始要求每次檢測忙信號 WriteCommandLCD(0x08,1); //關閉顯示 WriteCommandLCD(0x01,1); //顯示清屏 WriteCommandLCD(0x06,1); // 顯示光標移動設置 WriteCommandLCD(0x0C,1); // 顯示開及光標設置 } //按指定位置顯示一個字符 void DisplayOneChar(uchar X, uchar Y, uchar DData) { Y &= 0x1; X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40; X |= 0x80; // 算出LCD的指令碼 WriteCommandLCD(X, 0); //這里不檢測忙信號,發送地址碼 WriteDataLCD(DData); } //按指定位置顯示一串字符(只能寫一行); void DisplayListChar(uchar X, uchar Y,uchar ListLength, uchar *DData,uchar n) { uchar i; Y &= 0x01; X &= 0x0F; //限制X不能大于15,Y不能大于1 for(i=0;i { DisplayOneChar(X, Y, DData[i]); //顯示單個字符 if(n==true)Delay400Ms(); X++; } } } /**************************** 紅外線接收子程序,利用了中斷的下降沿觸發方式 ****************************/ void infrared_ray()interrupt 0 using 3 { uchar i=90; flage=0x01; //接受標志位 while(i--); //減小靈敏度 EX0=0; //關掉中斷,等到發射方波后才開啟,處于別動 } // 延時子程序 void delay(uint n) { while(--n); } //中斷初始化 void Init0(void) { EA=1; IT0=1; } /*************************************** /*原理是把中斷打開并 發射方波, 當有中斷時就轉到中斷產生中斷位為下一步轉向做準備, 當沒有是關閉中斷 ****************************************/ void seng_wave(uchar timer,bit n)//timer通過載波發射信號的時間,n->左右發射管的選擇 { uchar i; P1 |= 0X04; //ledcs=1為74ls573為11腳為高電平時數據直接輸出,為低時把數據鎖存住,即保持 IE |= 0X01; P0 |=0x0c; //04 for(i=timer;i>0;i--) { if(n)P0^=0x08; // 右發射管通過載波發射信號//00 else P0^=0x04; // 左發射管通過載波發射信號//0c delay(100); //這里控制著靈敏度(控制38khz的方波的多少)和距離 } //timer*delay(x)即為發射管得到的平均電流 P1 &= 0Xfb; IE &= 0Xfe; } //led轉向燈指示子程序 void light_control(uchar deng) { ledcs=1; P0 =deng; ledcs=0; //11111011 } //電機和燈光的控制部分 void control(uchar n,uchar dj_state,uchar light) { uchar i; // P1|=0x04; light_control(light); //led轉向指示燈 delay(100); P2 =dj_state; //電機的方向控制 WriteCommandLCD(0x01,1); //LCD顯示清屏 switch(dj_state) { case dj_state2 :{ DisplayListChar(3,1,10,talk4,false);}break; case dj_state3: { DisplayListChar(3,1,8,talk3,false);}break; case dj_state4: { DisplayListChar(3,1,7,talk1,false); }break; default :break; } for(i=n;i>0;i--) {delay(2000);} P2=dj_state5; //停車 light_control(light_off); //led關閉 WriteCommandLCD(0x01,1); //LCD顯示清屏 P2=dj_state1; //前進 if(dj_state1) { P1|=0X04; //ledcs=1; P0=0x0f; P1&=0XFB; delay(100); DisplayListChar(0,0,7,talk2,false); } } /**************************************** 避障主要控制部分 *****************************************/ void move_car(void) { uchar temp =0x00; //左邊紅外管發射 seng_wave(1,left_infrare); //向下為中斷開啟有關閉后,要執行的語句 if(flage==0x01){temp|=0x01;flage=0x00;} //右邊紅外管發射 delay(30); seng_wave(1,right_infrare); //向下為中斷開啟有關閉后,要執行的語句 if(flage==0x01){temp|=0x02;flage=0x00;} //左邊有障礙物,右轉 if(temp==0x01){control(2,dj_state2,left_light); temp =0x00;} //右邊有障礙物,左轉 else if(temp==0x02) {control(2,dj_state3,right_light ); temp =0x00;} //兩個方向都有障礙物,后退,右轉 else if(temp==0x03) {control(10,dj_state4,back_light ); control(5,dj_state2,right_light ); temp =0x00;} } void main(void) { Init0(); //中斷初始化 P1 |= 0X04; //開鎖存器的控制位 P0 = 0xFf; //數據口的清零 P1&=0XFB; //關鎖存器的控制位 LCDInit(); //LCD初始化 WriteCommandLCD(0x01,1); //顯示清屏 delay(100); P2=dj_state1; DisplayListChar(0,0,8,talk2,false); while(1) { move_car(); //主要控制部分 delay(200000);//延時 } }
上一篇:51+ch375讀寫U盤超精簡源程序
下一篇:最后一頁
推薦閱讀
史海拾趣
隨著市場的不斷發展和競爭的加劇,BELDEN公司開始通過并購來擴大規模和提升競爭力。2004年7月,BELDEN公司與CDT公司合并,這次合并使得BELDEN成為了全球最大的通訊線纜和網絡產品生產廠家之一。合并后的BELDEN不僅擁有了更豐富的產品線和更強大的技術實力,還進一步提升了在全球市場中的競爭地位。此后,BELDEN繼續通過并購等方式不斷擴大規模,逐步成為了電子行業的領軍企業。
隨著業務的不斷擴展,FINISAR開始在全球范圍內布局。公司在中國、馬來西亞、美國、澳大利亞、以色列、新加坡、印度、韓國等多個國家設立了子公司和研發中心,形成了全球化的生產和服務網絡。這一戰略布局不僅增強了FINISAR的市場競爭力,還為公司帶來了更多的發展機遇。特別是在中國市場,FINISAR憑借其先進的技術和優質的產品,贏得了眾多知名企業的青睞,如思科、IBM、華為等。
面對電子行業的快速發展和市場需求的不斷變化,致強科技始終保持敏銳的市場洞察力。公司積極尋求與上下游企業的跨界合作,共同推動產業升級和技術創新。通過與知名電子廠商、科研機構及高校等建立緊密的合作關系,致強科技不斷引入新技術、新工藝和新材料,為產品的升級換代提供了有力支持。同時,公司還積極拓展新業務領域,如車聯網、物聯網等新興領域,為公司的未來發展開辟了更廣闊的空間。
致強科技深知員工是企業持續發展的關鍵。因此,公司自成立以來便注重企業文化的建設,積極營造和諧、關愛的工作氛圍。公司管理層倡導“尊重人性”的理念,不僅為員工提供具有競爭力的薪酬福利,還通過EAP(員工協助計劃)等方式關注員工的心理健康和生活需求。EAP項目的實施不僅幫助員工緩解了工作壓力,還從多方面提升了員工的歸屬感和幸福感,為公司的長期發展奠定了堅實的人才基礎。
為了加強研發實力和應用能力,達晶微在上海設立了研發中心和應用中心。這些中心匯聚了來自全球的優秀人才和先進技術,為公司提供了強大的技術支持和創新動力。通過不斷研發新產品和拓展新領域,達晶微在電子行業中保持了領先地位。
隨著公司業務的不斷拓展,協順電子逐漸意識到品質和創新的重要性。公司投入大量資金引進先進的生產設備和技術人才,同時加強內部管理和質量控制。此外,協順電子還積極與國內外知名企業和研究機構合作,共同研發新產品和新技術。這些舉措使得公司的產品質量和技術水平得到了顯著提升,也贏得了客戶的廣泛贊譽。
急~~求個單片機報警聲音設計的畢業論文--最好能完整點的--謝謝各位了啊--! 求個單片機報警聲音設計的畢業論文--最好能完整點的--謝謝各位了啊--! 著急用啊--自己寫也來不急了。。有的兄弟姐妹幫幫忙吧--謝謝了 我郵箱418370882@qq.com… 查看全部問答∨ |
wince gprs撥號連接,加上CGDCONT命令后撥不上號 wince6.0 板子上建立一個撥號連接,波特率等等設置好之后,連接到網絡,撥號完成。 但是如果我想指定是cmnet網,在附加指令里加入“AT+CGDCONT=1,"IP","CMNET"”,再次撥號,出錯,提示端口不可用或在占用 很怪異,請問這是為什么啊 ...… 查看全部問答∨ |
宏基AS4720主板通電后電壓到達1.1時自動斷電自動加電重復5次后開機,所有功能正常,是什么回事呀?我這里有兩塊一樣的主板都這個問題!!換了3V 5V芯片也不管用,搞得我摸不著頭腦了?有沒有人碰到過這種情況啊?… 查看全部問答∨ |
學習用evc開發wince程序,安裝evc4.0前一定要先安裝pb4.2嗎?? 開始看的書是Programming Microsoft Windows CE .NET, Third Edition,想照書上講的練練,不知安裝evc4.0前一定要先安裝pb4.2嗎?? 謝謝!!… 查看全部問答∨ |
AD轉換輸入電壓可以大于參考電壓嗎?AD自帶自動增益控制PGA,可編程設置為0.5,1,,,,參考電壓為內部2.4V,輸入模擬電壓通過滑動變阻器接入,范圍0--3.3V,這樣可以嗎?自動增益設置為PGA=0.5,最大3.3V輸入為1.5V,似乎可以啊?… 查看全部問答∨ |
|
通過CCS轉換為Keil的模式,硬件管理器中顯示的正確。 Keil仿真能進去,但是控制不了,運行的還是原來的默認程序。 暫停也能停下來,單步運行也是全速運行原來的默認程序。… 查看全部問答∨ |