单片机 C51 AAU_CS

👉免费下载 👈之前上课老师给的源码. 不下白不下. 0积分即可下载. 此文章排版极不优雅🤡, 强烈建议配合源码使用👍👍👍

实验 01 清零和分支程序设计、Keil的使用

1、 实验目的

  1. 掌握汇编语言设计和调试方法

  2. 熟悉Keil uVision4的使用

  3. 熟悉八位数的拆分方法

  4. 掌握存储器读写方法

  5. 了解存储器的块操作方法
    2、 实验内容

  6. 清零程序

  7. Keil uVision4的安装及使用

  8. 条件分支程序的编写
    3、实验步骤

  9. 清零程序
    仔细阅读下列程序,把2000H~20FFH单元内容清零,写出前三次运行(循环)到对应位置时以下各存储单元的值

  10. Keil uVision4的安装及使用
    说明:为了方便同学们课后用自己的电脑使用Keil软件,本实验指导书参照最新的Keil C51 uVersion 4版本编写。实验室使用的是版本和实验指导书中的Keil C51,在界面上,稍有不同,但不影响使用。
     Keil C51的安装
    在网上下载【Keil C51 V9.00 】的破解版
    点击C51V900安装即可。如需破解,使用注册机。
     在Keil中使用汇编语言
    如下图所示,Keil的界面如下
    Keil以项目方式进行管理,各种C51源程序、汇编源程序、头文件等都放在项目文件里统一管理。
    使用时过程一般如下步骤:
    a) 建立项目文件
    b) 给项目添加程序文件
    c) 编译、连接项目,形成目标文件
    d) 运行调试观察结果
    本实验以清零程序为例,描述Keil的使用过程
     建立项目文件
    在编辑模式下,选择【Project】菜单下的【New uvision Project】命令
    弹出如图所示的Create new Project对话框,输入新建项目文件的名称,项目文件类型固定为uvproj文件。如图所示,本实验保存项目名称为1-1.uvproj(注:保存在shiyan01的文件夹下,以后每个实验保存为一个文件夹,切记)
    单击【保存】按钮将弹出如所示的Select Device for Target 'Target 1’对话框,用户可以根据使用情况选择单片机型号,如选择Atmel公司的AT89C51或AT89C52
    点【ok】按钮后,提示是否采用8051的启动代码。本实验系统都是自己编写的汇编或C语言代码,所以无需标准代码,点击【否】
     给项目添加程序文件
    点击菜单【File】【new】,默认的程序文件名是text1,如图所示
    在Text1处编写清零程序的代码
    ORG 0000H
    LJMP SE01
    ORG 0640H
    SE01: MOV R0,#00H ; R0=
    MOV DPTR,#2000H ; DPTR=
    LOO1: MOV A,#22H ; A=
    MOVX @DPTR,A ; @DPTR=
    INC DPTR
    INC R0
    CJNE R0,#00H,LOO1
    LOOP: SJMP LOOP
    END
    点击菜单【File】【save as】,将此文件保存为 1-1.asm,如下图所示。请注意不能省略文件的扩展名。
    注:如果编写的是C语言文件,保存为***.c即可,编译器根据扩展名自动识别是C语言还是汇编
    程序文件已经建立好后,在项目管理器窗口中,展开Target1项,可以看到Source Group1子项。右击Source Group1,在出现如图所示的菜单中选择Add Files to Group 'Source Group1’命令。
    弹出如图所示的Add Files to Group 'SourceGroup1’对话框。在对话框中选择需要添加的程序文件,单击Add按钮,把所选文件添加到项目文件中。
     编译文件1-1.asm(生成可执行文件1-1.hex)
    右键点击 Target1,在弹出的菜单中选择【Options for Target1】,如图所示
    在弹出的对话框中,选择【Output】标签
    勾选上Create HEX File 选项,如图所示,点击【ok】按钮
    右键单击文件名,在菜单中选择【Build target】可以编译整个项目,如果文件没有语法错误,则编译能通过。
    当文件出现错误,需要修改语句,如下图所示:
     调试程序文件
    点击菜单【Debug】【Start/Stop Debug Session】,进入调试界面
    A. 调试工具栏的使用:
    从 左到右依次是复位、运行、暂停、单步跟踪、单步、执行完当前子程序、运行到当前行
    请注意:
    单步(快捷键F10)
    step over:单步执行一行程序。如果当前语句是函数调用,则执行完该函数并返回到下一条语句。
    单步跟踪(快捷键F11)
    step:单步执行一行程序。如果当前语句包含函数调用,则执行进入该函数后,仍然单步执行一行程序。
    运行(快捷键F5)
    Run:运行当前程序,直至程序结束
    B. 观察窗口的使用
    a) 寄存器窗口,可以观察到各寄存器的当前值,如下图所示
    b) 存储器窗口
    点击菜单【View】【Memory windows】,可看到四个子项,分别是
    Memory1:
    Memory2:
    Memory3:
    Memory4:
    这里共有4个memory,一般选择第一个,如果不行的话就可以选择其余三个。
    在此编辑框内我们输入“字母:数字”;D、 I、 X、 C分别代表着直接寻址的片内RAM、间接寻址的片内RAM、扩展的外部RAM和ROM
    比如:输入D:0x20或D:20H 可观察 内部RAM 20H单元的内容
    比如:输入X:0x2030或X:2030H 可观察 外部RAM 2030H单元的内容
    C. 运行上述程序,并将结果截图
    4、实验运行结果:

5、思考题解答
改写程序
A、改写以上程序,使2000H-20FFH单元内容为0FH(在实验报告中写出程序,并将运行结果截图)保存程序为1-2.asm
注意:每一个程序都需要先建一个项目文件,本例中需要在Keil 中建立一个项目文件1-2.uproj

答案A:
ORG 0000H
LJMP SE01
ORG 0640H
SE01: MOV R0,#00H
MOV DPTR,#2000H
LOO1: MOV A,#0FH
MOVX @DPTR,A
INC DPTR
INC R0
CJNE R0,#00H,LOO1
LOOP: SJMP LOOP
END

B、改写以上程序,使2000H-200FH单元内容为05(在实验报告中写出程序,并将运行结果截图)保存程序为1-3.asm
注意:每一个程序都需要先建一个项目文件,本例中需要在Keil 中建立一个项目文件1-3.uproj
答案B:
ORG 0000H
LJMP SE01
ORG 0640H
SE01: MOV R0,#00H
MOV DPTR,#2000H
LOO1: MOV A,#05H
MOVX @DPTR,A
INC DPTR
INC R0
CJNE R0,#10H,LOO1
LOOP: SJMP LOOP
END

实验 02 数据区的数据传送与比较

1、 实验目的
1) 掌握汇编语言设计和调试方法
2) 熟悉Keil uVision4的使用
3) 熟悉片内RAM数据区的使用
4) 熟悉片外RAM数据区的使用
5) 了解存储器的块操作方法
2、 实验内容
1) 片内RAM数据传送至片外RAM
2) 片外RAM数据传送至片内RAM
3) 找出最大数和最小数
3、实验步骤
1) 掌握片内RAM和片外RAM的数据传送操作
阅读以下程序,描述该程序完成的功能
该程序的功能是,将片内RAM 50H53H中的4个数据,送到片外RAM2050H2053H单元
2) 在Keil uVision4中调试程序,并观察运行结果
 建立项目文件
在编辑模式下,选择【Project】菜单下的【New uvision Project】命令
弹出如图所示的Create new Project对话框,输入新建项目文件的名称,项目文件类型固定为uvproj文件。如图,本实验保存项目名称为 2-1.uvproj
单击【保存】按钮将弹出如所示的Select Device for Target 'Target 1’对话框,用户可以根据使用情况选择单片机型号,如选择Atmel公司的AT89C51或AT89C52
点【ok】按钮后,提示是否采用8051的启动代码。本实验系统自带启动代码,所以无需启动代码,点击【否】
 给项目添加程序文件
点击菜单【File】【new】,默认的程序文件名是text1,如图所示
在Text1处编写数据传送程序的代码(如下所示)
点击菜单【File】【save as】,将此文件保存为 2-1.asm,如下图所示。请注意不能省略文件的扩展名。
程序文件已经建立好后,在项目管理器窗口中,展开Target1项,可以看到Source Group1子项。右击Source Group1,在出现如图所示的菜单中选择Add Files to Group 'Source Group1’命令。
弹出如图所示的Add Files to Group 'SourceGroup1’对话框。在对话框中选择需要添加的程序文件,单击Add按钮,把所选文件添加到项目文件中。
 编译文件2-1.asm(生成可执行文件2-1.hex)
