模拟串口函数-适用于串口不够用场合
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//#define BAUD OxF400 //1200bps@11.0592MHz(1T) #define BAUD 0xFE90 //9600bps@11.0592MHz(1T) //#define BAUD OxFF00 //1200bps@11.0592MHz(12T)
file:///J|/资料/单片机开发/mnck_2_stc12/模拟串口函数-适用于串口不够用场合.txt[2013-09-20 12:41:19]
if(TING) //判别是否有发送标志 { if(nTBIT==0) //发送位计数为0发送起始位 { TXb_MN=0; //发起始位 TDAT=TSBUF_MN; //装载发送数 to TDAT nTBIT=9; //位计数初值为9 } else //非起始位 { TDAT>>=1; //移出1位 to CY if(--nTBIT==0) //9位发送完否 { TXb_MN=1; //发停止位 TING=0; //stop send TI_MN=1; //置字节已发送完标志 } else //9位未发完移出位由CY移到TXb引脚 { TXb_MN=CY; } } } } } /***************************模拟串口函数结束*********************************/ /********************主函数(需对T0初始化)************************/ void main() {
file:///J|/资料/单片机开发/mnck_2_stc12/模拟串口函数-适用于串口不够用场合.txt[2013-09-20 12:41:19]
//#define BAUD OxFFC0 //4800bps@11.0592MHz(12T) //#define BAUD OxFFE0 //9600bps@11.0592MHz(12T)
/**************************全局定义************************************/ #include "reg51.h"
/*定义波特率定时初值*/ /*BAUD=65536-SYSclk/3/baudrate/M(1T:M=1,12T:M=12)*/
sbit RXb_MN=P3^2; //define UART_MN TXD/RXD pin sbit TXb_MN=P3^3; sfr AUXR=0x8E;
#define uchar unsigned char #define uint unsigned int
uchar TSBUF_MN,RSBUF_MN; //模拟串口全局变量 bit TI_MN,RI_MN,WTSBUF_MN; /**************************************************************/ /***************************模拟串口函数*********************************/ /******************Timer interrupt routline for UART_MN******************/ void tm0() interrupt 1 using 1 { static uchar RbaudCNT,nRBIT,RDAT; static uchar TbaudCNT,nTBIT,TDAT; static bit RING,TING;
file:///J|/资料/单片机开发/mnck_2_stc12/模拟串口函数-适用于串口不够用场合.txt[2013-09-20 12:41:19]
TL0=BAUD; //重装TO定时初值(决定波特率的) TH0=BAUD>>8; /****接收处理程序****/ if(RING) //如果正在逐位接收中 { if(--RbaudCNT==0) //接收波特率计数,波特率周期时间到 { RbaudCNT=3; //reset send baudrate counter
file:///J|/资料/单片机开发/mnck_2_stc12/模拟串口函数-适用于串口不够用场合.txt[2013-09-20 12:41:19]
if(--nRBIT==0) //收完9位否 { RSBUF_MN=RDAT; //收到的1字节装载到RSBUF_MN中 RING=0; //清接正在接收标志 RI_MN=1; //置接收完字节标志 } else { RDAT>>=1; //移位接收1位 if(RXb_MN) RDAT|=0x80; } } } else if(!RXb_MN) //判别RXB_MN引脚是否收到起始位 { RING=1; //置接收标志 RbaudCNT=4; //置接收波特率计数器(起始位为4,中间位为3-三倍频) nRBIT=9; //接收位计数初值为9(1起始加8数据) } /****发送处理程序****/ if(WTSBUF_MN) //判别发送缓冲区是否写入要发送的数 { WTSBUF_MN=0; TING=1; nTBIT=0; } if(--TbaudCNT==0) //发送波特率计数(位周期到) { TbaudCNT=3; //reset send baudrate counter
/*************stc-1T单片机模拟串口程序*************/
/**功能:用T0定时中断模拟波特率周期实现模拟串口功能**/ /**适于STC1T系列单片机,波特率默认为9600晶振11.0592工作于1T模式 其它波特率或晶振需稍作修改***********************************/ /***********************程序接口:********************************* 发送缓冲单元- TSBUF_MN :要发送的数 接收缓冲单元- RSBUF_MN :收到的数 写发送单元标志- WTSBUF_MN :发送数写入TSBUF_MN后置1 发送完标志- TI_MN :发送完1帧后置1 收到数标志- RI_MN :收到1帧后,则装载RSBUF_MN后置1 *******************************************************************/ /***********************使用方法:********************************* **在主函数中要先对T0初始化,使能T0x12,定时时间为波特率周期的1/3,允许中断; **T0的中断服务函数即为模拟串口程序; **发送时先将发送数送TSBUF_MN,同时置位WTSBUF_MN标志,模拟串口便自动发送,发完置位TI_MN; **接收时先查询RI_MN是否为1,然后在RSBUF_MN中读取收到的数 *******************************************************************/ /***********作者:ltiaobao,2013.09***********/
file:///J|/资料/单片机开发/mnck_2_stc12/模拟串口函数-适用于串口不够用场合.txt[2013-09-20 12:41:19]
Hale Waihona Puke Baidu
TMOD=0x01; //set T0 to timer working at 16bit(mode1) AUXR=0x80; //T0x12=1,working at 1T mode TL0=BAUD; //定时时间1/3波特率周期 TH0=BAUD>>8; TR0=1; ET0=1; PT0=1; EA=1; while(1) {;} //加入其它应用程序 }
file:///J|/资料/单片机开发/mnck_2_stc12/模拟串口函数-适用于串口不够用场合.txt[2013-09-20 12:41:19]
if(TING) //判别是否有发送标志 { if(nTBIT==0) //发送位计数为0发送起始位 { TXb_MN=0; //发起始位 TDAT=TSBUF_MN; //装载发送数 to TDAT nTBIT=9; //位计数初值为9 } else //非起始位 { TDAT>>=1; //移出1位 to CY if(--nTBIT==0) //9位发送完否 { TXb_MN=1; //发停止位 TING=0; //stop send TI_MN=1; //置字节已发送完标志 } else //9位未发完移出位由CY移到TXb引脚 { TXb_MN=CY; } } } } } /***************************模拟串口函数结束*********************************/ /********************主函数(需对T0初始化)************************/ void main() {
file:///J|/资料/单片机开发/mnck_2_stc12/模拟串口函数-适用于串口不够用场合.txt[2013-09-20 12:41:19]
//#define BAUD OxFFC0 //4800bps@11.0592MHz(12T) //#define BAUD OxFFE0 //9600bps@11.0592MHz(12T)
/**************************全局定义************************************/ #include "reg51.h"
/*定义波特率定时初值*/ /*BAUD=65536-SYSclk/3/baudrate/M(1T:M=1,12T:M=12)*/
sbit RXb_MN=P3^2; //define UART_MN TXD/RXD pin sbit TXb_MN=P3^3; sfr AUXR=0x8E;
#define uchar unsigned char #define uint unsigned int
uchar TSBUF_MN,RSBUF_MN; //模拟串口全局变量 bit TI_MN,RI_MN,WTSBUF_MN; /**************************************************************/ /***************************模拟串口函数*********************************/ /******************Timer interrupt routline for UART_MN******************/ void tm0() interrupt 1 using 1 { static uchar RbaudCNT,nRBIT,RDAT; static uchar TbaudCNT,nTBIT,TDAT; static bit RING,TING;
file:///J|/资料/单片机开发/mnck_2_stc12/模拟串口函数-适用于串口不够用场合.txt[2013-09-20 12:41:19]
TL0=BAUD; //重装TO定时初值(决定波特率的) TH0=BAUD>>8; /****接收处理程序****/ if(RING) //如果正在逐位接收中 { if(--RbaudCNT==0) //接收波特率计数,波特率周期时间到 { RbaudCNT=3; //reset send baudrate counter
file:///J|/资料/单片机开发/mnck_2_stc12/模拟串口函数-适用于串口不够用场合.txt[2013-09-20 12:41:19]
if(--nRBIT==0) //收完9位否 { RSBUF_MN=RDAT; //收到的1字节装载到RSBUF_MN中 RING=0; //清接正在接收标志 RI_MN=1; //置接收完字节标志 } else { RDAT>>=1; //移位接收1位 if(RXb_MN) RDAT|=0x80; } } } else if(!RXb_MN) //判别RXB_MN引脚是否收到起始位 { RING=1; //置接收标志 RbaudCNT=4; //置接收波特率计数器(起始位为4,中间位为3-三倍频) nRBIT=9; //接收位计数初值为9(1起始加8数据) } /****发送处理程序****/ if(WTSBUF_MN) //判别发送缓冲区是否写入要发送的数 { WTSBUF_MN=0; TING=1; nTBIT=0; } if(--TbaudCNT==0) //发送波特率计数(位周期到) { TbaudCNT=3; //reset send baudrate counter
/*************stc-1T单片机模拟串口程序*************/
/**功能:用T0定时中断模拟波特率周期实现模拟串口功能**/ /**适于STC1T系列单片机,波特率默认为9600晶振11.0592工作于1T模式 其它波特率或晶振需稍作修改***********************************/ /***********************程序接口:********************************* 发送缓冲单元- TSBUF_MN :要发送的数 接收缓冲单元- RSBUF_MN :收到的数 写发送单元标志- WTSBUF_MN :发送数写入TSBUF_MN后置1 发送完标志- TI_MN :发送完1帧后置1 收到数标志- RI_MN :收到1帧后,则装载RSBUF_MN后置1 *******************************************************************/ /***********************使用方法:********************************* **在主函数中要先对T0初始化,使能T0x12,定时时间为波特率周期的1/3,允许中断; **T0的中断服务函数即为模拟串口程序; **发送时先将发送数送TSBUF_MN,同时置位WTSBUF_MN标志,模拟串口便自动发送,发完置位TI_MN; **接收时先查询RI_MN是否为1,然后在RSBUF_MN中读取收到的数 *******************************************************************/ /***********作者:ltiaobao,2013.09***********/
file:///J|/资料/单片机开发/mnck_2_stc12/模拟串口函数-适用于串口不够用场合.txt[2013-09-20 12:41:19]
Hale Waihona Puke Baidu
TMOD=0x01; //set T0 to timer working at 16bit(mode1) AUXR=0x80; //T0x12=1,working at 1T mode TL0=BAUD; //定时时间1/3波特率周期 TH0=BAUD>>8; TR0=1; ET0=1; PT0=1; EA=1; while(1) {;} //加入其它应用程序 }