|
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 軟件復位
}
}
|
|