




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机与计算机串行通信实验心得 单片机应用电子报/xx?/02月/20日/第011版/单片机与计算机?通信实验心得北京赵宁?很多单片机教材?提到了单片机和计算机?口通信的硬件和软件设计,给出了如图1所示的最简单的三线连接电?和BIOS INT14H的应用。 笔者按照教材所述的方法进?了实验,但未成功。 通过实验,发现在简单的三线连接电?中,INT14H?能用来通信,无法发送和接收。 下面详细给出笔者采用的能实现通信的方法,供参考。 一、计算机?口编程PC/XT计算机?口的核心是通用异步接收/发送器8250。 附表是计算机?口的系统地址和8250内部寄存器的对应关系。 DLAB(除数寄存器访问控制位)是通信线控制寄存器的D7位,当该位为1时,对地址3F8H(2F8H)、3F9H(2F9H)的读写是针对除数寄存器的,在此用途之外应使该位置0;接收缓冲器和发送保持寄存器的地址相同,由读写信号区分。 寄存器可以分为3类。 发送保持寄存器和接收缓冲器用于暂存待发送数据或接收到的数据;通信线控制寄存器、除数寄存器、MODEM控制寄存器、中断允许寄存器用于设置和控制?口;通信线状态寄存器、MODEM状态寄存器、中断识别寄存器用来反映?口当前的状态。 有关寄存器的设置,请读者查阅相关资?。 8250的初始化编程步骤如下:1.将80H送通信线控制寄存器3FB(2FBH),使DLAB=1。 2.将分频系数送入除数寄存器,确定波特率3F9H(2F9H)、3F8H(2F8H)。 3.把D7=0的命令字送入通信线控制寄存器,确定一帧数据格式。 4.将中断允许命令字送中断允许寄存器3F9H(2F9H)。 查询方式时为0H。 5.设置MODEM控制寄存器3FCH(2FCH),查询方式时D3=0,中断方式时D3=1,以允许8250送出中断请求。 正常收发时应使D4=0,内环自检时使D4=1。 二、INT14H功能调用INT14H功能调用的子功能如下:功能号00H为初始化?口;功能号01H为向?口写数据;功能号02H为从?口读数据;功能号03H为读取?口状态。 在C语言中,可以使用int86()等函数设置寄存器变?后,直接使用上述功能调用,但最简单的方法是用bios()函数,它的函数说明是int bios(int cmd,charabyte,int port)。 其中,cmd是子功能号,abyte是初始化参数或待发送的字符,port是?口号。 Cmd取 0、 1、 2、3时,bios()的功能分别和INT14H的00H、01H、02H、03H子功能对应。 无论cmd取何值,返回值的高8位对应INT14H出口参数中的AH,低8位对应AL。 当cmd=0时,abyte为初始化参数;当cmd=1时,abyte是待发送数据;当cmd=2时,返回值的低8位是所接收到的数据;当cmd取1或2时,返回值的最高位为0,表示成功,否则失败;当cmd=3时,返回值为?口状态,高8位为通信线状态,低8位为MODEM状态。 三、单片机的?通信实验下面给出笔者实验时编写的单片机?通信源程序:org00hjmp mainorg23h;?中断入口地址jmp _int;?中断服务程序org30hmain:mov sp,#30h;设置堆栈lcall m;?口初始化jmp$;原地等待m:mov tmod,#20h;T1方式2mov tl1,#0f3h;定时器计数初值,波特率2400mov th1,#0f3h;定时器重装值setb ea;开总中断setb es;开?中断mov pcon,#00h;波特率?倍增mov scon,#50h;置?口工作方式1,REN=1允许接收setb tr1;定时器ret;返回_int:clr es;关?中断clr ri;清接收标志mov a,sbuf;从缓冲区取数据mov sbuf,ajnb ti,$;等待发送完毕clrti;清发送标志setb es;允许?中断reti;中断返回end该程序将MCU的?口初始化为2400bps的波特率,然后等待中断。 中断服务程序的功能是将所接收的数据发给计算机。 笔者最初用C语言编写的通信程序如下:#include?dos.h?#include?bios.h?main0int i;bios(0,0xa3,0);for(i=0;i256;i+)bios(1,i,0);printf(?%c?,i);while(!(bios(3,0,0)&0x0100);printf(?_%c?,bios(2,0,0)&0x00ff);printf(?n?);getch0;该程序无法实现与单片机的?口通信,用int86函数直接调用14H功能调用也?,所以笔者剖析了bios函数的执?过程,发现了问题所在。 笔者用图1所示的连接线将计算机的1和2连接起来,具体如图2所示,然后执?下列程序对bios函数的1号发送功能进?测试。 #include?dos.h?#include?bios.h?#define 3main()outportb(0x3fc,0);outportb(0x2fc,0);bios(0,0xa3,0);bios(0,0xa3,1);outportb(0x2fc,);printf(?%X?,bios(1,65,0)&0x8000);printf(?n?);getch();1和2初始化后,将2的MODEM控制寄存器(2FCH)的D 0、D1位置1,使2的DTR、RTS有效,从而使1的DSR、CTS有效。 程序显示的结果是0,说明发送正确。 通过改变程序中宏定义的值,可以改变1的DSR、CTS信号有效的组合。 结果表明,只有=3时,即DSR和CTS都有效时,bios才能发送成功。 当取 1、2或0,即DSR、CTS分别有效或全无效时,程序显示8000,表明发送失败。 利用下列程序段对bios的接收功能进?测试:#include?dos.h?#include?bios.h?#define1main()int a;outportb(0x3fc,0);outportb(0x2fc,0);bios(0,0xa3,0);bios(0,0xa3,1);outportb(0x3fc,);outportb(0x3f8,65);delay (10000);a=bios(2,0,1);printf(?%X,%c?,a&0x8000,a&0x00ff);printf(?n?);getch();可以得出如下结论:当cmd=0时,bios函数对?口初始化,写通信线控制寄存器和除数寄存器,设置数据帧格式和波特率,并写中断允许寄存器,清除所有中断允许位,?口读写只能工作于程序查询方式,但?写MODEM控制寄存器;当cmd=1时,bios函数发送数据,改写MODEM控制寄存器,使DTR、RTS信号有效,并查询MODEM状态寄存器,等待DSR、CTS两个回答信号,只有在一定延时内,两个回答信号都有效才发送成功;当cmd=2时,bios函数接收数据,改写MODEM控制寄存器使DTR有效,并查询MODEM状态寄存器,等待DSR回答信号,同样需在一定延时内得到回答否则接收失败;当cmd=3时,bios函数读取通信线状态寄存器和MODEM状态寄存器,并返回。 ?清了bios函数的执?过程,就可以用图3所示的连接进?通信,使?口的DTR和DSR短接,RTS和CTS短接,这样,只要bios使DTR、RTS有效,?可得到所需的回答信号。 在这种连接下,前面给出的?能通信的程序就可以正常通信了。 那么,能否用图1所示的简单三线连接进?计算机和单片机的?通信呢,答案是肯定的。 只要用上述程序中给出的inportb和outportb两个函数直接驱动8250即可,其说明如下:unsigned charinportb(int portid);void charinportb(int portid,unsigned charvalue);portid是硬件端口地址;Value是发送的字符数据。 下面是笔者编写的初始化、写?口、读?口函数。 void init(int ,int bps)int co_a,io_a;char ch;switch(bps)case110:ch=0x03;break;case150:ch=0x23;break;case300:ch=0x43;break;case600:ch=0x63;break;case1200:ch=0x83;break;case2400:ch=0xa3;break;case4800:ch=0xc3;break;case9600:ch=0xe3;break;default:ch=0xa3;co_a=(-1)?0x2fc:0x3fc;io_a=(-1)?0x2f8:0x3f8;bios(0,ch,-1);outportb(co_a,0);inportb(io_a);参数是?口号,1为1,2为2。 bps是所需的波特率。 这?是用bios函数实现初始化的大部分功能。 ?按照前边给出的8250初始化步骤,可以用下列程序段对1进?初始化:outportb(0x3fb,0x80);outportb(0x3f9,0);outportb(0x3f8,0x30);outportb(0x3fb,0x03);outportb(0x3f9,0);outportb(0x3fc,0);下面是写?口函数和读?口函数:void out(int ,charch)int st_a,io_a;st_a=(-1)?0x2fd:0x3fd;io_a=(-1)?0x2f8:0x3f8;while(!(inportb(st_a)&0x20);outportb(io_a,ch);int in(int ,char*ch)int st_a,io_a;st_a=(-1)?0x2fd:0x3fd;io_a=(-1)?0x2f8:0x3f8;if(inportb(st_a)&0x01)*ch=inportb(io_a);return1;else return0;out函数将ch从指定的?口发送出去,in函数从指定的?口读取字符,?成功则返回1并改写ch单元。 In函数?等待?口接收完毕,?无数据可读则立即返回,可以在主调函数中等待。 现在,我们可以用图1所示的连接进?计算机和单片机之间的?通信了,使用如下程序可以实现通信的实验:#includ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 儿科患者的多领域护理查房
- 病人移动过程的安全护理策略
- 肠内营养输注中的护理安全策略
- 2025年黑龙江省肇源县事业单位公开招聘辅警考试题带答案分析
- 市场政府企业关系课件
- 巧马课件家长同步问题
- 工程险理赔课件
- 二零二五年度电子商务供应链管理合同
- 2025年度按摩馆加盟管理咨询及运营支持承包合同
- 二零二五版跨境电商大额借款合同范本
- 烘焙店食品安全与卫生管理培训
- 多模态数据融合-第9篇-洞察及研究
- 2025年中国工业副产氢行业市场全景调查及投资前景预测报告
- 2025至2030年中国电力运维行业市场全景调查及发展前景研判报告
- 2025至2030中国冰雪装备行业产业运行态势及投资规划深度研究报告
- Q-SY 13034-2024 物料主数据数字化描述规范
- DZ 0141-1994地质勘查坑探规程
- 社会化工会工作者考试试题及答案
- 员工定岗定员管理制度
- 2025年无房产证房屋买卖合同示例
- T/CECS 10097-2020大直径缓粘结预应力钢绞线
评论
0/150
提交评论