单片机IO口模拟串口程序(发送+接收).doc
- 文档编号:2490053
- 上传时间:2022-10-30
- 格式:DOC
- 页数:9
- 大小:52.50KB
单片机IO口模拟串口程序(发送+接收).doc
《单片机IO口模拟串口程序(发送+接收).doc》由会员分享,可在线阅读,更多相关《单片机IO口模拟串口程序(发送+接收).doc(9页珍藏版)》请在冰豆网上搜索。
前一阵一直在做单片机的程序,由于串口不够,需要用IO口来模拟出一个串口。
经过若干曲折并参考了一些现有的资料,基本上完成了。
现在将完整的测试程序,以及其中一些需要总结的部分贴出来。
程序硬件平台:
11.0592M晶振,STC单片机(兼容51)
/***************************************************************
*在单片机上模拟了一个串口,使用P2.1作为发送端
*把单片机中存放的数据通过P2.1作为串口TXD发送出去
***************************************************************/
#include
#include
#include
typedefunsignedcharuchar;
inti;
ucharcodeinfo[]=
{
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;//定时器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.0592MHz
TL0=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 { WByte(info[i]); } } voidmain() { UartInit(); while (1) { Sendata(); } } ############################################################################## /*************************************************************** *模拟接收程序,这个程序的作用从模拟串口接收数据,然后将这些数据发送到实际串口 *在单片机上模拟了一个串口,使用P3.2作为发送和接收端 *以P3.2模拟串口接收端,从模拟串口接收数据发至串口 ***************************************************************/ #include #include #include typedefunsignedcharuchar; //这里用来切换晶振频率,支持11.0592MHz和18.432MHz //#defineF18_432 #defineF11_0592 uchartmpbuf2[64]={0}; //用来作为模拟串口接收数据的缓存 struct { ucharrecv: 6;//tmpbuf2数组下标,用来将模拟串口接收到的数据存放到tmpbuf2中 ucharsend: 6;//tmpbuf2数组下标,用来将tmpbuf2中的数据发送到串口 }tmpbuf2_point={0,0}; sbitnewRXD=P3^2;//模拟串口的接收端设为P3.2 voidUartInit() { SCON=0x50;//SCON: serailmode1,8-bitUART 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;//定时器0初始值,延时208us,目的是令模拟串口的波特率为9600bpsfosc=11.0592MHz #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;//定时器0初始值,延时104us,目的是令模拟串口的波特率为9600bpsfosc=18.432MHz #endif IE|=0x81;//中断允许总控制位EA=1;使能外部中断0 TF0=0; IT0=1;//设置外部中断0为边沿触发方式 TR1=1;//启动TIMER1,用于产生波特率 } voidWaitTF0(void) { while(! TF0); TF0=0; #ifdefF11_0592 TH0=0xFF;//定时器重装初值模拟串口的波特率为9600bpsfosc=11.0592MHz TL0=0xA0;//定时器重装初值模拟串口的波特率为9600bpsfosc=11.0592MHz #endif #ifdefF18_432 TH0=0xFF; //定时器重装初值fosc=18.432MHz TL0=0x60; //定时器重装初值fosc=18.432MHz #endif } //接收一个字符 ucharRByte() { ucharOutput=0; uchari=8; TR0=1;//启动Timer0 #ifdefF11_0592 TH0=0xFF;//定时器重装初值模拟串口的波特率为9600bpsfosc=11.0592MHz TL0=0xA0;//定时器重装初值模拟串口的波特率为9600bpsfosc=11.0592MHz #endif #ifdefF18_432 TH0=0xFF;//定时器重装初值fosc=18.432MHz TL0=0x60;//定时器重装初值fosc=18.432MHz #endif TF0=0; WaitTF0();//等过起始位 //接收8位数据位 while(i--) { Output>>=1; if(newRXD)Output|=0x80;//先收低位 WaitTF0();//位间延时 } TR0=0;//停止Timer0 returnOutput; } //向COM1发送一个字符 voidSendChar(ucharbyteToSend) { SBUF=byteToSend; while(! TI); TI=0; } voidmain() { UartInit(); while (1) { 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;//防止外部中断
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 IO 模拟 串口 程序 发送 接收
