請高人幫忙指點,小弟勝感激
/****************《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后發回
}
}
}
}
}
}
|