右键单击文件名,在菜单中选择【Build target】可以编译整个项目,如果文件没有语法错误,则编译能通过。
 调试程序文件
点击菜单【Debug】【Start/Stop Debug Session】,进入调试界面
A:在memory1中,输入D:0x50,显示片内RAM 50H单元的内容,在50H-53H 4个单元中,填入四个不同的值,如图所示
单步执行以下程序(F10),观察R1,R2,A,DPTH中的值,并截图
(每一次循环,截图一次)
B:观察片外RAM的2050H~2053H单位的内容,并截图
3) 片外RAM数据传送至片内RAM
将片外2100H-2105H一共6个单元的内容,传送到片内30H-35H单元
编写程序,将程序保存为2-2.asm
注意:每一个程序都需要先建一个项目文件,本例中需要在Keil 中建立一个项目文件2-2.uvproj
调试程序:将片外RAM 2100H-2105H单元,填入6个数据,运行程序,截图显示片内RAM30H-35H单元的内容
4、实验运行结果:

5、思考题解答
1) 设计性实验:
在片外2000H~200FH单元事先存入16个无符号数,编程查找这16个数中的最大数,保存到R2中,查找最小数,保存到R3中
(程序保存为2-3.asm,截图显示这16个数,并截图显示程序运行后的R2和R3的内容)
注意:每一个程序都需要先建一个项目文件,本例中需要在Keil 中建立一个项目文件2-3.uvproj

答案:
ORG 0000H
LJMP START
ORG 0100H
START: MOV DPTR,#2000H
MOVX A,@DPTR
MOV R2,A ;ZUIDASHU
MOV R3,A ;ZUIXIAOSHU
MOV R0,#15
LOO1: INC DPTR
MOVX A,@DPTR
CLR C
SUBB A,R2
JNC DASHU
ADD A,R2
CLR C
SUBB A,R3
JC XIAOSHU
ADD A,R3
SJMP NEXT
DASHU: ADD A,R2
MOV R2,A
SJMP NEXT
XIAOSHU: ADD A,R3
MOV R3,A
NEXT: DJNZ R0,LOO1
HERE: SJMP HERE
END

2) 用C51编写上述程序
程序保存为ex02-4.c
答案:
#include <reg51.h>
void main(void) {
unsigned char max,min,tmp,i;
unsigned char xdata *p;
p=0x2000;
max=min=*p;
p++;
for(i=0;i<15;i++) {
tmp=*p;
if (tmp>max)max=tmp;
if(tmp<min)min=tmp;
p++;
}
}

实验 03 数据运算与数据比较

1、 实验目的

  1. 掌握汇编语言设计和调试方法

  2. 熟悉Keil uVision4的使用

  3. 熟悉无符号数的算术运算

  4. 熟悉无符号数的逻辑运算

  5. 掌握多字节无符号数的乘法运算过程

  6. 熟悉数字0-9与其对应的ASCII码之间的转换
    2、 实验内容

  7. 无符号双字节数据的乘法运算

  8. 利用MUL指令实现双字节乘操作:4054H×2005H=80BC1A4H’

  9. ASCII码转换为对应的十六进制

  10. 十六进制转换为ASCII码
    3、实验步骤

  11. 利用MUL指令实现双字节乘操作:4054H×2005H=80BC1A4H
    将(R1R0)和(R3R2)中双字节无符号整数相乘,积送R7R6R5R4中
    仔细阅读下列程序,在实验中完成如下步骤并写入实验报告:
     打开Keil uVision4,在shiyan03文件夹下,新建项目shiyan03-1.uvproj。
     编写程序,保存在shiyan03目录下,程序名为shiyan03-1.asm
     断点或单步运行本实验程序后,检查R4 R5 R6 R7中内容,并截图显示程序运行结果

  12. ASCII码数字字符转换为对应的十六进制数字
    假设寄存器R0中存放有一个ASCII码字符,若该字符是ASCII码数字字符‘0’-‘9’,则将该字符转换为相应的十六进制数字,存在R7中。若该字符不是数字字符,则在R7中存放FFH。
    注意:
    [1] ASCII码字符‘1’,其十六进制是31H,故转换时,只需要将原字符减去30H就可得到相应的数字
    [2] 判断是不是ASCII码数字字符,主要判断该字符是不是在30H-39H之间

仔细观察绿色字体的部分程序,在实验中完成如下步骤并写入实验报告
 对绿色字体部分的程序进行注释(或解释绿色字体部分程序的功能)
 打开Keil uVision4,在shiyan03文件夹下,新建项目shiyan03-2.uvproj。
 编写程序,保存在shiyan03目录下,程序名为shiyan03-2.asm
 运行程序前,事先向R2写入一个值(比如38H),单步运行程序,检查R0R7内容,截图显示程序运行结果(一轮循环的运行结果)

  1. 十六进制数字0-F(设该数字存在R2中),转换为对应的ASCII码,结果存放在R7中
    注意:转换的算法:凡大于等于10的十六进制数(0AH-0FH),变成ASCII码,加37H。凡小于10的十六进制数(0-9),加30H可得相对应的ASCII码

仔细阅读上述程序,在实验中完成如下步骤并写入实验报告
 对绿色字体部分的程序进行注释(或解释绿色字体部分程序的功能)
 打开Keil uVision4,在shiyan03文件夹下,新建项目shiyan03-3.uvproj。
 编写程序,保存在shiyan03目录下,程序名为shiyan03-3.asm
 运行程序前,事先向R2写入一个值(比如0AH),单步运行,检查R2R7内容,截图显示程序运行结果。
4、实验运行结果:

5、思考题解答
编写程序shiyan03-4.asm,程序的功能:实现16位无符号数与8位无符号数的乘法(设被乘数存放在R2R3中,乘数存放在R4中结果存放在R5R6R7中)。截图显示程序及其运行结果
提示:
Eg:4054H*05H=141A4H

   	ORG 0000H
   	LJMP QKUL
   	ORG 0100H

QKUL: MOV R2,#40H
MOV R3,#54H //被乘数放在R2R3中

	MOV R4,#05H		//乘数放在R4中

	MOV  R5,#00H
	MOV  R6,#00H
	MOV  R7,#00H 	//结果放在R5R6R7

	MOV    A,R3
	MOV    B,R4
	MUL    AB    	;R3×R4 = 54H×05H 
                   	;A←(R3×R4)L,积的低8位存入累加器A 
                   	;B←(R3×R4)H,积的高8位存入寄存器B

	MOV    R7,A        ;R7←(R3×R4)L
	MOV    R6,B        ;R6←(R3×R4)H

	MOV    A,R2
	MOV    B,R4
	MUL    AB 		   ;R2×R4 = 40H×05H   ;A←(R2×R4)L, B←(R2×R4)H 
	ADD    A,R6        ;A←(R2×R4)L+(R3×R4)H 
	MOV    R6,A       ;R6←(R2×R4)L+(R3×R4)H 

	MOV    A,B 
	ADDC   A,R5      ;A←(R2×R4)H+Cy 
	MOV    R5,A     	 ;R5←(R2×R4)H+Cy 

LOOP: SJMP LOOP
END

实验 04 闪烁灯

1、 实验目的

  1. 掌握汇编语言设计和调试方法
  2. 熟悉Keil uVision4的使用
  3. 熟悉Proteus软件
  4. 熟悉单片I/O口的基本输出功能
  5. 重点掌握P0、P1、P2、P3口作为输出口使用时,如何正确连线
    2、 实验内容
  6. 学习使用Proteus、Keil uVision 软件,掌握绘制原理图和编译程序的方法
  7. 学会仿真运行原理图,观察运行结果,验证程序和原理图的正确性
  8. LED发光二极管单个循环点亮,时间间隔可变
  9. 学会用汇编语言和C语言编写延时程序
  10. 学会延时时间的计算
    3、实验步骤
  11. 在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件:
    B、按照上述原理图,绘制仿真图
    C、绘图结束后,点击菜单【File】【Save Design As…】,将文件保存在shiyan03文件夹下,文件名为ex3-1.DSN,如图所示
  12. 在Keil uVision4中编写程序,并编译成可执行文件(闪烁灯)
    A、在Keil uVision4中,按照下述程序,建立新项目3-1.uvproj,保存在文件夹shiyan03目录下。参考实验01和实验02,编写汇编语言程序3-1.asm,保存在shiyan03目录下
    B、将文件3-1.asm添加到项目3-1中,编译生成3-1.hex文件
    C、将3-1.hex文件添加到单片机中,仿真,将仿真结果截图
  13. 实验程序分析
    A、延时程序的设计方法
    如何精确计算延时子程序的执行时间?
    汇编语言的一大优势就是能够精确控制程序的执行时间,这在编写一些对时序要求严格的外围器件驱动时由为重要!
    B、输出控制
    如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮
    4、实验运行结果:

