|
單片機(jī)與紅外收發(fā)裝置及數(shù)碼管,獨(dú)立按鍵實(shí)現(xiàn)的遙控車(chē)仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (15.35 KB, 下載次數(shù): 94)
下載附件
2021-4-24 17:20 上傳
51hei.png (14.93 KB, 下載次數(shù): 73)
下載附件
2021-4-24 17:20 上傳
單片機(jī)紅外線發(fā)射源程序如下:
- /***************************************************************
- 作品:紅外線發(fā)射
- 單片機(jī):STC89C52RC
- 晶振:12M
- 編譯環(huán)境:Keil uVision4 V9.00
- ***************************************************************/
- //
- // 發(fā)射引腳(接PNP三極管b極)
- // PNP三極管e極接2Ω電阻,c極接紅外發(fā)射管
-
- #include <REG51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define SBM 0x80 //識(shí)別碼
- #define m9 (65536-9000) //約9mS
- #define m4_5 (65536-4500) //約4.5mS
- #define m1_6 (65536-1630) //約1.65mS
- #define m_65 (65536-580) //約0.65mS
- #define m_56 (65536-560) //約0.56mS
- #define m40 (65536-40000) //約40mS
- #define m56 (65536-56000) //56mS
- #define m2_25 (65536-2250) //約2.25mS
- sbit IR = P3^6; //定義發(fā)射引腳(接PNP三極管基極)
- //按鍵
- sbit key1=P1^1;
- sbit key2=P1^2;
- sbit key3=P1^3;
- sbit key4=P1^4;
- sbit key5=P1^5;
- sbit key6=P1^6;
- sbit key7=P1^7;
- void keyscan(void);
- void ZZ(uchar x);
- void Z0(uchar temp);
- void TT0(bit BT,uint x);
- void YS(uchar time);
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數(shù)功能:主函數(shù)
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void main(void)
- {
- TMOD = 0x01; //T0 16位工作方式
- IR=1; //發(fā)射端口常態(tài)為高電平
- while(1)
- {
- keyscan();
- }
- }
- /***************************************************************
- 函數(shù)功能:散轉(zhuǎn)程序
- 入口參數(shù):v
- //
- // 13 14 15 16
- // 9 10 11 12
- // 5 6 7 8
- // 1 2 3 4
- ***************************************************************/
- void keyscan(void)
- {
- //發(fā)送0x01
- if(key1==0)
- {
- YS(5);
- if(key1==0)
- {
- ZZ(0x01);
-
- while(!key1);//等待按鍵釋放
- }
- }
- //發(fā)送0x02
- if(key2==0)
- {
- YS(5);
- if(key2==0)
- {
- ZZ(0x02);
-
- while(!key2);//等待按鍵釋放
- }
- }
- //發(fā)送0x03
- if(key3==0)
- {
- YS(5);
- if(key3==0)
- {
- ZZ(0x03);
-
- while(!key3);//等待按鍵釋放
- }
- }
- //發(fā)送0x04
- if(key4==0)
- {
- YS(5);
- if(key4==0)
- {
- ZZ(0x04);
-
- while(!key4);//等待按鍵釋放
- }
- }
- //發(fā)送0x05
- if(key5==0)
- {
- YS(5);
- if(key5==0)
- {
- ZZ(0x05);
-
- while(!key5);//等待按鍵釋放
- }
- }
- //發(fā)送0x06
- if(key6==0)
- {
- YS(5);
- if(key6==0)
- {
- ZZ(0x06);
-
- while(!key6);//等待按鍵釋放
- }
- }
- //發(fā)送0x07
- if(key7==0)
- {
- YS(5);
- if(key7==0)
- {
- ZZ(0x07);
- while(!key7);//等待按鍵釋放
- }
- }
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數(shù)功能:發(fā)送主程序
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void ZZ(uchar x)
- {
- TT0(1,m9); //高電平9mS
- TT0(0,m4_5); //低電平4.5mS
- /*┈ 發(fā)送4幀數(shù)據(jù) ┈*/
- Z0(SBM);
- Z0(~SBM);
- Z0(x);
- Z0(~x);
- /*┈┈ 結(jié)束碼 ┈┈*/
- TT0(1,m_65);
- TT0(0,m40);
-
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數(shù)功能:?jiǎn)螏l(fā)送程序
- 入口參數(shù):1幀數(shù)據(jù)
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void Z0(uchar temp)
- {
- uchar v;
- for (v=0;v<8;v++) //循環(huán)8次移位
- {
- TT0(1,m_65); //高電平0.65mS
- if(temp&0x01) TT0(0,m1_6); //發(fā)送最低位
- else TT0(0,m_56);
- temp >>= 1; //右移一位
- }
- }
- /*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
- 函數(shù)功能:38KHz脈沖發(fā)射 + 延時(shí)程序
- 入口參數(shù):(是否發(fā)射脈沖,延時(shí)約 x (uS))
- ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
- void TT0(bit BT,uint x)
- {
- TH0 = x>>8; //輸入T0初始值
- TL0 = x;
- TF0=0; //清0
- TR0=1; //啟動(dòng)定時(shí)器0
- if(BT == 0) while(!TF0); //BT=0時(shí)不發(fā)射38KHz脈沖只延時(shí);BT=1發(fā)射38KHz脈沖且延時(shí);
- else while(1) //38KHz脈沖,占空比5:26
- {
- IR = 0;
- if(TF0)break;
- if(TF0)break;
- IR = 1;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- if(TF0)break;
- }
- TR0=0; //關(guān)閉定時(shí)器0
- TF0=0; //標(biāo)志位溢出則清0
- IR =1; //脈沖停止后,發(fā)射端口常態(tài)為高電平
- }
- /***************************************************************
- 函數(shù)功能:按鍵消抖 延時(shí)程序
- 入口參數(shù):1ms×time (晶振=12MHz)
- ***************************************************************/
- void YS(uchar time)
- {
- uchar i,j;
- for(i=0; i<time; i++)
- for(j=0; j<247; j++)_nop_();
- }
復(fù)制代碼- #include <REGX52.H>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define duanma P0
- #define weima P2
- //按鍵
- sbit key1=P1^1;
- sbit key2=P1^2;
- sbit key3=P1^3;
- sbit key4=P1^4;
- sbit key5=P1^5;
- sbit key6=P1^6;
- sbit key7=P1^7;
- //紅外接收頭
- sbit IR=P3^2;
- //電機(jī)接口
- sbit motor1=P3^4;
- sbit motor2=P3^5;
- sbit motor3=P3^6;
- sbit motor4=P3^7;
- uchar code table[]={0xc0,0xf9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF};//數(shù)碼管顯示0~9和 -
- uchar N[4]; //識(shí)別碼,操作碼存放
- uchar num,count;//狀態(tài),加減選擇
- uint speed=100;//速度
- //延時(shí)函數(shù)
- void delay(uint mux)
- {
- uint i,j;
-
- for(i=mux;i>0;i--)
- for(j=100;j>0;j--);
- }
- //數(shù)碼管顯示內(nèi)容函數(shù)
- void display()
- {
-
- delay(1);
- weima=0x01;
- duanma=table[num];//顯示狀態(tài)
- delay(1);
- weima=0x02;
- duanma=table[10];//顯示-
- delay(1);
- weima=0x04;
- duanma=table[10];//顯示-
- delay(1);
- weima=0x08;
- duanma=table[speed/100];//顯示檔位
- delay(1);
- }
- //前進(jìn)
- void go()
- {
- uint i;
- for(i=speed;i>0;i=i-5)
- {
- if(i>10)
- {
- motor1=0;
- motor2=1;
- motor3=1;
- motor4=0;
- }
- if(i<11)
- {
- motor1=0;
- motor2=0;
- motor3=0;
- motor4=0;
- }
- }
- }
- //后退
- void back()
- {
- uint i;
- for(i=speed;i>0;i=i-5)
- {
- if(i>10)
- {
- motor1=1;
- motor2=0;
- motor3=0;
- motor4=1;
- }
- if(i<11)
- {
- motor1=0;
- motor2=0;
- motor3=0;
- motor4=0;
- }
- }
- }
- //停止
- void stop()
- {
- motor1=0;
- motor2=0;
- motor3=0;
- motor4=0;
- }
- //左轉(zhuǎn)
- void turn_left()
- {
- uint i;
- for(i=speed;i>0;i=i-5)
- {
- if(i>10)
- {
- motor1=1;
- motor2=0;
- motor3=1;
- motor4=0;
- }
- if(i<11)
- {
- motor1=0;
- motor2=0;
- motor3=0;
- motor4=0;
- }
- }
- }
- //右轉(zhuǎn)
- void turn_right()
- {
- uint i;
- for(i=speed;i>0;i=i-5)
- {
- if(i>10)
- {
- motor1=0;
- motor2=1;
- motor3=0;
- motor4=1;
- }
- if(i<11)
- {
- motor1=0;
- motor2=0;
- motor3=0;
- motor4=0;
- }
- }
- }
- //按鍵控制
- void keyscan()
- {
- //加速
- if(key1==0)
- {
- delay(10);
- if(key1==0)
- {
-
- count=1;
- while(!key1);//等待按鍵釋放
- }
- }
- //左轉(zhuǎn)
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
-
- num=3;
- while(!key2);//等待按鍵釋放
- }
- }
- //前進(jìn)
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
-
- num=1;
- while(!key3);//等待按鍵釋放
- }
- }
- //停止
- if(key4==0)
- {
- delay(10);
- if(key4==0)
- {
-
- num=0;
- while(!key4);//等待按鍵釋放
- }
- }
- //后退
- if(key5==0)
- {
- delay(10);
- if(key5==0)
- {
-
- num=2;
- while(!key5);//等待按鍵釋放
- }
- }
- //減速
- if(key6==0)
- {
- delay(10);
- if(key6==0)
- {
-
- count=2;
- while(!key6);//等待按鍵釋放
- }
- }
- //右轉(zhuǎn)
- if(key7==0)
- {
- delay(10);
- if(key7==0)
- {
- num=4;
- while(!key7);//等待按鍵釋放
- }
- }
- }
- //主函數(shù)
- void main(void)
- {
- IT0 = 1;
- EX0 = 1;
- EA = 1;
- while(1)
- {
- display();
- keyscan();
- switch(num)
- {
- case 0: stop(); break;//暫停
- case 1: go(); break;//前進(jìn)
- case 2: back(); break; //后退
- case 3: turn_left(); break;// 左轉(zhuǎn)
- case 4: turn_right(); break; // 右轉(zhuǎn)
-
- }
- if((count==1)&&(speed<410)){speed=speed+100;count=0;} //加速
- if((count==2)&&(speed>110)){speed=speed-100;count=0;}//減速
- }
- }
- /********************** 外部中斷函數(shù)************************/
- void exint0() interrupt 0
- {
- uint cnt;
- uchar i;
- EX0 = 0;
- cnt = 0;
-
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼 所有資料51hei提供下載,仿真必須要Proteus7.5版本才能打開(kāi):
紅外遙控車(chē) 獨(dú)立按鍵.zip
(191.29 KB, 下載次數(shù): 121)
2021-4-23 19:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|