有大哥帮帮忙吗,看看那里有问题,51单片机做一个蓝牙小车程序,pwm中断和串口中断冲突,帮忙看看那里有问题, 感谢感谢。
#include <reg52.h>
sbit EN1 = P2^0; //为1 右电机使能
sbit EN2 = P2^1; //为1 左电机使能
sbit IN1 = P2^2; //为1 右电机反转
sbit IN2 = P2^3; //为1 右电机正转
sbit IN3 = P2^4; //为1 左电机正转
sbit IN4 = P2^5; //为1 左电机反转
#define left_motor_en EN1 = 1 //左电机使能
#define left_motor_stops EN1 = 0 //左电机停止
#define right_motor_en EN2 = 1 //右电机使能
#define right_motor_stops EN2 = 0 //右电机停止
#define left_motor_go IN1 = 0, IN2 = 1 //左电机正传
#define left_motor_back IN1 = 1, IN2 = 0 //左电机反转
#define right_motor_go IN3 = 1, IN4 = 0 //右电机正传
#define right_motor_back IN3 = 0, IN4 = 1 //右电机反转
double count = 0;//定义占空比,并初始占空比为26%
unsigned char time;
unsigned char pwm_left_val = 0;//左电机占空比值 取值范围0-170,0最快
unsigned char pwm_right_val = 0;//右电机占空比值取值范围0-170 ,0最快
unsigned char pwm_t; //周期
void UART_INIT(); //蓝牙接收初始化
void Che_init(); //小车输出端口定时器初始化
void forward(); //小车前进
void back(); //小车后退
void right(); //小车左转
void left(); //小车右转
void stop(); //小车停止
void delay(unsigned int z); //延时函数
void main()
{
UART_INIT(); //蓝牙接收初始化
Che_init(); //小车输出端口定时器初始化
while(1);
}
void UART_INIT() //蓝牙接收初始化
{
SCON = 0X50;
TMOD = 0x20; //8位自动重装模式
TH1 = 0xfd;
TL1 = 0xfd; //9600波特率
TR1 = 1; //启动定时器1
ES = 1; //开串口中断
EA = 1; //开总中断
}
void Che_init() //小车使能输出端口定时器初始化
{
TMOD|= 0x02; //8位自动重装模块
TH0=(65536-10)/256;
TL0=(65536-10)%256;
TR0=1;
ET0=1;
EA=1;
/*
TMOD|= 0x02; //8位自动重装模块
TH0 = 220;
TL0 = 220; //11.0592M晶振下占空比最大比值是256,输出100HZ
TR0 = 1; //启动定时器0
ET0 = 1; //允许定时器0中断
EA = 1; //总中断允许
*/
}
void forward() //小车前进
{
ET0 = 1;
TR0 = 1;
left_motor_go; //左电机前进
right_motor_go; //右电机前进
while(1)
{
count += 0.1;
}
}
void back() //小车后退
{
ET0 = 1;
TR0 = 1;
left_motor_back; //左电机反转
right_motor_back; //右电机反转
}
void right() //小车左转
{
ET0 = 1;
TR0 = 1;
left_motor_go; //左电机正传
right_motor_back; //右电机反转
}
void left() //小车右转
{
ET0 = 1;
TR0 = 1;
right_motor_go; //右电机正传
left_motor_back; //左电机反转
}
void stop() //小车停止
{
ET0 = 0;
TR0 = 0;
count = 0;
left_motor_stops; //左电机停止
right_motor_stops; //右电机停止
}
void timer0() interrupt 1 //定时器0中断
{
TR0 = 0; //设置定时器初值期间,关闭定时器
TH0=(65536-10)/256;
TL0=(65536-10)%256;
//TR0=1;
time++;
//count += 0.1;
if(time<count)
{
EN1 = 1; //输出高电平
EN2 = 1; //输出高电平
}
else
{
EN1 = 0; //输出低电平
EN2 = 0; //输出低电平
}
if(time>=1000)
time=0;
/*
pwm_t++;
if(pwm_t == 255)
{
EN1 = 0;
EN2 = 0;
pwm_t = 0;
}
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;//清除接收标志
switch(SBUF)
{
case 'a': //前进
forward();
break;
case 'b': //后退
back();
break;
case 'l': //左转
right();
break;
case 'r': //右转
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--);
}
|