单片机串口通信,实现接收到数据后,灯亮。
void main()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
PCON&=0xef;
EA=0;
while(1)
{
if(RI==1)
{
RI=0;
P1=0x00;
}
}
}
让P1=0x00,按预期应该是复位后,电脑传数据过去后才会灯全亮,但是烧录后怎么复位灯就是自己全亮。
复位后就有数据自己传过去了?如果是这样,传过去的是什么? 展开
查询RI 不是等于 1,而是0
只有当数据传送过来的时候,RI才会由1变为0,所以需要查询的状态是 0,不是1
当接收完数据后,再进行对RI的清零
还是不多说了,上程序,若满意请记得采纳一下,谢谢!
这是一个由串口助手发送十六进制码来控制单片机的8个LED亮灭的简单小程序
/***************************************************************************/
#include <REG52.h>//通用89C52头文件
/***************************************************************************/
void main(void)//主函数
{
TMOD=0x20; //定时器1和2工作方式2(8位定时/计数)
TH1=0xfd; //定时器1设置初值,波特率9600bit/s,
TL1=0xff;
TR1=1; //启动定时器T1
PCON=0x00; //SMOD=0,不加倍
SCON=0x50; //串口工作方式1,允许接收
IE=0x00; //关闭所有中断
while(1)
{
if(RI==0)//如果有数据
{
P2=SBUF; //接收数据并输出至LED上显示
while(!RI); //等待接收完成
RI=0; //清空标识
}
}
}
/***************************************************************************/
只有当数据传送过来的时候,RI才会由1变为0?这跟书上说的好像不一样呀。
当接收到停止位时,RI由硬件置位,RI=1表示帧接收完成,可由软件查询RI位标志,也可以请求中断。RI必须由软件清0。
我的想法是RI有软件清零后,如果有数据传过去,串行接收到停止位,硬件会自动将RI置1,检测RI是否为1,就能知道上位机是否给单片机传数据。
本人初学者,很多刚接触,有些东西不是很清楚,请见谅。
具体的细节我倒是没有像你那样研究太深
我记得看到的资料以及众多实例中,都是这么写的代码
RI 既是串口中断的接收标志位,只有当接收完数据后,才会变成1
所以就有了这一句等待接收完成的语句 while(!RI);
然后在用代码置0,完成一个字符的接收过程
至于怎么个工作过程没必要研究那么详细,知道如何运用即可
就是能够发送和接收数据就够了