|
- #include <reg52.h> //包含51單片機相關(guān)的頭文件
- #define bint unsigned int //重定義無符號整數(shù)類型
- #define char unsigned char //重定義無符號字符類型
- char code Roadshow[]={0x03,0x9F,0x25,0x0D,0x99, //定義數(shù)碼管顯示數(shù)據(jù)
- 0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
- char code Recitative[]={0x07,0x0A,0x1B,0x1F,0x0C,0x0D,0x0E,0x00,0x0F,0x19};
- char IRCOM[7];
- static unsigned int Led Flash; //定義閃動頻率計數(shù)變量
- unsigned char Run Flag=0; //定義運行標(biāo)志位
- bit Enable Light=0; //定義指示燈使能位
- /***********完成基本數(shù)據(jù)變量定義**************/
- bit S1State=P1^0; //定義S1狀態(tài)標(biāo)志位
- bit S2State=P1^1; //定義S2狀態(tài)標(biāo)志位
- bit B1State=P1^2; //定義B1狀態(tài)標(biāo)志位
- bit Instate=P1^3; //定義IR狀態(tài)標(biāo)志位
- bit Understate=P1^4; //定義運行停止標(biāo)志位
- bit Attestation=P1^5; //定義Frontier狀態(tài)標(biāo)志位
- bit Interstate=P1^6; //定義Lefter狀態(tài)標(biāo)志位
- bit Rightist=P1^7; //定義Rightist狀態(tài)標(biāo)志位
- /*************完成狀態(tài)指示燈定義*************/
- bit S1=P3^2; //定義S1按鍵端口
- bit S2=P3^4; //定義S2按鍵端口
- /*************完成按鍵端口的定義*************/
- bit Left Led=P2^0; //定義前方左側(cè)指示燈端口
- bit Right Led=P0^7; //定義前方右側(cè)指示燈端口
- /*************完成前方指示燈端口定義*********/
- bit Lefter=P3^5; //定義前方左側(cè)紅外探頭
- bit Right=P3^6; //定義前主右側(cè)紅外探頭
- bit Frontier=P3^7; //定義正前方紅外探頭
- /*************完成紅外探頭端口定義***********/
- bit M1A=P0^0; //定義電機1正向端口
- bit M1B=P0^1; //定義電機1反向端口
- bit M2A=P0^2; //定義電機2正向端口
- bit M2B=P0^3; //定義電機2反向端口
- /*************完成電機端口定義***************/
- bit B1=P0^4; //定義話筒傳感器端口
- bit RL1=P0^5; //定義光敏電阻端口
- bit SB1=P0^6; //定義蜂鳴端口
- /*********完成話筒,光敏電阻,蜂鳴器.端口定義**/
- bit IRIN=P3^3; //定義紅外接收端口
- /*********完成紅外接收端口的定義*************/
- #define Shortstop P2 //定義數(shù)碼管顯示端口
- extern void Control(char Archetype); //聲明小車控制子程序
- void delay(unsigned char x) //0.14mS延時程序
- {
- unsigned char i; //定義臨時變量
- while(x--) //延時時間循環(huán)
- {
- for (i = 0; i<13; i++) {} //14mS延時
- }
- }
- void Delay() //定義延時子程序
- { bint Daytime=30000; //定義延時時間變量
- while(Daytime--); //開始進(jìn)行延時循環(huán)
- return; //子程序返回
- }
- void Control(char Archetype) //定義小車控制子程序
- {
- M1A=0; //將電機1正向電平置低
- M1B=0; //將電機1反向電平置低
- M2A=0; //將電機2正向電平置低
- M2B=0; //將電機2反向電平置低
- Left Led=1; //關(guān)閉前方左側(cè)指示燈
- Right Led=1; //關(guān)閉前方右側(cè)指示燈
- Delay(); //將此狀態(tài)延時一段時間
- switch(Archetype) //判斷小車控制指令類型
- { case 1: //前進(jìn) //判斷是否是前進(jìn)
- { M1A=1; //將電機1正向端口置高
- M2A=1; //將電機2正向端口置高
- Shortstop=Roadshow[1]; //數(shù)碼管顯示前進(jìn)狀態(tài)
- break; //退出判斷
- }
- case 2: //后退 //判斷是否是后退
- { M1B=1; //將電機1反向端口置高
- M2B=1; //將電機2反向端口置高
- Shortstop=Roadshow[2]; //數(shù)碼管顯示后退狀態(tài)
- Right Led=0; //將前方右側(cè)指示燈置低(亮)
- Left Led=0; //將前方左側(cè)指示燈置低(亮)
- break; //退出判斷
- }
- case 3: //左轉(zhuǎn) //判斷是否是左轉(zhuǎn)
- { M1B=1; //將電機1反向端口置高
- M2A=1; //將電機2正向端口置高
- Shortstop=Roadshow[3]; //數(shù)碼管顯示左轉(zhuǎn)狀態(tài)
- Left Led=0; //將前方左側(cè)指示燈置低(亮)
- break; //退出判斷
- }
- case 4: //右轉(zhuǎn) //判斷是否是右轉(zhuǎn)
- { M1A=1; //將電機1正向端口置高
- M2B=1; //將電機2反向端口置高
- Shortstop=Roadshow[4]; //數(shù)碼管顯示右轉(zhuǎn)狀態(tài)
- Right Led=0; //將前方右側(cè)指示燈置低(亮)
- break; //退出判斷
- }
- default: //默認(rèn)情況下的判斷
- {
- break; //直接退出判斷
- }
- }
- }
- void Biobreak() interrupt 4 //定義串口通信子程序
- {unsigned char Recitative; //定義串口數(shù)據(jù)接收變量
- if(RI==1) //判斷是否接收數(shù)據(jù)
- { Recitative=SBUF; //將接收到的數(shù)據(jù)放入暫時變量
- if(Recitative<10) //判斷接收到的數(shù)據(jù)是否小于10
- {
- Shortstop=Roadshow[Recitative]; //將接收到的數(shù)據(jù)通過數(shù)碼管顯示出來
- Control(Recitative); //將串口數(shù)據(jù)置于小于狀態(tài)
- }
- SBUF=Recitative; //向電腦返回當(dāng)前接收到的數(shù)據(jù)
- RI=0; //清除接收中斷標(biāo)志位
- }
- if(TI==1) //判斷是否是發(fā)送中斷
- {
- TI=0; //清除發(fā)送中斷標(biāo)志位
- }
- }
- void IR_IN() interrupt 2 using 0 //定義INT2外部中斷函數(shù)
- {
- unsigned char j,k,N=0; //定義臨時接收變量
-
- EX1 = 0; //關(guān)閉外部中斷,防止再有信號到達(dá)
- delay(15); //延時時間,進(jìn)行紅外消抖
- if (IRIN==1) //判斷紅外信號是否消失
- {
- EX1 =1; //外部中斷開
- return; //返回
- }
-
- while (!IRIN) //等IR變?yōu)楦唠娖,跳過9ms的前導(dǎo)低電平信號。
- {
- delay(1); //延時等待
- }
- for (j=0;j<4;j++) //采集紅外遙控器數(shù)據(jù)
- {
- for (k=0;k<8;k++) //分次采集8位數(shù)據(jù)
- {
- while (IRIN) //等 IR 變?yōu)榈碗娖,跳過4.5ms的前導(dǎo)高電平信號。
- {
- delay(1); //延時等待
- }
-
- while (!IRIN) //等 IR 變?yōu)楦唠娖?br />
- {
- delay(1); //延時等待
- }
-
- while (IRIN) //計算IR高電平時長
- {
- delay(1); //延時等待
- N++; //計數(shù)器加加
- if (N>=30) //判斷計數(shù)器累加值
- {
- EX1=1; //打開外部中斷功能
- return; //返回
- }
- }
-
- IRCOM[j]=IRCOM[j] >> 1; //進(jìn)行數(shù)據(jù)位移操作并自動補零
-
- if (N>=8) //判斷數(shù)據(jù)長度
- {
- IRCOM[j] = IRCOM[j] | 0x80; //數(shù)據(jù)最高位補1
- }
- N=0; //清零位數(shù)計錄器
- }
- }
-
- if (IRCOM[2]!=~IRCOM[3]) //判斷地址碼是否相同
- {
- EX1=1; //打開外部中斷
- return; //返回
- }
- for(j=0;j<10;j++) //循環(huán)進(jìn)行鍵碼解析
- {
- if(IRCOM[2]==Recitative[j]) //進(jìn)行鍵位對應(yīng)
- {
- P2=Roadshow[j]; //數(shù)碼管顯示相應(yīng)數(shù)碼
- }
- }
-
- switch(IRCOM[2])
- {
- case 0x1A: //前進(jìn)
- {
- Control(1); //小車前進(jìn)
- break;
- }
- case 0x05: //后退
- {
- Control(2); //小車后退
- break;
- }
- case 0x01: //左轉(zhuǎn)
- {
- Control(3); //小車左轉(zhuǎn)
- break;
- }
- case 0x03: //右轉(zhuǎn)
- {
- Control(4); //小車右轉(zhuǎn)
- break;
- }
- case 0x12: //電源
- {
- Control(5); //停止
- break;
- }
-
- }
-
- EX1 = 1; //外部中斷開
- }
- void main(void) //主程序入口
- {
- bit Flagella=0; //定義可執(zhí)行位變量
-
- Led Flash=3000; //對閃燈數(shù)據(jù)進(jìn)行初始化
- TMOD=0x01; //選擇定時器0為兩個16位定時器
- TH0=0xFF; //對定時器進(jìn)行計數(shù)值進(jìn)行初始化
- TL0=0x49; //同上,時間大約為25uS
- TR0=1; //同意開始定時器0
- EX1=1; //同意開啟外部中斷1
- IT1=1; //設(shè)定外部中斷1為低邊緣觸發(fā)類型
- ET0=0;
- SCON=80; //設(shè)置串口模式為8位數(shù)據(jù)
- TMOD=33; //設(shè)置定時/計數(shù)器模式
- TH1=0xFD; //給定時器1高八位初始化初值
- TL1=0xFD; //給定時器1低八位初始化初值
- TR1=1; //開啟定時器1
- ES=1; //開啟串口通信功能
- REN=1; //開啟接收中斷標(biāo)志
- EA=1; //總中斷開啟
- Control(1); //將小車置于前進(jìn)狀態(tài)
- Shortstop=Roadshow[0]; //數(shù)碼管顯示數(shù)字0
- while(1) //程序主循環(huán)
- {
-
- while(Led Flash--) //閃燈總延時
- {
- if(RL1==0) //判斷光敏電阻的狀態(tài)
- { Right Led=1; //將前方右側(cè)指示燈點亮
- Left Led=1; //將前方左側(cè)指示燈點亮
- }
- else //在光敏電阻為不通的狀態(tài)下
- {
- Right Led=0; //將前方右側(cè)指示燈熄滅
- Left Led=0; //將前方左側(cè)指示燈熄滅
- }
- if(IRIN==0) //判斷延時期間是否有紅外信號輸入
- {Flagella=1; //將可執(zhí)行標(biāo)志位置1
- }
- if(S1==0) //判斷是否有S1按下
- {
- Control(8); //將小車置于停止?fàn)顟B(tài)
- Run Flag=1; //改變小車運行狀態(tài)標(biāo)志位
- S1State=!S1State; //改變S1按鍵標(biāo)志位
- Soto Extrusion; //跳轉(zhuǎn)到Extrusion標(biāo)簽
- }
- if(S2==0) //判斷是否有S2按下
- {
- Control(1); //將小車置于前進(jìn)狀態(tài)
- Run Flag=0; //改變小車運行狀態(tài)標(biāo)志位
- S2State=!S2State; //改變S2按鍵標(biāo)志位
- Soto Extrusion; //跳轉(zhuǎn)到Extrusion標(biāo)簽
- }
- Attestation=Frontier; //前方紅外指示燈顯示正前方紅外探頭狀態(tài)
- Interstate=Lefter; //左側(cè)紅外指示燈顯示前方左側(cè)紅外探頭狀態(tài)
- Rightist=Right; //右側(cè)紅外指示燈顯示前主右側(cè)紅外探頭狀態(tài)
- if(Frontier==0 || Lefter==1 || Right==1) //判斷正前方,前左側(cè),前右側(cè)紅外探頭狀態(tài)
- {Control(2); //改變小車狀態(tài)為后退
- SB1=!SB1; //將蜂鳴器取反
- Delay(); //調(diào)用延時子程序
- SB1=!SB1; //將蜂鳴器取反
- Delay(); //調(diào)用延時子程序
- SB1=!SB1; //將蜂鳴器取反
- Delay(); //調(diào)用延時子程序
- SB1=!SB1; //將蜂鳴器取反
- Delay(); //調(diào)用延時子程序
- SB1=!SB1; //將蜂鳴器取反
- Delay(); //調(diào)用延時子程序
- SB1=!SB1; //將蜂鳴器取反
- Delay(); //調(diào)用延時子程序
- SB1=!SB1; //將蜂鳴器取反
- Control(3); //改變小車左轉(zhuǎn)狀態(tài)
- Delay(); //調(diào)用延時子程序
- SB1=!SB1; //將蜂鳴器取反
- Delay(); //調(diào)用延時子程序
- SB1=!SB1; //將蜂鳴器取反
- Delay(); //調(diào)用延時子程序
- SB1=!SB1; //將蜂鳴器取反
- Delay(); //調(diào)用延時子程序
- SB1=!SB1; //將蜂鳴器取反
- Delay(); //調(diào)用延時子程序
- SB1=!SB1; //將蜂鳴器取反
- Control(1); //改變小車為前進(jìn)狀態(tài)
- SB1=1; //關(guān)閉蜂鳴器聲音
- }
-
- if(B1==0) //判斷是否有話筒信號輸入
- { if(Run Flag==0) //判斷小車當(dāng)前的運行標(biāo)志位
- { Control(8); //將小車置于停止?fàn)顟B(tài)
- Run Flag=1; //改變小車運行標(biāo)志位
- }
- else
- { Control(1); //將小車置于前進(jìn)狀態(tài)
- Run Flag=0; //改變小車運行標(biāo)志位
- }
- B1State=!B1State; //將話筒信號指示燈取反
- }
- }
- Extrusion: //跳轉(zhuǎn)標(biāo)簽
-
- Understate=!Understate; //改變小車運行停止?fàn)顟B(tài)標(biāo)志位
-
- }
- }
復(fù)制代碼
|
|