版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、高速单片机的多串口扩展摘要:本文利用高速单片机的特性,讨论用软件实现多串口扩展的方法。并以STC12C5410AD单片机为例,用软件扩展了两个全双工的串口,程序实现三个串口(波特率可独立设置的相互转发。同时分析了软件实现扩展串口的波特率误差等性能指标。随着芯片设计的发展,单片机的性能得到飞速提高,性价比越来越高。在低价格的单片机中,出现了各种高速单片机。在传统的51系列单片机中,机器周期是时钟周期的12倍,而在高速单片机中,机器周期等于时钟周期。指令与传统的51系列单片机兼容,指令执行周期是传统的51系列单片机的812倍。利用高速单片机的这种特性,结合PCA可编程计数器阵列,可以用软件实现多串
2、口扩展。一.用软件实现串口的原理在异步串行通讯中,数据以字符为单位组成字符帧进行传送。字符帧一般总是以逻辑0作为起始位开始,接着是从低到高的数据位,然后是可选的效验位,最后以逻辑1作为结束位。字符帧的每一位都是按照波特率指定的时间长度来发送和接收的。利用单片机内部PCA 可编程计数器,可以按照波特率指定的时间长度,利用软件来逐位完成异步传行通讯的收发。实现数据发送比较简单,将一路PCA模块设置为定时器,按照波特率指定的位时间间隔产生中断,并在中断中逐位输出字符帧就可以了。实现数据接收相对要复杂一些,先将一路PCA模块启始设置为下降沿触发捕获方式,当串行数据启始位的下降沿到来时,中断触发PCA模
3、块捕获当前计数值(起始时刻。同时,设置PCA模块为定时器,并将捕获的时刻加1.4个位的时间。这样,在下数据位到来时(数据位的接近中间时刻,PCA模块定时器正好会产生中断,此时判断接收串行数据。之后将PCA模块定时值每次加1个位的时间,当字符帧的所有数据位接收完毕后,设置PCA模块为下降沿触发捕获方式,等待下一字符帧的到来。二.多串口扩展的程序分析以STC12C5410AD高速单片机为例,用软件实现多串口扩展。STC12C5410AD是1T机器周期的高速单片机,工作频率可达35MHz,具备10K片内FLASH程序存储器,512字节片内RAM数据存储器和2K片内FLASH数据存储器。片上功能强大,
4、包含23个四种模式可配置的I/O口和8通道10位ADC以及硬件看门狗等。另外,片内有4通道PCA单元,可以灵活编程,实现定时器、计数器、PWM调制器、外部中断等等。本文的程序中利用4通道PCA单元的2个单元作一路串口的数据接受和发送,另2个单元作另一路串口的数据接受和发送,这样单片机就具备了3个全双工串口,并且各串口的波特率是可以独立设置的。串口扩展的程序实现包含以下几部分:1.计算和确立时间常数首先确定单片机的时钟频率:采用14.7456MHz晶体振荡器,这样能够比较准确得产生常用的波特率。#define CON_OSC 14745600 /* 振荡频率(1T超高速外部14.7456MHz
5、*/ STC12C5410AD普通标准的串口可以利用定时器T1作为波特率发生器,T1的时钟可以与普通的51单片机兼容(系统时钟12分频,也可以采用单时钟周期(可以获得更高的波特率。标准串口设置为波特率不加倍的9600BPS(采用单时钟周期。#define U0_BPS 256 - (CON_OSC/1/32/9600 /* 9600BPS时间常数(T1x12=1 */ STC12C5410AD的PCA可编程计数器阵列时钟也是可选择的,我们采用系统时钟的12分频就可以了。扩展串口1设置为9600波特率,扩展串口2设置为4800波特率。#define U1_BPS1 CON_OSC/12/9600
6、 /* 9600BPS的1bit时间*/#define U1_BPS2 CON_OSC*7/60/9600 /* 9600BPS的1.4bit时间*/#define U2_BPS1 CON_OSC/12/4800 /* 4800BPS的1bit时间*/#define U2_BPS2 CON_OSC*7/60/4800 /* 4800BPS的1.4bit时间*/2.定义变量扩展串口1用PCA0作数据接收PCA1作数据发送,扩展串口2用PCA2作数据接收PCA3作数据发送。sbit P_U1R = P37; /* UART1数据接收端口*/sbit P_U1T = P35; /* UART1数据发
7、送端口*/sbit P_U2R = P20; /* UART2数据接收端口*/sbit P_U2T = P24; /* UART2数据发送端口*/在全双工的方式下,串口的数据接收和数据发送必须定义有独立的数据缓冲和数据标志:bit u1r_f=0; /* UART1接收标志*/uchar u1r_c; /* UART1接收数据*/bit u1t_f=0; /* UART1发送标志*/uchar u1t_c; /* UART1发送数据*/bit u2r_f=0; /* UART2接收标志*/uchar u2r_c; /* UART2接收数据*/bit u2t_f=0; /* UART2发送标志*
8、/uchar u2t_c; /* UART2发送数据*/由于是用软件实现串口通讯,还需定义在程序使用的临时变量: union ut_i2c ccap_hl; /* PCA计算使用*/uchar u1r_n; /* UART1接收位数*/uchar u1r_t; /* UART1接收暂存*/bit u1t_b=0; /* UART1发送开始标志*/uchar u1t_n; /* UART1发送位数*/uchar u1t_t; /* UART1发送暂存*/uchar u2r_n; /* UART2接收位数*/uchar u2r_t; /* UART2接收暂存*/bit u2t_b=0; /* UA
9、RT2发送开始标志*/uchar u2t_n; /* UART2发送位数*/uchar u2t_t; /* UART2发送暂存*/3.初始化在初始化程序中,除了对普通UART初始设置外,还要完成对PCA可编程计数器阵列的设置:AUXR=0x40; /* T1x12=1:T1时钟源采用单时钟周期(是传统51单片机的12倍 */ PCON=0x00; /* 波特率不加倍*/TMOD=0x25; /* 置定时器1工作方式2,计数器0工作方式1 */SCON=0x50; /* 置串口工作方式1(T1用作串口波特率发生 */TH1=U0_BPS; /* 波特率时间常数*/TL1=U0_BPS;TR1=1
10、; /* 启动定时器1 */CMOD=0x81; /* PCA时钟源1/12f,PCA溢出中断使能*/CCAPM0 = 0x11; /* PCA0用作UART1接收:16位捕获模式,CEXn下降沿触发*/ CCAPM1 = 0x49; /* PCA1用作UART1发送:16位软件定时器*/CCAPM2 = 0x11; /* PCA2用作UART2接收:16位捕获模式,CEXn下降沿触发*/ CCAPM3 = 0x49; /* PCA3用作UART2发送:16位软件定时器*/EPCA_LVD=1; /* 开EPCA_LVD中断*/CCON=0x40; /* PCA启动运行*/4.中断处理程序设计
11、:对于数据发送,以UART1为例,程序及说明如下:if(CCF1 /* 如果是PCA1中断(UART1数据发送 */ CCF1=0; /* 清中断标志*/if(u1t_f /* 如果要发送数据*/ if(u1t_b=0/* 还没有开始发送*/ P_U1T=0; /* 起始位为0 */u1t_t=u1t_c; /* 要发送的数据*/u1t_n=10; /* 共10个位*/u1t_b=1; /* 设置已经开始发送标志*/else /* 已经开始发送*/ u1t_n-; /* 剩余位数减1 */if(u1t_n>1 /* 是数据位*/ if(u1t_t&0x01 P_U1T=1; /*
12、 当前数据位是1 */else P_U1T=0; /* 当前数据位是0 */u1t_t>>=1; /* 传口数据是低位先的:数据右移*/else P_U1T=1; /* 终止位1 */if(u1t_n=0 /* 发送完毕*/ u1t_b=0; /* 清已经开始发送标志*/u1t_f=0; /* 发送完毕,清发送标志*/CCAPM1=0; /* 先暂停PCA0 */ccap_hl.c0=CCAP1H; /* 本次定时值*/ccap_hl.c1=CCAP1L;ccap_hl.i += U1_BPS1; /* 加1个位时间发送下1位*/CCAP1L = ccap_hl.c1; /* 下次
13、定时值*/CCAP1H = ccap_hl.c0;CCAPM1 = 0x49; /* PCA1用作发送:16位软件定时器*/对于数据接收,以UART1为例,程序及说明如下:if(CCF0 /* 如果是PCA0中断(UART1数据接收 */ CCF0=0; /* 清中断标志*/if(CCAPM0=0x11 /* 如果PCA0是捕获模式:下降沿数据接收开始*/ CCAPM0=0; /* 先暂停PCA0 */ccap_hl.c0=CCAP0H; /* 捕获值*/ccap_hl.c1=CCAP0L;ccap_hl.i += CON_BPS2; /* 加1.4个位时间开始接收*/CCAP0L = cca
14、p_hl.c1; /* 作为定时值*/CCAP0H = ccap_hl.c0;CCAPM0=0x49; /* PCA0用作数据接收:16位软件定时器*/u1r_n=9; /* 接收8个数据位和1个停止位*/else /* PCA0是定时器模式:已经开始接收数据*/ u1r_n-; /* 剩余位数减1 */if(u1r_n /* 是数据位*/ u1r_t>>=1; /* 传口数据是低位先的:数据右移*/if(P_U1R u1r_t |= 0x80; /* 当前数据位是1 */else u1r_t &= 0x7f; /* 当前数据位是0 */CCAPM0=0; /* 先暂停PC
15、A0 */ccap_hl.c0=CCAP0H; /* 本次定时值*/ccap_hl.c1=CCAP0L;ccap_hl.i += CON_BPS1; /* 加1个位时间接收下1位*/CCAP0L = ccap_hl.c1; /* 下次定时值*/CCAP0H = ccap_hl.c0;CCAPM0=0x49; /* PCA0用作接收:16位软件定时器*/else /* 是停止位*/ u1r_c=u1r_t; /* 接收到的数据存入接收缓冲区*/u1r_f=1; /* 接收到数据标志*/CCAPM0 = 0x11; /* 恢复PCA0用作接收:16位捕获模式,CEXn下降沿触发,开中断*/5.扩展
16、串口的使用,演示程序:演示程序为每个串口设置独立的数据缓冲区和数据启始、终止指针,模拟32字节的FIFO缓冲:uchar xdata buf032;uchar xdata buf132;uchar xdata buf232;uchar tit0=0;uchar end0=0;uchar tit1=0;uchar end1=0;uchar tit2=0;uchar end2=0;程序实现在三个串口之间的数据互通,即:每个串口收到的数据都同时转发到另两个串口:while(1 if(end0!=tit0&&TI /* UART0发送缓冲有数据*/ SBUF=buf0end0; /*
17、UART0发送数据*/TI=0; /* UART0数据发送标志*/end0+; /* UART0数据FIFO止指针加1 */end0&=0x1f; /* FIFO缓冲最大32字节*/if(end1!=tit1&&(u1t_f=0 /* UART1发送缓冲有数据*/ u1t_c=buf1end1; /* UART1发送数据*/u1t_f=1; /* 置UART1数据发送标志*/end1+; /* UART1数据FIFO止指针加1 */end1&=0x1f; /* FIFO缓冲最大32字节*/if(end2!=tit2&&(u2t_f=0 /* UA
18、RT2发送缓冲有数据*/ u2t_c=buf2end2; /* UART2发送数据*/u2t_f=1; /* 置UART2数据发送标志*/end2+; /* UART2数据FIFO止指针加1 */end2&=0x1f; /* FIFO缓冲最大32字节*/if(RI /* UART0收到数据*/ buf1tit1=SBUF; /* 存入UART1的发送缓冲*/buf2tit2=buf1tit1; /* 存入UART2的发送缓冲*/tit1+; /* UART1数据FIFO起指针加1 */tit1&=0x1f; /* FIFO缓冲最大32字节*/tit2+; /* UART2数据F
19、IFO起指针加1 */tit2&=0x1f; /* FIFO缓冲最大32字节*/RI=0; /* 清 UART0 数据接收标志 */ if(u1r_f /* UART1 收到数据 */ buf0tit0=u1r_c; /* 存入 UART0 的发送缓冲 */ buf2tit2=u1r_c; /* 存入 UART2 的发送缓冲 */ tit0+; /* UART0 数据 FIFO 起指针加 1 */ tit0&=0x1f; /* FIFO 缓冲最大 32 字节 */ tit2+; /* UART2 数据 FIFO 起指针加 1 */ tit2&=0x1f; /* FIFO 缓冲最大 32 字节 */ u1r_f=0; /* 清 UART1 数据接收标志 */ if(u2r_f /* UART2 收到数据 */ buf0tit0=u2r_c; /* 存入 UART0 的发送缓冲 */ buf1tit1=u2r_c; /* 存入 UART1 的发送缓冲 */ tit0+; /* UART0 数据 FIFO 起指针加 1 */ tit0&=0x1f; /* FIFO 缓冲最大 32 字节 */ tit1+; /* UART1 数据 FIFO 起指针加 1 */ tit1&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年中国水家电行业竞争力策略及投资前景展望报告版
- 人教版四年级上册数学第一单元《大数的认识》测试卷及参考答案1套
- 2022年大学工程力学专业大学物理二期末考试试卷B卷-附解析
- 2022年大学物理学专业大学物理下册开学考试试卷B卷-附解析
- 公司年会小品剧本一个女人和三个男人的故事
- 2022年大学水产专业大学物理下册开学考试试卷C卷-附解析
- 2022年大学环境与安全专业大学物理二期末考试试题B卷-附解析
- 2022年大学化工与制药专业大学物理二期末考试试题A卷-附解析
- 2022年大学农业工程专业大学物理二期中考试试卷D卷-附解析
- 高速公路沿线环境卫生清扫管理制度
- 八年级生物中考备考计划
- 2024-2030年全球及中国湿巾和卫生纸行业市场现状供需分析及市场深度研究发展前景及规划可行性分析研究报告
- 公务员2019年国考《申论》真题及答案(省级)
- 2024年会计专业考试初级会计实务试卷与参考答案
- 职业技术学院材料工程技术专业调研报告
- 五年级阅读《概括题专项训练》
- 2024-2030年中国辐照加速器行业运营态势及未来前景预测研究报告
- 2024年上海市中考政治真题含解析
- 2024年中国铁路南宁局集团限公司招聘81人高频难、易错点500题模拟试题附带答案详解
- 浙江省金华市兰溪市2023-2024学年五年级上学期期中数学试卷
- 药店挂名负责人免责协议书
评论
0/150
提交评论