|
那個(gè)電機(jī)使能所對(duì)應(yīng)的I/O口連接著的是驅(qū)動(dòng)模塊的那個(gè)地方?是總開關(guān)那里嗎(程序是看帖子里某個(gè)大佬的 )
這是一個(gè)藍(lán)牙小車單片機(jī)程序
#include <reg52.h>
sbit EN1 = P2^0; //為1 右電機(jī)使能
sbit EN2 = P2^1; //為1 左電機(jī)使能
sbit IN1 = P2^2; //為1 右電機(jī)反轉(zhuǎn)
sbit IN2 = P2^3; //為1 右電機(jī)正轉(zhuǎn)
sbit IN3 = P2^4; //為1 左電機(jī)正轉(zhuǎn)
sbit IN4 = P2^5; //為1 左電機(jī)反轉(zhuǎn)
#define left_motor_en EN1 = 1 //左電機(jī)使能
#define left_motor_stops EN1 = 0 //左電機(jī)停止
#define right_motor_en EN2 = 1 //右電機(jī)使能
#define right_motor_stops EN2 = 0 //右電機(jī)停止
#define left_motor_go IN1 = 0, IN2 = 1 //左電機(jī)正傳
#define left_motor_back IN1 = 1, IN2 = 0 //左電機(jī)反轉(zhuǎn)
#define right_motor_go IN3 = 1, IN4 = 0 //右電機(jī)正傳
#define right_motor_back IN3 = 0, IN4 = 1 //右電機(jī)反轉(zhuǎn)
double count = 0;//定義占空比,并初始占空比為26%
unsigned char time;
unsigned char pwm_left_val = 255;//左電機(jī)占空比值 取值范圍0-170,0最快
unsigned char pwm_right_val = 255;//右電機(jī)占空比值取值范圍0-170 ,0最快
unsigned char pwm_t = 0; //周期
void UART_INIT(); //藍(lán)牙接收初始化
void Che_init(); //小車輸出端口定時(shí)器初始化
void forward(); //小車前進(jìn)
void back(); //小車后退
void right(); //小車左轉(zhuǎn)
void left(); //小車右轉(zhuǎn)
void stop(); //小車停止
void delay(unsigned int z); //延時(shí)函數(shù)
void main()
{
UART_INIT(); //藍(lán)牙接收初始化
Che_init(); //小車輸出端口定時(shí)器初始化
while(1);
}
void UART_INIT() //藍(lán)牙接收初始化
{
SCON = 0X50;
TMOD = 0x20; //8位自動(dòng)重裝模式
TH1 = 0xfd;
TL1 = 0xfd; //9600波特率
TR1 = 1; //啟動(dòng)定時(shí)器1
ES = 1; //開串口中斷
EA = 1; //開總中斷
}
void Che_init() //小車使能輸出端口定時(shí)器初始化
{
TMOD|= 0x02; //8位自動(dòng)重裝模塊
TH0 = 0xdc;
TL0 = 0xdc; //11.0592M晶振下占空比最大比值是256,輸出100HZ
TR0 = 1; //啟動(dòng)定時(shí)器0
ET0 = 1; //允許定時(shí)器0中斷
EA = 1; //總中斷允許
}
void forward() //小車前進(jìn)
{
ET0 = 1;
TR0 = 1;
left_motor_go; //左電機(jī)前進(jìn)
right_motor_go; //右電機(jī)前進(jìn)
}
void back() //小車后退
{
ET0 = 1;
TR0 = 1;
left_motor_back; //左電機(jī)反轉(zhuǎn)
right_motor_back; //右電機(jī)反轉(zhuǎn)
}
void right() //小車左轉(zhuǎn)
{
ET0 = 1;
TR0 = 1;
left_motor_go; //左電機(jī)正傳
right_motor_back; //右電機(jī)反轉(zhuǎn)
}
void left() //小車右轉(zhuǎn)
{
ET0 = 1;
TR0 = 1;
right_motor_go; //右電機(jī)正傳
left_motor_back; //左電機(jī)反轉(zhuǎn)
}
void stop() //小車停止
{
ET0 = 0;
TR0 = 0;
count = 0;
left_motor_stops; //左電機(jī)停止
right_motor_stops; //右電機(jī)停止
}
void timer0() interrupt 1 //定時(shí)器0中斷
{
pwm_t++;
pwm_left_val--;
if(pwm_left_val <= pwm_t)
EN1 = 1;
else
EN1 = 0;
if(pwm_t == 255)
pwm_t = 0;
/*
pwm_t++;
// pwm_left_val--;
// pwm_right_val--;
if(pwm_t == 255)
{
EN1 = 0;
EN2 = 0;
pwm_t = 255;
}
if(pwm_left_val == pwm_t)
EN1 = 1;
if(pwm_right_val == pwm_t)
EN2 = 1;*/
}
void UART_SER() interrupt 4 //串口中斷
{
if(RI)
{
RI = 0;//清除接收標(biāo)志
switch(SBUF)
{
case 'a': //前進(jìn)
forward();
break;
case 'b': //后退
back();
break;
case 'l': //左轉(zhuǎn)
right();
break;
case 'r': //右轉(zhuǎn)
left();
break;
case 's': //停止
stop();
break;
default: //否則全部停止
stop();
break;
}
}
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
|
|