gaoqianzhe
驱动牛犊
驱动牛犊
  • 注册日期2003-01-21
  • 最后登录2004-01-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1255回复:3

我也碰到了串行口的问题

楼主#
更多 发布于:2003-01-21 16:09
    各位大虾,小弟正在做一个单片机的串行通讯的东东,不知道为什么接收来的数据总是不对。请高手不吝赐教。另外,我第一次来这里,还不是很明白这里的规矩,有不妥之处希见谅并给予指正。

   程序约定:单片机向外设发一个\"AT\\r\",外设执行相应功能,成功后,外设会发一个\"OK\"给CPU,否则发\"ERROR\" ,用的是9600的波特率,串行口用方式1,我在串行中断里设置了一个标志位serialflag,因为在中断里要清掉 RI 标志,RI 在主程序里就不能再作是否接收完成的标志了。我调试总是不成功,甚至有点怀疑是我的电脑有点问题,或者是仿真软件的问题。我用的是insight ME 52仿真器,源程序好下:(注释中的程序代码是我用中断方式时用的,可能不完整,但我调试的时候是完整的,也是不对);
#include <reg52.h>


#define uchar unsigned char
#define uint unsigned int

sfr WC = 0x8F;
extern char receive();
extern bit send(char *ptr, char diff);
void sendchar(char c);

extern char chget,serialflag;

/*********************************************************/

void counter0() interrupt 1
{
    TF0 = 0;
    TR0 = 0;
    TL0 = 0x0;
    TH0 = 0x0;
    TR0 = 1;    // enable T0
}

// *********************************************************
void serior() interrupt 4
{
//    TI = 0;
    EA = 0;
//    RI = 0;
    chget = SBUF;
    serialflag = 1;
    EA = 1;
}
// *********************************************************

void delay()
{
    uchar i = 255;

    while( i-- )
    ;
    return;
}
// *********************************************************

void sendchar(char c)
{
//    TI = 0;
    serialflag = 0;
    SBUF = c;
    while ( !TI )
    ;
    TI = 0;
    return;
}
// *********************************************************
char receive()
{
    char c;
    uint kt = 10000;

    RI = 0;
    REN = 1;
    while ( !RI && kt )
        kt--;
    REN = 0;
    RI = 0;
    c = SBUF;
    return (c);
}
// *********************************************************
// *********************************************************
main()
{
    uchar i,temp,c,chget;
    
    PSW = 0;

    TMOD = 0x25;    //set T1 16 bits counter, T0 16 bits timer. mode 1
    TH1 = 0x0FD;    // 9600bps
    TL1 = 0x0FD;
    TL0 = 0x00;
    TH0 = 0x00;
    SCON = 0x50;    //mode 1,enable receive
    PCON = 0x0;

    TCON = 0x40;

    IE = 0x10;    // enable T0 ( as counter ) interrupt
            // T1 ( timer ) and series port interrupt
    IP = 0x10;    // set series port as the most priority level


    do{
        temp = 1;        //success flag
        serialflag = 0;        //receive flag
        sendchar( \'A\' );
        sendchar( \'T\' );
        sendchar( \'\\r\' );

        EA = 1;            //interrupt enable
        ES = 1;            //serries interrupt enable

        while( !serialflag );    //
    //    chget = SBUF;
    //    chget = receive();
        if( chget == \'O\' )
        {    //chget = receive();
            serialflag = 0;
            while( !serialflag );
            if( chget == \'K\' )
            temp = 0;
        }
    }while( temp != 0 );    //receive not \"OK\" ,repeat

    while( 1 );

}

或者我干脆用下面简单的程序也不行
#include <reg52.h>

// *********************************************************
main()
{
    char ch,c,temp;
    TMOD = 0x20;    //T1 mode 2
    TL1 = 0x0FD;
    TH1 = 0x0FD;    // 9600bps

    TR1 = 1;    //TCON = 0x40;

    temp = 1;
    SCON = 0x50;
    PCON = 0x0;
    
    SBUF = \'A\';
    while( !TI );
    TI = 0 ;
    
    SBUF = \'T\';
    while( !TI );
    TI = 0 ;
    
    SBUF = \'\\r\';
    while( !TI );
    TI = 0 ;
    
    while( !RI );
    ch  = SBUF;
    RI = 0;
    
    while( !RI );
    c  = SBUF;
    RI = 0;
    if( ch == \'O\' )
        if( c == \'K\' )
            temp = 0;
    
    while( 1 );
}



 
wangxianjun
驱动牛犊
驱动牛犊
  • 注册日期2003-01-03
  • 最后登录2003-04-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-23 08:12
你晶振的频率可能不准,我曾遇到这样的问题
qinxg
驱动小牛
驱动小牛
  • 注册日期2002-11-15
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分37分
  • 威望27点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-23 17:14
可能用的是仿真器的晶振,我遇到过这种问题.写片子就好了.
winter_mao
驱动牛犊
驱动牛犊
  • 注册日期2002-05-25
  • 最后登录2007-04-17
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-24 17:43
    我同意上面两位老兄的意见,你没说单片机是否能实现收发功能,如果能的话,就肯定是晶振问题。12M的在4800以上误差特别大,应该换11.059的。
游客

返回顶部