微机原理第三次实验报告.docx
- 文档编号:23915235
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:15
- 大小:2.48MB
微机原理第三次实验报告.docx
《微机原理第三次实验报告.docx》由会员分享,可在线阅读,更多相关《微机原理第三次实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
微机原理第三次实验报告
实验三串口通信实验
一、实验目的与要求
利用开发板的串口仿真功能,掌握串口通信的编程方法。
实验要求:
(1)利用串行口向PC机发送字符“0x55”,利用串口调试软件在计算机端观察接收到的数据是否与预期一致。
(2)利用串行口向PC机发送字符串,利用串口调试软件在计算机端观察接收到的数据是否与预期一致
(3)观察分析参考程序3,利用开发板接收PC机发送过来的16进制数据并用数码管显示。
(4)掌握实验基础内容后根据参考源程序进行修改和拓展,自行设计程序目标并编程验证,比如修改发送程序的内容,实现由上位机控制数码管显示内容等。
二、实验注意事项
1、启动KEIL软件,选择菜单“工程\新建工程”以建立工程(扩展名为.uv2,如T2a.uv2)。
2、选择菜单“文件\新文件”以建立一个新的文本编辑窗口,在窗口中输入参考源程序1并保存(扩展名为.asm),如test2a.asm,然后将其加入到源程序组1中。
3、在工程菜单的选项“目标1属性”中设置相应的选项,包括“输出\产生hex文件”选项以便汇编生成HEX代码供编程器使用,在“调试\使用KeilMonitor-51Driver”的设置中选择相应的串口号。
4、使用“工程”中的“编译全部文件”完成相应的文件编译,如果程序格式正确将生成相应HEX代码文件,如T2a.hex。
如果提示有编译错误请自行修改源程序然后再重新编译。
5、用单根连线将P1.0(JP44)连接到8路指示灯部分(JP32)的LED0,将P1.6、P1.7(JP44)分别连接到JP37的K01、K02。
6、完成仿真器与计算机之间的连线并通电。
7、在KEIL软件中启动“调试\开启仿真模式”,然后用“运行”命令实现全速运行的仿真。
8、观察实验现象并分别依次按下K01、K02,观察并记录实验现象然后在KEIL软件中启动“中断运行-调试(debug)\关闭仿真模式”退出仿真,选择“工程\关闭工程”可关闭当前工程。
9、参考步骤1-4完成参考源程序2的建立与输入,如新项目T2b.uv2和新的源程序test2b.asm,完成编译与仿真设置。
10、用8PIN连线将P0口连接到数码管数据输入端,P2口连接到数码管控制端。
11、输入程序并仿真运行,注意数码管的显示内容。
12、根据参考源程序1和参考源程序2进行思考、修改和拓展,自行设计程序目标并编程验证。
三、实验内容
1.利用串口向PC机发送字符“0x55”。
参考程序如下
ORG0000H
LJMPMain
ORG00F0H
Main:
MOVTMOD,#22H;设置T1为方式2
MOVSCON,#40H
MOVTH1,#0F3H;设置速率4800,(12M晶体)
MOVTL1,#0F3H
MOVPCON,#80H;定时器1开始计数
SETBTR1
next:
lcalldelay
mova,#55h
movr3,#01
setbp1.7
jnbp1.7,SENDWT
mova,#56h
movr3,#02
setbp1.6
jnbp1.6,SENDWT
sjmpnext
SENDWT:
CLRTI
movsbuf,a;发送数据
JNBTI,$;;
djnzr3,SENDWT
ljmpnext
delay:
movr7,#0
l0:
movr6,#0
djnzr6,$
djnzr7,l0
ret
;
END
实验现象:
按下P1.6,然后再P1.7按键,PC端的接收软件上看见接收到55、56,实验现象如下:
2.利用P1.7外接按钮控制单片机通过串口向PC机发送一串预定义的字符。
参考程序如下:
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVTMOD,#22H;设置T1为方式2
MOVSCON,#40H
MOVTH1,#0F3H;设置速率4800,(12M晶体)
MOVTL1,#0F3H
MOVPCON,#80H;定时器1开始计数
SETBTR1
MAINLOOP:
setbp1.7
jbp1.7,MAINLOOP
movdptr,#tab
send$:
CLRTI
mova,#0
movca,@a+dptr
cjnea,#81h,send_SBUF
;81作为输出字符串的结束标志,不发送
ljmpMAINLOOP
send_SBUF:
MOVSBUF,a
JNBTI,$
incdptr
sjmpsend$
tab:
db0dh,0ah
db".....$$...$$.....",0dh,0ah
db"....$$$$$$$$$....",0dh,0ah
db"...$$$$$$$$$$$...",0dh,0ah
db"...$$$$$$$$$$$...",0dh,0ah
db"....$$$$$$$$$....",0dh,0ah
db".....$$$$$$$.....",0dh,0ah
db"......$$$$$......",0dh,0ah
db".......$$$.......",0dh,0ah
db"........$........",0dh,0ah
db81h
;
END
实验现象:
按下P1.7时,PC端的接收软件上看见的字符串如下图所示。
实验现象分析:
包含$的左右一对引号是用来告诉编译软件将字符转成ASC码。
要点部分:
(1)通过预设计字符串长度,用字节长度计算
(2)通过定义特殊的控制字符作为结束符号:
例子中定义81H代表发送数据的结束。
*0DH,0AH在字符显示中通过回车和换行实现显示光标的换行。
3.利用仿真板接收PC机发送过来的16进制数据并用数码管显示。
参考程序如下:
DIS_DIGITEQU40H
;位选通值,传送到P2口用于选通当前数码管的数值,
;如等于0xfe时,选通P2.0口数码管
DIS_INDEXDATA41H
;显示索引,用于标识当前显示的数码管和缓冲区的偏移量
DIS_LONGDATA8H
RXD_INDEXEQU43H
;串口接收索引,用于标识当前接收的数据位于显示缓冲区的第几位
DIS_BUFDATA50H;显于缓冲区起始地址
ORG0000H
AJMPMAIN
ORG000BH
AJMPINTT0
ORG0100H
MAIN:
MOVP0,#0FFH;初始化I/O口
MOVP2,#0FFH
MOVTMOD,#22H;定时器0在模式2下工作
MOVPCON,#80H
MOVSCON,#40H
MOVTH1,#0F3H;设置速率4800,(12M晶体)
MOVTL1,#0F3H
SETBTR1;定时器1开始计数
SETBREN
MOVTH0,#38H;每200μs产生一次溢出
MOVTL0,#38H;自动重装初值
SETBET0;使能定时器0中断
SETBEA;使能总中断
MOVDPTR,#DIS_CODE;开始设定显示初值为全0
MOVA,#0;取“0”的段码到B
MOVCA,@A+DPTR
MOVB,A
movDIS_INDEX,#0
movr7,#DIS_LONG;数码管位数,用于计算要清零的数据区长度
nextdata:
MOVa,#DIS_BUF
ADDa,DIS_INDEX
movr1,a
MOV@R1,B
incDIS_INDEX
djnzr7,nextdata
DISPLAY:
MOVDIS_DIGIT,#0FEH
;初始从第一个数码管开始扫描
MOVDIS_INDEX,#0
SETBTR0;启动定时器0,开始动态扫描显示
MAIN_LP:
movRXD_INDEX,#DIS_BUF
CLRRI
NEXTRD:
JNBRI,$
MOVA,SBUF
CLRRI
movb,a
clrc
subbA,#80h;大于等于80h的当回车处理
JNCRST_R
mova,b
MOVDPTR,#DIS_CODE;
MOVCA,@A+DPTR
movr1,RXD_INDEX
mov@r1,a
INCRXD_INDEX
mova,RXD_INDEX
CJNEa,#DIS_LONG+DIS_BUF,NEXTRD;
movb,#39h
RST_R:
CLRTI
mova,b
movsbuf,a
jnbTI,$
CLRTI
SJMPMAIN_LP
INTT0:
;定时器0中断服程序,用于数码管的动态扫描
PUSHACC
PUSHPSW
MOVP2,#0FFH;先关闭所有数码管
MOVA,#DIS_BUF;获得显示缓冲区基地址
ADDA,DIS_INDEX;获得偏移量
MOVR0,A;R0=基地址+偏移量
MOVA,@R0;获得显示代码
MOVP0,A;显示代码传送到P0口
MOVP2,DIS_DIGIT;
MOVA,DIS_DIGIT
;位选通值左移,下次中断时选通下一位数码管
RLA
MOVDIS_DIGIT,A
INCDIS_INDEX;DIS_INDEX加1,下次中断时显示下一位
ANLDIS_INDEX,#0x07
;当DIS_INDEX等于8(00001000B)时,清0
POPPSW
POPACC
RETI
DIS_CODE:
DB28h,7eh,0a2h,62h,74h,61h,21h,7ah
DB20h,60h,30h,25h,0a9h,26h,0a1h,0b1h
DB0ffh
;0-9和ABCDEF的数码管显示代码,偏移量10H对应为0FFH即该管熄灭
实验现象:
未输入其他任何值之前,数码管显示均为0。
如下图:
通过串口向PC机发送一组数据:
0102030405060708,在数码管上显示123456789
实验现象分析:
初值都为0,所以进入开发板仿真模式后初始显示都为0。
是因为程序中定义了一个接收缓冲区指针RXD_INDEX,数值在#DIS_BUF+0~#DIS_BUF+DIS_LONG-1之间变化,用于指明下一个串口接收到的数据要存放在缓冲区的哪个地址下,刚开始地址中没数据缓存到PC口,输出0。
随后在PC端向输入0102030405060708,缓存的地址中存有输入数据,依次在数码管从左向右输出12345678。
四、思考题
1.试根据参考程序1和参考程序2分析如何修改程序以实现利用不同的按键发送不同的字符串分段完成学生学号的完整显示,完成程序的设计并调试记录。
因为我的学号是2015124014,本想在PC端接收到10位学号,可是只有4个按键,每个按键控制输出两个数字,所以最终只能做到接收区收到8位学号。
对于程序1,我修改了代码如下图部分,得到右图所示结果。
next:
lcalldelay
mova,#15h
movr3,#01
setbp1.4
jnbp1.4,SENDWT
mova,#12h
movr3,#01
setbp1.5
jnbp1.5,SENDWT
mova,#40h
movr3,#01
setbp1.6
jnbp1.6,SENDWT
mova,#14h
movr3,#01
setbp1.7
jnbp1.7,SENDWT
sjmpnext
依次按下P1.4-P1.7,在PC上显示15124014
对于程序2,修改代码部分如下图:
得到结果如下:
2.观察参考程序3的实验现象,试利用PC机仿真串口发送数据控制数码管显示为学生自己的学号的后8位并拍照记录
这个实验比较简单,只用在发送区输入0105010204000104,点击发送文件,数码管就会由原来的8个0变成显示我的学号的后8位数字。
如下图:
五、心得体会
本次实验对代码的修改要求比较低,我们的实验完成得比较顺利。
在实验的过程中,我们初步了解并学习了串口通信,初步掌握了利用开发板接收PC机发过来的数据。
实验思考题的第一题将图形修改成自己的学号并显示在PC上的难度不是很大,但由于要打的东西比较多,我用了很多时间,这在以后好好熟悉键盘,学会快速打代码,提高自己的编程能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 第三次 实验 报告