|
50黑幣
單片機(jī)STC89C52RC,晶振采用24MHZ,波特率9600,當(dāng)前問題是:
1、把RGB()函數(shù)放在主函數(shù)while(1)里面后,雖然在串口助手看到有收到指令,指令所對(duì)應(yīng)動(dòng)作無(wú)法被執(zhí)行
2、注釋主函數(shù)中的RGB()函數(shù)后,先發(fā)指令1-6能收到且執(zhí)行,再發(fā)送指令9后,RGB燈正常,這時(shí)候發(fā)送1-6指令,概率性打斷RGB執(zhí)行對(duì)應(yīng)指令
為什么RGB()運(yùn)行的同時(shí)Uart指令無(wú)法識(shí)別呢?就算去掉RGB()中的Delay()函數(shù),看到的現(xiàn)象跟問題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; //定義信號(hào)輸出DIN
unsigned char Compare,Compare1,Compare2,Compare3;
unsigned char Counter,Counter1,Counter2,Counter3;
unsigned int IC=2; //控制TM1804個(gè)數(shù)
unsigned int LED_PX; //像素點(diǎn)數(shù)
unsigned char PWM=255; //TM1804灰度數(shù)據(jù)
unsigned char Rda,Gda,Bda; //R、G、B灰度數(shù)據(jù)
unsigned char bdata LED_data; //可位操作的數(shù)據(jù)發(fā)送暫存變量聲明
sbit bit0=LED_data^0; //被發(fā)送的數(shù)據(jù)各位定義
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() //發(fā)送0碼函數(shù),規(guī)格書體現(xiàn)低速模式高電平700ns,周期2.5us
{
//示波器實(shí)際測(cè)試高1uS,周期4.5uS
DIN=1;
_nop_();
DIN=0;
}
void send_data_1() //發(fā)送1碼函數(shù),規(guī)格書體現(xiàn)低速模式高電平1800ns,周期2.5us
{
//示波器實(shí)際測(cè)試高1.5uS,周期6uS
DIN=1;
_nop_();_nop_();
DIN=0;
}
void send_data(unsigned char DATA1) //發(fā)送1個(gè)字節(jié)數(shù)據(jù),高位先發(fā)
{
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() //發(fā)送1幀數(shù)據(jù)
{
unsigned int i;
for(i=0;i<LED_PX;i++)
{
send_data(Rda); //發(fā)送R灰度數(shù)據(jù)
send_data(Gda); //發(fā)送G灰度數(shù)據(jù)
send_data(Bda); //發(fā)送B灰度數(shù)據(jù)
}
}
void RGB() //RGB函數(shù)
{
unsigned char i;
LED_PX=IC; //像素點(diǎn)數(shù)等于TM1804個(gè)數(shù)
Rda=Gda=Bda=0; //R、G、B灰度數(shù)據(jù)復(fù)位清零
for(i=0;i<PWM;i++) //紅色漸亮
{
Rda=i; //灰度計(jì)算
send_px(); //發(fā)送灰度數(shù)據(jù)
Delay(10); //復(fù)位延時(shí)
}
for(i=0;i<PWM;i++) //紅色漸滅,綠色漸亮
{
Gda=i;
Rda=PWM-i; //灰度計(jì)算
send_px(); //發(fā)送灰度數(shù)據(jù)
Delay(10); //復(fù)位延時(shí)
}
for(i=0;i<PWM;i++) //綠色漸滅,藍(lán)色漸亮
{
Bda=i;
Gda=PWM-i; //灰度計(jì)算
send_px(); //發(fā)送灰度數(shù)據(jù)
Delay(10); //復(fù)位延時(shí)
}
for(i=0;i<PWM;i++) //藍(lán)色漸滅,紅色漸亮
{
Rda=i;
Bda=PWM-i; //灰度計(jì)算
send_px(); //發(fā)送灰度數(shù)據(jù)
Delay(10); //復(fù)位延時(shí)
}
}
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(); //左轉(zhuǎn)
if(Data==4)TurnRight(); //右轉(zhuǎn)
if(Data==5)TurnLeftCircle(); //左轉(zhuǎn)彎
if(Data==6)TurnRightCircle(); //右轉(zhuǎn)彎
if(Data==9)RGB(); //RGB
}
}
void UART_Routine() interrupt 4 //串口中斷
{
gbRI=1;
if(RI==1) //允許單片機(jī)接收數(shù)據(jù)
{
Data=SBUF; //讀取數(shù)據(jù)
UART_SendByte(SBUF); //將接收到的數(shù)據(jù)發(fā)回串口
RI=0; //接收標(biāo)志位清0 軟件復(fù)位
}
}
|
|