导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→c51串口通讯[wjh1999515]

 *第32936篇: c51串口通讯

  
楼 主:wjh1999515 2005年7月10日20:19
 c51串口通讯
#include  <reg52.h>  
#define uchar unsigned char        
void ini_seris(void)
 {
   RCLK=1;
   TCLK=1; 
   RCAP2H=0xFF;
   RCAP2L=0xDC;                  //定时器2自动装入8位                    //波特率9600
   TR2=1;
   IE=0x00;
   SCON=0x50; 
 }                     
  
void main(void)
{ uchar bdata b='1';
  uchar idata i;
  ini_seris();
  while(1)
  {
     SBUF=b;
     for(i=0;i  <255;i++);   //延时
     while(TI==0);
     TI=0;
    }
}
各位大哥们您们好:最近在调试串口时,出现了一个问题,上面的这段程序我向串口调试助手中接收区发送一个字符‘1’ ,但是当我编译后,点击运行,接收区中仅仅接收到了2个字符,这是我点击重新开始按钮,然后再点击运行,就能够正常接收。
在单步运行的条件下,也可以正常接收,但是不知道为什么出现上面的问题,真是郁闷!!我搞了两周了,希望各位大哥帮小弟看看程序,在次先谢您们了!


  
2楼:虚子心 2005年7月11日15:26
 程序应该没问题,可能是Keil C的问题
程序应该没问题,可能是Keil C的问题。我也用Timer2这样做的,但用的是模式3,全部用中断方式收发,没有问题。你用的晶振是11.0592吧。
初始化应该对TH2和TL2一同赋值.
 RCAP2H = 0xFF;
 RCAP2L = 0xEE; //19200 Baud Rate
 TH2 = 0xFF;
 TL2 = 0xEE;

给你点小建议, “ for(i=0;i  <255;i++);   //延时“ 可不要,在此做别的另当别论。
     while(TI==0);  TI=0;这两句可用 while(!_testbit_(TI))代替。
可以在ini_seris();后设断点,看是否有区别。或在ini_seris();后加一句读SBUF。


  
3楼:wjh1999515 2005年7月13日16:37
 c51串口通讯
虚子心您好:非常感谢您的帮助,可能是我的仿真器所用的软件有些问题,我用的是台湾MICETEK的Easyprobe 80c52的仿真器,如果有可能换一个仿真器试试,
另外,我还有一个问题,我在通讯俄的时候,同时,time1也在工作(我用T1和T0用作定时和计数,用于测量速度,)通讯和定时计数都是用的是查询方式(首先查询通讯程序),通讯波特率为9600,但是,当通讯程序打开时,定时和计数就不能正常运行,我感觉的是当正在执行通讯程序时,这是定时器已经置位,两者在时间上有些冲突。
     我在考虑如果串口用中断,则定时和计数是不是就不是很准确了(因为在进行定时计数是有可能执行中断程序,而定时和计数还在工作),有可能在中断的过程中,定时器已经益处了2次或大于3次的情况,查询时也会遇见这样的问题,不知道该如何解决,希望您能给提供一个思路!在此先谢!
  
4楼:虚子心 2005年9月21日23:12
 刚看到你的帖子,如果用定时中断来精确定时
刚看到你的帖子,如果用定时中断来精确定时的话,要把前面的指令周期加上.但我告诉你一个简单方法,且十分精确.即设定时间常数时让TL1(TL0)的值为0,在中断服务程序中只给TH1(TH0)赋值(此时TL1/0已开始计时了,不要赋值了),且外部关中断不要超过256时钟周期.这可是我多年使用的秘密.
  
5楼:Asuraguo 2005年7月11日17:48
 你的程序可能有问题!
RCAP2H=0xFF;
   RCAP2L=0xDC;                  //定时器2自动装入8位                    //波特率9600

RCAP2H、RCAP2L在自动装入8位模式下好象要一样的数值吧。

  
6楼:Kuang-chingTsui 2005年7月12日15:16
 SBUF = b  后干嘛要延时?

>>>>>>对该主题发表你的看法

本主题贴数6,分页: [第1页]


[上一篇主题]:学习ARM的问题11

[下一篇主题]:c51串口通讯