5、思考题解答
4) 思考题:修改R5和R6的值,将延时时间加长或缩短,重做以上实验,观察灯的闪烁速度。在实验报告中写出延时100ms以及延时500ms,你的R5和R6的值
答案:
延时100ms:R5和R6为10(缩短延时时间)
延时500ms:R5和R6为50(加长延时时间)
5) 在Keil uVision4中编写C51程序,并编译成可执行文件
A、在Keil uVision4中,按照下述程序,建立新项目3-2.uvproj,保存在文件夹shiyan03目录下。参考实验01和实验02,编写C51程序3-2.c,保存在shiyan03目录下
B、将程序3-2.c添加到项目3-2中,并编译生成3-2.hex文件
C、将3-2.hex文件添加到单片机中,仿真,将仿真结果截图
答案:
#include<AT89X51.H>
sbit LED=P1^0;

void delay02s(void)
{
unsigned char i,j,k;
for(i=20;i>0;i–)
for(j=20;j>0;j–)
for(k=248;k>0;k–);
}

void main(void)
{
while(1)
{
LED=0 ;
delay02s();
LED=1;
delay02s();
}
}

实验 05 花样流水灯

1、 实验目的

  1. 掌握汇编语言设计和调试方法
  2. 熟悉Keil uVision4的使用
  3. 熟悉Proteus软件
  4. 熟悉单片I/O口的基本输出功能
  5. 重点掌握P0、P1、P2、P3口作为输出口使用时,如何正确连线
    2、 实验内容
  6. 学习使用Proteus、Keil uVision 软件,掌握绘制原理图和编译程序的方法
  7. 学会仿真运行原理图,观察运行结果,验证程序和原理图的正确性
  8. LED发光二极管单个循环点亮,时间间隔可变
  9. LED发光二极管多个同时点亮、灭,时间间隔可变
  10. 将输出口改为P1、P3、P0口,重复以上实验
    3、实验步骤
  11. 在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件:
    B、按照上述原理图,绘制仿真图
    C、绘图结束后,点击菜单【File】【Save Design As…】,将文件保存在shiyan05文件夹下,文件名为ex5-1.DSN,如图所示
  12. 在Keil uVision4中编写程序,并编译成可执行文件(普通流水灯)
    A、在Keil uVision4中,按照下述程序,建立新项目5-1.uvproj,保存在文件夹shiyan05目录下。参考实验01和实验02,编译生成5-1.hex文件
    普通流水灯亮灯示意图:
    ◎○○○○○○○
    ○◎○○○○○○
    ○○◎○○○○○
    ○○○◎○○○○
    ○○○○◎○○○
    ○○○○○◎○○
    ○○○○○○◎○
    ○○○○○○○◎
    ◎○○○○○○○
    ○◎○○○○○○
    ○○◎○○○○○
    ○○○◎○○○○
    ○○○○◎○○○
    ○○○○○◎○○
    ○○○○○○◎○
    ○○○○○○○◎

B、将5-1.hex文件添加到单片机中,仿真,将仿真结果截图
4、实验运行结果:

5、思考题解答
3) 思考题:修改R5和R4的值,将延时时间加长或缩短,重做以上实验,观察结果。在实验报告中写出延时100ms以及延时500ms,你的R5和R4的值
延时100ms:R5为248,R4为10
延时500ms:R5为248,R4为50
4) 思考题:用C51编写普通流水灯程序
(在Keil中新建项目5-2.uvproj,编写c语言程序,保存为5-2.c)

  1. 在Keil uVision4中编写程序,并编译成可执行文件(花样流水灯)
    A、在Keil uVision4中,按照下述程序,建立新项目5-3.uvproj,保存在文件夹shiyan05目录下。参考实验01和实验02,编译生成5-3.hex文件
    花样流水灯亮灯示意图:
    ◎○○○○○○○
    ○◎○○○○○○
    ○○◎○○○○○
    ○○○◎○○○○
    ○○○○◎○○○
    ○○○○○◎○○
    ○○○○○○◎○
    ○○○○○○○◎
    ○○○○○○◎○
    ○○○○○◎○○
    ○○○○◎○○○
    ○○○◎○○○○
    ○○◎○○○○○
    ○◎○○○○○○
    ◎○○○○○○○

B、将5-3.hex文件添加到单片机中,仿真,将仿真结果截图

C、在Keil uVision4中编写下列C51程序,并编译成可执行文件,装入Proteus项目中仿真,将仿真结果截图
(在Keil中新建项目5-4.uvproj,编写c语言程序,保存为5-4.c)

  1. 多灯流水
    A、在Keil uVision4中,按照下述程序,建立新项目5-5.uvproj,保存在文件夹shiyan04目录下。参考实验01和实验02,编译生成5-5.hex文件
    多灯流水亮灯示意图:
    ◎◎○○○○○○
    ○◎◎○○○○○
    ○○◎◎○○○○
    ○○○◎◎○○○
    ○○○○◎◎○○
    ○○○○○◎◎○
    ○○○○○○◎◎
    ○○○○○◎◎○
    ○○○○◎◎○○
    ○○○◎◎○○○
    ○○◎◎○○○○
    ○◎◎○○○○○
    ◎◎○○○○○○

B、将5-5.hex文件添加到单片机中,仿真,将仿真结果截图

  1. 思考题:用C51实现上述多灯流水
    在Keil uVision4中编写C51程序,并编译成可执行文件,装入Proteus项目中仿真,将仿真结果截图
    (在Keil中新建项目5-6.uvproj,编写c语言程序,保存为5-6.c)
    答案:
    #include<reg51.h>
    #include<intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    //延时
    void DelayMS(uint x)
    {
    uchar i;
    while(x–)
    {
    for(i=0;i<120;i++);
    }
    }
    //主程序
    void main()
    {
    uchar i;
    P2=0xfc;
    while(1)
    {
    for(i=0;i<6;i++)
    {
    P2=crol(P2,1); //P2的值向左循环移动
    DelayMS(150);
    }
    for(i=0;i<6;i++)
    {
    P2=cror(P2,1); //P2的值向右循环移动
    DelayMS(150);
    }
    }
    }

实验 06 IO输入输出实验

1、 实验目的

  1. 掌握汇编语言设计和调试方法

  2. 熟悉Keil uVision4的使用

  3. 熟悉Proteus软件

  4. 熟悉单片I/O口的基本输出功能

  5. 重点掌握P0、P1、P2、P3口作为输出口使用时,如何正确连线
    2、 实验内容

  6. 学习使用Proteus、Keil uVision 软件,掌握绘制原理图和编译程序的方法

  7. 学会仿真运行原理图,观察运行结果,验证程序和原理图的正确性

  8. AT89C51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)

  9. AT89C51单片机的P1接8个开关,将8位数据输入到P1口,让CPU从P1口读入数据,并将数据输出到P2口显示
    3、实验步骤

  10. 在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件:其中,多路开关是SW-SPST
    B、按照上述原理图,绘制仿真图
    C、绘图结束后,点击菜单【File】【Save Design As…】,将文件保存在shiyan06文件夹下,文件名为ex6-1.DSN,如图所示

  11. 实验原理分析
    程序设计内容
    (1)开关状态检测
    对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。
    (2)输出控制
    根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。
    (3)程序框图

  12. 在Keil uVision4中编写汇编程序,并编译成可执行文件(方法一)
    A、在Keil uVision4中,按照下述程序,建立新项目6-1.uvproj,保存在文件夹shiyan06目录下。
    B、编写汇编程序,保存为6-1.asm,加入到项目中,编译生成6-1.hex文件
    C、将6-1.hex文件添加到单片机中,仿真观察结果
    注意:
    1、第一句MOV P1,#0FFH 是为了读P1引脚(开关状态)
    2、本源码中,四句RR A,可以一句 SWAP A替换

  13. 在Keil uVision4中编写C51程序,并编译成可执行文件(方法一)
    A、在Keil uVision4中,按照下述程序,建立新项目6-2.uvproj,保存在文件夹shiyan06目录下。
    B、编写C51程序,保存为6-2.c,加入到项目中,编译生成6-2.hex文件
    C、将6-2.hex文件添加到单片机中,仿真观察结果

  14. 思考题:试说明,51单片机读引脚之前要置1的原理(51单片机读端口与读引脚)

  15. 在Keil uVision4中编写汇编程序,并编译成可执行文件(方法二)
    A、在Keil uVision4中,按照下述程序,建立新项目6-3.uvproj,保存在文件夹shiyan06目录下。
    B、编写汇编程序,保存为6-3.asm,加入到项目中,编译生成6-3hex文件
    C、将6-3.hex文件添加到单片机中,仿真观察结果

  16. 在Keil uVision4中编写C51程序,并编译成可执行文件(方法二)
    A、在Keil uVision4中,按照下述程序,建立新项目6-4.uvproj,保存在文件夹shiyan06目录下。
    B、编写C51程序,保存为6-4.c,加入到项目中,编译生成6-4.hex文件
    C、将6-4.hex文件添加到单片机中,仿真观察结果

  17. P2输入P1输出实验(多路开关)
    AT89C51单片机的P1接8个开关,将8位数据输入到P1口,让CPU从P1口读入数据,并将数据输出到P2口显示
    在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件:其中,多路开关是SW-SPDT
    B、按照上述原理图,绘制仿真图
    C、绘图结束后,点击菜单【File】【Save Design As…】,将文件保存在shiyan05文件夹下,文件名为ex5-2.DSN

  18. 在Keil uVision4中编写程序,并编译成可执行文件(P2输入P1输出)
    A、在Keil uVision4中,按照下述程序,建立新项目6-5.uvproj,保存在文件夹shiyan06目录下。
    B、编写C51程序,保存为6-5.asm,加入到项目中,编译生成6-5.hex文件
    C、将6-5.hex文件添加到单片机中,仿真观察结果
    4、实验运行结果:

