1、串行通信实验报告班级 姓名 学号 日期 一、实验目的:1、掌握单片机串行口工作方式的程序设计,及简易 三线式通讯的方法。2、了解实现串行通讯的硬环境、数据格式的协议、 数据交换的协议。3、学习串口通讯的程序编写方法。二、实验要求1.单机自发自收实验:实现自发自收。编写相应程序,通过发光二极管观察收发状态。 2利用单片机串行口,实现两个实验台之间的串行通讯。其中一个实验台作为发送方,另一侧为接收方。三、实验说明通讯双方的 RXD、TXD 信号本应经过电平转换后再行交叉连接,本实验中为减少连线可将电平转换电路略去,而将双方的 RXD、TXD 直接交叉连接。也可以将本机的 TXD 接到 RXD 上。
2、连线方法:在第一个实验中将一台实验箱的 RXD 和 TXD 相连,用 P1.0 连接发光二极管。波特率定为 600,SMOD=0。在第二个实验中,将两台实验箱的 RXD 和 TXD 交叉相连。编写收发程序,一台实验箱作为发送方,另一台作为接收方,编写程序,从内部数据存储器20H3FH 单元中共 32 个数据,采用方式 1 串行发送出去,波特率设为 600。通过运行程序观察存储单元内数值的变化。四、程序甲方发送程序如下:ORG 0000HLJMP MAINORG 0023HLJMP COM_INTORG 1000HMAIN: MOV SP,#53HMOV 78H,#20HMOV 77H,00HM
3、OV 76H,20HMOV 75H,40HACALL TRANSHERE: SJMP HERETRANS: MOV TMOD,#20HMOV TH1,#0F3HMOV TL1,#0F3HMOV PCON,#80HSETB TR1MOV SCON,#40HMOV IE,#00HCLR F0MOV SBUF,78HWAIT1: JNB TI,WAIT1CLR TIMOV SBUF,77HWAIT2: JNB TI,WAIT2CLR TIMOV SBUF,76HWAIT3: JNB TI,WAIT3CLR TIMOV SBUF,75HWAIT4: JNB TI,WAIT4CLR TIMOV IE,#
4、90HMOV DPH,78HMOV DPL,77HMOVX A,DPTRMOV SBUF,AWAIT: JNB F0,WAITRETCOM_INT: CLR TIINC DPTRMOV A,DPHCJNE A,76H,END1MOV A,DPLCJNE A,75H,END1SETB F0CLR ESCLR EARETEND1: MOVX A,DPTRMOV SBUF,ARETIEND乙方发送程序如下:ORG 0000HLJMP MAINORG 0023HLJMP COM_INTORG 1000HMAIN: MOV SP,#53HACALL RECEIHERE: SJMP HERERECEI:
5、MOV R0,#78HMOV TMOD,#20HMOV TH1,#0F3HMOV TL1,#0F3HMOV PCON,#80HSETB TR1MOV SCON,#50HMOV IE,#90HCLR F0CLR 7FHWAIT: JNB 7FH,WAITRETCOM_INT: PUSH DPLPUSH DPHPUSH AccCLR RIJB F0,R_DATAMOV A,SBUFMOV R0,ADEC R0CJNE R0,#74H,RETNSETB F0RETN: POP AccPOP DPHPOP DPLRETIR_DATA: MOV DPH,78HMOV DPL,77HMOV A,SBUFM
6、OVX DPTR,AINC 77HMOV A,77HJNZ END2INC 78HEND2: MOV A,76HCJNE A,78H,RETNMOV A,75HCJNE A,77H,RETNCLR ESCLR EASETB 7FHSJMP RETNEND五、实验过程中遇到的主要问题OUTBIT equ 08002h ; 位控制口OUTSEG equ 08004h ; 段控制口IN equ 08001h ; 键盘读入口HasRcv equ 20h.0 ; 接收标志位LEDBuf equ 40h ; 显示缓冲RCVBuf equ 50H ; 接收缓冲ORG 0000HLJMP START; 串行口
7、中断程序ORG 0023HJNB TI,S0_RCLR TINOPSJMP S0_RETS0_R: ; 接收数据CLR RIMOV RCVBUF,SBUF ; 保存数据SETB HasRcv ; 提示收到数据NOPS0_RET:RETILEDMAP: ; 八段管显示码db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07hdb 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71hDelay: ; 延时子程序mov r7, #0DelayLoop:djnz r7, DelayLoopdjnz r6, DelayLoopretDisplayLED:
8、mov r0, #LEDBufmov r1, #6 ; 共 6 个八段管mov r2, #00100000b ; 从左边开始显示Loop:mov dptr, #OUTBITmov a, #0movx dptr, a ; 关所有八段管mov a, r0mov dptr, #OUTSEGmovx dptr,amov dptr, #OUTBITmov a, r2movx dptr, a ; 显示一位八段管mov r6, #1call Delaymov a, r2 ; 显示下一位rr amov r2, ainc r0djnz r1, LoopretTestKey:mov dptr, #OUTBITmo
9、v a, #0movx dptr, a ; 输出线置为 0mov dptr, #INmovx a, dptr ; 读入键状态cpl aanl a, #0fh ; 高四位不用retKeyTable: ; 键码定义db 16h, 15h, 14h, 0ffhdb 13h, 12h, 11h, 10hdb 0dh, 0ch, 0bh, 0ahdb 0eh, 03h, 06h, 09hdb 0fh, 02h, 05h, 08hdb 00h, 01h, 04h, 07hGetKey:mov dptr, #OUTBITmov P2, dphmov r0, #Low(IN)mov r1, #00100000
10、bmov r2, #6KLoop:mov a, r1 ; 找出键所在列cpl amovx dptr, acpl arr amov r1, a ; 下一列movx a, r0cpl aanl a, #0fhjnz Goon1 ; 该列有键入djnz r2, KLoopmov r2, #0ffh ; 没有键按下, 返回 0ffhsjmp ExitGoon1:mov r1, a ; 键值 = 列 X 4 + 行mov a, r2dec arl arl amov r2, a ; r2 = (r2-1)*4mov a, r1 ; r1 中为读入的行值mov r1, #4LoopC:rrc a ; 移位找
11、出所在行jc Exitinc r2 ; r2 = r2+ 行值djnz r1, LoopCExit:mov a, r2 ; 取出键码mov dptr, #KeyTablemovc a, a+dptrmov r2, aWaitRelease:mov dptr, #OUTBIT ; 等键释放clr amovx dptr, amov r6, #10call Delaycall TestKeyjnz WaitReleasemov a, r2retSTART:MOV SP, #60HMOV IE, #0 ; DISABLE ALL INTERRUPTMOV TMOD,#020H ; 定时器 1 工作于方
12、式 2 (8 位重装)MOV TH1, #0F3H ; 波特率?2400BPS 12MHzMOV TL1, #0F3HANL PCON,#07FH ; SMOD 位清零orl PCON,#80hMOV SCON,#050H ; 串行口工作方式设置MOV LEDBuf, #0ffh ; 显示 8.8.8.8.mov LEDBuf+1, #0ffhmov LEDBuf+2, #0ffhmov LEDBuf+3, #0ffhmov LEDBuf+4, #0mov LEDBuf+5, #0SETB TR1SETB ESSETB EA;mov sbuf,a;jnb ti,$MLoop:jb HasRcv
13、, RcvData ; 收到数据?call DisplayLED ; 显示call TestKey ; 有键入?jz MLoop ; 无键入, 继续显示call GetKey ; 读入键码anl a, #0fh ; 通讯口输出键码MOV SBUF,ALJMP MLoopRcvData:clr HasRcv ; 是mov a, RcvBuf ; 显示数据mov b,aanl a,#0fh ; 显示低位mov dptr, #LEDMapmovc a, a+dptrmov LEDBuf+5, amov a,bswap a ; 显示高位anl a,#0fhmov dptr, #LEDMapmovc a, a+dptrmov LEDBuf+4, aljmp MLoopEND六、实验后的心得体会