郭天祥书上的51单片机串口通迅请求大神帮助指点
时间:10-02
整理:3721RD
点击:
![](../imgqa/ele/mcu/mcu-3721rd.com-37406f2ufirvlluv.jpg)
这些是我买的郭天祥的书上,关于串口通信的一个实验,这实验,为什么 我发送一个任意字符,却返回任意字符,而不是"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[]={};这个是数组,如果是单字符就用‘字符’双字符就用“字符码”这里不用大括号。
数组不对
都是高手 新手上路 多多关照哦
各位大神 平时怎么学的啊?
受益!