标题: 单片机串口程序调试 [打印本页]

作者: xyxiyangyaang    时间: 2021-11-14 16:01
标题: 单片机串口程序调试
#include<reg52.h>
void main()
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        
        while(1)
                {
                while(!RI);
                        RI=0;
                        P1=0x00;
                }        
}
天祥单片机里面第七讲,想不明白,为什么这样写,P1口全被置零了,事实上,我并没有往串口发送数据。程序烧好之后,按复位键之后,P1口还是全置零(P1口等于0代表LED灯亮。)

如果把循环换成
while(1)
                {
                while(!RI);
                        RI=0;
                        P1=SBUF;
                }
P1口接到的是串口传来的数据。
这是为什么?



作者: 13205495918    时间: 2021-11-14 17:33
这个程序就这么长???没看见往串口发送的语句哎
作者: 188610329    时间: 2021-11-14 18:05
#include<reg52.h>
void main()
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        while(!RI);
        RI=0;        
        while(1)
                {
                while(!RI);
                        RI=0;
                        P1=0x00;
                }        
}

如果改成这样, 重起之后,应该就不会灯全亮了。

不知道你是什么板子, 也不知道你是什么单片机。很多学习板设计问题,重起后,串口会收到一个因为噪音产生的数据,其实是全1,但是你这个语句什么都没管,直接P0 = 0; 所以分辨不出。你进入while 前抛弃第一收到的噪音,基本就没有问题了。
作者: xyxiyangyaang    时间: 2021-11-14 19:33
188610329 发表于 2021-11-14 18:05
#include
void main()
{

谢谢回复,我是89C52的单片机,天祥电子的板子,我自己也试了一些程序,第一个确实是乱七八糟的数字,但是如果程序这样写的话,
#include<reg52.h>
void main()
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        
        while(1)
                {
                while(!RI);
                        RI=0;
                        P1=SBUF;
                }        
}
串口输入什么,P1就是什么,
SBUF 是第一个吗,这边没有把第一个噪音显示进来吗?
作者: xyxiyangyaang    时间: 2021-11-14 19:38
13205495918 发表于 2021-11-14 17:33
这个程序就这么长???没看见往串口发送的语句哎

第一个程序我没有往串口发数据,P1就等于0了;
第二个程序,我往串口发什么数据,P1就等于SBUF的值。
作者: 188610329    时间: 2021-11-14 20:27
xyxiyangyaang 发表于 2021-11-14 19:33
谢谢回复,我是89C52的单片机,天祥电子的板子,我自己也试了一些程序,第一个确实是乱七八糟的数字,但 ...

串口收到的数据,就是在SBUF里面的
你P1 =SBUF; 自然发什么,P1 就等于什么。

你While(1) 是重复执行的,所以,SBUF收到的内容是一直在变的。
你按我说的改了的话,你重起就不会亮灯,串口发了任何数据之后,会所有灯都亮。
说白了那个事列,只是为了验证,RI 有没有动作。
你改成 P1 = SBUF 也就是能多一些变化,实际意义来讲,也就是验证串口有没有正确验证
作者: jiajuntao    时间: 2021-11-14 20:46
程序里面把P1口写成0了,语句是P1=0x00;正确的是当收到串口信号后,读取串口收到的信号,就是读SBUF。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1