5、思考题解答

  1. 试说明,51单片机读引脚之前要置1的原理(51单片机读端口与读引脚)
    因为 51 单片机 I/O 口内部结构的限制,在读取外部引脚状态的时候,需要向端口写 1,使mosfet V2截止,以免信号被拉低而读错. 在 51 单片机复位后,不需要进行此操作也可以进行读取外部引脚的操作。因此,在按键的端口没有复用的情况下,可以省略此步骤。而对于其它一些真正双向 I/O 口的单片机来说,将引脚设置成输入状态,是必不可少的一个步骤。
  2. 思考题:在Keil uVision4中编写程序,并编译成可执行文件(P2输入P1输出)
    A、在Keil uVision4中,按照下述程序,建立新项目6-6.uvproj,保存在文件夹shiyan06目录下。
    B、编写C51程序,保存为6-6.c,加入到项目中,编译生成6-6.hex文件
    C、将6-6.hex文件添加到单片机中,仿真观察结果

#include <AT89X51.H>
void main()
{
unsigned char temp;
P1=0XFF;
P2=0XFF;
while(1)
{
temp=P2;
P1=temp;
while(P2==temp);
}
}
答案:

实验 07 静态数码管和定时器

1、 实验目的

  1. 掌握汇编语言设计和调试方法
  2. 熟悉Keil uVision4的使用
  3. 熟悉Proteus软件
  4. 熟悉单片I/O口的基本输入/输出功能
  5. 重点掌握单片机与静态数码管的接线和显示程序
  6. 掌握七段LED数码管的工作原理
    2、 实验内容
  7. 学习使用Proteus、Keil uVision 软件,掌握绘制原理图和编译程序的方法
  8. 用AT89S51单片机的P0端口的P0.0-P0.7,通过非门(74LS04)连接到一个共阳数码管的a-h的笔段上,数码管的公共端接Vcc。在数码管上循环显示0-9数字,时间间隔0.2秒。
  9. 用AT89S51单片机的P0端口的P0.0-P0.7,通过非门(74LS04)连接到一个共阴极数码管的a-h的笔段上,数码管的公共端接地。在数码管上循环显示0-9数字,时间间隔0.2秒。
  10. 综合实验:用AT89S51单片机实现00-59的自动计时器(秒表timer)。
  11. 用单片机的P0和P2端口分别接有两个共阳极数码管,编程实现00-59秒计时器。P0口驱动显示秒时间的十位,而P2口驱动显示秒时间的个位。
    3、实验步骤
  12. 在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件:
    注意:
    (1)PHYC1812 P033P是33pF的瓷片电容
    (2)数码管有共阴极和共阳极之分,有带小数点和不带小数点之分
    其中,数码管的代号所代表的含义如下:
    代号7SEG-COM-AN-GRN:不带小数点的共阳极数码管
    代号7SEG-COM-CAT-GRN:不带小数点的共阴极数码管
    代号7SEG-MPX1-CA:带小数点的1位共阳极数码管
    代号7SEG-MPX1-CC:带小数点的1位共阴极数码管
    7654 3210=P0.7–P0.0
    3FH=0011 1111 在共阳极型中543210为高电平,加个反向器就为为低电平信号,同时对应发光二极管因发亮.(在共阳极型7SEG-COM-AN中输入为低电平信号对应发光二极管因发亮.)
    “0” 3FH 0011 1111 “8” 7FH
    “1” 06H “9” 6FH
    “2” 5BH “A” 77H
    “3” 4FH “b” 7CH
    “4” 66H “C” 39H
    “5” 6DH “d” 5EH
    “6” 7DH “E” 79H
    “7” 07H “F” 71H

以共阴极LED为例,数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见上表。
(3)74LS04是集成电路芯片,封装了6个非门
B、按照上述原理图,绘制仿真图(注意电解电容的正负极不能接错)
C、绘图结束后,点击菜单【File】【Save Design As…】,将文件保存在shiyan07文件夹下,文件名为ex7-1.DSN

  1. 在Keil uVision4中编写程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目7-1.uvproj,保存在文件夹shiyan07目录下。
    B、添加7-1.asm文件,源码如下,编译生成7-1.hex文件
    C、将7-1.hex文件添加到单片机中,仿真,将仿真结果截图
  2. 在Keil uVision4中编写C51程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目7-2.uvproj,保存在文件夹shiyan07目录下。
    B、添加7-2.c文件,源码如下,编译生成7-2.hex文件
    C、将7-2.hex文件添加到单片机中,仿真,将仿真结果截图
  3. 思考题,去掉电路原理图中的非门,将上述C51代码的显示码表改成共阳极显示码表,如下所示
    运行源程序,观察结果,试说出显示异常的原因?
  4. 在Proteus中绘制共阴极静态数码管显示电路的原理图,保存为ex7-2.dsn
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件:
    注意:
    (1)PHYC1812 P033P是33pF的瓷片电容
    (2)数码管有共阴极和共阳极之分,有带小数点和不带小数点之分
  5. 将7-1.hex文件添加到单片机中,仿真,将仿真结果截图
  6. 将7-2.hex文件添加到单片机中,仿真,将仿真结果截图
    (2)综合实验:用AT89S51单片机实现00-59的自动计时器(秒表timer)。
    用单片机的P0和P2端口分别接有两个共阳极数码管,编程实现00-59秒计时器。P0口驱动显示秒时间的十位,而P2口驱动显示秒时间的个位。
  7. 在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件如下:
    注意:
    (1)PHYC1812 P033P是33pF的瓷片电容
    (2)数码管有共阴极和共阳极之分,有带小数点和不带小数点之分
    其中,数码管的代号所代表的含义如下:
    代号7SEG-COM-AN-GRN:不带小数点的共阳极数码管
    代号7SEG-COM-CAT-GRN:不带小数点的共阴极数码管
    代号7SEG-MPX1-CA:带小数点的1位共阳极数码管
    代号7SEG-MPX1-CC:带小数点的1位共阴极数码管

B、按照上述原理图,绘制仿真图(注意电解电容的正负极不能接错)
C、绘图结束后,点击菜单【File】【Save Design As…】,将文件保存在shiyan07文件夹下,文件名为ex7-3.DSN
9) 在Keil uVision4中编写程序,并编译成可执行文件
工作原理分析:
在设计过程中,可以考虑用软件延时1秒的形式来实现1秒的定时。
(1)用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加1,当秒计数达到60时,就自动返回到0,从新秒计数。
(2)对于秒计数单元中的数据要把它十位数和个数分开,方法是采用对10整除和对10求余。
(3)在数码上显示,仍通过查表的方式完成。
(4) 一秒时间的产生在这里我们采用软件精确延时的方法来完成,经过精确计算得到1秒时间为1.002秒。
A、在Keil uVision4中,按照下述程序,建立新项目7-3.uvproj,保存在文件夹shiyan09目录下。
B、添加7-3.asm文件,源码如下,编译生成7-3.hex文件
C、将7-3.hex文件添加到单片机中,仿真,将仿真结果截图
10) 在Keil uVision4中编写C51程序,并编译成可执行文件
A、在Keil uVision4中,按照下述程序,建立新项目7-4.uvproj,保存在文件夹shiyan09目录下。
B、添加7-4.c文件,源码如下,编译生成7-4.hex文件
C、将7-4.hex文件添加到单片机中,仿真,将仿真结果截图
4、实验运行结果:

