单片机c语言入门实例:串行口应用
解:数字字符为增量进二进制码,‘0’对应0x30,‘1’= ‘0’+ 1 = 0x31,从‘0’到‘9’对应编码为0x30到0x39,记忆二进制编码较难,实际编程中用单引号括起对应字符表示引用该字符的二进制编码值,如‘?’表示引用?号的编码值。 在用11.0592MHz晶体时,9600bps的初始化分频初值为-6,现晶频加倍,如果其它条件不变,只有分频初始加倍为-12,才能得到9600bps;如果想得到2400bps(速率降4倍),分频初始自然加大4倍,即为-48。根据题意编得如下程序: #include <at89x52.h> void main( void ) { TMOD = (TMOD & 0x0F) | 0x20; TH1 = -12; PCON |= 0x80; //SMOD = 1 TR1 = 1; SCON = 0x42; while( 1 ) { if( TI==1 ) { static unsigned char Dat=‘0’; SBUF = Dat; TI = 0; If( ++Dat > ‘9’) Dat=‘0’; } } }
void main( void ) { TMOD = (TMOD & 0x0F) | 0x20; TH1 = -96; //注意不用倍频方式 PCON &= 0x7F; //SMOD = 0 TR1 = 1; SCON = 0x42; while( 1 ) { if( TI==1 ) { static unsigned char Dat=‘a’; SBUF = Dat; TI = 0; //If( ++Dat > ‘9’) Dat=‘0’; ++Dat; if( Dat == (‘z’+1) ) Dat=‘A’; if( Dat == (‘Z’+1) ) Dat=‘a’; } } } 上述改变值时,也可以再设一变量表示当前的大小写状态,比如写成如下方式: ++Dat; { static unsigned char Caps=1; if( Caps != 0 ) if( Dat>‘Z’){ Dat=‘a’; Caps=0; } else if( Dat>‘z’){ Dat=‘A’; Caps=1; } } 如下写法有错误:因为小b比大Z的编码值大,所以Dat总是‘a’ ++Dat; if( Dat>‘Z’){ Dat=‘a’} else if( Dat>‘z’){ Dat=‘A’}
在计算最高速率时,由于单方程,双未知数,又不知道波特率为多少,所以要综合各方面的条件,估算出A和B的分频常数,分别为-13和-14时,速率不但相同,且为最大值。如下给出A机的程序: #include <at89x52.h> void main( void ) { TMOD = (TMOD & 0x0F) | 0x20; TH1 = -13; //注意用倍频方式 PCON |= 0x80; //SMOD = 1 TR1 = 1; SCON = 0x52; //REN = 1 ES = 1; EA = 1; while( 1 ); } void RS232_intr( void ) interrupt 4 //注意RI和TI任一位变为1都中断 { unsigned char rDat; if( RI == 1 ){ RI=0; rDat=SBUF; } if( TI==1 ) { static unsigned char tDat=‘a’; SBUF = tDat; TI = 0; If( ++Dat > ‘z’) Dat=‘a’; } } |
|