闲话不说,先附上代码:
#include <REGX52.H>
#include "UART.h"
void main()
{
UART_Init(); //串口初始化
while(1)
{
}
}
void UART_Routine() interrupt 4
{
if(RI==1) //如果接收标志位为1,接收到了数据
{
P2=~SBUF; //读取数据,取反后输出到LED
UART_SendByte(SBUF); //将受到的数据发回串口
RI=0; //接收标志位清0
}
}
#include <REGX52.H>
void UART_Init()
{
SCON=0x50;
PCON |= 0x80;
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1;
ES=1;
}
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
我在测试P2取反效果的时候我发现,如果电脑向单片机发00即0000 0000,相应的取反应该的1111 1111 应该是灯全灭的状态,但现实却不是,51单片机上的D8亮了,即0x00取反后得到的是0x7E,并不是0xFE,我猜测的原因可能是单片机把第一位当成了符号位,不进行取反操作,我后来尝试了电脑向单片机发7F,单片机除了D7都亮了,我觉得是能证明我的推断的,希望有大佬能解答我的疑惑,感谢!