1、实验三 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
2、 的扩展方法。 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 DEL
3、20 ms ;延时 20 ms 去抖动SKEY:MOV A,#00 ;下面进行行扫描,1 行 1 行扫MOV R0,A ;R0 作为行计数器,开始为 0MOV R1,A ;R1 作为列计数器,开始为 0MOV R3 #0FEH ;R3 暂存行扫描字,低 4 位为行扫描字SKEY2:MOV A,R3MOV P1,A ;输出行扫描字,高 4 位全 1NOPNOPNOP MOV A,P1 ;读列值MOV R1,A ;暂存列值ANL A,#0F0H ;取列值CPL A ;高电平则有键闭合S123:JNZ SKEY3 ;有键按下转 SKEY3INC R0 ;行计数器加 1SETB C ;准备将行扫描左移
4、 1 位,;形成下一行扫描字,C=1 保证输出行扫描字中高 4 位全为 1,;为列输入作准备,低 4 位中只有 1 位为 0MOV A,R3 ;R3 带进位 C 左移 1 位RLCAMOV R3,A ;形成下一行扫描字R3MOV A,R0CJNE A,#04H,SKEY1 ;最后一行扫(4 次)完了吗?EKEY:RET;列号译码SKEY3:MOV A,R1JNB ACC.4,SKEY5JNB ACC.5,SKEY6JNB ACC.6,SKEY7JNB ACC.7,SKEY8AJMP EKEYSKEY5:MOV A,#00HMOV R2,A ;存 0 列号AJMP DKEYSKEY6:MOV A
5、,#01HMOV R2,A ;存 1 列号AJMP DKEYSKEY7:MOV A,#02HMOV R2,A ;存 2 列号AJMP DKEYSKEY8:MOV A,#03HMOV R2,A ;存 3 列号AJMP DKEY;键位置译码DKEY: MOV A,R0 ;取行号ACALL DECODEAJMP EKEY;键值(键号)译码DECODE:MOV A,R0 ;取行号送 AMOV B,#04H ;每一行按键个数MUL AB ;行号按键数ADD A,R2 ;行号按键数+列号= 键值RET实验 2根据 TD-NMC+实验平台的单元电路,构建一个硬件系统,并编写实验程序实现如下功能:将 P3.3
6、 口作状态输入口(接一个逻辑开关,即拨码开关) ,P1 口做输入口(接八只发光二极管 D0D7) 。当 P3.3=1 时循环轮流点亮一个 LED 灯;当 P3.3=0 时循环轮流点亮相邻两个 LED 灯。 程序如下:BUFF EQU 30H KEYADR:MOV A,BUFF ;键号ACJNE A,0FH,KYARD1AJMP DIGPRO ;等于 F,转数字键处理KYARD1:JC DIGPRO ;小于 F,转数字键处理KEYTBL:MOV DPTR,JMPTBL ;送功能键地址表指针CLR C ;请进位位SUBB A,10H ;功能键值(10H 1FH)减 16RL A ;(A )2,使(
7、A )为偶数:0, 2,4,JMP ADPTR ;转相应的功能键处理程序JMPTBL: AJMP AAAAJMP BBBAJMP CCCAJMP DDDAJMP EEEAJMP FFFAJMP GGGAJMP HHHAJMP IIIAJMP JJJJAJMP KKKAJMP LLLAJMP MMMAAA:DIS: MOV R0,#7EH ;显示缓冲区末地址R0MOV R2,#01H ;位控字,先点亮最低位(右边)MOV A,R2MOV DPTR,#TAB ;字型表头地址DPTRLP0: MOV P1,AMOV A,R0 ;取显示数据MOVC A,A+DPTR ;取出字形码MOV P0,A ;送
8、出显示ACALL D1MS ;调延时子程序DEC R0 ;数据缓冲区地址减 1MOV A,R2JB ACC.5,LP1 ;扫描到最左面的显示器了吗 ?RL A ;没有到,左移 1 位MOV R2,AAJMP LP0LP1: RETTAB: DB 3FH,06H,5BH,4FH,66H ,6DH,7DH ,07H ,7FHDB 6FH,77H,7CH, 39H ,5EH ,79H,71H,40H,00HD1MS: MOV R7,#02H ;延时 1 ms 子程序DL: MOV R6,#0FFHDL1: DJNZ R6,DL1DJNZ R7,DLRET4.1.5 实验单元电路及连线开关及 LED
9、显示单元4.1.6 实验说明1、 P1 口是准双向口,作输出口时与一般的双向口使用方法相同。由准双向口结构可知当 P1 口作输入口时,必须先对它置高电平,同时内接上拉电阻(20K40 K) ,使内部 MOS 截止,这样对外部输入不会产生影响,否则会使读入的数据不正确。 2、 由于机械键盘的抖动作用,常常通过硬件 RS 或软件延时的方法去除机械抖动。使用软件延时方法时注意延时子程序的编写。 3、 发光二极管的需要 510mA 的驱动电流,1.72.4V 的驱动电压。 4、循环轮流点亮 LED,可以通过循环移位指令实现。 4.1.7 思考题1. 8051 系列单片机的四个并行口可以作准双向 I/O
10、 使用,当它们作为输入口时,必须先向端口输入高电平,为什么?解: I/O 是开漏的,如果输入低电平,该口无论输入高低电平都会被拉至低,所以电平,也就无法正确识别输入电平。 2. 编写按键(如拨码开关)程序时,应注意什么问题?解:根据不同的拨码开关状态,在程序里写相应拨码开关的程序。3. 若系统晶振为 12MHz,试编写一个延时 10ms 的程序段。 MOV R5,#5D1: MOV R6,#4D2: MOV R7,#248DJNZ R7,$ DJNZ R6,D2DJNZ R5,D1RET 4. 本实验中,允许单片机的 I/O 口直接驱动 LED 灯,为什么? 解:单片机的 I/O 口的高电平接近电源电压+5V,而发光二极管的工作电压为 2V 以下,因此需要串接降压电阻,但在此实验中使用低电平驱动,所以允许单片机的 I/O 口直接驱动 LED 灯。