单片机IO口模拟串口程序(发送+接收)Word文档下载推荐.doc
《单片机IO口模拟串口程序(发送+接收)Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《单片机IO口模拟串口程序(发送+接收)Word文档下载推荐.doc(9页珍藏版)》请在冰豆网上搜索。
0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55
};
sbitnewTXD=P2^1;
//模拟串口的发送端设为P2.1
voidUartInit()
SCON=0x50;
//SCON:
serailmode1,8-bitUART
TMOD|=0x21;
//T0工作在方式1,十六位定时
PCON|=0x80;
//SMOD=1;
TH0=0xFE;
//定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bpsfosc=11.0592MHz
TL0=0x7F;
//TH0=0xFD;
//定时器0初始值,延时417us,目的是令模拟串口的波特率为2400bpsfosc=18.432MHz
//TL0=0x7F;
}
voidWaitTF0(void)
while(!
TF0);
TF0=0;
TH0=0xFE;
//定时器重装初值fosc=11.0592MHz
TL0=0x7F;
//TH0=0xFD;
//定时器重装初值fosc=18.432MHz
//TL0=0x7F;
voidWByte(ucharinput)
//发送启始位
ucharj=8;
TR0=1;
newTXD=(bit)0;
WaitTF0();
//发送8位数据位
while(j--)
{
newTXD=(bit)(input&
0x01);
//先传低位
WaitTF0();
input=input>
>
1;
}
//发送校验位(无)
//发送结束位
newTXD=(bit)1;
TR0=0;
}
voidSendata()
for(i=0;
i<
sizeof(info);
i++)//外层循环,遍历数组
WByte(info[i]);
voidmain()
UartInit();
while
(1)
Sendata();
##############################################################################
*模拟接收程序,这个程序的作用从模拟串口接收数据,然后将这些数据发送到实际串口
*在单片机上模拟了一个串口,使用P3.2作为发送和接收端
*以P3.2模拟串口接收端,从模拟串口接收数据发至串口
#include<
typedefunsignedcharuchar;
//这里用来切换晶振频率,支持11.0592MHz和18.432MHz
//#defineF18_432
#defineF11_0592
uchartmpbuf2[64]={0};
//用来作为模拟串口接收数据的缓存
struct
ucharrecv:
6;
//tmpbuf2数组下标,用来将模拟串口接收到的数据存放到tmpbuf2中
ucharsend:
//tmpbuf2数组下标,用来将tmpbuf2中的数据发送到串口
}tmpbuf2_point={0,0};
sbitnewRXD=P3^2;
//模拟串口的接收端设为P3.2
SCON=0x50;
//SCON:
TMOD|=0x21;
//TMOD:
timer1,mode2,8-bitreload,自动装载预置数(自动将TH1送到TL1);
T0工作在方式1,十六位定时
PCON|=0x80;
//SMOD=1;
#ifdefF11_0592
TH1=0xE8;
//Baud:
2400fosc=11.0592MHz2400bps为从串口接收数据的速率
TL1=0xE8;
//计数器初始值,fosc=11.0592MHz因为TH1一直往TL1送,所以这个初值的意义不大
TH0=0xFF;
//定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bpsfosc=11.0592MHz
TL0=0xA0;
#endif
#ifdefF18_432
TH1=0xD8;
//Baud:
2400fosc=18.432MHz2400bps为从串口接收数据的速率
TL1=0xD8;
//计数器初始值,fosc=18.432MHz因为TH1一直往TL1送,所以这个初值的意义不大
TH0=0xFF;
//定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bpsfosc=18.432MHz
TL0=0x60;
IE|=0x81;
//中断允许总控制位EA=1;
使能外部中断0
TF0=0;
IT0=1;
//设置外部中断0为边沿触发方式
TR1=1;
//启动TIMER1,用于产生波特率
//定时器重装初值模拟串口的波特率为9600bpsfosc=11.0592MHz
TL0=0xA0;
#endif
TL0=0x60;
//接收一个字符
ucharRByte()
ucharOutput=0;
uchari=8;
TR0=1;
//启动Timer0
//定时器重装初值fosc=18.432MHz
//等过起始位
//接收8位数据位
while(i--)
Output>
=1;
if(newRXD)Output|=0x80;
//先收低位
WaitTF0();
//位间延时
TR0=0;
//停止Timer0
returnOutput;
//向COM1发送一个字符
voidSendChar(ucharbyteToSend)
SBUF=byteToSend;
TI);
TI=0;
if(tmpbuf2_point.recv!
=tmpbuf2_point.send)//差值表示模拟串口接收数据缓存中还有多少个字节的数据未被处理(发送至串口)
{
SendChar(tmpbuf2[tmpbuf2_point.send++]);
}
//外部中断0,说明模拟串口的起始位到来了
voidSimulated_Serial_Start()interrupt0
EX0=0;
//屏蔽外部中断0
tmpbuf2[tmpbuf2_point.recv++]=RByte();
//从模拟串口读取数据,存放到tmpbuf2数组中
IE0=0;
//防止外部中断