打開(kāi)小車(chē)開(kāi)關(guān)和攝像頭開(kāi)關(guān),然后手機(jī)連接到wifi信號(hào),通過(guò)將wifi接收器接收到的信號(hào)傳送給STC89C52,最后將信號(hào)傳送給小車(chē)和攝像頭進(jìn)行小車(chē)的移動(dòng)和攝像頭視頻的錄制。摘要隨著無(wú)線技術(shù)的發(fā)展及應(yīng)用,手機(jī)藍(lán)牙及wifi技術(shù)逐漸被應(yīng)用于人們生活中。針對(duì)現(xiàn)階段家電智能化的發(fā)展趨勢(shì),為了實(shí)現(xiàn)家電的智能化控制,本文設(shè)計(jì)了以單片機(jī)為控制核心,基于手機(jī)平臺(tái),利用WiFi技術(shù),無(wú)線WiFi模塊,單片機(jī)模塊,將攝像頭、小車(chē)與手機(jī)APP連接在一起,手機(jī)APP的操作指令通過(guò)WiFi無(wú)線傳輸給攝像頭內(nèi)部的芯片,進(jìn)而根據(jù)指令做出相應(yīng)改變。這種以無(wú)線連接為基礎(chǔ)的監(jiān)視控制系統(tǒng),不僅能夠?qū)崿F(xiàn)小車(chē)的無(wú)線控制,而且體現(xiàn)了區(qū)域自由的優(yōu)越性。
第一章 引言當(dāng)今世界,傳感器技術(shù)和自動(dòng)控制技術(shù)正在飛速發(fā)展,機(jī)械、電氣和電子信息已經(jīng)不再明顯分家,自動(dòng)控制在工業(yè)領(lǐng)域中的地位已經(jīng)越來(lái)越重要,“智能”這個(gè)詞也已經(jīng)成為了熱門(mén)詞匯。現(xiàn)在國(guó)外的自動(dòng)控制和傳感器技術(shù)已經(jīng)達(dá)到了很高的水平,特別是日本,比如日本本田制作的機(jī)器人,其仿人雙足行走已經(jīng)做得十分逼真,而且具有一定的學(xué)習(xí)能力,還據(jù)說(shuō)其智商已達(dá)到6歲兒童的水平。 而本次學(xué)校組織的智能循跡小車(chē)大賽也讓同學(xué)們能充分的參與到實(shí)際電子作品的設(shè)計(jì),制作中,同時(shí)也讓同學(xué)們能在實(shí)際制作中理解傳感器系統(tǒng),自動(dòng)控制系統(tǒng)。無(wú)容置疑,人才的培養(yǎng)不論是在國(guó)外還是國(guó)內(nèi),都開(kāi)始重視起來(lái),主要表現(xiàn)在大學(xué)生的各種大型的創(chuàng)新比賽,比如:亞洲廣播電視聯(lián)盟亞太地區(qū)機(jī)器人大賽(ABU ROBCON)、全國(guó)大學(xué)生“飛思卡爾”杯智能汽車(chē)競(jìng)賽等眾多重要競(jìng)賽都能很好的培養(yǎng)大學(xué)生對(duì)于電子,電路,自動(dòng)控制,傳感系統(tǒng)相關(guān)知識(shí)。學(xué)校此次的比賽對(duì)于我們來(lái)說(shuō)就是很好的一個(gè)平臺(tái),讓我們能更加的加強(qiáng)自己理論方面的知識(shí),同時(shí),增強(qiáng)理論與實(shí)踐相結(jié)合的發(fā)散性,創(chuàng)造性思維的能力。 第二章 系統(tǒng)方案2.1方案與選擇方案1:該智能車(chē)采用紅外傳感器對(duì)賽道進(jìn)行道路檢測(cè),單片機(jī)根據(jù)采集到的信號(hào)的不同狀態(tài)判斷小車(chē)當(dāng)前狀態(tài),通過(guò)電機(jī)驅(qū)動(dòng)芯片L298N發(fā)出控制命令,控制電機(jī)的工作狀態(tài)以實(shí)現(xiàn)對(duì)小車(chē)姿態(tài)的控制。方案2:該智能車(chē)采用HT6221芯片控制小車(chē)的移動(dòng),單片機(jī)根據(jù)控制器發(fā)出的信號(hào)做出相應(yīng)的移動(dòng),再加上小車(chē)上安裝了攝像頭對(duì)沿途的狀況記錄并傳送到手機(jī)上。綜合以上方案我們選擇方案2的設(shè)計(jì)。功能: 由遙控器控制小車(chē)進(jìn)行移動(dòng),攝像機(jī)進(jìn)行拍攝。
第三章 硬件3.1最小系統(tǒng):小車(chē)采用atmel公司的AT89S52單片機(jī)作為控制芯片,圖1是其最小系統(tǒng)電路。主要包括:時(shí)鐘電路、電源電路、復(fù)位電路。其中各個(gè)部分的功能如下:1、時(shí)鐘電路:給單片機(jī)提供一個(gè)外接的16MHz的石英晶振。2、電源電路:給單片機(jī)提供5V電源。3、復(fù)位電路:在電壓達(dá)到正常值時(shí)給單片機(jī)一個(gè)復(fù)位信號(hào)。 圖2 單片機(jī)最小系統(tǒng)原理圖3.2遙控電路 HT6221/HT6222芯片是通用紅外遙控發(fā)射集成電路,采用CMOS工藝制造,最多可外接64個(gè)按鍵,并有三組雙重按鍵。封裝形式為SOP-24和SOP-20。 特點(diǎn):1. 低壓CMOS工藝制造。2. 工作電壓范圍寬。3.通過(guò)外部接法最多可產(chǎn)生65536種用戶(hù)碼。4. 可通過(guò)SEL管腳選擇,最多可支持128+6條指令碼。5.SOP-24、SOP-20、COB封裝形式可選。 圖3 控制電路圖 第四章 軟件設(shè)計(jì)移動(dòng)監(jiān)視車(chē)的設(shè)計(jì)包括兩部分,一部分是通過(guò)手機(jī)APP與wifi連接實(shí)現(xiàn)的攝像顯示,另一部分是通過(guò)HT6221芯片接受控制 信號(hào)進(jìn)行移動(dòng)。4.1 無(wú)線鏈接
4.2軟件流程圖 第五章 測(cè)試結(jié)果將本電路用硬件做出來(lái),用編程器將KEIL軟件對(duì)源程序編譯生成的.HEX文件燒入AT89S52單片機(jī),將單片機(jī)插入到小車(chē)中,連好線。 將“控制模式”開(kāi)關(guān)選擇在“遙控”,打開(kāi)電源,小車(chē)在遙控器的控制下開(kāi)始移動(dòng),攝像頭也正常工作。 測(cè)試結(jié)果表明,本系統(tǒng)實(shí)現(xiàn)了預(yù)期功能。我們還想給小車(chē)添加自動(dòng)監(jiān)控的功能,遇到障礙進(jìn)行躲避。為了這一目標(biāo)我們繼續(xù)努力。
附錄#include <REGX52.H> //包含51單片機(jī)相關(guān)的頭文件 #include <intrins.h> sbit LeftLed=P2^0; //定義前方左側(cè)指示燈端口 sbit RightLed=P0^7; //定義前方右側(cè)指示燈端口 sbit FontLled=P1^7; sbit LeftIR=P3^5; //定義前方左側(cè)紅外探頭端口 sbit RightIR=P3^6; //定義前方右側(cè)紅外探頭端口 sbit FontIR=P3^7; //定義前方正前方紅外探頭端口 sbit M1A=P0^0; //定義左側(cè)電機(jī)驅(qū)動(dòng)A端 sbit M1B=P0^1; //定義左側(cè)電機(jī)驅(qū)動(dòng)B端 sbit M2A=P0^2; //定義右側(cè)電機(jī)驅(qū)動(dòng)A端 sbit M2B=P0^3; //定義右側(cè)電機(jī)驅(qū)動(dòng)B端 sbit B1=P0^4; //定義語(yǔ)音識(shí)識(shí)別傳感器端口 sbit SB1=P0^6; //定義蜂鳴器端口 sbit IRIN=P3^3; //定義紅外接收端口 unsigned char code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //定義數(shù)碼管顯示數(shù)據(jù) 0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9 unsigned char code RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F}; unsigned char IRCOM[7]; static unsigned int LedFlash; //定義閃動(dòng)頻率計(jì)數(shù)變量 bit EnableLight=0; //定義指示燈使能位 #define ShowPort P2 //定義數(shù)碼管顯示端口 unsigned char temp = 1; void tingzhi() { M1A=0; //將M1電機(jī)A端初始化為0 M1B=0; //將M1電機(jī)B端初始化為0 M2A=0; //將M2電機(jī)A端初始化為0 M2B=0; } void qianjin() { M1A=1; M1B=0; M2A=1; M2B=0; } void houtui() { M1A=0; M1B=1; M2A=0; M2B=1; } void zuozhuan() { M1A=0; M1B=1; M2A=1; M2B=0; } void youzhuan() { M1A=1; M1B=0; M2A=0; M2B=1; } void Delay1ms(unsigned int i) { unsigned char j,k; do{ j = 10; do{ k = 50; do{ _nop_(); }while(--k); }while(--j); }while(--i); } void delay_nus(unsigned int i) //延時(shí):i>=12 ,i的最小延時(shí)單12 us { i=i/10; while(--i); } void delay_nms(unsigned int n) //延時(shí)n ms { n=n+1; while(--n) delay_nus(900); //延時(shí) 1ms,同時(shí)進(jìn)行補(bǔ)償 } void delayms(unsigned char x) //0.14mS延時(shí)程序 { unsigned char i; //定義臨時(shí)變量 while(x--) //延時(shí)時(shí)間循環(huán) { for (i = 0; i<13; i++) {} //14mS延時(shí) } } void Delay() //定義延時(shí)子程序 { unsigned int DelayTime=30000; //定義延時(shí)時(shí)間變量 while(DelayTime--); //開(kāi)始進(jìn)行延時(shí)循環(huán) return; //子程序返回 } void ControlCar(unsigned char ConType) //定義電機(jī)控制子程序 {
tingzhi(); switch(ConType) //判斷用戶(hù)設(shè)定電機(jī)形式 { case 1: //前進(jìn) //判斷用戶(hù)是否選擇形式1 { //tingzhi(); //進(jìn)入前進(jìn)之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 //Delay1ms(50); LeftLed = 0 ; qianjin(); break; } case 2: //后退 //判斷用戶(hù)是否選擇形式2 { // tingzhi(); //進(jìn)入后退之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 // Delay1ms(50); LeftLed = 1 ; houtui(); //M2電機(jī)反轉(zhuǎn) break; } case 3: //左轉(zhuǎn) //判斷用戶(hù)是否選擇形式3 { //tingzhi(); //進(jìn)入左轉(zhuǎn)之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 // Delay1ms(50); zuozhuan(); //M2電機(jī)正轉(zhuǎn) break; } case 4: //右轉(zhuǎn) //判斷用戶(hù)是否選擇形式4 { // tingzhi(); //進(jìn)入右轉(zhuǎn)之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 // Delay1ms(50); youzhuan(); //M1電機(jī)正轉(zhuǎn) //M2電機(jī)反轉(zhuǎn) break; } case 8: //停止 //判斷用戶(hù)是否選擇形式8 { tingzhi(); break; //退出當(dāng)前選擇 } } } void ControlCar_yaokong(unsigned char ConType) //定義電機(jī)控制子程序 (紅外遙控單獨(dú)設(shè)置一個(gè) switch case 語(yǔ)句 ) {
tingzhi(); switch(ConType) //判斷用戶(hù)設(shè)定電機(jī)形式 { case 1: //前進(jìn) //判斷用戶(hù)是否選擇形式1 { tingzhi(); //進(jìn)入前進(jìn)之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 Delay1ms(150); LeftLed = 0 ; qianjin(); break; } case 2: //后退 //判斷用戶(hù)是否選擇形式2 { tingzhi(); //進(jìn)入后退之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 Delay1ms(150); LeftLed = 1 ; houtui(); //M2電機(jī)反轉(zhuǎn) break; } case 3: //左轉(zhuǎn) //判斷用戶(hù)是否選擇形式3 { tingzhi(); //進(jìn)入左轉(zhuǎn)之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 Delay1ms(150); zuozhuan(); //M2電機(jī)正轉(zhuǎn) break; } case 4: //右轉(zhuǎn) //判斷用戶(hù)是否選擇形式4 { tingzhi(); //進(jìn)入右轉(zhuǎn)之前 先停止一段時(shí)間 防止電機(jī)反向電壓沖擊主板 導(dǎo)致系統(tǒng)復(fù)位 Delay1ms(150); youzhuan(); //M1電機(jī)正轉(zhuǎn) //M2電機(jī)反轉(zhuǎn) break; } case 8: //停止 //判斷用戶(hù)是否選擇形式8 { tingzhi(); break; //退出當(dāng)前選擇 } } } void Robot_Avoidance() //機(jī)器人避障子程序 { LeftLed=LeftIR; //前方左側(cè)指示燈指示出前方左側(cè)紅外探頭狀態(tài) RightLed=RightIR; //前方右側(cè)指示燈指示出前方右側(cè)紅外探頭狀態(tài) FontLled= FontIR; SB1=FontIR; if(FontIR == 0) //如果前面避障傳感器檢測(cè)到障礙物 { ControlCar(8); //停止 delay_nms (300); //停止300MS 防止電機(jī)反相電壓沖擊 導(dǎo)致系統(tǒng)復(fù)位 ControlCar(2); //后退 delay_nms (1000); //后退1500MS ControlCar(3); // delay_nms (1800); } else { ControlCar(1); //右側(cè)沒(méi)有信號(hào)時(shí),開(kāi)始向左轉(zhuǎn)一定的角度 delay_nms (10); } ControlCar(1); } //機(jī)器人循跡子程序 void Robot_Traction() //機(jī)器人循跡子程序 { LeftLed=LeftIR; //前方左側(cè)指示燈指示出前方左側(cè)紅外探頭狀態(tài) RightLed=RightIR; //前方右側(cè)指示燈指示出前方右側(cè)紅外探頭狀態(tài) FontLled= FontIR; SB1=LeftIR; if(LeftIR == 0 && RightIR == 0) //三個(gè)紅外檢測(cè)到黑線,就前進(jìn) { ControlCar(1); //左側(cè)沒(méi)有信號(hào)時(shí),開(kāi)始向右轉(zhuǎn)一定的角度 delay_nms (10); } else if(LeftIR == 0 && RightIR == 1) { ControlCar(3); //右側(cè)沒(méi)有信號(hào)時(shí),開(kāi)始向左轉(zhuǎn)一定的角度 delay_nms (10); } else if(LeftIR == 1 && RightIR == 0) { ControlCar(4); //右側(cè)沒(méi)有信號(hào)時(shí),開(kāi)始向左轉(zhuǎn)一定的角度 delay_nms (10); } ControlCar(8); } void main() //主程序入口 { bit RunFlag=0; //定義小車(chē)運(yùn)行標(biāo)志位 LedFlash=3000; //對(duì)閃燈數(shù)據(jù)進(jìn)行初始化 //EX1=1; //同意開(kāi)啟外部中斷1 IT1=1; //設(shè)定外部中斷1為低邊緣觸發(fā)類(lèi)型 EA=1; //總中斷開(kāi)啟 ControlCar(8); //初始化小車(chē)運(yùn)行狀態(tài) while(1) //程序主循環(huán) { if(P3_2 == 0) { delay_nms(10); if(P3_2 == 0) { temp++; while(!P3_2); } } if(temp > 3) { temp = 1; } switch(temp) { case 1: ShowPort = LedShowData[1];Robot_Traction();EX1 = 0;break; case 2: ShowPort = LedShowData[2];Robot_Avoidance();EX1 = 0;break; case 3: ShowPort = LedShowData[3];EX1 = 1;break; } } } //----------紅外遙控------------------------------------------------------------- void IR_IN() interrupt 2 using 0 //定義INT2外部中斷函數(shù) { unsigned char j,k,N=0; //定義臨時(shí)接收變量 EX1 = 0; //關(guān)閉外部中斷,防止再有信號(hào)到達(dá) delayms(15); //延時(shí)時(shí)間,進(jìn)行紅外消抖 if (IRIN==1) //判斷紅外信號(hào)是否消失 { EX1 =1; //外部中斷開(kāi) return; //返回 } while (!IRIN) //等IR變?yōu)楦唠娖,跳過(guò)9ms的前導(dǎo)低電平信號(hào)。 { delayms(1); //延時(shí)等待 } for (j=0;j<4;j++) //采集紅外遙控器數(shù)據(jù) { for (k=0;k<8;k++) //分次采集8位數(shù)據(jù) { while (IRIN) //等 IR 變?yōu)榈碗娖剑^(guò)4.5ms的前導(dǎo)高電平信號(hào)。 { delayms(1); //延時(shí)等待 } while (!IRIN) //等 IR 變?yōu)楦唠娖?/font> { delayms(1); //延時(shí)等待 } while (IRIN) //計(jì)算IR高電平時(shí)長(zhǎng) { delayms(1); //延時(shí)等待 N++; //計(jì)數(shù)器加加 if (N>=30) //判斷計(jì)數(shù)器累加值 { EX1=1; //打開(kāi)外部中斷功能 return; //返回 } } IRCOM[j]=IRCOM[j] >> 1; //進(jìn)行數(shù)據(jù)位移操作并自動(dòng)補(bǔ)零 if (N>=8) //判斷數(shù)據(jù)長(zhǎng)度 { IRCOM[j] = IRCOM[j] | 0x80; //數(shù)據(jù)最高位補(bǔ)1 } N=0; //清零位數(shù)計(jì)錄器 } } if (IRCOM[2]!=~IRCOM[3]) //判斷地址碼是否相同 { EX1=1; //打開(kāi)外部中斷 return; //返回 } for(j=0;j<10;j++) //循環(huán)進(jìn)行鍵碼解析 { if(IRCOM[2]==RecvData[j]) //進(jìn)行鍵位對(duì)應(yīng) { // ControlCar(j); ControlCar_yaokong(j); //數(shù)碼管顯示相應(yīng)數(shù)碼 } } EX1 = 1; //外部中斷開(kāi) } |