汇编语言实现双机通信.docx
《汇编语言实现双机通信.docx》由会员分享,可在线阅读,更多相关《汇编语言实现双机通信.docx(12页珍藏版)》请在冰豆网上搜索。
![汇编语言实现双机通信.docx](https://file1.bdocx.com/fileroot1/2023-1/23/ea772c0c-9621-4de5-8e37-b3f7265fe426/ea772c0c-9621-4de5-8e37-b3f7265fe4261.gif)
汇编语言实现双机通信
西安邮电大学
单片机课程设计报告
题目:
单片机之间的通信综合设计
班级
:
测控1002班
学
生
姓
名
:
仵俊娇(06102048)
朱凌萱(06102053)
刘俊廷(06102038)
刘宇(06102043)
指导老师
:
赵广元
实习时间
:
12-12-03-----12-12-13
单片机之间的通信综合设计
一、设计要求:
1.A机,B机进行全双工通信,并用2位一体的数码管显示发送的数据和接收的数据。
2.加扩展功能。
二、实验步骤:
1.根据单片机原理,分析实验要求,编写程序。
2.设计硬件电路,并且在Proteus中进行模拟仿真。
3.仿真成功后,合理布线,进行焊接。
4.进行检查调试。
三、所需元器件:
器件名称
数量
AT89C52
2
管脚座
4
晶振
2
30pF电容
2
2k欧电阻
4
纽扣开关
1
220欧电阻
4
两位一体共阳数码管
2
电路板
1
四、主要功能描述:
双机通讯系统实现A机指定数据段对B机指定数据段循环发送数据,建立通信时A机与B机进行一次握手确认,在接收过程中由B机对A机发送的数据进行校验,并可对错误字节进行重新接收。
A机数码管显示A机发送的数据,B机数码管显示B机接收的数据。
五、实验电路图:
六、实验源程序及流程图:
A机程序:
ORG0000H
LJMPAMAIN
ORG0040H
AMAIN:
MOVSP,#5FH
MOVTMOD,#20H;定时器1置为方式2
MOVTH1,#0F4H;装载定时器初值,波特率2400
MOVTL1,#0F4H
MOVSCON,#50H;串口工作在方式2
MOVPCON,#00H;SMOD=0
SETBTR1;启动定时器
SETBET1;开定时器1
SETBES;允许串行口中断
CLRTI;发送中断标志位清零
MOVP2,#00H;
MAIN:
JNB,KEY2;判断按键是否按下
LJMPMAIN
KEY2:
LCALLD10MS;延时,消抖
JB,MAIN;再判断按键是否真的按下
WAIT:
JNB,WAIT;等待按键松手
CALLINIT;调试用数据产生
DIALOG:
MOVA,#0E1H
CALLTXBYTE;发送“E1”联络信号
CALLRXBYTE
CJNEA,#0E2H,DIALOG;B机允许发送
RETX:
CALLTXDATA;发送数据块
CALLRXBYTE
CJNEA,#00H,RETX;B机接受正确
LJMPDIALOG
TXBYTE:
MOVSBUF,A;发送字节子程序
CALLTRANS;调用显示
MOVA,SBUF
JNBTI,$
CLRTI
RET
RXBYTE:
JNBRI,$;接受字节子程序
MOVA,SBUF
CLRRI
RET
TXDATA:
MOVR7,#15;发送数据块子程序
MOVR0,#40H
MOVR6,#00H
LDATA:
MOVA,@R0
CALLTXBYTE
MOVA,R6
ADDA,@R0;求校验和
MOVR6,A;保存校验和
INCR0
DJNZR7,LDATA;整个数据块是否发送完毕
MOVA,R6;发送校验和
CALLTXBYTE
RET
INIT:
MOVR0,#40H;调试用数据产生子程序
MOVR7,#15
MOVA,#36H
L0:
MOV@R0,A
INCA
INCR0
DJNZR7,L0
RET
;延时消抖程序
D1S:
MOVR6,#100
D10:
CALLD10MS
DJNZR6,D10
RET
D10MS:
MOVR5,#10
D1MS:
MOVR4,#249
DL:
NOP
NOP
DJNZR4,DL
DJNZR5,D1MS
RET
;显示子程序
TRANS:
MOVB,#16;采用16进制显示
DIVAB
MOVR1,B
MOVR2,A
MOVR3,#17
DISP:
MOVA,R2
SETB
ACALLDISPLAY
ACALLD10MS
CLR
MOVA,R1
SETB
ACALLDISPLAY
ACALLD10MS
CLR
DJNZR3,DISP
RET
DISPLAY:
MOVDPTR,#TABLE1;设置数据指针地址初值
MOVCA,@A+DPTR;根据有效地址查询
MOVP1,A;结果传送到输出口P1
RET
;共阳
TABLE1:
DB0C0H,0F9H,0A4H,0B0H
DB99H,92H,82H,0F8H
DB80H,90H,88H,83H
DB0C6H,0A1H,86H,8EH
;共阴
TABLE2:
DB3FH,06H,5BH,4FH
DB66H,6DH,7DH,07H
DB7FH,6FH,77H,7CH
DB39H,5DH,79H,71H
END
B机程序:
ORG0000H
LJMPBMAIN
ORG0040H
BMAIN:
MOVSP,#5FH
MOVTMOD,#20H;定时器1置为方式2
MOVTH1,#0F4H;装载定时器初值,波特率2400
MOVTL1,#0F4H
MOVSCON,#50H
MOVPCON,#00H;SMOD=0
SETBTR1;启动定时器
WDIALOG:
CALLRXBYTE
CJNEA,#0E1H,WDIALOG;等待联络信号
MOVA,#0E2H
CALLTXBYTE;发送“E2”联络信号
RERX:
CALLRXDATA;接受校验块
XRLA,R6;校验和正确
JNZNO;不正确,转NO
MOVA,#00H;正确
CALLTXBYTE
LJMPWDIALOG
NO:
MOVA,#0FFH
CALLTXBYTE
LJMPRERX
TXBYTE:
MOVSBUF,A;发送字节子程序
JNBTI,$
CLRTI
RET
RXBYTE:
JNBRI,$;接受字节子程序
MOVA,SBUF
CLRRI
RET
RXDATA:
MOVR7,#15;接受数据块子程序
MOVR0,#40H
MOVR6,#00H
LDATA:
CALLRXBYTE
MOV@R0,A
CALLTRANS;调用显示
MOVA,@R0
MOVA,R6
ADDA,@R0;求校验和.................
MOVR6,A;保存校验和
INCR0
DJNZR7,LDATA;整个数据块是否接受完毕
CALLRXBYTE
RET
D1S:
MOVR6,#100
D10:
CALLD10MS
DJNZR6,D10
RET
D10MS:
MOVR5,#10
D1MS:
MOVR4,#249
DL:
NOP
NOP
DJNZR4,DL
DJNZR5,D1MS
RET
TRANS:
MOVB,#16;采用16进制显示
DIVAB
MOVR1,B
MOVR2,A
MOVR3,#17
DISP:
MOVA,R2
SETB
ACALLDISPLAY
ACALLD10MS
CLR
MOVA,R1
SETB
ACALLDISPLAY
ACALLD10MS
CLR
DJNZR3,DISP
RET
DISPLAY:
MOVDPTR,#TABLE1;设置数据指针地址初值
MOVCA,@A+DPTR;根据有效地址查询
MOVP1,A;结果传送到输出口P0
RET
;共阳
TABLE1:
DB0C0H,0F9H,0A4H,0B0H
DB99H,92H,82H,0F8H
DB80H,90H,88H,83H
DB0C6H,0A1H,86H,8EH
;共阴
TABLE2:
DB3FH,06H,5BH,4FH
DB66H,6DH,7DH,07H
DB7FH,6FH,77H,7CH
DB39H,5DH,79H,71H
END
A,B机通信流程图(省略按键与显示流程):
A机流程图B机流程图
七、设计原理:
本次课程设计的主要原理有:
1.串行口通信,通过简单的握手验证,在定时器控制下实现字节接收:
如果两个单片机应用系统相距很近,将他们的串行口直接相连即可实现双机通信。
通信时首先A机发送“E1”请求传送数据。
B机收到后发送应答数据“E2”(因此时E2未放入B机数据缓冲区所以B机数码管不显示),表示同意接收。
当A机收到应答信号“E2”后开始发送数据(此时“E2”为A机接收的数据,不显示),每发送一个数据字节都要计算“校验和”,然后B机接收数据并转存到数据缓冲区,接收一个次数据字节便计算一次“校验和”,再接收A机发送的校验和,进行比较若不相等请求A机重发。
2.数码管的动态显示:
数码管的abcdefgh与单片机数据输出端相连,将和和数码管使能端相连,通过控和的高低电平对数码管的高低位进行位选通控制,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
3.按键的检测与软件去抖:
作为一个按键,从没有按下到按下以及释放是一个完整的过程,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的过程中,不可避免会产生干扰,这些干扰可能造成误触发过程。
为了防止这种现象的产生,需要在按键按下的时候把各种干扰信号滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但会增加硬件成本及硬件电路的体积。
对于实时性要求不高的系统,可以采用软件滤波的方法去除干扰信号:
一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。
从按键被识别按下之后,延时4ms以上,可以避开了干扰信号区域,此时再检测一次按键是否真得已经按下,若真的已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明之前是由于干扰信号引起的误触发,处理单元便会舍弃本次的按键识别过程。
从而提高了系统的可靠性。
八、实验分析及检测:
在数码管阳极未连接放大电路时,用仿真软件对电路和程序进行仿真,结果正确功能正常。
但查询网络和参考资料后,了解到P1口输出电流(10mA左右)不足以正常驱动数码管(30~40mA)。
为了使数码管正常工作,小组讨论决定增加放大电路。
程序烧录和电路焊接完成后试运行,A机数码管高位不能点亮,用万用表检查放大电路的各脚电压后确定为管脚虚焊,重新焊接后解决问题,双机通讯系统最终正常工作。
九、实验心得:
仵俊娇:
在最后加电源的环节,B组数码管只显示一边,通过检查,是因为控制他的放大电路三极管虚焊导致,补修之后问题就解决了。
朱凌萱:
实验开始时编写的程序略有问题无法很好的运行,后经过查阅资料、课本以及询问咨询解决了这个小问题,能够正常的运行。
做实验一定要先把理论知识弄清楚做实验才能顺利。
刘俊廷:
实验中调试时会有接触不良的情况出现,时焊接时出现了些许地方没有焊好。
重新检查后恢复正常,实验有一定的难度,也让我对于课本上的知识有了进一步的理解不在只局限于课本。
能够真正动手把课本上的知识变成手下的成品是这次实验最大的收获。
刘宇:
通过本次实验,我最大的收获是学到了解决实际问题的方法。
从一开始对课题的无从下手,到分析课题原理,明确步骤,逐个解决每一个问题的过程尽管艰难,却使我收获良多。
从最初确定数码管共阴共阳到汇编源程序生成.hex文件再到按键去抖和用数码管进行数据显示,每一个问题都可以在参考书中找到解决方法,但只有真正将各个功能联系整合起来才真正解决了具体问题。
最后,我们感谢赵老师在本次课程设计中对本小组的指导和支持。
十、参考文献:
《单片机原理及接口技术》,李全利,高等教育出版社
《单片机在控制系统中的应用》,余永权,汪明慧,黄英,电子工业出版社