|
- /******************************************
- *******************************************
- 程序名稱:藍牙無線遙控避障
- ******************************************
- *******************************************/
- #include <at89x51.h>
- #include <stdio.h>
- #include <PWM.h> //包含前面講到的PWM頭文件,此頭文件導入后能產生1KHZ的PWM信號
- #include <intrins.h>
- #define Forward_L_DATA 200
- #define Forward_R_DATA 200
- #define Back_L_DATA 190
- #define Back_R_DATA 190
- #define Turn_Left_L_DATA 230
- #define Turn_Left_R_DATA 230
- #define Turn_Right_L_DATA 230
- #define Turn_Right_R_DATA 230
- /***自定義一些數據,這些數據對應軟件上的數據設置**/
- #define leftdata 0x11
- #define rightdata 0x22
- #define forwarddata 0x33
- #define backdata 0x44
- /*******L293D邏輯電平口定義******/
- sbit L293D_IN1=P1^5;
- sbit L293D_IN2=P1^6;
- sbit L293D_IN3=P1^1;
- sbit L293D_IN4=P1^0;
- sbit L293D_EN1=P1^3;
- sbit L293D_EN2=P1^4;
- /*****左傳感器和右傳感器接線定義***/
- sbit Left_InSen=P2^3;
- sbit Right_InSen=P2^0;
- /******寄存器地址賦值******/
- sfr AUXR=0x8e;
- sfr BRT=0x9c;
- /******全局變量定義******/
- unsigned char SBUF_DATA,flag1,flag2,flag3,flag4,Last_SBUF_DATA;
- unsigned int count1=0;
- unsigned int speed;
- char s[10]; //存放速度值的緩沖區
- /*******函數聲明*******/
- void SendString(unsigned char *pt);
- void Send_Char(unsigned char DATA);
- //—————————————延時1ms函數————————————
- void Delay1ms(unsigned int i)
- {
- unsigned char j,k;
- do{
- j = 44;
- do{
- k = 100;
- do{ _nop_(); }while(--k);
- }while(--j);
- }while(--i);
- }
- /*************************電機控制函數******************/
- void Forward(unsigned char Speed_Right,unsigned char Speed_Left)//前進
- {
- L293D_IN1=1;
- L293D_IN2=0;
- L293D_IN3=1;
- L293D_IN4=0;
- PWM_Set(255-Speed_Right,255-Speed_Left);
- }
- void Back(unsigned char Speed_Right,unsigned char Speed_Left)//后退
- {
- L293D_IN1=0;
- L293D_IN2=1;
- L293D_IN3=0;
- L293D_IN4=1;
- PWM_Set(255-Speed_Right,255-Speed_Left);
- }
- void Turn_Left(unsigned char Speed_Right,unsigned char Speed_Left)//左轉
- {
- L293D_IN1=1;
- L293D_IN2=0;
- L293D_IN3=0;
- L293D_IN4=1;
- PWM_Set(255-Speed_Right,255-Speed_Left);
- }
- void Turn_Right(unsigned char Speed_Right,unsigned char Speed_Left)//右轉
- {
- L293D_IN1=0;
- L293D_IN2=1;
- L293D_IN3=1;
- L293D_IN4=0;
- PWM_Set(255-Speed_Right,255-Speed_Left);
- }
- void Stop(void) //停止
- {
- L293D_IN1=0;
- L293D_IN2=0;
- L293D_IN3=0;
- L293D_IN4=0;
- PWM_Set(0,0);
- }
- /****************發送字符串函數****************/
- void SendString(unsigned char *pt)
- {
- while(*pt)
- Send_Char(*(pt++));
- }
- /****************發送字符函數****************/
- void Send_Char(unsigned char DATA)
- {
- ES=0;//關閉串口中斷
- flag1=0;
- SBUF=DATA; //將數據發送出去,可以在電腦串口工具的接收區觀察
- while(!TI);//數據發送完畢之后,T1會置1
- TI=0;
- ES=1;//重新允許串口中斷
- }
- /****************************串口中斷函數****************************/
- void serial() interrupt 4
- {
- flag1=1;//如果產生了中斷,說明單片機串口接收到數據,串口中斷標志置1
- SBUF_DATA=SBUF; //存放接收到的數據
- RI=0;//中斷標志
- }
- /****************************障礙檢測函數**************************/
- void jiance(void)
- {
- if(Left_InSen==0&& Right_InSen==1) //如果左邊傳感器檢測到物體,提示左邊有障礙物
- {
- if(flag2!=1)
- {
- Delay1ms(500);
- flag2=1;
- SendString("\r\n左方有障礙物...\r\n\r\n");
- }
- }
- else
- {
- flag2=0;
- }
- if(Left_InSen==1&& Right_InSen==0) //如果右邊傳感器檢測到物體,提示右邊有障礙物
- {
- if(flag3!=1)
- {
- Delay1ms(500);
- flag3=1;
- SendString("\r\n右方有障礙物...\r\n\r\n");
- }
- }
- else
- {
- flag3=0;
- }
- if(Left_InSen==0&& Right_InSen==0) //如果前方傳感器檢測到物體,提示前方有障礙物
- {
- if(flag4!=1)
- {
- Delay1ms(500);
- flag4=1;
- SendString("\r\n前方有障礙物...\r\n\r\n");
- }
- }
- else
- {
- flag4=0;
- }
- }
復制代碼
/****************************主函數***********************/
void main(void)
{
PWM_ini();
TMOD|=0x10;
TMOD&=0x1F;
TH1=(65536-36815)/256;
TL1=(65536-36815)%256; // 20ms
TR1=1;
ET1=1;
EX0=1;
IT0=1; //
SCON=0x50;//設置串口工作在方式1,允許串口接收數據
BRT=0xff;
AUXR=0x11;
ES=1; //允許串行中斷
EA=1; //開總中斷
SendString("已經進入藍牙無線控制模式,\r\n\r\n請按下對應的鍵盤按鍵,無線遙控小車。\r\n");
while(1)
{
jiance();
if(flag1==1) //如果產生過中斷,證明串口接收到了數據
{
flag1=0;
if(SBUF_DATA!=Last_SBUF_DATA)
{
switch(SBUF_DATA)
{
case leftdata: SendString("小車正在左轉...\r\n\r\n");break;
case rightdata: SendString("小車正在右轉...\r\n\r\n");break;
default: break;
}
}
switch(SBUF_DATA)
{
case leftdata: Turn_Left(Turn_Left_R_DATA,Turn_Left_L_DATA);break;
case rightdata: Turn_Right(Turn_Right_R_DATA,Turn_Right_L_DATA);break;
case forwarddata: Forward(Forward_R_DATA,Forward_L_DATA);SendString("小車正在前進...\r\n\r\n");SendString(s); break;
case backdata: Back(Back_R_DATA,Back_L_DATA);SendString("小車正在后退...\r\n\r\n");SendString(s);break;
default: break;
}
Last_SBUF_DATA = SBUF_DATA;
Delay1ms(30);
}
else Stop();
}
}
void int0() interrupt 0
{
count1++;
}
void timer1() interrupt 3
{
static unsigned char n=0;
TH1=(65536-36815)/256;
TL1=(65536-36815)%256; // 20ms
n++;
if(n>=50)
{
n=0;
speed=(float)count1*1.0053096;
count1=0;
sprintf(s,"speed:%3dcm/s\r\n\r\n",(unsigned short)speed);//將速度轉化為字符串送到S數組中
}
}
|
-
-
小車通訊部分原理圖.pdf
2015-5-12 15:17 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
19.71 KB, 下載次數: 7, 下載積分: 黑幣 -5
|