串口控制led闪烁没有反应
typedef unsigned int u16;
typedef unsigned char u8;
void UsartInit()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1;
//打开计数器
}
void main()
{
UsartInit();
// 串口初始化
while(1);
}
void Usart() interrupt 4
{
u8 receiveData;
receiveData=SBUF;
P2=SBUF; 在这里是否对
RI = 0;
SBUF=receiveData;
while(!TI);
TI=0;
}
不需要开定时器中断吧
不知坛友解决问题了没有 是怎么造成的呀
这是设置波特率的
没有。 求助大神啊00000000000000
两个问题,第一:你的波特率是多少?0xf3是对应4800吗? 第二:我觉得在串口中断函数中应该对中断源做判断,发送也可以采用查询方式。
数据转换那出了问题,SBUF中的数据没有转换就到了P0,不知你是否懂得SBUF中的数据格式。
sbuf就是一个8位寄存器(你可以理解成8个格子的抽屉),向它写入数据就是填充串口数据位,读取就是获得串口数据。一般的c51都是大端模式,所以sbuf中的数据是高位在前低位在后。放下c51时间太长了,不知你要怎样转换?
假如我输入1,SBUF中的8位数是什么
电脑端使用十六进制方式你发送1那 sbuf=0x01 串口端使用asiic码发送1 则sbuf=1的asiic码值
void Usart() interrupt 4
{
receiveData=SBUF;
while(!RI);
if( RI)
{if(0x30==receiveData)
{P2=0X50;
delay(66536);
}
if( 0x31==receiveData)
{P2=0X05;
delay(66536);
} } 已经解决了,谢谢你的提醒。电脑端发送1,单片机接收到的是0x31,单片机发出时电脑将0x31转换成数字1显示出来。串口调试助手是以字符串的形式输入的,难道是这个的原因?
与之前的效果一样
void Usart() interrupt 4
{
receiveData=SBUF;
while(!RI);
if( RI)
{if(48==receiveData) 输入0
{P2=0X50;
delay(66536);
}
if( 49==receiveData) 输入1
{P2=0X05;
delay(66536);
} }
请区分一下 字节和字符串