单片机串口通信,实现接收到数据后,灯亮。

#include<reg52.h>voidmain(){TMOD=0x20;TH1=0xfd;TL1=0xfd;TR1=1;REN=1;SM0=0;SM1=1;PCON&... #include<reg52.h>
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,按预期应该是复位后,电脑传数据过去后才会灯全亮,但是烧录后怎么复位灯就是自己全亮。
复位后就有数据自己传过去了?如果是这样,传过去的是什么?
展开
 我来答
帐号已注销
2015-02-18 · TA获得超过2061个赞
知道小有建树答主
回答量:342
采纳率:0%
帮助的人:336万
展开全部

看你这程序编的,ha


查询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,完成一个字符的接收过程

至于怎么个工作过程没必要研究那么详细,知道如何运用即可

就是能够发送和接收数据就够了
huzi2099
2015-02-18 · TA获得超过1172个赞
知道小有建树答主
回答量:1887
采纳率:82%
帮助的人:630万
展开全部
不知你io是怎么连的,高亮还是低亮?
追问
亮度就是正常的P1给低电平的亮度。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式