单片机双击串行通信MS51汇编代码.docx
《单片机双击串行通信MS51汇编代码.docx》由会员分享,可在线阅读,更多相关《单片机双击串行通信MS51汇编代码.docx(18页珍藏版)》请在冰豆网上搜索。
单片机双击串行通信MS51汇编代码
铁道大学四方学院
集中实践报告书
课题名称
双机串行通信设计
XX
邢志杰
学号
20127019
系、部
电气工程系
专业班级
方1210-4
指导教师
马丽
2015年7月3日
一、设计任务及要求:
设计任务:
双机串行通信设计
设计要求:
1、两片单片机利用串行口进行串行通信:
串行通信的波特率可从键盘进行设定,可选的波特率为1200、2400、4800和9600bit/s。
串行口工作方式为方式1的全双工串行通信。
2、两个单片机之间进行通讯波特率的设定,最终归结到对定时计数器T1计数初值TH1、TL1进行设定。
故本题目本质上是通过键盘扫描得到设定的波特率,从而载入相应的T1计数初值TH1、TL1实现的。
3、要求发送方读入按键值,发送到接收方,接收方接受数据并显示在数码管上。
4、要求做出实物。
二、指导教师评语:
三、成绩
指导教师签名:
年月日
第1章设计目的
1.1设计目的
(1)掌握单片机实际系统的开发步骤。
(2)了解串行通信的原理;了解数码管显示的工作原理;了解键盘扫描的工作原理;对双机串行通信软件编程、调试、相关硬件设备的使用技能等方面得到真正的实践机会,把软硬件结合,克服其中的种种问题,提高编程能力。
第2章设计要求
2.1设计要求
(1)两片单片机利用串行口进行串行通信:
串行通信的波特率可从键盘进行设定,可选的波特率为1200、2400、4800和9600bit/s。
串行口工作方式为方式1的全双工串行通信。
(2)两个单片机之间进行通讯波特率的设定,最终归结到对定时计数器T1计数初值TH1、TL1进行设定。
故本题目本质上是通过键盘扫描得到设定的波特率,从而载入相应的T1计数初值TH1、TL1实现的。
(3)要求发送方读入按键值,发送到接收方,接收方接受数据并显示在数码管上。
(4)要求做出实物。
第3章硬件电路设计
3.1 系统框图
图3-1系统框图
3.2 STC89C52单片机最小系统
89C52共有四个八位的并行双向口,即有32根输入输出口线。
各口的每一位均由锁存器、输出驱动器和输入缓冲器组成。
VCC(40引脚):
电源电压
VSS(20引脚):
接地
图3-2STC89C52引脚图
P0端口(P0.0~P0.7,39~32引脚):
P0口是一个漏极开路的8位双向I/O口。
作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。
在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。
此时,P0口部上拉电阻有效。
在FlashROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。
验证时,要求外接上拉电阻。
P1端口(P1.0~P1.7,1~8引脚):
P1口是一个带部上拉电阻的8位双向I/O口。
P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。
对端口写入1时,通过部的上拉电阻把端口拉到高电位,这是可用作输入口。
P1口作输入口使用时,因为有部上拉电阻,那些被外部拉低的引脚会输出一个电流。
P1口特点是输出锁存器,输出时没有条件。
输入缓冲,输入时有条件,即需要先将该口设为输入状态,先输出1。
此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX)。
P3口为准双向口。
可以字节访问,也可以位访问。
P3.0---RXD,串行输入口。
P3.1---TXD,串行输出口。
P3.2---INT0,外部中断0的请求。
P3.3---INT1,外部中断1的请求。
P3.4---T0,定时器/计数器0外部计数脉冲。
P3.5---T1,定时器/计数器,1外部计数脉冲。
P3.6---WR,外部数据存储器写选通。
P3.7---RD,外部数据存储器读选通。
RST(9引脚):
复位输入。
当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。
ALE(30引脚):
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
XTAL1(19引脚):
振荡器反相放大器和部时钟发生电路的输入端。
XTAL2(18引脚):
振荡器反相放大器的输入端。
STC89C52引脚图如图3-2所示。
3.3按键电路
图3-3按键电路图
本设计按键采用矩阵键盘,键盘连接主机的P2口,主机从矩阵键盘接收信息,通过串行输出口输出到从机,从机从串行输入口接收信息并把信息显示在数码管上。
3.4主电路设计
图3-4主电路图
第4章软件程序设计
设计思路为:
主机通过键盘扫描程序确认是否有键按下,若有键按下则将按键号对应的显示代码发送给从机,并判断是否是波特率按键,若是则进行波特率调整,若无键按下,则继续进行键盘扫描。
从机主程序动态显示缓冲区的数据。
中断子程序接收数据并判断是否是波特率按键所对应的显示代码,若是则进行波特率调整,然后将数据保存到缓冲区。
初始波特率都为9600。
4.1主程序流程图
键盘连接到甲机的P2口,通过按键扫描确定键值,从机与主机通过串行输入口P3.0和串行输出口P3.1相连接,实现两机之间的串行通信。
图4-1主机主程序流程图
4.2键盘扫描子程序流程图
矩阵式键盘扫描的方法常用的有两种,一种是逐列送0,依次读回行;另一种为反转法。
本程序采用前者,程序流程图如下:
图4-2键盘扫描子程序流程图
4.3从机主程序流程图
从机主程序动态显示缓冲区的4个数据。
从机的P1口经锁存器74HC573连接数码管位码,P2口经锁存器74HC573连接数码管的段码。
从机与主机通过串行输入口P3.0和串行输出口P3.1相连接,利用中断来接收主机发来的数据,并根据接收的数据来判断是否需要进行波特率调整。
从机主程序流程图如下:
图4-3从机主程序流程图
4.4从机中断子程序流程图
图4-3从机中断子程序流程图
4.5程序调试
图4-5程序调试
4.6双机串行通信源程序
/*************************************************************
程序调试软件:
KeiluVision4
程序仿真软件:
ISIS即Proteus-7.8sp2
/*************************************************************
双机串行通信主机程序源代码:
/**************************************************************
双机串行通信波特率可改变主机程序代码(汇编)
主机功能:
通过键盘扫描得到键号,并发送对应键号的显示代码,
同时判断是否是波特率按键。
简要说明:
甲机P2口接4*4矩阵式键盘,高4位行,低4位列。
其中0~4号按键分别代表4种不同波特率(1200、2400、4800、9600)。
初始波特率9600。
编写:
邢志杰(QQ824997141)
时间:
2015年07月02日
最后修改:
2015年07月03日
**************************************************************/
ORG00H
AJMPMAIN
ORG30H
MAIN:
MOVSP,#60H
MOVTMOD,#20H;定时器T1,方式2
MOVTH1,#0FDH;初始波特率9600
MOVTL1,#0FDH
SETBTR1
MOVSCON,#40H;串口方式1
;主程序从这里开始
LOP1:
MOVP2,#0F0H;列置0,行置1
MOVA,P2;读回P2口
ANLA,#0F0H;屏蔽列,保留行
MOVB,A;暂存A,用于二次读回时判断
XRLA,#0F0H;相异或判断是否有键按下
JZLOP1;无键按下返回
LCALLDelay;有按键,延时消抖
MOVA,P2;二次读回
ANLA,#0F0H;屏蔽列,保留行
CJNEA,B,LOP1;判断两次读数是否相等,(其实没多大用)。
LCALLSCAN;掉键盘扫描
LCALLLOOSE;等待按键松开
LCALLGET_KEY;得键号并发送,同时根据是否是波特率按键来改变波特率
AJMPLOP1;主程序到此结束,返回开始处不断循环
;键盘扫描函数
SCAN:
MOVR3,#0;列号初值0
MOVR2,#0FEH;R2用于扫描时行置1,逐列送0
SCAN2:
MOVA,R2
MOVP2,A;行置1,逐列送0
MOVA,P2;逐列送0,依次读回行
ACC.4,LOOP1;判断第0行是否为0,若为0则该列,该行有按键
MOVR4,#0;第0行的行号0送R4
RET
LOOP1:
ACC.5,LOOP2
MOVR4,#04H;第1行的行号4送R4
RET
LOOP2:
ACC.6,LOOP3
MOVR4,#08H;第2行的行号8送R4
RET
LOOP3:
ACC.7,SCAN1
MOVR4,#0CH;第3行的行号12送R4
RET
SCAN1:
INCR3;该列无按键则列号加1
MOVA,R2
RLA
MOVR2,A
ACC.4,SCAN2;4列未扫描完,扫描下一列
RET
;等待按键松开子函数
LOOSE:
MOVP2,#0F0H
MOVA,P2
ANLA,#0F0H
XRLA,#0F0H
JNZLOOSE
RET
;得键号并发送
GET_KEY:
MOVA,R4
ADDA,R3;得偏移量A即键号
MOVB,A;暂存键号
MOVDPTR,#TAB;查表得对应键号的显示代码
MOVCA,A+DPTR
MOVSBUF,A;发送显示代码
JNBTI,$;未发完等待
CLRTI;清发送标志位
MOVA,B;取出键号,判断是否是波特率按键并调整波特率
CJNEA,#0,GET1;键号0对应波特率1200
MOVTL1,#0E8H
MOVTH1,#0E8H
AJMPGET4
GET1:
CJNEA,#1,GET2;键号1对应波特率2400
MOVTL1,#0F4H
MOVTH1,#0F4H
AJMPGET4
GET2:
CJNEA,#2,GET3;键号2对应波特率4800
MOVTL1,#0FAH
MOVTH1,#0FAH
AJMPGET4
GET3:
CJNEA,#3,GET4;键号3对应波特率9600
MOVTL1,#0FDH
MOVTH1,#0FDH
GET4:
RET
;延时子涵数(10ms)
Delay:
MOVR2,#20
DEY1:
MOVR3,#248
NOP
DJNZR3,$
DJNZR2,DEY1
RET
SJMP$
;共阴极数码管显示代码
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H
END
双机串行通信从机程序源代码
/*******************************************************************
双机串行通信波特率可改变从机程序代码(汇编)
从机功能:
主函数显示缓冲区数据。
中断子函数接收主机发送的显示代码,同时判断是否是波特率按键代码。
简要说明:
P1口接4个数码管位码,P2口接段码。
缓冲区30H~33H用于存放要显示的数据代码。
其中30H存放波特率的显示代码初值为:
4FH即显示‘3’(波特率9600)。
编写:
邢志杰
时间:
2015年07月02日
最后修改:
2015年07月03日
*******************************************************************/
ORG00H
AJMPMAIN
ORG23H
AJMPRece;中断子程序
ORG30H
MAIN:
MOVSP,#60H
MOVTMOD,#20H;T1方式1
MOVTH1,#0FDH;波特率9600
MOVTL1,#0FDH
MOVSCON,#50H;串口方式1,允许接收
SETBTR1
SETBES
SETBEA
MOVR6,#3;动态显示三个非波特率数据
MOV30H,#4FH;保存接收的数据(波特率代码)初值为3所对应的代码,代表初始波特率9600
MOVR1,#31H;保存接收的数据(非波特率代码)
;主函数一直在显示缓冲区
DISP:
MOVP1,#0FEH;送位码
MOVP2,30H;送段码
LCALLDelay;调延时函数
MOVP1,#0FDH
MOVP2,31H
LCALLDelay
MOVP1,#0FBH
MOVP2,32H
LCALLDelay
MOVP1,#0F7H
MOVP2,33H
LCALLDelay
AJMPDISP;返回主函数开始处,循环显示
;接收中断子函数
Rece:
CLRRI;清接收标志位
MOVA,SBUF
LCALLOption;调波特率选择子函数
MOVR1,A;存入缓冲区
INCR1
DJNZR6,Rec1;三个数未显示完跳转
MOVR1,#31H;三个数显已示完,从31H从新开始
MOVR6,#3
Rec1:
RETI
;延时子函数
Delay:
MOVR2,#20
DEY1:
MOVR3,#248
NOP
DJNZR3,$
DJNZR2,DEY1
RET
;波特率判断选择
Option:
CJNEA,#3FH,Opt1;判断是否是波特率1200所对应的按键代码
MOVTL1,#0E8H
MOVTH1,#0E8H
ACALLRest;是波特率按键则初始化缓冲区,重新显示
AJMPOpt4
Opt1:
CJNEA,#06H,Opt2
MOVTL1,#0F4H
MOVTH1,#0F4H
ACALLRest
AJMPOpt4
Opt2:
CJNEA,#5BH,Opt3
MOVTL1,#0FAH
MOVTH1,#0FAH
ACALLRest
AJMPOpt4
Opt3:
CJNEA,#04FH,Opt4
MOVTL1,#0FDH
MOVTH1,#0FDH
ACALLRest
Opt4:
RET
;缓冲区初始化
Rest:
MOV30H,A;保存波特率
MOV31H,#0;清0缓冲区
MOV32H,#0
MOV33H,#0
MOVR1,#30H;为了与返回时衔接,使重新显示
MOVR6,#1;同上
RET
END
第5章结论
串口通信是学习单片机的重点也是难点。
要想实现正常通信就必须保证两个单片机具有一致的波特率。
单片机具有强大中断功能,使得从机在显示数据的同时还能接收主机发来的信息,这给程序设计带来了极大的方便。
尽管与C语言等高级语言相比汇编语言的可读性不高,也缺乏灵活性,但是在某些情况下汇编语言却是其他语言无法替代的,因此本程序依然采用汇编语言来编写。
在本次的课程设计过程中,我们通过查阅资料,接口设计,程序设计,安装调试等环节完成了仿真电路的设计,然后才进行硬件电路的焊接,实现了一个基于MCS—51系列单片机,涉及多种资源应用,并具有综合功能的小应用系的统设计。
由于提前进行了软件的仿真,所以得到的实物结果也比较理想。
本次设计提高了我们在单片机方面的实践技能和综合运用理论知识解决问题的能力。
参考文献
[1]高峰.单片微型计算机原理与接口技术.科学,2007.
[2]胡汉才.单片机原理及其接口技术.清华大学,2004.
[3]勋.单片机微型计算机大学读本.航空航天大学,2002.
[4]王幸之.单片机应用系统抗干扰技术.航空航天大学,2001.