打印
[疑难问答]

51串口通信的问题

[复制链接]
1787|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Karlshen|  楼主 | 2010-3-6 10:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自学8051时由于对原理了解不透彻,遇到一些问题,希望得到各位老师的指导。
这段代码实现基本的串口通信。使用“串口调试助手”给单片机发一个字节的数据K,单片机马上回发K。
我不明白的有两个地方:
1、为什么必须使用一个a变量来储存SBUF的值才能成功将该K回发。如果直接写“SBUF=P1”的话,无论K为何值,发回来的都是“00”。
2、为什么必须先关闭中断,即给ES=0,否则单片机会连续不断的发送数据?发送这个动作究竟在什么时候进行的?是给SBUF赋值以后,还是...?


#include<reg51.h>
unsigned char flag;
unsigned char a;
void main()
{

TMOD=0x20;   
TR1=1;      
TH1=0xfd;
TL1=0xfd;   
EA=1;     
  

SM0=0;
SM1=1;     
REN=1;     
ES=1;     
while(1)
{
     if(flag==1)
{
  ES=0;   
  flag=0;      
  SBUF=a;   
  while(!TI);   
  TI=0;   
  ES=1;   
}
}

}
void receive() interrupt 4
{
flag=1;
P1=SBUF;
a=SBUF;
RI=0;     
}
沙发
Karlshen|  楼主 | 2010-3-6 11:07 | 只看该作者
在Keil里输入的中文注释复制出来成了乱码,所以只好删干净。

使用特权

评论回复
板凳
god_like| | 2010-3-7 13:48 | 只看该作者
不是很清楚,帮顶了

使用特权

评论回复
地板
司徒老鹰| | 2010-3-7 13:57 | 只看该作者
没遇到过

使用特权

评论回复
5
yidou| | 2010-3-7 16:15 | 只看该作者
对于问题2,有些是填发送缓冲(即SBUF赋值),即触发发送.

使用特权

评论回复
6
suoma| | 2010-3-9 19:08 | 只看该作者
a是一个中间变量,将串口接收缓冲器的数据存储在中间变量a中,在发送程序中再将接收的这个数据发送出去。51单片机的发送缓冲器与接收缓冲器共用一个地址,读这个地址就是将接收缓冲器中的数据读走,写这个地址就是将待发送数据写入发送缓冲器同时触发发送.

使用特权

评论回复
7
Karlshen|  楼主 | 2010-3-9 20:10 | 只看该作者
那为什么,如果直接写“SBUF=P1”的话,无论K为何值,发回来的都是“00”?

使用特权

评论回复
8
wangwo| | 2010-3-9 20:45 | 只看该作者
好像有些片读端口不等于针,所以P1可能读全0

使用特权

评论回复
9
Shadow_Song| | 2013-1-25 10:44 | 只看该作者
Karlshen 发表于 2010-3-9 20:10
那为什么,如果直接写“SBUF=P1”的话,无论K为何值,发回来的都是“00”?

请问P1口接的是什么?有信号输入么?P1在右边时貌似是读输入值吧?

使用特权

评论回复
10
Shadow_Song| | 2013-1-25 10:53 | 只看该作者
问题2:貌似TI0==1的时候也会触发中断服务程序吧?然后flag==1,又可以进入循环,所以不关中断的话,就会不断的发送。
PS:中断服务程序这么写怎样?这样应该不用关中断了
void receive() interrupt 4
{
    if(RI0 == 1)
    {
        flag=1;
        P1=SBUF;
        a=SBUF;
        RI=0; 
    }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

81

主题

734

帖子

1

粉丝