打印

串口调试问题

[复制链接]
2151|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
w2340|  楼主 | 2007-11-28 15:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大虾们帮我看看下面程序哪里出问题了
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
sbit RE_DE=P1^0;
//sbit testpoint=P1^1;
unsigned char buffer[]={0x05,0x15,0x25,0x35,0x45};    //定义接收缓冲区
unsigned char RECEIVR_buffer;

void UART_init();               //串口初始化函数
void COM_send(void);            //串口接收函数
void VariableDelay(unsigned char delay);


//--------------------------------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
//            串口接收中断允许,发送中断禁止
//--------------------------------------------------------------------------------------------------
void UART_init()
{
                     //初始化串行口和波特率发生器
    SCON =0x50;          //选择串口工作方式,打开接收允许
    TMOD|=0x20;           //定时器1工作在方式2,定时器0工作在方式1
    PCON=0;
    TH1 =0xfd;           //实现波特率9600(系统时钟11.0592MHZ)
          REN=1;
    TR1 =1;              //启动定时器T1
    ET1 =0;
    ES=1;                //允许串行口中断
    EA =1;               //单片机中断允许
    }
//--------------------------------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收包括起始5位数据到数据缓冲区
//--------------------------------------------------------------------------------------------------
void recive(void) interrupt 4 using 3
{

  if(RI)                                //处理接收中断
  {
        RI=0;                                //清除中断标志位

        RECEIVR_buffer=SBUF;                  //接收串口数据
    }     

}
//--------------------------------------------------------------------------------------------------
// 函数名称: COM_send()串口发送函数
// 函数功能: 把数据缓冲区的5位数据发送出去
//--------------------------------------------------------------------------------------------------
void COM_send(void)
{
 int point;
 EA=0;

 RE_DE=1;                                
 for(point=0;point<5;point++)     //连续发送5位数据
                                         //把缓存区的数据都发送到串口
  {
   SBUF=buffer[point];
   while(TI==0);
   TI=0;
   }
    RE_DE=0; 
    point=0;
    EA=1;
}

//--------------------------------------------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度个子函数,完成通信过程
//--------------------------------------------------------------------------------------------------
 void main(void)
 {
   
       UART_init();            
       RE_DE = 0;
      // testpoint=0;
       VariableDelay(1000);
       while(1)
           {
              if(RECEIVR_buffer==0x88)
                {
                 RECEIVR_buffer=0;
                                 //   testpoint=1;
                     COM_send();                                          //调用发送程序通知主机
                }
        
         }
  
 }
 void VariableDelay(unsigned char delay)
{
    unsigned char i;

    for (;delay>0;delay--)
    {
        for (i=0;i<50;i++);
    }
}
           
就是接收不到数据,单独发送是可以的

相关帖子

沙发
w2340|  楼主 | 2007-11-28 15:38 | 只看该作者

怎么就没有知道啊

怎么就没有人呢?

使用特权

评论回复
板凳
hellomcu| | 2007-11-28 15:59 | 只看该作者

TL1 的什没有值

TL1 的什没有值
相关链接:http://shop35088126.taobao.com

使用特权

评论回复
地板
w2340|  楼主 | 2007-11-28 16:02 | 只看该作者

这个关系不大吧

TL1没有赋值应该关系不大吧,以前也用过没有出现问题,这次比较邪门

使用特权

评论回复
5
twz8858877| | 2007-11-28 17:50 | 只看该作者

485通讯?

找找硬件是否有问题

使用特权

评论回复
6
w2340|  楼主 | 2007-11-28 18:37 | 只看该作者

我把485去掉

我把485去掉了,还是不行
而且还仿真了
仿真结果不对

使用特权

评论回复
7
bbs21iccom| | 2007-11-28 19:41 | 只看该作者

TL1不用赋值

使用特权

评论回复
8
孤星119| | 2007-11-28 21:40 | 只看该作者

吓搞以下.

void recive(void) interrupt 4 using 3
{
  ES=0;
  if(RI)                                //处理接收中断
  {
                                       //清除中断标志位    
        RECEIVR_buffer=SBUF;                  //接收串口数据
        RI=0; 
    }     
  ES=1;
}

使用特权

评论回复
9
hellomcu| | 2007-11-28 22:14 | 只看该作者

TL1没有初始值

  TL1没有初始值!!! 过去不出问题不代表就是完成正确的!!
  改来试下,不然你按下面的顺序来再试。


    //选定时器1作为波特率发生器,工作于模式2,自动装载        
    TMOD = 0x20;                            
    ET1 = 0;
    SCON = 0x50;                            
    PCON = 0x00;    //PCON的地址是87H,这里SMOD =0                
        TH1 = 0xFA;    //22.1184M,波特率的常数=0XFA
    TL1 = 0xFA;    //波特率:9600
    RI = 0;        //清除接收中断标志
    REN = 1    ;    //允许串行接收
        ES = 1;        //允许串行中断
        TR1 = 1;    //启动定时器1

相关链接:http://shop35088126.taobao.com

使用特权

评论回复
10
w2340|  楼主 | 2007-11-28 22:39 | 只看该作者

真够邪门

这次真够邪门的,不管怎么改,还是只能发送,不能接收

使用特权

评论回复
11
hellomcu| | 2007-11-29 09:48 | 只看该作者

检查硬件电路

   用示波器看下输入端有没有信号进来。然后再把程序改了,改成收到什么发什么
相关链接:http://shop35088126.taobao.com

使用特权

评论回复
12
w2340|  楼主 | 2007-12-3 20:36 | 只看该作者

手上没有示波器

没有示波器,也没有办法的

使用特权

评论回复
13
mapleyang| | 2007-12-3 23:35 | 只看该作者

re

改成查询方式看一下,既然能发送,说明波特率设置的没有问题了

使用特权

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

本版积分规则

17

主题

49

帖子

0

粉丝