第一部分软件实验
实验一 熟悉伟福模拟仿真软件的使用
1.实验程序
INDEX EQU 20H
SUM EQU 21H
ORG 0000H
START:MOV INDEX,#5
MOV A,#0
LOOP: ADD A,INDEX
DJNZ INDEX,LOOP
MOV SUM,A
SJMP $
END
单步执行时
累加器A的内容变化:
00 05 09 0C 0E 0F
20H单元的内容变化:
05 04 03 02 01 00
21H单元的内容变化:
00 00 00 00 00 00 0F
全速执行时
累加器A的内容:0F
21H单元的内容:0F
断点执行时
累加器A的内容变化:
00 05 09 0C 0E
20H单元的内容变化:
05 04 03 02 01
思考题:将存储单元由内部存储单元21H改为外部存储单元2100H
程序如下:
INDEX EQU 20H
ORG 0000H
MOV DPTR,#2100H
START:MOV INDEX,#5
MOV A,#0
LOOP: ADD A,INDEX
DJNZ INDEX,LOOP
MOVX @DPTR,A
SJMP $
END
实验二 简单编程实验
1.清零程序
(1)对一个单元清零
ORG 0000H
CLR A
MOV DPTR,#200AH
MOVX @DPTR,A
SJMP $
END
200AH单元内容 执行前:FF 执行后:00
思考题:能否用MOVX @DPTR,#00H 或 MOVX 200AH,A?
不能,访问外部数据需要间接访问
对内部数据清零的方法?
MOV direct,A 或 MOV direct,Rn 或 MOV direct1,direct2
MOV direct,@Ri 或 MOV direct,#data
(2)将RAM某一数据块清零
程序如下:
ORG 0000H
MOV DPTR,#2010H
MOV R0,#11H
CLR A
LL:MOVX @DPTR,A
INC DPTR
DJNZ R0,LL
SJMP $
END
执行前:2010H FF 执行后:2010H 00
2011H FF 执行后:2011H 00
… …
2020H FF 执行后:2020H 00
流程图:
思考题:如何对从2010H开始的256个存储单元清零
程序如下:
ORG 0000H
MOV DPTR,#2010H
CLR A
MOV R1,#10H
LL2: MOV R0,#10H
LL1:MOVX @DPTR,A
INC DPTR
DJNZ R0,LL1
DJNZ R1,LL2
SJMP $
END
2.屏蔽程序
执行前:2010H FF 执行后:2010H FF
2011H FF 执行后:2011H 0F
思考题:(1)如何对指定单元进行低4位屏蔽?
例如将2010H—2020H的低4位屏蔽,程序如下:
ORG 0000H
MOV DPTR,#2010H
MOV RO,#11H
LOOP:MOVX A,@DPTR
ANL A,#0FH
MOVX @DPTR,A
INC DPTR
DJNZ R0,LOOP
SJMP $
END
(2)如何将指定位屏蔽?
答: 修改A,将相应的位取0即可。
3.位移程序
执行前: 2010H 0B 执行后:2010H 0B
2011H 2D 2011H 85
思考题:如何对指定单元内容左移一位?
程序如下:
ORG 0000H
MOV DPTR,#2010H
MOVX A,@DPTR
RL A
INC DPTR
MOVX @DPTR,A
SJMP $
END
4.拆字程序
执行结果:
执行前:2040H 3A 执行后:2040H 3A
2041H FF 2041H 0A
2042H FF 2042H 03
思考题:执行后,原始数据(2040H的内容)有没有变化?为什么?
答:没有变化,因为程序在进行逻辑运算后都是把结果保存在另外的存储单元中,没有覆盖原来的值。
5.拼字程序
源程序执行结果:
执行前:2040H 58 执行后:2040H 58
2041H 4A 2041H 4A
2042H 3D 2042H A8
思考题:结果单元2042H中的高4位是哪个单元的低4位,如果要将此单元的低4位放在结果单元的低4位上,结果单元的高4位放另一单元的低4位,请修改程序。
答:结果单元2040H的高4位是2041H单元的低4位。
修改后程序如下:
ORG 0000H
MOV DPTR,#2041H
MOVX A,@DPTR
ANL A,#0FH
MOV R0,A
MOV DPTR,#2040H
MOVX A,@DPTR
SWAP A
ANL A,#0F0H
ORL A,R0
INC DPTR
INC DPTR
MOVX @DPTR,A
SJMP $
END
实验三 编程实验(一)
1.分支程序
实验结果:
X(2100H) Y(2101H)
24 29
0 19
83 83
结果与设想相符。
1. 循环程序
程序流程图如下:
执行结果:将初始值设定好后,运算得2100H单元为02,与手算结果相同,改变初值,再次运行,结果依然正确。
2. 子程序调用
实验结果:
PC值的变化:
SP值的变化:
思考题:子程序中PUSH ACC的作用是什么?如果将这条指令去掉,执行程序会出现什么情况?
答:指令PUSH ACC的作用:使得返回时的堆栈指针不变,保证调用完子程序后能够正确返回。如果将这条指令去掉,则程序调用完子程序后返回出错,会跳到别的地方。
3. 查表程序:
问题:验证查找次数是否正确,读懂程序,给程序加上注释。
答:赋初值执行,查找次数正确。程序注释如下:
ORG 0000H
MOV DPTR,#2100H
MOVX A,@DPTR
MOV B,A ;将2100H单元的值赋给B
MOV R0,#00H ;R0用于计量查找次数,初始化
MOV DPTR,#KYTRL ;赋数据区的起始地址给DPTR
KEY1:CLR A
MOVC A,@A+DPTR
CLR C ;将C清零,便于A,B的比较
SUBB A,B ;比较A,B,相等时表示找到
JZ KEY2 ;找到后跳至KEY2
INC R0
INC DPTR ;没找到时查找次数加1,地址加1
SJMP KEY1 ;跳到KEY1,重新比较查找
KEY2:MOV A,R0
MOV DPTR,#2101H
MOVX @DPTR,A ;保存查找次数到2101H单元
SJMP $
ORG 2020H
KYTRL:DB 0FFH,0EFH,0F7H,0FBH ;将数据区赋初值
DB 0DFH,0E7H,0EBH,0CFH
DB OD7H,0DBH,0DDH
END
实验四 编程实验(二)
1. 程序跳转表
实验结果:
各地址单元数据变化:
30H: 00 00 00 00
31H: 00 00 01 01
32H: 00 00 02 02
33H: 00 00 03 03
各寄存器变化:
DPL: 00 19 19 19 19 19
PSW: 00 01 01 01 01 00
A: 00 01 02 04 03 06
第一部 硬件基础实验
实验五 并行接口
实验程序(1)
自编程序①使第三个数码管各段轮流亮。
②使六个数码管共42段;LED各段轮流亮。
程序①如下:
ORG 0000H
MOV P1,#04H
MOV A,#01H
NEXT: MOV P2,A
MOV R3,#0
LOOP: MOV R4,#0
DJNZ R4,$
DJNZ R3,LOOP
RL A
SJMP NEXT
END
程序②如下:
ORG 0000H
MOV A,#01H
MOV R6,#06H
MOV R7,A
LOOP1:MOV P1,A
MOV R5,#07H
MOV A,#01H
NEXT: MOV P2,A
MOV R3,#0
LOOP2:MOV R4,#0
DJNZ R4,$
DJNZ R3,LOOP2
RL A
DJNZ R5,NEXT
MOV A,R7
RL A
MOV R7,A
DJNZ R6,LOOP1
END
实验程序(2)
1.自编程序:编程并烧写程序完成置1键ON第一个数码管亮“1”,拨2键第二个数码管亮“2”,拨3键第三个亮“3”。
程序如下:
ORG 0000H
MOV DPTR,#TAB0
MOV P1,#01H
STA1: SETB C
MOV R0,#01
ASP: MOV P0,#0FFH
MOV A,P0
CLP A
MOV P1,A
MOV A,P0
ASP1: RRC A
JNC LED
INC R0
CJNE R0,#9,ASP1
SJMP STA1
LED: MOV A,R0
MOVC A,@A+DPTR
MOV P2,A
SJMP STA1
TAB0:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
2.自编程序:编程并烧写程序完成置1键ON六个数码管轮流亮1,置2键轮流亮2,置3轮流亮3.
程序如下:
ORG 0000H
MOV DPTR,#TAB0
STA1: SETB C
MOV R0,#01
ASP: MOV P0,#0FFH
MOV A,P0
ASP1: RRC A
JNC LED
INC R0
CJNE R0,#9,ASP1
SJMP STA1
LED: MOV A,R0
MOVC A,@A+DPTR
MOV P2,A
WE: MOV A,#01
NEXT:MOV P1,A
MOV R3,#0
LOP: MOV R4,#0
LOP1: NOP
NOP
DJNZ R4,LOP1
DJNZ R3,LOP
RL A
CJNE A,#10H,NEXT
SJMP STA1
TAB0: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
实验六 中断
实验程序1:
(1).分析该程序的功能及现象。
答:功能:通过开关产生中断信号,显示数码管的不同段亮。
现象:不断按下开关W2,可看到第三个数码管的不同段顺序点亮。
(2).自编程序:①七个发光二极管(即一个数码管)同时点亮,中断一次,同时熄灭,每中断一次,变反一次。
②要求同①,每中断一次,变反四次。
程序①如下:
ORG 0000H
AJMP STAR
ORG 0003H
CPL A
MOV P2,A
RETI
STAR:MOV P1,#01H
MOV A,#0FFH
MOV P2,A
SETB EA
SETB EX0
SETB IT0
SJMP $
END
程序②如下:
ORG 0
AJSM STAR
ORG 3
CPL A
MOV P2,A
ACALL TIME
CPL A
MOV P2,A
ACALL TIME
CPL A
MOV P2,A
ACALL TIME
CPL A
MOV P2,A
ACALL TIME
RETI
STAR:MOV P1,#01H
MOV A,#0FFH
MOV P2,A
SETB EA
SETB EX0
SETB IT0
SJMP $
TIME:MOV R3,#0
LOP: MOV R4,#0
LOP1:NOP
NOP
DJNZ R4,LOP1
DJNZ R3,LOP
END
实验程序2.
分析该程序的功能及现象
答:功能:记录并显示INT0中断的次数
现象:通过开关按键,按两下,数码管显示的数字增1。
自编程序:使第六个数码管显示“H”,每中断一次,“H”左移一位。
程序如下:
ORG 0000H
AJMP STAR
ORG 3
RR A
MOV P1,A
RETI
STAR:MOV P2,#F6H
MOV A,#20H
MOV P1,A
SETB EA
SETB EX0
SETB IT0
SIMP $
END
实验七 定时/计数器
实验程序1.
修改程序(使用查询方式)使计3个脉冲A加1,并将A的值显示在数码管上。
程序如下:
ORG 0000H
MOV DPTR,#TAB0
MOV TMOD,#6
MOV TH0,#0FDH
MOV TL0,#0FDH
MOV P1,#0FFH
MOV A,#0
MOV R0,A
MOV P2,#3FH
COUN:JNB TF0,$
CLR TF0
INC A
MOV R0,A
MOVC A,@A+DPTR
MOV P2,A
MOV A,R0
SJMP COUN
TAB0: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
实验程序2.
修改程序(使用中断方式)使3个脉冲A加1,并将A值显示在数码管上。
程序如下:
ORG 0000H
SJMP COUN
ORG 000BH
INC A
MOV R0,A
MOVC A,@A+DPTR
MOV P2,A
MOV A,R0
RETI
COUN: MOV TMOD,#6
MOV TH0,#0FDH
MOV TL0,#0FDH
MOV P1,#0FFH
MOV A,#0
MOV P2,#3FH
SETB EA
SETB ET0
SETB TR0
SJMP $
END
实验程序3.简易电子琴
计算“Do”的计算初值。
解:单片机的内部脉冲:f1=12000,000HZ,
机器周期:T1=12/f1
Do的频率:f2为 262HZ,
音调周期:T2=1/f2
由于是半个音调周期就要产生一次中断,
则计时时间t=T2/2
计时初值tt=2(16)-t/T1=63628
转为十六进制为F88C。
第二篇:单片机实训实验报告
单片机实训实验报告
课 题:单片机实训
院 系:电子信息工程学院
班 级
学 号:
姓 名:
指导老师:熊老师、罗老师
日 期:2011.6.10
一、硬件系统
1、自制单片机实验板由七部分组成:
(1).8路跑马灯
(2)动态扫描共阳型数码管
(3)4X4矩阵键盘
(4)蜂鸣器
(5)4路独立键盘
(6)温度传感器
(7)I2C通信方式的EEPROM芯片24C02
二、Keil C u Vision2 简述与使用
1.打开 u Vision2
2.新建工程:菜单【project】→【New Project】选择工程存放的路径,并输入工程文件名,然后点“保存”
3.进入器件选择界面树列表框内选择“Atmel”→“AT89C52”,然后点“确定”完成器件选择。
4.编辑源程序:
新建文件:菜单【File】→【new…】。然后输入代码,编辑完成后菜单【File】→【Save】或【Save As…】把代码文件存入硬盘。C源文件存为.C后缀,汇编源文件存为.a或.src后缀,并存放在同一个工程文件夹下。
5.加入源文件到工程中:
在左边浮动窗口【File】选项卡里展开“Target 1”树,在“Source Group 1”上右键单击,弹出菜单,选【Add File to Group“Source Group 1”】,选择需要加入的源文件,点“Add”按钮加入,加入完成后按“Close”关闭。
6.设置编译选项:先选中左边浮动窗口【File】选项卡里“Target1“树节点,然后选菜单【Project】→【Options for Target “Target 1”】。
7.在弹出的“Options for Target “Target 1”” 对话框中选择[output]选项卡,勾选“Create HEX File”然后按“确定”完成设置。
8. 按“F7”开始编译,编译成功后会在工程文件夹内生成.Hex目标文件生成的.hex文件就可以用来对AT89S52芯片进行编程和运行了。
三.STC-ISP V29 Beta5 下载软件的使用
1.连接好电源线与串口线(附件中的九孔对九孔线分别连接电脑和点偏激开发板)。
2.检查电源板上电源指示灯是否亮起,如果亮起则检查USB电源线,如果已亮则关掉电源看后面的步骤。
3.启动软件。
4.选择好STC单片机的型号(STC89CF52RC).
5.选择好你使用的计算机串口号.
6.点击OPEN FILE选择你用KEIL编译好的HEX文件.
7.直接点击下载按钮.
8.点击下载的时候按下”冷启动“按键,是单片机上电。
9.如果正常会看到下载程序进度条闪过的过程。
四、实验项目
1、 I/O口输出P1口发光二极管显示
2、 数码管显示
单管显示
多管动态显示
3、 按键控制
独立键盘
矩阵键盘
4、 信号发生(延时、定时计数器应用)
5、中断的应用
五、实验内容
(一).I/O口输出P1口发光二极管显示
1.实验工具:8路跑马灯,开发软件Keil u Vision2,STC-ISP V29 Beta5 下载软件。
2.实验要求:八路跑马灯从右边向左依次发亮。
3.实验目的:学习P1口的使用,延时程序的编写和调用。
4.实验程序:
org 0000h
start:jb p3.2,start
lcall delay
jb p3.2,start
mov r0,#8
mov a,#0feh
l1:mov p1,a
lcall delay2
rl a
djnz r0,l1
mov p1,#0ffh
sjmp start
delay:mov r1,#20
del:mov r2,#250
djnz r2,$
djnz r1,del
ret
delay2:mov r3,#200
dl:mov r4,#255
DJNZ r4,$
djnz r3,dl
ret
end
5.实验图8路跑马灯
(二)、数码管动态扫描
1.实验工具:共阳型数码管,开发软件Keil u Vision2,STC-ISP V29 Beta5 下载软件。
2.实验要求:让其中的一个数码管依次显示0到9。
3. 实验目的:学习数码管的显示原理,及共阳极数码管显示电路;掌握动态扫描间隔时间.
4.实验电路图如下
5.实验程序:
org 000h
ljmp start
org 0030h
start:mov p2,#7fh
mov r0,#10
mov r1,#0
loop:mov a ,r1
movc a ,@a+dptr
mov p0,a
lcall delay
inc a
mov r1 ,a
djnz r0,loop
db:db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h
delay:mov r6,#1000
dell:mov r7,#250
del:djnz r7,del
djnz r6,dell
ret
End
(三).矩阵按键控制
1.实验要求:采用扫描方式,识别4*4矩阵按键,没按下一个键,则对应的1位或2位发光二极管被点亮。
2.实验目的:采用扫描方式,识别4*4矩阵按键,没按下一个键,则对应的1位或2位发光二极管被点亮。
3.实验电路图
按下某一件键,在P1口对应灯里显示对应键的反码
4.实验程序:
ORG 0000H
SETB P3.6
M1:JNB P3.2,L1
JNB P3.3,L2
JNB P3.4,L3
JNB P3.5,L4
AJMP M1
L1:CLR P3.6
LCALL DELAY1
SETB P3.6
LCALL DELAY1
AJMP M1
L2:CLR P3.6
LCALL DELAY2
SETB P3.6
LCALL DELAY2
AJMP M1
L3:CLR P3.6
LCALL DELAY3
SETB P3.6
LCALL DELAY3
AJMP M1
L4:CLR P3.6
LCALL DELAY4
SETB P3.6
LCALL DELAY4
AJMP M1
DELAY1:MOV R6,#2
DEL1:MOV R7,#250
DJNZ R7,$
DJNZ R6,DEL1
RET
DELAY2:MOV R6,#5
DEL2:MOV R7,#250
DJNZ R7,$
DJNZ R6,DEL2
RET
DELAY3:MOV R6,#10
DEL3:MOV R7,#250
DJNZ R7,$
DJNZ R6,DEL3
RET
DELAY4:MOV R6,#15
DEL4:MOV R7,#250
DJNZ R7,$
DJNZ R6,DEL4
RET
END
<四>.小喇叭报警器
1. 实验要求:声音是由震动产生的,一定频率的震动就产生了一定频率的声音。这实验是让不同的按键控制蜂鸣器的不同频率和发声时间。
2. 实验目的:a.学习频率子程序的编写和使用。
b.学习蜂鸣器驱动电路。
3.实验电路图:
3. 实验程序:
org 0000h
SETB P3.6
M1:JNB P3.2,L1
JNB P3.3,L2
JNB P3.4,L3
JNB P3.5,L4
AJMP M1
L1:CLR P3.6
CALL DELAY1
SETB P3.6
CALL DELAY1
DJNZ R1,L1
AJMP M1
L2:CLR P3.6
CALL DELAY2
SETB P3.6
CALL DELAY2
DJNZ R2,L2
AJMP M1
L3:CLR P3.6
CALL DELAY3
SETB P3.6
CALL DELAY3
DJNZ R3,L3
AJMP M1
L4:CLR P3.6
CALL DELAY4
SETB P3.6
CALL DELAY4
DJNZ R4,L4
AJMP M1
DELAY1:MOV R6,10
DEL1:MOV R7,#250
DJNZ R7,$
DJNZ R6,DEL1
RET
DELAY2:MOV R6,#50
DEL2:MOV R7,#250
DJNZ R7,$
DJNZ R6,DEL2
RET
DELAY3:MOV R6,#120
DEL3:MOV R7,#50
DJNZ R7,$
DJNZ R6,DEL3
RET
DELAY4:MOV R6,#180
DEL4:MOV R7,#25
DJNZ R7,$
DJNZ R6,DEL4
RET
END
<五>.中断的应用
1.实验要求:对外部中断源INT0、INT1设置边沿触发中断方式,利用按键产生中断功能。按下S17或S18,产生INT0或INT1的中断信号,使数码管显示处迅速速递增1或递减1.递增1时,伴随蜂鸣器的“嘀--嘀”声音,数码管显示处迅速增加1.当9999再加1时,数码管恢复成0000。递减1时,伴随着蜂鸣器的“嘀”声音,数码管显示处迅速递减1.当0000再减1时,数码管保持0000不变。
2.实验目的:a.学习INT0、INT1的边沿触发中断程序。
b.结合数码管、按键识别和 ,学习小型系统程序的编写。
c.从显示结果中观察、理解按键的抖动现象。
3.电路图如
4.实验程序:
SECOND EQU 30H
TCOUNT EQU 31H
ORG 00H
LJMP START
ORG 0BH
LJMP INT0X
START: MOV SECOND,#00H
MOV A,SECOND
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
MOV TCOUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
SETB TR0
SETB ET0
SETB EA
SJMP $
INT0X:
MOV TH0,#(65536-50000) / 256
MOV TL0,#(65536-50000) MOD 256
INC TCOUNT
MOV A,TCOUNT
CJNE A,#20,NEXT
MOV TCOUNT,#00H
INC SECOND
MOV A,SECOND
CJNE A,#60,NEX
MOV SECOND,#00H
NEX: MOV A,SECOND
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,B
MOVC A,@A+DPTR
MOV P2,A
NEXT: RETI
TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
六、实验总结
为期一周的实训结束了,从第一天编辑最简单的程序到后来编辑较复杂的程序,整周实训感觉时间挺紧,对如何编写好程序可谓是费劲心思,最后程序完成则有一种成功的喜悦。在实训中,我感觉理论知识的不足,编写过程中不细心导致不必要的错误等,故此,理论知识和细心度是我努力的方向,希望学好单片机掌握这门知识。