当前位置:文档之家› 实验一 数字量输入输出实验

实验一 数字量输入输出实验

实验一数字量输入输出实验
一、实验目的
1.熟悉教学板电路及其结构。

2.掌握利用μVision C51 软件编辑、调试(包括仿真调试、单步调试)、运行单片机
程序的步骤和方法,掌握利用STC-ISP V39软件和下载线将程序写入单片机的方
法。

3.通过实验熟悉51单片机的并行I/O口,并掌握它们的应用。

4.掌握矩阵键盘、LED动态显示的工作原理。

二、实验设备
PC机一台、实验教学板一块。

三、实验准备
1.阅读实验讲义附录一、实验教学板电路图和附录二、μVision软件使用说明
2.按实验题目要求设计好硬件电路,画出电路原理图,设计出相应程序,并给程序加
上较详细的注释。

四、实验内容
1. 1.实验线路如附图所示,51单片机的P0口输出接8个发光二极管的阴极,P
2.4经
NPN三极管9011控制发光管的阳极。

P3口支持一个8位行列式键盘,其中P3.4~P3.7
供键盘扫描输出,P3.2、P3.3作键盘扫描输入。

2.实验要求:编程实现键盘对发光二极管的控制,每按一个按键,使对应的二极管点
亮。

2.51单片机P0口输出同时接4个数码管的阴极,P2.0~P2.3,经NPN三极管9011接数码管的阳极,该端口用于分别控制相应数码管的导通。

实验要求:编程实现对任意按键动作的次数进行计数(最大99次),同时将计数值实时显示。

五、实验步骤
1.将实验板与PC机通过COM口连接。

启动PC机,进入μVision软件环境,选择建立
新工程文件,即可开始输入源程序。

2.完成汇编、编译、连接,若有错误,则修改源程序,直至编译、连接通过为止。

3.接上实验板上的电源。

3.运行“STC-ISP V39.EXE”,将程序代码下载到实验板的单片机中。

操作的顺序是:1)选择单片机(MCU TYPE)型号。

如:“STC89C51RC”要与实验板上所装单片机的型号一至。

2)打开文件(Open File)。

即把要下载到单片机的程序文件(已通过编译了的机器码文件——二进制(.Bin)或十六进制(.Hex)的)调到“文件缓冲区”,这时可看到右边的“文件缓冲
区”有数字变化。

3)选择串行通信口。

选对时,软件上的小灯会变绿。

否则小灯是灰色。

且在左下窗口提示“出错信息”。

4)下载:按“Download/下载”按键下载。

5)把实验板上的供电的直流电源拔掉或关掉3秒钟再插入或打开电源(为单片机上电复位)。

注意: 4)和5)顺序不能反!
4.观察单片机运行情况,验证程序是否能完成题目给出的控制要求,若不能达到要求,分析原因、查找错误,修改源程序,再次汇编、连接,重新下载、运行,直至达到题目的控制要求。

