请高人帮忙指点,小弟胜感激
/****************《51单片机轻松入门-基于STC15W4K系列》配套例程 *************
/* 任意I/O口模拟串口,22.1184MHZ, 内部R/C时钟,9600bps */
#include "STC15W4K.H" // 包含 "STC15W4K.H"寄存器定义头文件
#define RECEIVE_MAX_BYTES 1 // 最大接收字节数
unsigned char RecvBuf[16]; // 接收数据缓冲区
unsigned char RecvCount=0; // 接收数据计数器
sbit T_TXD=P3^2; // 发送数据的引脚
sbit R_RXD=P3^3; // 接收数据的引脚
bit RXD_OK; // 数据接收完成标志,1(接收正确),0(接收错误)
//******************************************/
void delay104uS()
{
unsigned char i,j,k;
for(i=1;i>0;i--) // 注意后面没分号
for(j=3;j>0;j--) // 注意后面没分号
for(k=189;k>0;k--); // 注意后面有分号
}
void delay52uS() // 起始位结束后52uS采样数据
{
unsigned char i,j,k;
for(i=1;i>0;i--) // 注意后面没分号
for(j=3;j>0;j--) // 注意后面没分号
for(k=93;k>0;k--); // 注意后面有分号
}
void SendByte(unsigned char Dat)
{
unsignedchar i=8; // 发送8 位数据
T_TXD=0; // 发送起始位
delay104uS();
while(i--)
{
if(Dat&1)T_TXD=1;
elseT_TXD=0;
delay104uS();
Dat>>=1;
}
T_TXD=1; // 发送停止位
delay104uS(); // 延时
}
unsigned char RecvByte()
{
unsignedchar i;
unsignedchar Dat=0; // 接收到的数据
RXD_OK=0; // 字节数据接收正常标志,0——错误,1——正常
delay52uS(); // 数据位中心位置读数据
if(R_RXD==0) // 确认起始位正常
{
delay104uS(); // 起始位宽度
for(i=0;i<8;i++)
{
if(R_RXD) Dat|=(1<<i); /这一句不懂,求高人讲解。
delay104uS();
}
if(R_RXD==1) // 确认停止位正常
{
RXD_OK=1;
}
}
returnDat;
}
//功能:串口打印字符串
//*****************************************/
void PrintfStr(char * pstr)
{
while(*pstr)
{
SendByte(*pstr++);
}
}
//功能:函数主体
//******************************************/
void main(void)
{
unsignedchar i;
PrintfStr("模拟串口:STC15\r\n");
while(1)
{
if(R_RXD==0) // 死循环不断检测R_RXD是否有起始位出现
{
RecvBuf[RecvCount]=RecvByte();
if(RXD_OK==1) // 一个字节接收正常
{
RecvCount++;
if(RecvCount>=RECEIVE_MAX_BYTES)
{
RecvCount=0;
for(i=0;i<RECEIVE_MAX_BYTES;i++)
{
SendByte(RecvBuf[ i]+1); // 接收到得数据+1后发回
}
}
}
}
}
}
|