以下内容来源于《51单片机轻松入门——基于STC15W4K系列》 例4.8 任意IO口模拟串口,22.1184MHz内部R/C时钟,波特率115200bps,每bit 位传送时间按通信速率115200 bit /s计算为1/115200=8.68μS。 #include"STC15W4K.H" // 包含"STC15W4K.H"寄存器定义头文件 #define RECEIVE_MAX_BYTES 1 //最大接收字节数 unsigned charRecvBuf[16]; // 接收数据缓冲区 unsigned charRecvCount=0; // 接收数据计数器 sbit T_TXD=P3^2; // 发送数据的引脚 sbit R_RXD=P3^3; // 接收数据的引脚 unsigned char bdata dat; // dat是可位寻址的变量 sbit dat7=dat^7;sbitdat6=dat^6;sbit dat5=dat^5;sbit dat4=dat^4; sbit dat3=dat^3;sbitdat2=dat^2;sbit dat1=dat^1;sbit dat0=dat^0; // 取出dat的各个位 void delay8_6uS() // 8.6uS延时函数 { unsigned char t=46; while(--t); } void delay2_6uS() // 理论计算值4.3uS实际出现数据出错现象,根据调试结果确定为2.6uS { unsignedchar t=12; while(--t); } void SendByte(unsigned charDat) { dat= Dat; T_TXD=0; delay8_6uS(); // 发送起始位 T_TXD=dat0; delay8_6uS(); //数据最低位 T_TXD=dat1; delay8_6uS(); T_TXD=dat2; delay8_6uS(); T_TXD=dat3; delay8_6uS(); T_TXD=dat4; delay8_6uS(); T_TXD=dat5; delay8_6uS(); T_TXD=dat6; delay8_6uS(); T_TXD=dat7; delay8_6uS(); // 数据最高位 T_TXD=1; delay8_6uS(); // 发送停止位 } unsigned char RecvByte() { unsigned char RXD_OK=0; // 数据接收完成标志 delay2_6uS(); // 起始位中心位置 if(R_RXD==0) // 确认起始位正常 { delay8_6uS();dat0=R_RXD; // 数据最低位,数据位中心位置读数据 delay8_6uS();dat1=R_RXD; delay8_6uS();dat2=R_RXD; delay8_6uS();dat3=R_RXD; delay8_6uS();dat4=R_RXD; delay8_6uS();dat5=R_RXD; delay8_6uS();dat6=R_RXD; delay8_6uS();dat7=R_RXD; // 数据最高位 delay8_6uS(); // 停止位 if(R_RXD==1) // 确认停止位正常 { RXD_OK=1; } } return RXD_OK; } void PrintfStr(char * pstr) // 串口打印字符串 { while(*pstr) { SendByte(*pstr++); } } void main(void) { unsigned char i; PrintfStr("模拟串口:STC15\r\n"); while(1) { if(R_RXD==0) // 死循环不断检测R_RXD是否有起始位出现 { if (RecvByte()!=0) // 一个字节接收正常 { RecvBuf[RecvCount++]=dat; if(RecvCount>=RECEIVE_MAX_BYTES) { RecvCount=0; for(i=0;i<RECEIVE_MAX_BYTES;i++) { SendByte(RecvBuf+1); // 接收到得数据+1后发回 } } } } } }
|