微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 郭天祥书上的51单片机串口通迅请求大神帮助指点

郭天祥书上的51单片机串口通迅请求大神帮助指点

时间:10-02 整理:3721RD 点击:



这些是我买的郭天祥的书上,关于串口通信的一个实验,这实验,为什么 我发送一个任意字符,却返回任意字符,而不是"I get "?
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag,a,i;
uchar code table[]="I get ";
/****晶振为11.0592MHz,波特率为9600******/
void init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void main()//程序烧入51单片机后,单片机从main()进入主程序
{
   init();//---初始化串口
   while(1)//单片机进入while()大循环
    {
     if(flag==1)/*单片机上电后,是先执行本程序最后面的中断子程序
void ser() interrupt 4,还是先判断flag==1这个条件?
   我的理解中,应该先判断if()中的flag==1这条件。可是本人又很不明
白:如果先判断if()函数中的条件flag==1的话,那这个flag定义时并没有赋值给它呀!所以
我们对它的值也就不知道是0还是1。
   如果是0则进不去if()函数;如果是1,那这个1是哪个给它的?是最后面的串口中断程序void ser() interrupt 4
赋给它的?我想不是吧?书上不是说main()是唯一的入口么?
   所以单片机一上电后,应该是先判断if()中的条件,所以我想请问一下高
人,单片机一上电,是先等待我们输入随便一个字符,它把此字符存入SBUF
然后产生接收中断RI=1?产生中断后进入中断程序使flag置1?然后进入程序的
if(flag==1)?*/
        {
          ES=0;//关闭串口中断
          for(i=0;i<6;i++)
           {
             SBUF=table;/*这里应该将"I get "发到"串口调试助手"去的啊,
可是我仿真却并没有出现"I get ",不知道怎么回事?*/
             while(!TI);
             TI=0;
           }
          SBUF=a;
          while(!TI);
          TI=0;
          ES=1;
          flag=0;
        }
    }
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
---------------原因在哪呢?为什么返回的不是"I get "呢?搞了都快一天了,还是找不出原因,这个程序的执行顺序也不是很清楚,是不是这个程序本身有问题?我的QQ是625558531,盼高人指教!



你在串口上面看到应该不是只有你发送的字符  应该还有东西 建议你看一下你接收了多少字节

SBUF=table[i];

SBUF=table;/*这里应该将"I get "发到"串口调试助手"去的啊,
可是我仿真却并没有出现"I get ",不知道怎么回事?*/
table是什么?是数组名。

          for(i=0;i<6;i++)
           {
             SBUF=table[i];           
             while(!TI);
             TI=0;
           }

如果你用串口调试助手,接受区,也应该设置成字符格式吧!

SBUF=table[i]

顶一个

1、线连错了,RXD与TXD交叉连接;
2、SBUF=table[i],一个一个的发;
改了再试

单片机中的SBUF是一个字节的缓存,不是一个指针。所以
SBUF=table是不对的,应该像11后说的那样一个一个的发送。

ddddddddddddddddd

table[]={};这个是数组,如果是单字符就用‘字符’双字符就用“字符码”这里不用大括号。

数组不对

都是高手  新手上路 多多关照哦  

各位大神 平时怎么学的啊?

受益!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top