[疑难问答] 51串口通信的问题

[复制链接]
3086|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 | 显示全部楼层
没遇到过
yidou 发表于 2010-3-7 16:15 | 显示全部楼层
对于问题2,有些是填发送缓冲(即SBUF赋值),即触发发送.
suoma 发表于 2010-3-9 19:08 | 显示全部楼层
a是一个中间变量,将串口接收缓冲器的数据存储在中间变量a中,在发送程序中再将接收的这个数据发送出去。51单片机的发送缓冲器与接收缓冲器共用一个地址,读这个地址就是将接收缓冲器中的数据读走,写这个地址就是将待发送数据写入发送缓冲器同时触发发送.
 楼主| Karlshen 发表于 2010-3-9 20:10 | 显示全部楼层
那为什么,如果直接写“SBUF=P1”的话,无论K为何值,发回来的都是“00”?
wangwo 发表于 2010-3-9 20:45 | 显示全部楼层
好像有些片读端口不等于针,所以P1可能读全0
Shadow_Song 发表于 2013-1-25 10:44 | 显示全部楼层
Karlshen 发表于 2010-3-9 20:10
那为什么,如果直接写“SBUF=P1”的话,无论K为何值,发回来的都是“00”?

请问P1口接的是什么?有信号输入么?P1在右边时貌似是读输入值吧?
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

粉丝
快速回复 在线客服 返回列表 返回顶部