实验 08 00-99手动计数器(足球比赛计分器)

1、 实验目的

  1. 掌握汇编语言设计和调试方法
  2. 熟悉Keil uVision4的使用
  3. 熟悉Proteus软件
  4. 熟悉单片I/O口的基本输入/输出功能
  5. 重点掌握单片机与静态数码管的接线和显示程序
  6. 掌握七段LED数码管的工作原理
  7. 单片机对按键的识别的过程处理;
    2、 实验内容
  8. 学习使用Proteus、Keil uVision 软件,掌握绘制原理图和编译程序的方法
  9. 用AT89S51单片机的P0和P2端口,通过非门(74LS04)连接到两个个共阳数码管的a-h的笔段上,数码管的公共端接Vcc。
  10. 用AT89S51单片机实现一个00-99的手动计数器(counter):
  11. 在AT89S51单片机的P3.7管脚接一个轻触开关,作为手动计数的按钮,用单片机的P2.0-P2.7接一个共阳数码管,作为00-99计数的个位数显示,用单片机的P0.0-P0.7接一个共阳数码管,作为00-99计数的十位数显示;
  12. 用AT89S51单片机实现一个足球比赛手动计分器(counter):
  13. 在AT89S51单片机的P3.7和P3.6管脚各接一个轻触开关,作为双方比赛进球后,手动计分的按钮,用单片机的P2.0-P2.7接一个共阳数码管,作为乙方进球计数的显示,用单片机的P0.0-P0.7接一个共阳数码管,作为甲方进球计数的显示
    3、实验步骤
  14. 实现原理分析
    分析:
    (1)单片机对按键的识别的过程处理;
    (2)单片机对正确识别的按键进行计数,计数满时,又从零开始计数;
    (3)单片机对计的数值要进行数码显示,计得的数是十进数,含有十位和个位,把所计得的数值对10求余,即可个位数字,对10整除,即可得到十位数字了。
    (4)通过查表方式,分别显示出个位和十位数字。
    实验理论:按键去抖动
    一个按键从没有按下到按下以及释放是一个完整的过程。在按键按下的时候,因为机械的原因,会存在一定的干扰信号。
  15. 在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件如下:
    注意:
    (1)PHYC1812 P033P是33pF的瓷片电容
    (2)数码管有共阴极和共阳极之分,有带小数点和不带小数点之分
    其中,数码管的代号所代表的含义如下:
    代号7SEG-COM-AN-GRN:不带小数点的共阳极数码管
    代号7SEG-COM-CAT-GRN:不带小数点的共阴极数码管
    代号7SEG-MPX1-CA:带小数点的1位共阳极数码管
    代号7SEG-MPX1-CC:带小数点的1位共阴极数码管
    将电路图保存在shiyan08文件夹下,文件名为ex8-1.DSN
  16. 在Keil uVision4中编写程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目8-1.uvproj,保存在文件夹shiyan08目录下。
    B、添加8-1.asm文件,源码如下,编译生成8-1.hex文件
    C、将8-1.hex文件添加到单片机中,仿真,将仿真结果截图
  17. 在Keil uVision4中编写C51程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目8-2.uvproj,保存在文件夹shiyan08目录下。
    B、添加8-2.c文件,源码如下,编译生成8-2.hex文件
    C、将8-2.hex文件添加到单片机中,仿真,将仿真结果截图
    4、实验运行结果:

5、思考题解答
(5)思考题:综合实验,足球比赛计分器
用AT89S51单片机实现一个足球比赛手动计分器(counter):
在AT89S51单片机的P3.7和P3.6管脚各接一个轻触开关,作为双方比赛进球后,手动计分的按钮,用单片机的P2.0-P2.7接一个共阴数码管,作为乙方进球计数的显示,用单片机的P0.0-P0.7接一个共阴数码管,作为甲方进球计数的显示
其中,数码管的代号所代表的含义如下:
代号7SEG-COM-AN-GRN:不带小数点的共阳极数码管
代号7SEG-COM-CAT-GRN:不带小数点的共阴极数码管
代号7SEG-MPX1-CA:带小数点的1位共阳极数码管
代号7SEG-MPX1-CC:带小数点的1位共阴极数码管
答案:
#include <AT89X51.H >
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char Count_jia,Count_yi;

void delay10ms(void)
{
unsigned char i,j;
for(i=20;i>0;i–)
for(j=248;j>0;j–);
}

void main(void)
{
Count_jia=0;
Count_yi=0;
P0=table[Count_jia]; //显示甲队比分
P2=table[Count_yi]; //显示乙队比分
while(1)
{
if(P3_60)
{
delay10ms();
if(P3_6
0) //甲队得分
{
P0=table[++Count_jia]; //请补充完整
while(P3_6==0); //等待按键释放
}
}

  if(P3_7==0) 
    { 
      delay10ms(); 
      if(P3_7==0)     //乙队得分
        { 
          P2=table[++Count_yi]; //请补充完整      
          while(P3_7==0);   //等待按键释放
        } 
    }
} 

}

实验 09 多位数码管扫描及动态数码管显示

1、 实验目的

  1. 掌握汇编语言设计和调试方法
  2. 熟悉Keil uVision4的使用
  3. 熟悉Proteus软件
  4. 熟悉单片I/O口的基本输入/输出功能
  5. 熟悉多位数码管的电路设计和程序设计
  6. 掌握动态数码管的工作原理
    2、 实验内容
  7. 学习使用Proteus、Keil uVision 软件,掌握绘制原理图和编译程序的方法
  8. 用AT89S51单片机的P2端口的P0.0-P0.7,通过连接到四个共阳数码管的a-h的笔段上。四个数码管的公共端接达林顿管,由单片机的P1.0-P1.3控制达林顿管的开关。本实验需要在数码管上循环显示2008数字。
  9. 动态数码管显示综合实验:
  10. 上例多位数码管的显示电路中,如果每个数码管能保证在20MS内刷新显示一次(50Hz),由于视觉暂留的原因,用户觉察不到数码管的灭灯状态,以为该数码管一直在显示,这样就形成了四个数码管都在同时显示的假象。这种工作机制,称为多位数码管的动态显示。
  11. (4)8位继承动态数码管显示综合实验
    3、实验步骤
  12. 在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件:
    注意:
    (1)PHYC1812 P033P是33pF的瓷片电容
    (2)数码管有共阴极和共阳极之分,有带小数点和不带小数点之分
    其中,数码管的代号所代表的含义如下:
    代号7SEG-COM-AN-GRN:不带小数点的共阳极数码管(绿色)
    代号7SEG-COM-ANODE:不带小数点的共阳极数码管(红色)

B、按照原理图,绘制仿真图(注意电解电容的正负极不能接错)
C、绘图结束后,点击菜单【File】【Save Design As…】,将文件保存在shiyan09文件夹下,文件名为ex9-1.DSN

  1. 在Keil uVision4中编写程序,并编译成可执行文件
    多位数码管的工作原理:
    (1)将要显示的七段LED数码管的扫描信号置为1,达林顿管打开,该数码管的共阳端接VCC,数码管能正确显示
    (2)同时,将其他不显示的七段LED数码管的扫描信号置为0,其他数码管均不能显示。
    (3)将七段码所要显示的数据放到A、B、C、D、E、F、G总线上,该数码管能显示所需要的内容
    (4)一次循环就可以实现多位数码管的扫描显示;
    (5)虽然在任何一个时间里,只显示一个数码管,但在实际中,只要从第一个到最后一个的扫描时间不超过20MS,因人视觉暂留的原因,会同时看到这几个数码管显示的数据。

A、在Keil uVision4中,按照下述程序,建立新项目9-1.uvproj,保存在文件夹shiyan09目录下。
B、添加9-1.asm文件,源码如下,编译生成9-1.hex文件
C、将9-1.hex文件添加到单片机中,仿真,将仿真结果截图

  1. 在Keil uVision4中编写C51程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目9-2.uvproj,保存在文件夹shiyan09目录下。
    B、添加9-2.c文件,源码如下,编译生成9-2.hex文件
    C、将9-2.hex文件添加到单片机中,仿真,将仿真结果截图
    4、实验运行结果:

