南昌大学实验报告
学生姓名:曾华兆学号:6110116078 专业班级:电子163班
实验类型:⃞验证⃞综合⃞设计⃞创新实验日期:2018.6.1 实验成绩:
实验七单片机串口通信实验
(一)实验目的
掌握单片机双机或多机通信工作原理,熟练掌握单片机通信编程。
掌握单片机定时器的初始化和定时模式编程。
(二)设计要求
串口全双工中断方式收发通讯。
串口设置为:115200/8/n/1。
通过单片机(或者是PC)向单片机发送数据,单片机收到后通过串口把收到的数据原样返回。
(三)实验原理
MCS-51 串行口的结构、原理及各种工作方式参阅教材相关内容。
本实验使用串行口工作方式 1,通过定时器 1(T1)产生波特率时钟,通过查询串行口收发中断标志 RI 和 TI 来判断单片机串行口数据收发的状态。
(四)实验设备
STC高性能单片机实验箱、电脑(软件:Keil uVision5、stc-isp-15xx-v6.86J)
(五)实验结果
(六)结果讨论与心得体会
本次实验中解决了如何判断数据是发送还是接收的问题和如何判断数据是否发送或接受完成的问题,通过实验中的讨论和研究书.上关于串行口的内容,我们通过中断标志位和循环很好的解决了这个问题。
这个实验让我认识到单片机中中断的巨大作用,它不仅可以省去很多繁琐的设计步骤,还可以帮助我们解决许多设计上的问题。
另外,我觉得这是一次较为综合性的实验,按键,消抖,数码管显示,定时,串行口中断,串行口数据的收发这些内容都在本次实验中体现出来了,也算是让我们进行了一个小复习,让我们站在一个更高的平台上去编写程序。
(七)附录:实验源代码
AUXR EQU 08EH
P1M0 EQU 91H
P1M1 EQU 92H
P4 DATA 0C0H
P5 DATA 0C8H
P_HC595_SER BIT P4.0 ;
P_HC595_RCLK BIT P5.4 ;
P_HC595_SRCLK BIT P4.3 ;
LED8 DATA 30H ;
display_ index DATA 38H ; ORG 0000H
AJMP MAIN
ORG 000BH
LJMP Timer0_Interrupt
ORG 0023H
LJMP Serial_ ISR
ORG 0100H
MAIN:LCALL LED_INIT MOV display_ index, #7
MOV TL0,#0BFH
MOV TH0,#0FFH
MOV SCON,#50H
//ANL AUXR,#0BFH
MOV AUXR,#00H
MOV TMOD,#00H
MOV TL1,#0FEH
MOV TH1,#0FFH
CLR ET1
SETB ET0
SETB TR0
SETB TR1
SETB ES
SETB EA
CLR TI
CLR RI
KEY_UP:
LCALL KS
JNZ S1
AJMP KEY_UP
S1: LCALL DELAY_10MS LCALL KS
JNZ S2
AJMP KEY_UP
S2: MOV R2,#0FEH
MOV R4,#00H
S3: MOV P0,R2
JB P0.4,L1
MOV A,#0
AJMP LK
L1: JB P0.5,L2
MOV A,#4
AJMP LK
L2: JB P0.6,L3
MOV A,#8
AJMP LK
L3: JB P0.7,NEXT
MOV A,#12
LK: ADD A,R4
MOV SBUF,A
MOV B, #10
DIV AB
MOV LED8+6, A ;
MOV LED8+7, B
NEXT:INC R4
MOV A,R2
JNB ACC.3,S4
RL A
MOV R2,A
AJMP S3
S4:LCALL KS
JNZ S4
AJMP KEY_UP
KS:MOV P0,#0F0H
MOV A,P0
XRL A,#0F0H
RET
DELAY_10MS:
MOV R5,#2
DELAY10MS1:
MOV R6,#250
DJNZ R6,$
DJNZ R5,DELAY10MS1
RET
T_ Display:
DB 03FH,006H,05BH,04FH,066H,06DH,07DH,007H,07FH,06FH T_COM:
DB 001H,002H,004H,008H,010H,020H,040H,080H
F_Send_595:
MOV R2, #8
L_Send_595_Loop:
CLR C
RLC A
MOV P_HC595_SER,C
SETB P_HC595_SRCLK
CLR P_HC595_SRCLK
DJNZ R2, L_Send_595_Loop
RET
PTR, #T_COM
MOV A,F_ DisplayScan:
MOV D display_ index
MOVC A, @A+DPTR
CPL A
LCALL F_Send_595
MOV DPTR, #T_ Display
MOV A, display_ index
ADD A, #LED8
MOV R0, A
MOV A, @R0
MOVC A, @A+DPTR LCALL F_Send_595
SETB P_HC595_RCLK CLR P_HC595_RCLK
DEC display_ index
MOV A, display_ index CJNE A,#5,F_DisplayScan MOV display_ index, #7; RET
LED_INIT: MOV LED8,#0 MOV LED8+1,#0
MOV LED8+2,#0
MOV LED8+3,#0
MOV LED8+4,#0
MOV LED8+5,#0
MOV LED8+6,#0
MOV LED8+7,#0
RET
Serial_ ISR: JB RI,R_DATA JB TI,T_DATA SJMP ISR_OUT
T_DATA: CLR TI
SJMP ISR_OUT
R_DATA: CLR RI
MOV A,SBUF
PUSH ACC
MOV B,#16
DIV AB
MOV LED8+6, A
MOV LED8+7, B
POP ACC
MOV SBUF,A
ISR_OUT: RETI
Timer0_Interrupt:
PUSH PSW
PUSH ACC
LCALL F_ DisplayScan POP ACC
POP PSW
RETI。