嵌入式系统
实
验报告
实验1 Keil C51的使用(汇编语言)
实验目的:
初步掌握Keil C51(汇编语言)和ZY15MCU12BD型综合单片机实验箱的操作和使用,能够输入和运行简单的程序。
实验设备:
ZY15MCU12BD型综合单片机实验箱一台、具有一个RS232串行口并安装Keil C51的计算机一台。
实验原理及环境:
在计算机上已安装Keil C51软件。这个软件既可以与硬件(ZY15MCU12BD型综合单片机实验箱)连接,在硬件(单片机)上运行程序;也可以不与硬件连接,仅在计算机上以虚拟仿真的方法运行程序。如果程序有对硬件的驱动,就需要与硬件连接;如果没有硬件动作,仅有软件操作,就可以使用虚拟仿真。
实验内容:
1.掌握软件的开发过程:
1)建立一个工程项目选择芯片确定选项。
2)加入C 源文件或汇编源文件。
3)用项目管理器生成各种应用文件。
4)检查并修改源文件中的错误。
5)编译连接通过后进行软件模拟仿真。
6)编译连接通过后进行硬件仿真。
2.按以上步骤实现在P1.0输出一个频率为1Hz的方波。
3.在2的基础上,实现同时在P1.0和P1.1上各输出一个频率同为1Hz但电平状态相反的方波。
预习要求:
1.熟悉使用Keil C51的步骤。
2.理解实验内容2中程序的工作原理。
3.编写实验内容3所需要的程序。
实验步骤:
以下假定你在E:\TEST 文件夹下学习、运行Keil
1.建立一个工程项目选择芯片确定选项
如图1-1所示:①Project→②New Project→③输入工程名test→④保存工程文件(鼠标点击保存按钮)
弹出下一界面。
如图1-2所示:①选CPU厂家(Atmel)→②选CPU型号(89C51), ③选好后确定
接着选晶振频率及生成HEX 文件等。
如图1-3所示:①Project→②Options for Target ‘Target 1’… →③在Target中→④更改CPU 晶振频率为12MHz→⑤在Output中→⑥选择生成HEX 格式其它采用缺省设置→⑦选好后确定。
图1-1 创建工程名 图1-2 选厂家,选CPU 型号
图1-3 选晶振频率及生成HEX 文件等窗口 图1-4 进入编辑源文件窗口
2.建立汇编源文件
如图1-4所示:①File→②New, ③弹出源文件编辑窗口。
输入以下源文件:
ORG 0000H
AGAIN: CPL P1.0
MOV R0,#10 ;延时0.5秒
LOOP1: MOV R1,#100
LOOP2: MOV R2,#250
DJNZ R2,$
DJNZ R1,LOOP2
DJNZ R0,LOOP1
SJMP AGAIN
END
源程序编写完后,①File→②Save As 将文件以test.asm保存在E:\test 目录下,获得汇编语言源程序。
3.用项目管理器生成(编译)各种应用文件
①点击Target 1 前之+ 号→出现②Source Group1→③点击它并按鼠标右键会生弹出下拉菜单见图1-5 编译文件文件窗口→选择④Add Files to Group ‘ Source Group 1’ →⑤点击add向项目中添加Test.asm 源文件→⑥点击close关闭Add Files to Group ‘ Source Group 1’窗口→⑦在Source Group 1 前会出现一个+号→⑧点击之弹出test. asm 文件名点击该文件名→⑨主窗口中会出现该程序
图1-5 进入编译文件文件窗口 图1-5 硬件实时仿真调试选项窗口
编译:Project→Build target 就会生成一系列到文件如OBJ 文件LST 文件HEX文件等。
4.检查并修改源文件中的错误
如果在源文件中存在错误在Output 窗口中会出现错误提示信息,你可以在源程序中进行修改,然后存盘后重新Build 观察错误提示信息。
5.编译连接通过后进行软件模拟仿真
Debug→Start/Stop Debug Session进入软件模拟的仿真窗口,可使用单步、设断点来进行调试和除错。
6.编译连接通过后进行硬件仿真
实验箱的仿真串口必须与PC 机串口连接,通电,拨位开关K10必须拨在B端,连接P10和L00,连接P11和L01,设置硬件实时仿真调试选项:Project→Options for Target ‘Targetl’→Debug.硬件实时仿真调试选项窗口,见图1-5 选硬件仿真选项,按确定按钮确定。
进入硬件实时调试窗口后,可打开各种观察窗口,进行单步断点运行到光标连续执行等操作,无误后可连续运行观察LED发光管的显示效果。注意退出时须按单片机的复位按键SS10,在进行硬件连接前最好也先按单片机的复位按键SS10。
7.修改以上程序,实现同时在P1.0和P1.1上各输出一个频率为1Hz但电平状态相反的方波。
重要提示:
1.指令中的“,:;”是西文字符,切不可使用中文符号;数字“0”与字符“o”不可混淆。
2.以上菜单操作都可以点击工具栏中的相应图标快速实现。
3.退出硬件连接可以按SS10,在进行硬件连接前最好也按一次SS10。
4.生成源文件的方法:
①从键盘上输入源文件;
②用其他编辑软件(包括Microsoft Word)编辑源文件,然后复制到Keil C51 文件窗口中,使Word 文档变为TXT 文档,这种方法最好,可方便输入中文注释;
③也可装入在其它编辑软件中编辑的源文件如: *.asm/*.a51/*.c... 等。
实验2 十六进制与十进制的
1.实验目的:
实践汇编语言顺序结构的编程方法,掌握十六进制数转换成十进制数的编程实现,掌握单步运行程序的基本技巧。
2.实验设备:
ZY15MCU12BD型综合单片机实验箱一台、具有一个RS232串行口并安装Keil C51的计算机一台。
3.实验原理及环境:
将十六进制数转换成十进制数有多种方法,比较典型的是用待转换数除以权值的方法,即依次除以100、10,则各次的商和最后的余数就是所需要的十进制数。
4.实验内容:
将放在片内RAM30H中的2位十六进制数转换成3位十进制数,按照从高位到低位的顺序分别放入31H~33H中(即非压缩的BCD码)。在本实验中,要求使用单步方式运行,以便观察各单元的变化过程。
5.程序清单
ORG 0000H
MOV A,30H
MOV B,#100H
DIV AB
MOV 31H,A
MOV A,B
MOV B,#10H
DIV AB
MOV 32H,A
MOV 33H,B
6.实验步骤:
1.建立一个工程,将在预习中做好的*.asm文件加入。
2.调出存储器编辑窗口,将30H单元修改成某一值。
3.在希望停下来的指令上设断点,然后运行,在断点处停下来后,再单步运行,可以看到各单元的变化情况。运行完最后一条指令后,在31H~33H中应获得30H中十六进制数对应的十进制数。
7.实验结果及总结
单步调试结果
总结:本次实验中最重要的是单步调试的结果,每次单步调试后的结果如上所示,可以看出进制间的转换。
实验3 8段LED显示器动态显示
1实验目的:
掌握8段LED显示器的使用及显示程序的设计方法。
2实验设备:
ZY15MCU12BD型综合单片机实验箱一台、具有一个RS232串行口并安装Keil C51的计算机一台。
3实验原理及环境:
1. 实验箱上有6位8段LED显示器,采用动态方式驱动。即使一位LED显示器显示内容一段时间,然后下一位LED显示器显示内容一段时间……,周而复始。只要刷新频率不小于50Hz,就可以获得清晰稳定的显示效果。
2.MCS-51CPU通过一片8255对8段LED显示器进行段驱动和位驱动,8255的A口、B口、C口、控制口的地址分别为片外RAM的4000H、4001H、4002H、4003H。
3.LED显示器的各段由8255的B口驱动,低电平对应段发光,高电平对应段熄灭。各段的驱动位如图3-1,各显示字的字形代码如下所示:
显示字 字形代码 显示字 字形代码 显示字 字形代码
0 C0H 0. 40H - BFH
1 F9H 1. 79H 灭 FFH
2 A4H 2. 24H3 B0H 3. 30H
4 99H 4. 19H
5 92H 5. 12H
6 82H 6. 02H
7 F8H 7. 78H
8 80H 8. 00H
9 90H 9. 80H
A 88H A. 08H
B 83H B. 03H
C C6H C. 46H
D A1H D. 21H
E 86H E. 06H
F 8EH F. 0EH
4. LED显示器的各位由8255的A口驱动,低电平对应位发光,高电平对应位熄灭。
LED显示器 对应位口位
左起第一位 D0
左起第二位 D1
左起第三位 D2
左起第四位 D3
左起第五位 D4
左起第六位 D5
实验内容:
1.编写一个6位LED显示器驱动子程序(在主程序中已对接口芯片8255做好必要的初始化)。字形表按0~F、0.~F.、-、灭的顺序排列。该子程序的要求如下:
入口:待显示数(00H~1FH)放在20H~25H( 分别对应显示器的左起第1~第6位)中。
出口:每位LED显示0.5mS后返回。
占用:R0、R1、R2、A、PSW、DPTR。
2.子程序自身无法运行,为了运行这个子程序,另编写一个主程序。这个主程序的功能是首先对8255进行初始化,然后就反复调用显示子程序,显示20H~25H中的待显示内容。
首先在20H起始的6个字节中置入00H~0FH,然后连续运行此程序,应显示0~F;在20H起始的6个字节中置入10H~1FH,然后连续运行此程序,应显示0.~F.;若置入20H、21H,则显示-、灭。
3. 编写一段程序,运行后会在显示器上应出现连续向左移动的0~F。
实验程序:
ORG 0000H
MOV SP,#6FH
MOV 20H,#00
MOV 21H,#00
MOV 22H,#00
MOV 23H,#00
MOV 24H,#00
MOV 25H,#00
MOV DPTR,#4003H ;8255初始化
MOV A,#10000001B ; A口、B口方式0输出,C口高4位输出,低4位输入
MOVX @DPTR,A
;ACALL DELAY500MS ;延时0.5秒
LOOP3: LCALL DISP ;调用显示子程序
SJMP LOOP3
DISP:MOV R0,#20H
MOV R2,#0FEH
DISP1:MOV A,@R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#4001H
MOVX @DPTR,A
MOV A,R2
MOV DPTR,#4000H
MOVX @DPTR,A
CALL DELAY500US
MOV A,#0FFH
MOVX @DPTR,A
MOV A,R2
RL A
MOV R2,A
INC R0
CJNE R0,#26H,DISP1
RET
DELAY500MS: PUSH 00H
MOV R0,#25 ;延时0.5秒
NEXT: ACALL DELAY20MS
DJNZ R0,NEXT
POP 00H
RET
DELAY500US:PUSH 03H
MOV R3,#250
DJNZ R3,$
POP 03H
RET
DELAY20MS:PUSH 06H
PUSH 07H
MOV R7,#99
AGAIN: MOV R6,#100
DJNZ R6,$
DJNZ R7,AGAIN
POP 07H
POP 06H
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H ;0 ,1 ,2 ,3 ,4 ,5 ,6 ,7
DB 80H, 90H, 88H, 83H,0C6H,0A1H, 86H, 8EH ;8 ,9 ,A ,B ,C ,D ,E ,F
DB 40H, 79H, 24H, 30H, 19H, 12H, 2H, 78H ;0.,1.,2.,3.,4.,5.,6.,7.
DB 00H, 10H, 08H, 03H, 46H, 21H, 06H, 0EH ;8.,9.,A.,B.,C.,D.,E.,F.
END
实验4 矩阵键盘的使用
实验目的:
掌握矩阵键盘的使用及键盘扫描程序的设计方法。
实验设备:
ZY15MCU12BD型综合单片机实验箱一台、具有一个RS232串行口并安装Keil C51的计算机一台。
实验原理及环境:
实验箱上有一个16键的矩阵键盘,分为4行×4列。4行分别连接到一片8255(与8段LED显示器的段驱动和位驱动共用)的PC0~PC3,4列分别连接到8255的PC4~PC7。8255的A口、B口、C口、控制口的地址分别为片外RAM的4000H、4001H、4002H、4003H。
选择列驱动码使某一列为低电平而其它列为高电平,再读取行输入,若该列有键按下则相应的位便是低电平。每个键均安排一个键值,如图4-1所示。
实验内容:
1.编写一个键盘扫描子程序(在主程序中已对接口芯片8255做好必要的初始化)。这个程序对键盘作一次扫描,若无键按下,返回时累加器A中为FFH,若有键按下,返回时A中为该键键值。
其中,查键值子程序可以自行编写,也可以使用下面这个查键值子程序,这个子程序的参数如下:
入口:行列关键值码放在累加器A中,高4位是列驱动码(被扫描列的对应位为0,其余位均为1),低4位是行状态(按下键的对应位为0,其余位均为1)。
出口:键码放在A中带出。
占用:R1、A、PSW、DPTR。
程序清单如下:
;查键值子程序,起始
KEY20
KEY20: PUSH ACC ;暂存关键值
MOV R1,#00H ;查键值自变量清0
KEY21: JNB ACC.4,KEY22 ;计算列数
RR A
INC R1
SJMP KEY21
KEY22: MOV A,R1 ;按每列4个键计算
MOV B,#4
MUL AB
MOV R1,A
POP ACC ;恢复关键值
KEY23:JNB ACC.0,KEY24 ;计算行数
RR A
INC R1
SJMP KEY23
KEY24:MOV DPTR,#KEYTAB ;读取键值
MOV A,R1
MOVC A,@A+DPTR
RET
KEYTAB: DB 0FH,0BH,07H,03H
DB 0EH,0AH,06H,02H
DB 0DH,09H,05H,01H
DB 0CH,08H,04H,00H
2.键盘扫描子程序自身无法运行,为了运行这个子程序,另编写以下程序:
ORG 0000H
MOV SP,#6FH
MOV R0,#5 ;延时0.5秒
LOOP1: MOV R1,#200
LOOP2: MOV R2,#250
DJNZ R2,$
DJNZ R1,LOOP2
DJNZ R0,LOOP1
MOV DPTR,#4003H ;8255初始化
MOV A,#10000001B ; A口、B口方式0输出,C口高4位输出,低4位输入
MOVX @DPTR,A
LOOP3: LCALL DISP ;调用显示子程序DIS,设显示子程序入口为DISP
LCALL KEY ;调用键盘扫描子程序,设键盘扫描子程序入口为KEY
CJNE A,#0FFH,LOOP4 ;如果有键按下转
SJMP LOOP3
LOOP4: MOV 20H,21H
MOV 21H,22H
MOV 22H,23H
MOV 23H,24H
MOV 24H,25H
MOV 25H,A
SJMP LOOP3
其中显示子程序使用实验3中的显示子程序。程序运行后,每按一键便从显示器的右端移入一个对应的数。
实验5 A/D转换
实验目的:
掌握用ADC0809实现A/D的方法。
实验设备:
ZY15MCU12BD型综合单片机实验箱一台、具有一个RS232串行口并安装Keil C51的计算机一台。
实验原理及环境:
电位器W1将+5V电压分压后送入ADC0809的输入IN4~IN7,调节电位器W1可以获得0~+5V的电压输入。ADC0809的接口参数如下:
输入电压范围 0~+5V
启动IN4 A/D转换 写任意数到8004H
取转换结果 读8004H
EOC通过一个反相器输出
实验内容:
设计一个程序,将IN4输入的0~+5V模拟电压转换成数字量,再将这个2位十六进制转换成3位十进制数,放在LED显示器的第四~六位显示。其中显示子程序可以用实验3中的子程序。判断转换是否结束可以将ADC0809的EOC(经反相器)引入到P1.0,然后查询P1.0的状态。
程序清单
ADD_8255 DATA 4000H
ORG 0000H
MOV SP,#6FH
MOV R0,#5 ;延时0.5秒
LOOP1: MOV R1,#200
LOOP2: MOV R2,#250
DJNZ R2,$
DJNZ R1,LOOP2
DJNZ R0,LOOP1
MOV DPTR,#(ADD_8255+3)
MOV A,#10000001B
MOVX @DPTR,A
LOOP3: LCALL DIS
SJMP LOOP3
DIS: MOV R0,#20H
MOV R2,#0FEH
LOOP10:MOV A,@R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#(ADD_8255+1)
MOVX @DPTR,A
MOV A,R2
MOV DPTR,#ADD_8255
MOVX @DPTR,A
MOV R1,#250
DJNZ R1,$
MOV A,#0FFH
MOVX @DPTR,A
MOV A,R2
RL A
MOV R2,A
INC R0
MOV A,R0
CJNE A,#26H,LOOP10
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH
DB 040H,079H,024H,030H,019H,012H,002H,078H
DB 000H,080H,008H,003H,046H,021H,006H,00EH
DB 0BFH,0FFH
END
实验结果:变化范围为17到255,最小值存在误差,由于电路自身存在误差。
实验6 D/A转换
实验目的:
掌握用DAC0832实现D/A转换的方法。
实验设备:
ZY15MCU12BD型综合单片机实验箱一台、具有一个RS232串行口并安装Keil C51的计算机一台。
实验原理及环境:
DAC0832的连接使用单缓冲方式,D/A转换口地址为6000H。当输入数字量为0~255时,输出电压0~+5V。可以用这个电压驱动一个微型直流电动机,使它的转速在最慢到最快之间变化。
实验内容:
设计一个程序,在主程序中向P1.0输出频率为1Hz的方波,同时使用定时器1定时中断,在中断服务程序中用D/A转换器输出周期为20秒的三角波。
用一个工作寄存器存放电压值,使用定时器定时中断,每中断一次将电压值送D/A转换器并加1,直到最大值后再改为减1。周而复始,这样就可以输出三角波。这个三角波用来控制一个微型直流电动机的转速。
实验清单
ADD_8255 DATA 4000H
ORG 0000H
MOV SP,#6FH
MOV R0,#5 ;延时0.5秒
LOOP1: MOV R1,#200
LOOP2: MOV R2,#250
DJNZ R2,$
DJNZ R1,LOOP2
DJNZ R0,LOOP1
MOV DPTR,#(ADD_8255+3)
MOV A,#10000001B
MOVX @DPTR,A
LOOP3: LCALL DIS
SJMP LOOP3
DIS: MOV R0,#20H
MOV R2,#0FEH
LOOP10:MOV A,@R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#(ADD_8255+1)
MOVX @DPTR,A
MOV A,R2
MOV DPTR,#ADD_8255
MOVX @DPTR,A
MOV R1,#250
DJNZ R1,$
MOV A,#0FFH
MOVX @DPTR,A
MOV A,R2
RL A
MOV R2,A
INC R0
MOV A,R0
CJNE A,#26H,LOOP10
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB 080H,090H,088H,083H,0C6H,0A1H,086H,08EH
DB 040H,079H,024H,030H,019H,012H,002H,078H
DB 000H,080H,008H,003H,046H,021H,006H,00EH
DB 0BFH,0FFH
END