5、思考题解答
4) 思考题:
(1)在显示2008的实例中,调整延时子程序的延时时间,使得DELAY能延时5MS左右,将程序保存为9-3.asm,编译成9-3.hex,装载到单片机,观察其仿真结果。并将程序和仿真结果截图。
DELAY: MOV R7,#4 ;假设晶振为12MHz,则延时时间为25254*2=5MS
D2: MOV R6,#25
D1:MOV R5,#25
DJNZ R5,$
DJNZ R6,D1
DJNZ R7,D2
RET
END

(2)调整延时时间,使得使得DELAY能延时10MS左右,再次观察仿真结果,是不是觉得数码管会闪烁?
会感觉到很闪烁
DELAY: MOV R7,#8 ;假设晶振为12MHz,则延时时间为25258*2=10MS
D2: MOV R6,#25
D1:MOV R5,#25
DJNZ R5,$
DJNZ R6,D1
DJNZ R7,D2
RET
END

(3)回答:动态多位数码管和静态数码管显示相比,优点和缺点各是什么?
数码管动态显bai示和静态显示的区别du为:字符zhi变更不同、占用daoCPU时间不同、硬件资源不同。zhuan
一、字符shu变更不同
1、动态显示:动态显示轮流显示各个字符。利用人眼视觉暂留的特点,循环顺序变更位码,同时数据线上发送相应的显示内容。
2、静态显示:静态显示用同时显示各个字符。位码始终有效,显示内容完全跟数据线上的值一致。
二、占用CPU时间不同
1、动态显示:动态显示需要CPU不断的扫描位码发送显示数据,占用CPU时间长。
2、静态显示:静态显示由于不用不断变换位码,占用CPU时间短。
三、硬件资源不同
1、动态显示:动态显示消耗的硬件资源相较于静态显示消耗的硬件资源较少。
2、静态显示:静态显示消耗的硬件资源相较于动态显示消耗的硬件资源较多。

(5)多位集成数码管的动态显示
6位集成共阴极数码管动态显示综合实验
其中7SEG-MPX6-CC是7段六位共阴级数码管
工作原理分析:
多位共阳极数码管在动态显示时,共阳端需要用达林顿管驱动。而多位共阴极数码管,在显示的时候,显示码送出时,需要用74LS245来驱动
本实验电路原理图如图所示,P0端口通过74LS245接动态数码管的字形码笔段,P2端口接动态数码管的数位选择端,P1.7接一个开关,当开关接高电平时,显示“HELLO”字样;当开关接低电平时,显示“12345”字样。
(6)在Proteus中绘制原理图

A、电路如上图所示,按照上述原理图,绘制仿真图(注意电解电容的正负极不能接错)
B、绘图结束后,点击菜单【File】【Save Design As…】,将文件保存在shiyan09文件夹下,文件名为ex9-2.DSN

(7)在Keil uVision4中编写程序,并编译成可执行文件
A、在Keil uVision4中,按照下述程序,建立新项目9-4.uvproj,保存在文件夹shiyan09目录下。
B、添加9-4.asm文件,源码如下,编译生成9-4.hex文件
C、将9-4.hex文件添加到单片机中,仿真,将仿真结果截图

(8)在Keil uVision4中编写程序,并编译成可执行文件
A、在Keil uVision4中,按照下述程序,建立新项目9-5.uvproj,保存在文件夹shiyan09目录下。
B、添加9-5.c文件,源码如下,编译生成9-5.hex文件
C、将9-5.hex文件添加到单片机中,仿真,将仿真结果截图

  1. 思考题:参考本实验步骤(3),在数码管上轮流循环显示0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F
    在Keil uVision4中编写C51程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目9-6.uvproj,保存在文件夹shiyan09目录下。
    B、添加9-6.c文件,源码如下,编译生成9-6.hex文件
    C、将9-6.hex文件添加到单片机中,仿真,将仿真结果截图
    答:
    源码:
    #include <reg51.h>
    #include <stdio.h>

#define DELAYTIME 650000 //定义延迟时间常数
unsigned int temP2;

void delay(unsigned int temp)//延时程序
{
while(–temp);
}

void main()
{

P2=0;//led is off
while(1)
{
    P2=0XFE; //P2.0输出为1,其他为0,扫描第1个数码管
    P0=0X3F;//显示0,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XFD; //P2.1输出为1,其他为0,扫描第2个数码管
    P0=0X06;//显示1,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XFB; //P2.2输出为1,其他为0,扫描第3个数码管
    P0=0X5B;//显示2,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XF7; //P2.3输出为1,其他为0,扫描第4个数码管
    P0=0X4F;//显示3,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XEF; //P2.0输出为1,其他为0,扫描第1个数码管
    P0=0X66;//显示4,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XDF; //P2.1输出为1,其他为0,扫描第2个数码管
    P0=0X6D;//显示5,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XFE; //P2.2输出为1,其他为0,扫描第3个数码管
    P0=0X7D;//显示6,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XFD; //P2.3输出为1,其他为0,扫描第4个数码管
    P0=0X07;//显示7,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XFB; //P2.0输出为1,其他为0,扫描第1个数码管
    P0=0X7F;//显示8,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XF7; //P2.1输出为1,其他为0,扫描第2个数码管
    P0=0X6F;//显示9,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XEF; //P2.2输出为1,其他为0,扫描第3个数码管
    P0=0X77;//显示A,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XDF; //P2.3输出为1,其他为0,扫描第4个数码管
    P0=0X7C;//显示B,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XFE; //P2.0输出为1,其他为0,扫描第1个数码管
    P0=0X39;//显示C,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XFD; //P2.1输出为1,其他为0,扫描第2个数码管
    P0=0X5E;//显示D,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XFB; //P2.2输出为1,其他为0,扫描第3个数码管
    P0=0X79;//显示E,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);

    P2=0XF7; //P2.3输出为1,其他为0,扫描第4个数码管
    P0=0X71;//显示F,P0口输出其段选码
    temP2=DELAYTIME;
    delay(temP2);
    temP2=DELAYTIME;
    delay(temP2);
}

}
与实验(3)的主要区别在于本实验的数码管时共阴极的,而实验(3)的数码管时共阳极的,除了P0 P2口的修改,数码管的不同意味着字型码(段码)和位控码也需要进行修改。
实验结果如下:

附加综合思考题:

在上例基础上,选用8位集成共阴极数码管(7SEG-MPX8-CC-BLUE),重新保存为ex9-3.DSN。
编写程序9-7.c,实现功能:按键未按下,显示“HELLO—”,按键按下时,显示自己的学号。
编译生成9-7.hex文件,并装载到单片机中仿真,将仿真结果截图。
答:
#include <AT89X51.H>

unsigned char code table1[]={0x06,0x7f,0x06,0x06,0x06,0x06,0x4f,0x7d}; //"18111136"的显示码
unsigned char code table2[]={0x76,0x79,0x38,0x38,0x3f,0x40,0x40,0x40}; //"HELLO"的显示码
unsigned char i,j;
unsigned char a,b;
unsigned char temp;

void main(void)
{
while(1)
{
temp=0xfe;

  for(i=0;i<8;i++) 
    { 
      if(P1_7==1) 
        { 
          P0=table2[i]; 
        } 
        else 
          { 
            P0=table1[i]; 
          } 
      P2=temp;    
      a=temp<<(1);    //循环左移1位   FE -> FD -> FB -> F7
      b=temp>>(7); 
      temp=a|b; 
	  for(a=4;a>0;a--)
      for(b=248;b>0;b--) {} 
      P2=0xff;
    
    } 
} 

}

实验 10 外部中断及矩阵键盘识别

