STC8G1K08单片机调试中遇到如下问题:现在需要通过串口接收激光灯开关指令,如接收到D7 00 01就将PWR_ON_LASER拉高,即打开激光灯,现在通过串口发送D7 00 01指令,PWR_ON_LASER引脚没有被拉高。
#define _UART_C
#include "Uart.h"
#include "config.h"
#include "string.h"
//波特率配置为9600
#define FOSC 11059200UL //UL:无符号长整形
#define BRT (65536 - FOSC / 9600 / 4) //定时器速度1T
bit busy; //0表示不忙,1忙
char wptr; //写指针
char rptr; //读指针
char received_data;
char buffer[16]= {0};
//unsigned char RxdByte = 0;//-echo验证定义的变量
sbit PWR_ON_LASER = P1^2;
void Check_Laser()
{
if (buffer[(wptr - 3) & 0x0f] == 0xD7 &&
buffer[(wptr - 2) & 0x0f] == 0x00 &&
buffer[(wptr - 1) & 0x0f] == 0x01)&&
{
PWR_ON_LASER = 1; //收到指令"CMD"打开激光
}
else if(buffer[(wptr - 3) & 0x0f] == 0xD7 &&
buffer[(wptr - 2) & 0x0f] == 0x00 &&
buffer[(wptr - 1) & 0x0f] == 0x02)
{
PWR_ON_LASER = 0;//收到指令"CMD"关闭激光
}
}
void UartIsr() interrupt 4
{
if(TI) //判断TI标志位,为1表示数据发送完毕
{
TI = 0; //清零TI标志位
busy = 0; //串口不忙
}
if(RI) //判断RI标志位,接收数据完毕执行下面代码
{
RI = 0;
// RxdByte = SBUF;
// SBUF = RxdByte;// -echo验证
received_data = SBUF; //读取串口缓冲区的数据
buffer[wptr++] = received_data; //将接收到的数据存储到缓冲区
wptr &= 0x0f; //限制wptr值在0~15范围
}
}
void UartInit()
{
SCON = 0x50; //允许串口接收
P_SW1 = 0x40; //将串口1切换到P3.6和3.7引脚
T2L = BRT;
T2H = BRT >> 8; //BRT低8位存放在T2L中,高8位存放在T2H
AUXR = 0x15; //定时器2开始计数,时钟不分频
wptr = 0x00;
rptr = 0x00;
busy = 0;
}
void UartSend(char dat)
{
while(busy);
busy = 1;
SBUF = dat;
}
void UartSendStr(char *p)
{
while (*p)
{
UartSend(*p++);
}
}