实验三P3.3口输入、P1口输出实验

更新时间:2024-04-19 11:14:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验三 4.1 P3.3口输入、P1口输出实验

系别专业:电子系12级电信2班 学号:3121003210

姓名:李书杰 指导老师:刘志群老师

4.1.1 实验要求

1. 复习 Keil C51调试硬件的操作方法。 2. 复习单片机作为通用 I/O口的注意事项。 3. 复习单片机操作 I/O口的程序设计方法。

4.1.2 实验设备

PC 机一台,TD-NMC+教学实验系统

4.1.3 实验目的

1. 熟悉单片机仿真实验软件 Keil C51调试硬件的方法。 2. 了解 P3、P1口作通用 I/O口的使用方法。 3. 掌握延时子程序的编写和使用方法。 4. 了解单片机对简单 I/O的扩展方法。

4.1.4 实验内容

实验 1

根据TD-NMC+实验平台的单元电路,构建一个硬件系统,并编写实验程序实现如下功能:将 P1口的低 4位定义为输出,高 4位定义为输入,数字量从 P1口的高 4位输入,从 P1口的低 4位输出控制发光二极管的亮灭。 程序如下:

KEY: MOV P1,#0F0H ;令所有行为低电平 KEY1:MOV R7,#0FFH ;设置计数常数 DJNZ R7,KEY1 ;延时

MOV A, P1 ;读取P1口的列值 ANL A,#0F0H ;判别有键值按下吗?

CPL A ;求反后,有高电平就有键按下 JZ EKEY ;无键按下时退出 LCALL DEL20 ms ;延时20 ms去抖动

SKEY:MOV A,#00 ;下面进行行扫描,1行1行扫 MOV R0,A ;R0作为行计数器,开始为0 MOV R1,A ;R1作为列计数器,开始为0

MOV R3 #0FEH ;R3暂存行扫描字,低4位为行扫描字 SKEY2:MOV A,R3

MOV P1,A ;输出行扫描字,高4位全1 NOP NOP

NOP

MOV A,P1 ;读列值 MOV R1,A ;暂存列值

ANL A,#0F0H ;取列值 CPL A ;高电平则有键闭合 S123:JNZ SKEY3 ;有键按下转SKEY3 INC R0 ;行计数器加1 SETB C ;准备将行扫描左移1位,

;形成下一行扫描字,C=1保证输出行扫描字中高4位全为1, ;为列输入作准备,低4位中只有1位为0 MOV A,R3 ;R3带进位C左移1位 RLC A MOV R3,A ;形成下一行扫描字→R3 MOV A,R0 CJNE A,#04H,SKEY1 ;最后一行扫(4次)完了吗? EKEY:RET ;列号译码

SKEY3:MOV A,R1 JNB ACC.4,SKEY5 JNB ACC.5,SKEY6 JNB ACC.6,SKEY7 JNB ACC.7,SKEY8 AJMP EKEY SKEY5:MOV A,#00H MOV R2,A ;存0列号 AJMP DKEY SKEY6:MOV A,#01H MOV R2,A ;存1列号 AJMP DKEY SKEY7:MOV A,#02H MOV R2,A ;存2列号 AJMP DKEY SKEY8:MOV A,#03H MOV R2,A ;存3列号 AJMP DKEY ;键位置译码

DKEY: MOV A,R0 ;取行号 ACALL DECODE AJMP EKEY ;键值(键号)译码

DECODE:MOV A,R0 ;取行号送A MOV B,#04H ;每一行按键个数 MUL AB ;行号×按键数 ADD A,R2 ;行号×按键数+列号=键值 RET

实验 2

根据TD-NMC+实验平台的单元电路,构建一个硬件系统,并编写实验程序实现如下功能:将 P3.3口作状态输入口(接一个逻辑开关,即拨码开关),P1口做输入口(接八只发光二极管D0~D7)。当 P3.3=1时循环轮流点亮一个 LED灯;当 P3.3=0时循环轮流点亮相邻两个LED灯。 程序如下:

BUFF EQU 30H

KEYADR:MOV A,BUFF ;键号→A CJNE A,#0FH,KYARD1

AJMP DIGPRO ;等于F,转数字键处理 KYARD1:JC DIGPRO ;小于F,转数字键处理 KEYTBL:MOV DPTR,#JMPTBL ;送功能键地址表指针 CLR C ;请进位位

SUBB A,#10H ;功能键值(10H~1FH)减16 RL A ;(A)×2,使(A)为偶数:0,2,4,… JMP @A+DPTR ;转相应的功能键处理程序 JMPTBL: AJMP AAA AJMP BBB AJMP CCC AJMP DDD AJMP EEE AJMP FFF AJMP GGG AJMP HHH AJMP III AJMP JJJJ AJMP KKK AJMP LLL AJMP MMM AAA:

DIS: MOV R0,#7EH ;显示缓冲区末地址→R0 MOV R2,#01H ;位控字,先点亮最低位(右边) MOV A,R2 MOV DPTR,#TAB ;字型表头地址→DPTR LP0: MOV P1,A MOV A,@R0 ;取显示数据 MOVC A,@A+DPTR ;取出字形码 MOV P0,A ;送出显示 ACALL D1MS ;调延时子程序 DEC R0 ;数据缓冲区地址减1 MOV A,R2 JB ACC.5,LP1 ;扫描到最左面的显示器了吗? RL A ;没有到,左移1位 MOV R2,A AJMP LP0

LP1: RET

TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH DB 6FH,77H,7CH, 39H,5EH,79H,71H,40H,00H D1MS: MOV R7,#02H ;延时1 ms子程序 DL: MOV R6,#0FFH DL1: DJNZ R6,DL1 DJNZ R7,DL RET

4.1.5 实验单元电路及连线

开关及 LED显示单元

4.1.6 实验说明

1、 P1口是准双向口,作输出口时与一般的双向口使用方法相同。由准双向口结构可知当 P1口作输入口时,必须先对它置高电平,同时内接上拉电阻(20KΩ~40 KΩ),使内部MOS截止,这样对外部输入不会产生影响,否则会使读入的数据不正确。

2、 由于机械键盘的抖动作用,常常通过硬件 RS或软件延时的方法去除机械抖动。使用软件延时方法时注意延时子程序的编写。

3、 发光二极管的需要5~10mA的驱动电流,1.7~2.4V的驱动电压。 4、循环轮流点亮LED,可以通过循环移位指令实现。

4.1.7 思考题

1. 8051系列单片机的四个并行口可以作准双向 I/O使用,当它们作为输入口时,必须先向端口输入高电平,为什么?

解: I/O是开漏的,如果输入低电平,该口无论输入高低电平都会被拉至低,所以电平,也就无法正确识别输入电平。

2. 编写按键(如拨码开关)程序时,应注意什么问题?

解:根据不同的拨码开关状态,在程序里写相应拨码开关的程序。 3. 若系统晶振为12MHz,试编写一个延时 10ms的程序段。 MOV R5,#5 D1: MOV R6,#4 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET

4. 本实验中,允许单片机的 I/O口直接驱动 LED灯,为什么?

解:单片机的I/O口的高电平接近电源电压+5V,而发光二极管的工作电压为2V以下,因此需要串接降压电阻,但在此实验中使用低电平驱动,所以允许单片机的 I/O口直接驱动 LED灯。

本文来源:https://www.bwwdw.com/article/86fp.html

Top