1、 实验目的

  1. 掌握汇编语言设计和调试方法
  2. 熟悉Keil uVision4的使用
  3. 熟悉Proteus软件
  4. 熟悉单片机实现中断的原理
  5. 熟悉外部中断在电平触发和下降沿触发的不同程序
  6. 熟悉中断服务子程序的编写
    2、 实验内容
  7. 学习使用Proteus、Keil uVision 软件,掌握绘制原理图和编译程序的方法
  8. 利用外部中断0,实现单一中断方式下的计数器。显示方式是采用BCD码经7447译码后输出给七段码显示
  9. 两个外部中断同时存在时的计数器显示
    3、实验步骤
  10. 单个外部中断的使用:
    在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件
    B、按照上述原理图,绘制仿真图(注意电解电容的正负极不能接错)
    C、绘图结束后,点击菜单【File】【Save Design As…】,将文件保存在shiyan10文件夹下,文件名为ex10-1.DSN
  11. 在Keil uVision4中编写程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目10-1.uvproj,保存在文件夹shiyan10目录下,编译生成10-1.hex文件
  12. 两个外部中断同时存在时的计数器显示
    实验电路图如下图所示,该原理图中显示方式采用BCD码经7447译码后用七段数码管显示,输出口为P2口。键盘BUTTON1接外部中断0,用于控制数码管以十进制方式显示计数。键盘BUTTON2接外部中断1,用于通过P1.7来控制ULN2003A,实现对蜂鸣器的发声控制。
    在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件
    B、按照上述原理图,绘制仿真图(注意电解电容的正负极不能接错)
    C、绘图结束后,点击菜单【File】【Save Design As…】,将文件保存在shiyan09文件夹下,文件名为ex10-2.DSN
    D、编写程序,完成外部中断0中断优先,且下降沿触发,外部中断1电平触发
    在Keil uVision4中,按照下述程序,建立新项目10-2.uvproj,保存在文件夹shiyan10目录下。参考实验01和实验02,编译生成10-2.hex文件
  13. 矩阵键盘的识别
    如下述电路原理图所示,用AT89S51的并行口P3接4×4矩阵键盘,以P3.0-P3.3作列输入线,以P3.4-P3.7作行输出线;在数码管上显示每个按键的“0-F”序号。
    在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件
    B、按照上述原理图,绘制仿真图(注意电解电容的正负极不能接错)
    注意:
    矩阵键盘的画法
    C、绘图结束后,点击菜单【File】【Save Design As…】,将文件保存在shiyan09文件夹下,文件名为ex10-3.DSN
    D、编写程序,完成外部中断0中断优先,且下降沿触发,外部中断1电平触发
    在Keil uVision4中,按照下述程序,建立新项目10-3.uvproj,保存在文件夹shiyan09目录下。参考实验01和实验02,编译生成10-3.hex文件
    4×4矩阵键盘识别处理
    每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
    4、实验运行结果:

5、思考题解答
5) 用C51编写4×4矩阵键盘的识别程序
在Keil uVision4中,按照下述程序,建立新项目10-4.uvproj,保存在文件夹shiyan09目录下。编写C51程序,保存为10-4.c,编译生成10-4.hex文件并调试。
答案:

#include <AT89X51.H>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsigned char temp;
unsigned char key;
unsigned char i,j;

void main(void)
{
while(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
for(i=50;i>0;i–)
for(j=200;j>0;j–);
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:
key=3;
break;
case 0x0d:
key=2;
break;
case 0x0b:
key=1;
break;
case 0x07:
key=0;
break;
}
temp=P3;

          P0=table[key]; 
          temp=temp & 0x0f;              
          while(temp!=0x0f) 
            { 
              temp=P3; 
              temp=temp & 0x0f;              
            } 
        } 
    } 

  P3=0xff; 
  P3_5=0; 
  temp=P3; 
  temp=temp & 0x0f; 
  if (temp!=0x0f) 
    { 
      for(i=50;i>0;i--) 
      for(j=200;j>0;j--); 
      temp=P3; 
      temp=temp & 0x0f; 
      if (temp!=0x0f) 
        { 
          temp=P3; 
          temp=temp & 0x0f;              
          switch(temp) 
            { 
              case 0x0e: 
                key=7; 
                break; 
              case 0x0d: 
                key=6; 
                break; 
              case 0x0b: 
                key=5; 
                break; 
              case 0x07: 
                key=4; 
                break; 
            } 
          temp=P3; 

          P0=table[key]; 
          temp=temp & 0x0f;              
          while(temp!=0x0f) 
            { 
              temp=P3; 
              temp=temp & 0x0f;              
            } 
        } 
    } 

  P3=0xff; 
  P3_6=0; 
  temp=P3; 
  temp=temp & 0x0f; 
  if (temp!=0x0f) 
    { 
      for(i=50;i>0;i--) 
      for(j=200;j>0;j--); 
      temp=P3; 
      temp=temp & 0x0f; 
      if (temp!=0x0f) 
        { 
          temp=P3; 
          temp=temp & 0x0f;              
          switch(temp) 
            { 
              case 0x0e: 
                key=11; 
                break; 
              case 0x0d: 
                key=10; 
                break; 
              case 0x0b: 
                key=9; 
                break; 
              case 0x07: 
                key=8; 
                break; 
            } 
          temp=P3; 
 
          P0=table[key]; 
          temp=temp & 0x0f;              
          while(temp!=0x0f) 
            { 
              temp=P3; 
              temp=temp & 0x0f;              
            } 
        } 
    } 

  P3=0xff; 
  P3_7=0; 
  temp=P3; 
  temp=temp & 0x0f; 
  if (temp!=0x0f) 
    { 
      for(i=50;i>0;i--) 
      for(j=200;j>0;j--); 
      temp=P3; 
      temp=temp & 0x0f; 
      if (temp!=0x0f) 
        { 
          temp=P3; 
          temp=temp & 0x0f;              
          switch(temp) 
            { 
              case 0x0e: 
                key=15; 
                break; 
              case 0x0d: 
                key=14; 
                break; 
              case 0x0b: 
                key=13; 
                break; 
              case 0x07: 
                key=12; 
                break; 
            } 
          temp=P3; 
 
          P0=table[key]; 
          temp=temp & 0x0f;              
          while(temp!=0x0f) 
            { 
              temp=P3; 
              temp=temp & 0x0f;              
            } 
        } 
    } 
} 

}

#include<reg51.h>

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};

unsigned char count=0;
void delay1s(void)
{
unsigned char i,j,k;
for(i=180;i>0;i–)
for(j=20;j>0;j–)
for(k=248;k>0;k–);
}

void main(void)
{

while(1)
{
	P0=table[count/10];   //请补充此句
	P2=table[count%10];   //请补充此句
	delay1s();
	count++;
	if(count==60)
	{
		count=0;
	}
}

}

5、思考题解答
(11)附加综合思考题:编写程序7-5.c,利用AT89S51单片机的定时器,实现上述00-59的自动计时器(秒表timer)。
在Keil uVision4中,建立新项目7-5.uvproj,保存在文件夹shiyan09目录下。编写程序7-5.c,参考实验01和实验02,编译生成7-5.hex文件,并装载到上图单片机中仿真,将仿真结果截图。

#include<reg51.h>
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char count,second;
void initial(void)
{
TMOD=0x01; //定时器T0工作在方式1,16位定时器/计数器方式
TH0=0xD8;
TL0=0xF0; //定时器T0延时10ms初值,100*10ms=1s
TR0=1; //启动T0,开始定时
TF0=0;
count=0; //计数初值,100次定时10ms,时长为1s
second=0; //秒数初值
}

void display(void)
{
P0= table[second/10] ; //请补充此句
P2= table[second%10] ; //请补充此句
}

void query(void) //查询到“10ms定时时间已到”的处理函数
{
TF0=0; //查询的标志TF0清零,以方便下次查询
count++; //计数+1,100次,时长为1s
if(count100)
{ //定时器 定时 时长 到了1s
count=0;
second++;
if(second
60)
{
second=0 ; //请补充此句
}
}
TH0=0xD8; //重置定时器初值,下次定时10ms
TL0=0xF0;

}

void main(void)
{
initial();
second=0;
display();
while(1)
{
if(TF0==1) //查询到“10ms定时时间已到”
{
query();
display();
}

}

}

实验 11 8*8点阵