六、参考程序流程图
实验内容1流程图
实验内容2流程图
键盘处理程序流程图
七、思考题
1.在调试程序过长中,你是如何发现程序中的错误?
2.按键程序为什么要有去抖动功能,如何去抖动?
3. 在显示时,为什么要延时1ms,这个时间过长或过短,会出现什么现象?
参考程序:
1---1:
ORG 0000H
MOV P0,#0FFH ;将P2.4置1
MOV P2,#10H ;将P0口置1,关闭全部LED灯
START:LCALL KEYBOARD ;三字节长调用指令,调用KEYBOARD子程序MOV A,R2 ;将R2的值赋给累加器A
JZ START ;A=0时跳转至START
MOV A,R0 ;将RO的值赋给累加器A
DEC A ;A<-A-1
MOV DPTR,#TABLE ;指向表格地址
MOVC A,@A+DPTR ;查表得键码
MOV P0,A ;将累加器A的值赋给PO口
LJMP START ;跳转至START
TABLE: DB 0FEH,0EFH,0FDH,0DFH
DB 0FBH,0BFH,0F7H,07FH
KEYBOARD: MOV P3,#0FFH ;设置P3为0FFH
MOV R2,#4 ;循环次数
MOV R1,#0EFH ;键盘扫描值
MOV R0,#0 ;初始键值
KEY1: MOV A,R1 ;将R1的值赋给累加器A
MOV P3,A ;将A的值赋给P3口,即将R1的值赋给P3口
MOV A,P3 ;将P3口的值赋给累加器A
ANL A,#0FH ;通过逻辑与,取低四位
CJNE A,#0FH,KEY2 ;数值比较转移指令,不相等则转移,相等则顺序执行
MOV A,R0 ;R0<-R0+2
ADD A,#02H
MOV R0,A
MOV A,R1 ;R1循环左移一位
RL A
MOV R1,A
DJNZ R2,KEY1 ;R2<-R2-1,R2不等于0时原地踏步,KEY1代表PC当前值RET
KEY2: LCALL DELAY ;延时
JNB ACC.3,LOOP1 ;P3.3=0,则执行R0<-R0+1的指令
JNB ACC.4,LOOP2 ;P3.4=0,则执行R0<-R0+2的指令
LOOP1:MOV A,R0 ;R0<-R0+1
INC A
MOV R0,A
RET
LOOP2:MOV A,R0 ;R0<-R0+2
ADD A,#02H
MOV R0,A
RET
Delay: MOV R7,#20 ;延时10ms
Dela: MOV R6,#248
DJNZ R6,$ ;R6不为0,原地踏步,$代表PC当前值
DJNZ R7,Dela ;R7不为0,继续延时
RET ;返回
END
1---2
ORG 00H
START: MOV SP,#5FH ;设置栈顶指针
MOV R0,#0 ;将立即数0赋给R0,以R0记录按键次数
KEY1: MOV P3,#0F0H ;按键扫描
MOV A,P3 ;将P3口读到的值赋给累加器A
CPL A ;A取反
ANL A,#0F0H ;通过逻辑与运算,取得A的高四位
JZ MAIN ;没按键时跳转,显示初值00
LCALL Delay1 ;延时消除抖动
KEY2: MOV A,P3 ;将P3口读到的值赋给累加器A
CPL A ;A取反
ANL A,#0F0H ;通过逻辑与运算,取得A的高四位
JNZ KEY2 ;有按键时跳转,显示按键次数
LCALL Delay1 ;延时消除抖动
INC R0 ;按键次数加1
CJNE R0,#64H,MAIN ;总按键次数小于100时跳转
SJMP START ;跳转回START
MAIN: MOV A,R0 ;将R0赋给累加器A
MOV B,#10 ;将立即数10赋给B
DIV AB ;除法指令,A储存A/B的商,B储存A/B的余数,商表示十位数,余数表示个位数
ACALL KEY3 ;调用子程序KEY3
MOV P2,#01H ;打开数码管位选(十位数)
MOV P0,A ;将A的值赋给P0口,即送段选,数码管显示相应的数字
ACALL Delay2 ;延时1ms
MOV A,B ;将B(余数)赋给累加器A
ACALL KEY3 ;调用子程序KEY3
MOV P2,#02H ;打开数码管位选(个位数)
MOV P0,A ;将A的值赋给P0口,即送段选,数码管显示相应的数字ACALL Delay2 ;延时1ms
AJMP KEY1 ;跳转回KEY1
KEY3: MOV DPTR,#TABLE ;根据键值查的对应的点亮数码管的码值MOVC A,@A+DPTR
RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H ;点亮数码管0~9的对应码值DB 92H,82H,0F8H,80H,90H
Delay1: MOV R6,#20 ;延时10ms子程序
Dela1: MOV R7,#248
DJNZ R7,$
DJNZ R6,Dela1
RET
Delay2: MOV R6,#2 ;延时1ms子程序
Dela2: MOV R7,#250
DJNZ R7,$
DJNZ R6,Dela2
RET
END。

相关主题