|
50黑币
单片机STC89C52RC,晶振采用24MHZ,波特率9600,当前问题是:
1、把RGB()函数放在主函数while(1)里面后,虽然在串口助手看到有收到指令,指令所对应动作无法被执行
2、注释主函数中的RGB()函数后,先发指令1-6能收到且执行,再发送指令9后,RGB灯正常,这时候发送1-6指令,概率性打断RGB执行对应指令
为什么RGB()运行的同时Uart指令无法识别呢?就算去掉RGB()中的Delay()函数,看到的现象跟问题2一致。感谢各位大神解答,感激不尽!!!
#include <REGX52.H>
#include "UART.H"
#include "MotorDrive.H"
#include "INTRINS.H" //包含nop指令头文件
#include "Delay.H"
#include "Timer0.H"
#define nop _nop_();
sbit DIN=P2^6; //定义信号输出DIN
unsigned char Compare,Compare1,Compare2,Compare3;
unsigned char Counter,Counter1,Counter2,Counter3;
unsigned int IC=2; //控制TM1804个数
unsigned int LED_PX; //像素点数
unsigned char PWM=255; //TM1804灰度数据
unsigned char Rda,Gda,Bda; //R、G、B灰度数据
unsigned char bdata LED_data; //可位操作的数据发送暂存变量声明
sbit bit0=LED_data^0; //被发送的数据各位定义
sbit bit1=LED_data^1;
sbit bit2=LED_data^2;
sbit bit3=LED_data^3;
sbit bit4=LED_data^4;
sbit bit5=LED_data^5;
sbit bit6=LED_data^6;
sbit bit7=LED_data^7;
bit flag=0;
sbit L298N_ENA=P1^4;
sbit L298N_ENB=P1^5;
sbit L298N_ENA1=P1^1;
sbit L298N_ENB1=P0^2;
bit gb_RGB=0;
bit gbRI=0;
unsigned char Data;
void send_data_0() //发送0码函数,规格书体现低速模式高电平700ns,周期2.5us
{
//示波器实际测试高1uS,周期4.5uS
DIN=1;
_nop_();
DIN=0;
}
void send_data_1() //发送1码函数,规格书体现低速模式高电平1800ns,周期2.5us
{
//示波器实际测试高1.5uS,周期6uS
DIN=1;
_nop_();_nop_();
DIN=0;
}
void send_data(unsigned char DATA1) //发送1个字节数据,高位先发
{
LED_data=DATA1;
if(bit7) send_data_1(); else send_data_0();
if(bit6) send_data_1(); else send_data_0();
if(bit5) send_data_1(); else send_data_0();
if(bit4) send_data_1(); else send_data_0();
if(bit3) send_data_1(); else send_data_0();
if(bit2) send_data_1(); else send_data_0();
if(bit1) send_data_1(); else send_data_0();
if(bit0) send_data_1(); else send_data_0();
}
void send_px() //发送1帧数据
{
unsigned int i;
for(i=0;i<LED_PX;i++)
{
send_data(Rda); //发送R灰度数据
send_data(Gda); //发送G灰度数据
send_data(Bda); //发送B灰度数据
}
}
void RGB() //RGB函数
{
unsigned char i;
LED_PX=IC; //像素点数等于TM1804个数
Rda=Gda=Bda=0; //R、G、B灰度数据复位清零
for(i=0;i<PWM;i++) //红色渐亮
{
Rda=i; //灰度计算
send_px(); //发送灰度数据
Delay(10); //复位延时
}
for(i=0;i<PWM;i++) //红色渐灭,绿色渐亮
{
Gda=i;
Rda=PWM-i; //灰度计算
send_px(); //发送灰度数据
Delay(10); //复位延时
}
for(i=0;i<PWM;i++) //绿色渐灭,蓝色渐亮
{
Bda=i;
Gda=PWM-i; //灰度计算
send_px(); //发送灰度数据
Delay(10); //复位延时
}
for(i=0;i<PWM;i++) //蓝色渐灭,红色渐亮
{
Rda=i;
Bda=PWM-i; //灰度计算
send_px(); //发送灰度数据
Delay(10); //复位延时
}
}
void main()
{
UART_Init();
L298N_ENA=1;
L298N_ENB=1;
L298N_ENA1=1;
L298N_ENB1=1;
while(1)
{
// RGB();
if(Data==0)StopIt(); //停止
if(Data==1)Forward(); //直行
if(Data==2)BackOff(); //后退
if(Data==3)TurnLeft(); //左转
if(Data==4)TurnRight(); //右转
if(Data==5)TurnLeftCircle(); //左转弯
if(Data==6)TurnRightCircle(); //右转弯
if(Data==9)RGB(); //RGB
}
}
void UART_Routine() interrupt 4 //串口中断
{
gbRI=1;
if(RI==1) //允许单片机接收数据
{
Data=SBUF; //读取数据
UART_SendByte(SBUF); //将接收到的数据发回串口
RI=0; //接收标志位清0 软件复位
}
}
|
|