阅读:1257回复:3
我也碰到了串行口的问题
各位大虾,小弟正在做一个单片机的串行通讯的东东,不知道为什么接收来的数据总是不对。请高手不吝赐教。另外,我第一次来这里,还不是很明白这里的规矩,有不妥之处希见谅并给予指正。
程序约定:单片机向外设发一个\"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 ); } |
|
沙发#
发布于:2003-01-24 17:43
我同意上面两位老兄的意见,你没说单片机是否能实现收发功能,如果能的话,就肯定是晶振问题。12M的在4800以上误差特别大,应该换11.059的。
|
|
板凳#
发布于:2003-01-23 17:14
可能用的是仿真器的晶振,我遇到过这种问题.写片子就好了.
|
|
地板#
发布于:2003-01-23 08:12
你晶振的频率可能不准,我曾遇到这样的问题
|
|