1、微机原理第三次实验报告实验三串口通信实验一、 实验目的与要求利用开发板的串口仿真功能,掌握串口通信的编程方法。实验要求:(1)利用串行口向PC机发送字符“0x55”,利用串口调试软件在计算机端观察接收到的数据是否与预期一致。(2)利用串行口向PC机发送字符串,利用串口调试软件在计算机端观察接收到的数据是否与预期一致(3)观察分析参考程序3,利用开发板接收PC机发送过来的16进制数据并用数码管显示。(4)掌握实验基础内容后根据参考源程序进行修改和拓展,自行设计程序目标并编程验证,比如修改发送程序的内容,实现由上位机控制数码管显示内容等。二、 实验注意事项1、 启动KEIL软件,选择菜单“工程新建
2、工程”以建立工程(扩展名为.uv2,如T2a.uv2)。2、 选择菜单“文件新文件”以建立一个新的文本编辑窗口,在窗口中输入参考源程序1并保存(扩展名为.asm),如test2a.asm,然后将其加入到源程序组1中。3、 在工程菜单的选项“目标1属性”中设置相应的选项,包括“输出产生hex文件”选项以便汇编生成HEX代码供编程器使用,在“调试使用KeilMonitor-51 Driver”的设置中选择相应的串口号。4、 使用“工程”中的“编译全部文件”完成相应的文件编译,如果程序格式正确将生成相应HEX代码文件,如T2a.hex。如果提示有编译错误请自行修改源程序然后再重新编译。5、 用单根连
3、线将P1.0(JP44)连接到8路指示灯部分(JP32)的LED0,将P1.6、P1.7(JP44)分别连接到JP37的K01、K02。6、 完成仿真器与计算机之间的连线并通电。7、 在KEIL软件中启动“调试开启仿真模式”,然后用“运行”命令实现全速运行的仿真。8、 观察实验现象并分别依次按下K01、K02,观察并记录实验现象然后在KEIL软件中启动“中断运行调试(debug)关闭仿真模式”退出仿真,选择 “工程关闭工程”可关闭当前工程。9、 参考步骤14完成参考源程序2的建立与输入,如新项目T2b.uv2和新的源程序test2b.asm,完成编译与仿真设置。10、 用8PIN连线将P0口连
4、接到数码管数据输入端,P2口连接到数码管控制端。11、 输入程序并仿真运行,注意数码管的显示内容。12、 根据参考源程序1和参考源程序2进行思考、修改和拓展,自行设计程序目标并编程验证。三、 实验内容1. 利用串口向PC机发送字符“0x55”。 参考程序如下ORG 0000HLJMP MainORG 00F0HMain:MOV TMOD,#22H ;设置T1为方式2 MOV SCON,#40H MOV TH1,#0F3H ;设置速率4800,(12M晶体) MOV TL1,#0F3H MOV PCON,#80H ;定时器1开始计数 SETB TR1next: lcall delay mov a
5、,#55h mov r3,#01 setb p1.7 jnb p1.7,SENDWT mov a,#56h mov r3,#02 setb p1.6 jnb p1.6,SENDWT sjmp next SENDWT: CLR TI movsbuf,a ;发送数据 JNB TI,$; ; djnz r3, SENDWT ljmp nextdelay: mov r7,#0l0: mov r6, #0 djnz r6,$ djnz r7,l0 ret; END 实验现象:按下P1.6,然后再P1.7按键,PC端的接收软件上看见接收到55、56,实验现象如下:2. 利用P1.7外接按钮控制单片机通过串
6、口向PC机发送一串预定义的字符。参考程序如下:ORG 0000H LJMP MAIN ORG 0100HMAIN: MOV TMOD,#22H ;设置T1为方式2 MOV SCON,#40H MOV TH1,#0F3H ;设置速率4800,(12M晶体) MOV TL1,#0F3H MOV PCON,#80H ;定时器1开始计数 SETB TR1MAINLOOP: setb p1.7 jb p1.7,MAINLOOP movdptr,#tabsend$: CLR TI mov a,#0 movc a,a+dptr cjne a, #81h, send_SBUF ;81作为输出字符串的结束标志,
7、不发送 ljmp MAINLOOPsend_SBUF: MOV SBUF, a JNB TI, $ incdptr sjmp send$ tab: 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 db .$.,0dh,0ah db 81h ; END 实验现象: 按下P1.7时,PC端的接收软件上看见的字符串如下图所示。 实验现象分析: 包含$的左右一对引号是用来告诉编译软件将字
8、符转成ASC码。 要点部分:(1)通过预设计字符串长度,用字节长度计算(2)通过定义特殊的控制字符作为结束符号:例子中定义81H代表发送数据的结束。*0DH,0AH在字符显示中通过回车和换行实现显示光标的换行。3. 利用仿真板接收PC机发送过来的16进制数据并用数码管显示。参考程序如下:DIS_DIGIT EQU 40H;位选通值, 传送到P2口用于选通当前数码管的数值,; 如等于0xfe时, 选通P2.0口数码管DIS_INDEX DATA 41H ;显示索引, 用于标识当前显示的数码管和缓冲区的偏移量DIS_LONG DATA 8HRXD_INDEX EQU 43H;串口接收索引, 用于标
9、识当前接收的数据位于显示缓冲区的第几位DIS_BUF DATA 50H ;显于缓冲区起始地址 ORG 0000H AJMP MAIN ORG 000BH AJMP INTT0 ORG 0100HMAIN: MOV P0,#0FFH ; 初始化I/O口MOV P2,#0FFH MOV TMOD, #22H ;定时器0在模式2下工作 MOV PCON,#80H MOV SCON,#40H MOV TH1,#0F3H ;设置速率4800,(12M晶体) MOV TL1,#0F3H SETB TR1 ;定时器1开始计数 SETB REN MOV TH0, #38H ; 每200s产生一次溢出 MOV
10、TL0, #38H ;自动重装初值 SETB ET0 ;使能定时器0中断 SETB EA ;使能总中断 MOV DPTR, #DIS_CODE ; 开始设定显示初值为全0 MOV A,#0 ;取“0”的段码到B MOVC A,A+DPTR MOV B,A mov DIS_INDEX,#0 mov r7,#DIS_LONG ;数码管位数,用于计算要清零的数据区长度nextdata: MOV a,#DIS_BUF ADD a,DIS_INDEX mov r1,a MOV R1,B inc DIS_INDEX djnz r7 ,nextdata DISPLAY: MOV DIS_DIGIT,#0FE
11、H ; 初始从第一个数码管开始扫描 MOV DIS_INDEX,#0 SETB TR0 ; 启动定时器0,开始动态扫描显示 MAIN_LP: mov RXD_INDEX,#DIS_BUF CLR RINEXTRD: JNB RI,$ MOV A,SBUF CLR RI movb,a clr c subb A,#80h ;大于等于80h的当回车处理 JNC RST_R mova,b MOV DPTR, #DIS_CODE ; MOVC A,A+DPTR mov r1,RXD_INDEX mov r1,a INC RXD_INDEX mova,RXD_INDEX CJNE a,#DIS_LONG+
12、DIS_BUF,NEXTRD; mov b,#39hRST_R: CLR TI mova,b movsbuf ,a jnb TI,$ CLR TI SJMP MAIN_LPINTT0: ; 定时器0中断服程序, 用于数码管的动态扫描 PUSH ACC PUSH PSW MOV P2,#0FFH ; 先关闭所有数码管 MOV A,#DIS_BUF ; 获得显示缓冲区基地址 ADD A,DIS_INDEX ; 获得偏移量 MOV R0,A ; R0 = 基地址 + 偏移量 MOV A,R0 ; 获得显示代码 MOV P0,A ; 显示代码传送到P0口 MOV P2,DIS_DIGIT ; MOV
13、A,DIS_DIGIT ; 位选通值左移, 下次中断时选通下一位数码管 RL A MOV DIS_DIGIT,A INC DIS_INDEX ; DIS_INDEX加1, 下次中断时显示下一位 ANL DIS_INDEX,#0x07 ; 当DIS_INDEX等于8(0000 1000B)时, 清0 POP PSW POP ACC RETI DIS_CODE: DB 28h,7eh,0a2h,62h,74h,61h,21h,7ahDB 20h,60h,30h,25h,0a9h,26h,0a1h,0b1hDB 0ffh;09和ABCDEF的数码管显示代码,偏移量10H对应为0FFH即该管熄灭 实验
14、现象:未输入其他任何值之前,数码管显示均为0。如下图:通过串口向PC机发送一组数据:01 02 03 04 05 06 07 08,在数码管上显示123456789实验现象分析: 初值都为0,所以进入开发板仿真模式后初始显示都为0。是因为程序中定义了一个接收缓冲区指针RXD_INDEX,数值在#DIS_BUF+0 #DIS_BUF+DIS_LONG1之间变化,用于指明下一个串口接收到的数据要存放在缓冲区的哪个地址下,刚开始地址中没数据缓存到PC口,输出0。 随后在PC端向输入01 02 03 04 05 06 07 08,缓存的地址中存有输入数据,依次在数码管从左向右输出12345678。四、
15、 思考题1. 试根据参考程序1和参考程序2分析如何修改程序以实现利用不同的按键发送不同的字符串分段完成学生学号的完整显示,完成程序的设计并调试记录。因为我的学号是2015124014,本想在PC端接收到10位学号,可是只有4个按键,每个按键控制输出两个数字,所以最终只能做到接收区收到8位学号。对于程序1,我修改了代码如下图部分,得到右图所示结果。next: lcall delay mov a,#15hmov r3,#01 setb p1.4 jnb p1.4,SENDWTmov a,#12hmov r3,#01 setb p1.5 jnb p1.5,SENDWTmov a,#40hmov r3
16、,#01 setb p1.6 jnb p1.6,SENDWTmov a,#14hmov r3,#01 setb p1.7 jnb p1.7,SENDWTsjmp next 依次按下P1.4-P1.7,在PC上显示15 12 40 14对于程序2,修改代码部分如下图:得到结果如下:2.观察参考程序3的实验现象,试利用PC机仿真串口发送数据控制数码管显示为学生自己的学号的后8位并拍照记录这个实验比较简单,只用在发送区输入01 05 01 02 04 00 01 04 ,点击发送文件,数码管就会由原来的8个0变成显示我的学号的后8位数字。如下图:五、 心得体会本次实验对代码的修改要求比较低,我们的实验完成得比较顺利。在实验的过程中,我们初步了解并学习了串口通信,初步掌握了利用开发板接收PC机发过来的数据。实验思考题的第一题将图形修改成自己的学号并显示在PC上的难度不是很大,但由于要打的东西比较多,我用了很多时间,这在以后好好熟悉键盘,学会快速打代码,提高自己的编程能力。