实验六 串行口实验
一、实验目的
- 学习MCS-51串行口的工作原理及使用方法
- 学习MCS-51串行口的初始化程序、应用程序的编写和调试
二、实验仪器
- 普中A2开发板(STC89C52)
- keil5
- stc-isp
三、实验内容
-
矩阵按键作输入口,每当有按键按下时
1)将开关编号(0-F)存入内部数据存储器
2)通过本机的TXD和RXD进行串行通信,发送开关编号,接收的数据存入另一内部数据存储器, 要求采用方式1,波特率为4800b/s,fosc=11.0592MHz;
3)将接收到的数据显示在LED数码管。
四、流程框图
五、实验程序
ORG 0000H
LJMP START
ORG 0023H
LJMP UARTSVE
ORG 1000H
START:
KEY_VALUE EQU R0 ;R0 存储键值
RX_SBUF EQU R1 ;
ACALL UARTINIT ;串口初始化
MAIN:
ACALL KEYSCAN ;矩阵按键扫描
ACALL DTSEG ;数码管显示
AJMP MAIN ;主程序循环
UARTINIT:
ANL PCON, #7FH ;波特率不倍速
MOV SCON, #50H ;8位数据,可变波特率
ANL TMOD, #0FH ;清除定时器1模式位
ORL TMOD, #20H ;设定定时器1为8位重装方式
MOV TL1 , #0FAH ;设定定时器初值 波特率4800
MOV TH1 , #0FAH ;设定定时器重装值
CLR ET1 ;禁止定时器1中断
SETB TR1 ;启动定时器1
SETB EA ;打开中断
SETB ES ;允许串行口中断
RET
DTSEG:
MOV DPTR, #TAB1 ;指向字形码表首地址
MOV A , RX_SBUF ;
MOVC A , @A+DPTR ;
MOV P0 , A ;
RET
KEYSCAN: ;矩阵按键扫描
MOV P1 , #0FH ;进行列检测
MOV A , P1 ;读取P1的值
CJNE A , #0FH ,XD ;判断按键是否按下
RET
XD: ACALL DELAY10MS ;延时10ms进行消抖
MOV A , P1 ;再次读取按键的值
CJNE A , #0FH ,CSLIE ;再次检测键盘是否按下
RET
CSLIE: ;测试列
MOV P1 , #0FH ;
MOV A , P1 ;
LIE1: ;第一列
MOV C , P1.3 ;
JC LIE2 ;
MOV KEY_VALUE , #0 ;
LJMP CEHANG ;跳转到测试行
LIE2:
MOV C , P1.2 ;
JC LIE3 ;
MOV KEY_VALUE , #1 ;
LJMP CEHANG ;
LIE3:
MOV C , P1.1 ;
JC LIE4 ;
MOV KEY_VALUE , #2 ;
LJMP CEHANG ;
LIE4:
MOV C , P1.0 ;
JC CEHANG ;
MOV KEY_VALUE , #3 ;
LJMP CEHANG ;
CEHANG: ;测试行
MOV P1 , #0F0H ;
MOV A , P1 ;
HANG1:
MOV C , P1.7 ;第一行
JC HANG2
MOV A , #0 ;
ADD A , KEY_VALUE ;
MOV KEY_VALUE , A ;
LOOP1:
MOV C , P1.7 ;
JNC LOOP1 ;
LJMP PKEY
HANG2:
MOV C , P1.6 ;
JC HANG3 ;
MOV A , #4
ADD A , KEY_VALUE ;
MOV KEY_VALUE , A ;
LOOP2:
MOV C , P1.6 ;
JNC LOOP2 ;
LJMP PKEY
HANG3:
MOV C , P1.5 ;
JC HANG4
MOV A , #8
ADD A , KEY_VALUE ;
MOV KEY_VALUE , A ;
LOOP3:
MOV C , P1.5 ;
JNC LOOP3 ;
LJMP PKEY
HANG4:
MOV C , P1.4 ;
JC RETURN
MOV A , #12 ;
ADD A , KEY_VALUE ;
MOV KEY_VALUE , A ;
LOOP4:
MOV C , P1.4 ;
JNC LOOP4 ;
LJMP PKEY
PKEY:
ACALL KEY_P ;执行按键处理函数
RETURN:
RET
KEY_P:
MOV DPTR, #JPTAB ;指向转移指令表
MOV A , KEY_VALUE ;修正变址值
ADD A , KEY_VALUE ;因为AJMP指令有两个字节
JNC NADD ;判断是否有进位
INC DPH ;
NADD:
JMP @A+DPTR ;转向形成的散转地址
JPTAB:
AJMP PKEY0
AJMP PKEY1
AJMP PKEY2
AJMP PKEY3
AJMP PKEY4
AJMP PKEY5
AJMP PKEY6
AJMP PKEY7
AJMP PKEY8
AJMP PKEY9
AJMP PKEYA
AJMP PKEYB
AJMP PKEYC
AJMP PKEYD
AJMP PKEYE
AJMP PKEYF
PKEY0:
MOV SBUF, #00H;
RET
PKEY1:
MOV SBUF, #01H;
RET
PKEY2:
MOV SBUF, #02H;
RET
PKEY3:
MOV SBUF, #03H;
RET
PKEY4:
MOV SBUF, #04H;
RET
PKEY5:
MOV SBUF, #05H;
RET
PKEY6:
MOV SBUF, #06H;
RET
PKEY7:
MOV SBUF, #07H;
RET
PKEY8:
MOV SBUF, #08H;
RET
PKEY9:
MOV SBUF, #09H;
RET
PKEYA:
MOV SBUF, #0AH;
RET
PKEYB:
MOV SBUF, #0BH;
RET
PKEYC:
MOV SBUF, #0CH;
RET
PKEYD:
MOV SBUF, #0DH;
RET
PKEYE:
MOV SBUF, #0EH;
RET
PKEYF:
MOV SBUF, #0FH;
RET
UARTSVE:
JB RI , RXSVE
JB TI , TXSVE
RETI
RXSVE:
MOV RX_SBUF , SBUF
CLR RI
RETI
TXSVE:
CLR TI
RETI
DELAY10MS: ;@11.0592MHz
PUSH 30H
PUSH 31H
MOV 30H,#18
MOV 31H,#230
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
DELAY50MS: ;@11.0592MHz
PUSH 30H
PUSH 31H
MOV 30H,#90
MOV 31H,#158
NEXT1:
DJNZ 31H,NEXT1
DJNZ 30H,NEXT1
POP 31H
POP 30H
RET
DELAY1000MS: ;@11.0592MHz
PUSH 30H
PUSH 31H
PUSH 32H
MOV 30H,#8
MOV 31H,#1
MOV 32H,#236
NEXT2:
DJNZ 32H,NEXT2
DJNZ 31H,NEXT2
DJNZ 30H,NEXT2
POP 32H
POP 31H
POP 30H
RET
TAB1:;0 - F共阴极字形码
DB 03FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0-9
DB 77H,7CH,39H,5EH,79H,71H
DB 40H
END
六、程序分析
很简单,不想分析了😏😏😏