#include<at89x51.h>//此為紅外線尋線小車程序 單片機(jī)為stc89c51rc 發(fā)射頻率為38.5mKz 電機(jī)驅(qū)動(dòng)芯片為L(zhǎng)298 / 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ǔ)償 } /****************************************************** /************管腳定義********************/ extern int abs(int val); //聲明abs函數(shù) sbit ENA = P3^6; //左輪驅(qū)動(dòng)使能 sbit IN1 = P3^2; //左輪黑線 sbit IN2 = P3^3; //左輪紅線 sbit IN3 = P3^4; //右輪紅線 sbit IN4 = P3^5; //右輪黑線 sbit ENB = P3^7; //右輪驅(qū)動(dòng)使能 sbit L_scan=P0^2; //傳感器掃描管腳 sbit R_scan=P0^3; sbit L_led=P0^0; //LED控制管腳 sbit R_led=P0^1; //=============PWM================ #define PWM_COUST 100 //PWM細(xì)分等份 unsigned int MOTO_speed1; //左邊電機(jī)轉(zhuǎn)速 unsigned int MOTO_speed2; //右邊電機(jī)轉(zhuǎn)速 unsigned int PWM_abs1; //左邊電機(jī)取絕對(duì)值后占空比 unsigned int PWM_abs2; //左邊電機(jī)取絕對(duì)值后占空比 //uchar PWM_var1=20; //左邊電機(jī)直走速度 (不同的電機(jī),此參數(shù)不同) //uchar PWM_var2=20; //右邊電機(jī)直走速度 unsigned int PWMAnd = 0; //PWM自增變量 /****************************************************************** 名稱:motor(char speed1,char speed2); 功能:同時(shí)調(diào)節(jié)電機(jī)的轉(zhuǎn)速 參數(shù):speed1:電機(jī)1的PWM值;speed2:電機(jī)2的PWM值 speed>0.正轉(zhuǎn);speed<0.反轉(zhuǎn)(-100~100) 調(diào)用:extern int abs(int val); 取絕對(duì)值 返回: ******************************************************************/ void motor(unsigned int speed1,unsigned int speed2) { MOTO_speed1=speed1; MOTO_speed2=speed2; //==============左邊電機(jī)============= if(speed1==0) { IN1 =0;IN2 =0; } if (speed1>0) { IN1 =0;IN2 =1;//正轉(zhuǎn) } else if (speed1<0) { IN1 =1;IN2 =0;//反轉(zhuǎn) } //==============右邊電機(jī)============= if (speed2==0) { IN3 =0;IN4 =0;//不轉(zhuǎn) } if (speed2>0) { IN3 =1;IN4 =0;//正轉(zhuǎn) } else if (speed2<0) { IN3 =0;IN4 =1;//反轉(zhuǎn) } } /****************************************************************** 名稱:motor_PWM(); 功能:PWM占空比輸出 參數(shù):無 調(diào)用:無 返回:無 ******************************************************************/ void motor_PWM () { PWM_abs1=abs(MOTO_speed1); PWM_abs2=abs(MOTO_speed2); if (PWM_abs1>PWMAnd) ENA=1; //左邊電機(jī)占空比輸出 else ENA=0; if (PWM_abs2>PWMAnd) ENB=1; //右邊電機(jī)占空比輸出 else ENB=0; if (PWMAnd>=PWM_COUST) PWMAnd=0; //PWM計(jì)數(shù)清零 else PWMAnd+=1; } /****************************************************************** 名稱:void TIME_Init (); 功能:定時(shí)器初始化 指令: 調(diào)用:無 返回:無 ******************************************************************/ void TIME_Init () { //=========定時(shí)器T0初始化 PWM================== EA=1; // TCON = 0x10; TMOD = 0x01; TH0 = 0xff; TL0 = 0x9B; // TL0 = 0x47; ET0 = 1; //定時(shí)器1中斷開 TR0 = 1; //PWM定時(shí)器開,PWM周期為10ms } /****************************************************************** 名稱:void PWM_Time0 () interrupt 0 功能:T2中斷,PWM控制 參數(shù): 調(diào)用:motor_PWM();//PWM占空比輸出 返回: ******************************************************************/ void PWM_Time0 () interrupt 1 { TR0 = 0; //TF2 = 0; ET0 = 0; //定時(shí)器0中斷禁止 TH0 = 0xff; TL0 = 0x9B; motor_PWM();//PWM占空比輸出 ET0 = 1; //定時(shí)中斷0開啟 TR0 = 1; } //掃描傳感器狀態(tài) unsigned char scan(void) { unsigned char i,result,temp1,temp2; for(i=38;i>0;i--) //LED發(fā)送38次脈沖 { L_led=0; delay_nus(12); L_led=1; delay_nus(12); } temp1=L_scan; //記錄傳感器狀態(tài) for(i=38;i>0;i--) //另一側(cè)發(fā)脈沖 { R_led=0; delay_nus(12); R_led=1; delay_nus(12); } temp2=R_scan; //記錄傳感器狀態(tài) if(temp2==1&&temp1==1) //兩側(cè)都掃描到黑邊 result=1; if(temp1==0&&temp2==1) //左側(cè)掃描到白線 result=0; if(temp1==1&&temp2==0) //右側(cè)掃描到白線 result=2; if(temp1==0&&temp2==0) //兩側(cè)都掃描到白線 result=3; return result; } unsigned char result;
void main() { while(1) { result=scan(); if(result==1) //直走 { unsigned int i=0; unsigned int y=0; TIME_Init () ; motor(100,100);//電機(jī)的轉(zhuǎn)速 } else if(result==0)//左轉(zhuǎn),左輪停止 { unsigned int i=0; unsigned int y=0; TIME_Init () ; motor(0,100);//電機(jī)的轉(zhuǎn)速 while(1); } else if(result==2)//右轉(zhuǎn),右輪停止 { unsigned int i=0; unsigned int y=0; TIME_Init () ; motor(100,0);//電機(jī)的轉(zhuǎn)速 } else if(result==3)//兩邊都沒有返回的狀態(tài)(比如小車懸空)~自己定吧,這里停車 { unsigned int i=0; unsigned int y=0; TIME_Init () ; motor(0,0);//電機(jī)的轉(zhuǎn)速 } delay_nms(200);//延時(shí)200ms } } 求高手指點(diǎn)程序中錯(cuò)誤
[此貼子已經(jīng)被作者于2011-10-20 20:25:46編輯過]
|