前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口。经过若干曲折并参考了一些现有的资料,基本上完成了。现在将完整的测试程序,以及其中一些需要总结的部分贴出来。程序硬件平台:11.0592M晶振,STC单片机(兼容51)/****************************************************************在单片机上模拟了一个串口,使用P2.1作为发送端*把单片机中存放的数据通过P2.1作为串口TXD发送出去***************************************************************/#include#include#includetypedefunsignedcharuchar;inti;ucharcodeinfo[]={0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};sbitnewTXD=P2^1;//模拟串口的发送端设为P2.1voidUartInit(){SCON=0x50;//SCON:serailmode1,8-bitUARTTMOD|=0x21;//T0工作在方式1,十六位定时PCON|=0x80;//SMOD=1;TH0=0xFE;//定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bpsfosc=11.0592MHzTL0=0x7F;//定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bpsfosc=11.0592MHz//TH0=0xFD;//定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bpsfosc=18.432MHz//TL0=0x7F;//定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bpsfosc=18.432MHz}voidWaitTF0(void){while(!TF0);TF0=0;TH0=0xFE;//定时器重装初值fosc=11.0592MHzTL0=0x7F;//定时器重装初值fosc=11.0592MHz//TH0=0xFD;//定时器重装初值fosc=18.432MHz//TL0=0x7F;//定时器重装初值fosc=18.432MHz}voidWByte(ucharinput){//发送启始位ucharj=8;TR0=1;newTXD=(bit)0;WaitTF0();//发送8位数据位while(j--){newTXD=(bit)(input&0x01);//先传低位WaitTF0();input=input>>1;}//发送校验位(无)//发送结束位newTXD=(bit)1;WaitTF0();TR0=0;}voidSendata(){for(i=0;i#include#includetypedefunsignedcharuchar;//这里用来切换晶振频率,支持11.0592MHz和18.432MHz//#defineF18_432#defineF11_0592uchartmpbuf2[64]={0};//用来作为模拟串口接收数据的缓存struct{ucharrecv:6;//tmpbuf2数组下标,用来将模拟串口接收到的数据存放到tmpbuf2中ucharsend:6;//tmpbuf2数组下标,用来将tmpbuf2中的数据发送到串口}tmpbuf2_point={0,0};sbitnewRXD=P3^2;//模拟串口的接收端设为P3.2voidUartInit(){SCON=0x50;//SCON:serailmode1,8-bitUARTTMOD|=0x21;//TMOD:timer1,mode2,8-bitreload,自动装载预置数(自动将TH1送到TL1);T0工作在方式1,十六位定时PCON|=0x80;//SMOD=1;#ifdefF11_0592TH1=0xE8;//Baud:2400fosc=11.0592MHz2400bps为从串口接收数据的速率TL1=0xE8;//计数器初始值,fosc=11.0592MHz因为TH1一直往TL1送,所以这个初值的意义不大TH0=0xFF;//定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bpsfosc=11.0592MHzTL0=0xA0;//定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bpsfosc=11.0592MHz#endif#ifdefF18_432TH1=0xD8;//Baud:2400fosc=18.432MHz2400bps为从串口接收数据的速率TL1=0xD8;//计数器初始值,fosc=18.432MHz因为TH1一直往TL1送,所以这个初值的意义不大TH0=0xFF;//定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bpsfosc=18.432MHzTL0=0x60;//定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bpsfosc=18.432MHz#endifIE|=0x81;//中断允许总控制位EA=1;使能...