一、实验目的
- 学习51单片机串行口的工作原理及使用方法。
- 学习51单片机串行口的初始化程序、应用程序的编写和调试。
二、实验说明
本实验1通过单片机的串行口进行通信,通过本机向自身传送数据:TXD端进行发送,RXD端进行接收。通过检测开关状态,将开关编号存入内部数据存储器并在数码管上显示,同时记录开关总次数存入工作寄存器,并通过本机的串口发送和接收开关编号。实验2通过单片机的串行口进行双机通信,由甲机将开关编号和开关动作的总次数发往乙机。通过本实验学生可以掌握单片机串口的工作原理及使用方法以及串口的初始化程序、应用程序的编写和调试。实验1必做,实验2选做。
三、实验内容
1、P1.0-P1.7作为输入口拨动开关K1-K8,每当开关按下时,
1)将开关编号(0—7)存入内部数据存储器,要求存入的开关编号数据不少于10个,存储空间自定;
2)采用工作寄存器记录开关动作总次数;
3)通过本机的TXD和RXD进行串行通信,发送开关编号,接收的数据存入另一内部数据存储器,存储空间自定(不能重叠),要求采用方式1,波特率为4800b/s,fosc=11.0592MHz;
4)将接收到的数据显示在LED数码管。
个人解析:每次按下开关后将变量加1,并通过自机收发点亮相应的led数量
2、双机通信:(双机共地)
1)甲机P1.0–P1.7作输入口接拨动开关S0–S7,每当有开关动作(低电平)
A、将开关编号(0—7)存入内部数据存储器,开关编号数据显示在LED数码管上。
B、采用工作寄存器记录开关动作总次数,数据以二进制形式显示在LED上。
C、通过本机的TXD发送开关编号及开关动作总次数,要求采用方式3,奇校验,波特率为2400b/s,fosc=11.0592MHz;
2)乙机通过本机的RXD接收甲机发送的开关编号及开关动作总次数数据,要求采用方式3,奇校验,波特率为2400b/s,fosc=11.0592MHz;将接收到的开关编号数据显示在LED数码管,开关动作总次数数据以二进制形式显示在LED上。
编写初始化程序和中断服务程序,在实验板上调试通过。将接收和发送互换,将波特率改为9600b/s,完成上述双机通信任务。
PS
作者使用的是普中A2板子,因此IO口已经固定接了电子元件,读者可以通过代码开头的伪代码自己修改电子器件接哪个I/O口
由于时间以及精力的不足,本次实验只做了必做题目。
实验1
SWITCH EQU P3
LED EQU P2
TUBE EQU P0
ORG 0000H
AJMP MAIN
ORG 0023H
AJMP TRXSVE
ORG 0030H
MAIN:
MOV TMOD,#20H
MOV TH1,#0FAH
MOV TL1,#0FAH
SETB TR1
MOV SCON,#50H
MOV PCON,#00H
SETB EA
SETB ES
MOV R7, #00H
WATING_SWITCH:
MOV SWITCH, #0FFH
MOV A, SWITCH
CJNE A, #0FFH,GET_SWITCH_VALUE
SJMP WATING_SWITCH
GET_SWITCH_VALUE:
LCALL DELAY10MS
MOV A, SWITCH
CJNE A, #0FFH, WATING_SWITCH
;以上为基本的串口配置以及按键消抖,可以参考往期文章
INC R7
MOV SBUF, R7
;以SBUF为目的的指令会自动开启发送
JNB TI,$
;等待TI,发送标志位置1,表示发送完成。
CLR TI
;发送完成后需手动清零TI位,否则会一直触发中断
SJMP WATING_SWITCH
SJMP $
TRXSVE:
JB TI, BACK
;RI,TI中有一位为1就会触发中断,因此需要判断是否是接受位触发的中断
MOV A, SBUF
CPL A
CLR RI
;接收完信息后要手动清零,原因同上
MOV LED, A
BACK:
RETI
RET
DELAY10MS: ;@11.0592MHz
MOV 30H,#18
MOV 31H,#230
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
RET
END
实验现象
将P3.1与P3.0口连接后,按下开关led灯会以二进制显示按下的次数,断开这两个口,按键按下后led无变化。