1、 实验目的

  1. 掌握汇编语言设计和调试方法
  2. 熟悉Keil uVision4的使用
  3. 熟悉Proteus软件
  4. 熟悉单片I/O口的基本输入/输出功能
  5. 重点掌握单片机与静态数码管的接线和显示程序
  6. 掌握8*8点阵的工作原理
    2、 实验内容
  7. 学习使用Proteus、Keil uVision 软件,掌握绘制原理图和编译程序的方法
  8. 用AT89S51单片机的P1和P3端口,连接到点阵的行线和列线上。其中,列线是点阵的公共阴极。
  9. 在点阵上显示0-9数字
  10. 在点阵上显示柱形,从左到右从上到下各三次
    3、实验步骤
  11. 在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件
    原理图保存为ex11-1.dsn,存放到shiyan11目录下
  12. 点阵显示数字
    数字0-9点阵显示代码的形成
    如下图所示,假设显示数字“0”
    L8-L1取值:00 00 3E 41 41 41 3E 00
    当R8-R1的值为FE时,L8-L1取值00,第一列不亮,延时2MS;
    当R8-R1的值为FD时,L8-L1取值00,第二列不亮,延时2MS;
    当R8-R1的值为FB时,L8-L1取值3E,第三列亮5灯,延时2MS;
    当R8-R1的值为F7时,L8-L1取值41,第四列亮2灯,延时2MS;
    当R8-R1的值为EF时,L8-L1取值41,第五列亮2灯,延时2MS;
    当R8-R1的值为DF时,L8-L1取值41,第六列亮2灯,延时2MS;
    当R8-R1的值为BF时,L8-L1取值3E,第七列亮5灯,延时2MS;
    当R8-R1的值为7F时,L8-L1取值00,第八列不亮,延时2MS;
    通常,将形成的代码00H,00H,3EH,41H,41H,41H,3EH,00H,00H 称为显示码。将代码FE,FD,FB,F7,EF,DF,BF,7F称为列代码;
    送显示代码过程如下所示:
    送第一列线代码FE到P3端口,置第一列线为“0”,其它列线为“1”,同时送显示码00H到P1端口,延时2ms左右。
    送第二列线代码FD到P3端口,同时置第二列线为“0”,其它列线为“1”, 同时送显示码00H到P1端口,延时2ms左右,
    送第三列线代码FB到P3端口,置第三列线为“0”,其它列线为“1”,同时送显示码3EH到P1端口,延时2ms左右。
    如此下去,直到送完最后一列代码,又从头开始送。
    数字“1”代码建立
    其显示代码为 00H,00H,00H,21H,7FH,01H,00H,00H
    数字“2”代码建立
    00H,00H,27H,45H,45H,45H,39H,00H
    数字“3”代码建立
    00H,00H,22H,49H,49H,49H,36H,00H
    数字“4”代码建立
    00H,00H,0CH,14H,24H,7FH,04H,00H
    数字“5”代码建立
    00H,00H,72H,51H,51H,51H,4EH,00H
    以此类推,数字“6”的显示代码:
    00H,00H,3EH,49H,49H,49H,26H,00H
    数字“7”的显示代码:
    00H,00H,40H,40H,40H,4FH,70H,00H
    数字“8”显示代码:
    00H,00H,36H,49H,49H,49H,36H,00H
    数字“9”显示代码:
    00H,00H,32H,49H,49H,49H,3EH,00H
  13. 在点阵上显示0-9数字
    在Keil uVision4中编写下列C51程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目11-1.uvproj,保存在文件夹shiyan11目录下。
    B、添加11-1.c文件,源码如下,编译生成11-1.hex文件
    C、将11-1.hex文件添加到单片机中,仿真,将仿真结果截图
  14. 在点阵上显示移动柱形,从左到右从上到下各三次
    在Keil uVision4中编写下列C51程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目11-2.uvproj,保存在文件夹shiyan11目录下。
    B、添加11-2.c文件,源码如下,编译生成11-2.hex文件
    C、将11-2.hex文件添加到单片机中,仿真,将仿真结果截图
    4、实验运行结果:

5、思考题解答
5) 思考题:在点阵上循环显示学号
在Keil uVision4中编写下列C51程序,并编译成可执行文件
A、在Keil uVision4中,按照下述程序,建立新项目11-3.uvproj,保存在文件夹shiyan11目录下。
B、添加11-3.c文件,源码如下,编译生成11-3.hex文件
答案:
#include <AT89X52.H>
unsigned char code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code digittab[10][8]={
{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0
{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1
{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2
{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3
{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4
{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5
{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6
{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7
{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8
{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00} //9
};

unsigned int timecount;
unsigned char cnta;
unsigned char cntb;

void main(void)
{
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
ET0=1;
EA=1;
cntb=1; // first of the number 1712 4525
while(1)
{;
}
}

void t0(void) interrupt 1 using 0
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
P3=tab[cnta];
P1=digittab[cntb][cnta];
cnta++;
if(cnta8)
{
cnta=0;
}
timecount++;
if(timecount
100)
{
cntb=8;
}
if(timecount200)
{
cntb=1;
}
if(timecount
300)
{
cntb=1;
}
if(timecount400)
{
cntb=1;
}
if(timecount
500)
{
cntb=1;
}
if(timecount600)
{
cntb=3;
}
if(timecount
700)
{
//timecount=0;
cntb=6;
}
if(timecount==800)
{
timecount=0;
cntb=1;
}
}

  1. 思考题:在点阵上循环显示内缩外放的方框图,如下所示:

在Keil uVision4中编写下列C51程序,并编译成可执行文件
A、在Keil uVision4中,按照下述程序,建立新项目11-4.uvproj,保存在文件夹shiyan11目录下。
B、添加11-4.c文件,源码如下,编译生成11-4.hex文件
C、将11-4.hex文件添加到单片机中,仿真,将仿真结果截图
答案:

实验 12 LCD1602液晶显示(3课时)

1、 实验目的

  1. 掌握汇编语言设计和调试方法
  2. 熟悉Keil uVision4的使用
  3. 熟悉Proteus软件
  4. 熟悉单片I/O口的基本输入/输出功能
  5. 重点掌握单片机与LCD1602的接线和显示程序
  6. 了解字符型液晶模块的控制方法
    2、 实验内容
  7. 学习使用Proteus、Keil uVision 软件,掌握绘制原理图和编译程序的方法
  8. 用AT89S51单片机的P2连接到LCD的数据线。控制LCD显示输出两行字符。
  9. 在单片机和LCD数据线中间,加上锁存器74LS373,实现锁存输出,LCD显示两行字符。
  10. 实现LCD字符的滚动输出
    3、实验步骤
  11. 在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件
    原理图保存为ex12-1.dsn,存放到shiyan12目录下
  12. 在LCD1602上显示两行字符(方法一)
    在Keil uVision4中编写下列C51程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目12-1.uvproj,保存在文件夹shiyan12目录下。
    B、添加12-1.c文件,源码如下,编译生成12-1.hex文件
    C、将12-1.hex文件添加到单片机中,仿真,将仿真结果截图
  13. 在LCD1602上显示两行字符(方法二)
    在Keil uVision4中编写下列C51程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目12-2.uvproj,保存在文件夹shiyan11目录下。
    B、添加12-2.c文件,源码如下,编译生成12-2.hex文件
    C、将12-2.hex文件添加到单片机中,仿真,将仿真结果截图
  14. LCD1602移位显示多屏(正向移位显示和反向移位显示)
    编程实现:
    LCD1602的正向移位显示:1602从左到右,移动显示两行字符" WELCOME TO “和” ANHUI HEFEI “,
    LCD1602的反向移位显示:1602从右到左,移动显示两行字符” Name: zhangsan “和” No:18223333 ",
    在Keil uVision4中编写下列C51程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目12-3.uvproj,保存在文件夹shiyan12目录下。
    B、添加12-3.c文件,源码如下,编译生成12-3.hex文件
    C、将12-3.hex文件添加到单片机中,仿真,将仿真结果截图
  15. 利用按键,显示多屏字符
    在Proteus中绘制原理图
    A、打开Proteus(ISIS 7 Professional),在左侧选取元器件
    原理图保存为ex12-2.dsn,存放到shiyan12目录下
    在Keil uVision4中编写下列C51程序,并编译成可执行文件
    A、在Keil uVision4中,按照下述程序,建立新项目12-4.uvproj,保存在文件夹shiyan12目录下。
    B、添加12-4.c文件,源码如下,编译生成12-4.hex文件
    C、将12-4.hex文件添加到单片机中,仿真,将仿真结果截图
    4、实验运行结果:

5、思考题解答
6) 思考题,利用按键1和按键2,实现字符的正向移位显示和反向移位显示
如下图所示,初始时,LCD1602静态显示两行字符“This programm”和“by LiuBo”
按下KEY0时,1602从左到右,移动显示两行字符" WELCOME TO “和” ANHUI HEFEI “,
按下KEY1时,1602从右到左,移动显示两行字符” Name: zhangsan “和” No:18223333 ",
在Keil uVision4中编写下列C51程序,并编译成可执行文件
A、在Keil uVision4中,按照下述程序,建立新项目12-5.uvproj,保存在文件夹shiyan12目录下。
B、添加12-5.c文件,源码如下,编译生成12-5.hex文件
C、将12-5.hex文件添加到单片机中,仿真,将仿真结果截图

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值