汇编语言单片机实验.docx
- 文档编号:4615978
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:39
- 大小:27.73KB
汇编语言单片机实验.docx
《汇编语言单片机实验.docx》由会员分享,可在线阅读,更多相关《汇编语言单片机实验.docx(39页珍藏版)》请在冰豆网上搜索。
汇编语言单片机实验
软件实验一数据传送
一、实验目的
1.熟悉KEIL软件的程序调试方法
2.掌握从外部数据存储器传送到内部存储器的指令
3.掌握算术运算指令
二、实验内容
本实验为软件实验:
数据传送实验。
这个实验包括两个小实验:
1.从外部数据存储器传送到内部RAM中;2.求16个学生的年龄之和,数据存放在20H单元中。
此实验均可在脱机模拟状态下调试运行,也可以连接上仿真器与实验箱在线仿真运行。
1.从外部数据存储器传送到内部RAM中
本实验在程序编译之前,将外部数据存储器(XDATA)和内部数据存储器(DATA)窗口打开,并在XDATA窗口在0000H、0001单元分别键入54H、55H。
然后程序单步运行或全速运行,观察寄存器A,B,DPTR,R1,R2,R3的值是不是如程序所希望的那样变化,最后看R3的值是不是54H+55H=A9H。
实验源程序如下:
ORG00H
AJMPSTART
ORG30H
START:
MOVA,#56H
MOVB,#78H
MOVDPTR,#00H
MOVXA,@DPTR
MOVR1,A
INCDPTR
MOVXA,@DPTR
ADDA,R1
MOVR3,A
HERE:
AJMPHERE
END
2.求16个学生的年龄之和
程序运行前,先将16个学生的年龄放在内部数据区20H单元开始的地方,码制为BCD码,程序运行结束时,16个学生的年龄和放在寄存器A和B中(B为高位,A为低位)。
实验源程序如下:
ORG00H
AJMPSTART
ORG30H
START:
MOVR0,#20H
MOVR7,#16
MOVA,#00H
MOVB,A
LOOP:
ADDA,@R0
DAA
JNCNEXT
INCB
NEXT:
INCR0
DJNZR7,LOOP
HERE:
SJMPHERE
END
三、实验步骤
1.运行KEIL软件
2.新建项目project/newproject/
3.保存项目选择保存项目的名称和位置如abc.uv2
选择单片机的CPU型号如atmel公司的89c52
4.新建源文件file/new
5.输入源程序
6.保存源文件file/saveas选择保存的名称和位置,如abc.a51
7.将源文件加入项目中sourcegroup1右键选择“addfiletogroup”选择源文件点击确定
8.编译项目rebuildalltargetfiles
9.调试程序单击start/stopdebugsession进入程序调试状态
10.单步执行程序,或者全速、断点执行程序debug/step(go)
11.查看执行结果view/memorywindowaddressd:
00h内部RAM
X:
0000H外部RAM
C:
0000HROM
可以查看相应存储器内的内容
或者选择view/watchaandcallstackwindow查看相应变量内容
12.给相应单元赋值,并执行程序,记录执行结果,写出实验报告。
给相应单元赋值方法:
鼠标移动到相应单元,点击鼠标右键选择modifymemoryvalue输入新值。
13.记录实验中遇到的问题和解决方法。
软件实验二排序/数制转换
一、实验目的
1.熟练使用KEIL软件调试程序
2.掌握查询指令和循环程序的设计方法
3.掌握数据转换的程序设计方法
4.掌握有关循环程序和数据转换的程序的调试
二、实验内容
1.求8个无符号数的最大值
给定8个无符号数,将其放内部数据区(DATA)中,地址从20H开始,运行下列程序,看看是否将8个数的最大值存储在A寄存器和内部数据区41H单元中。
程序清单如下:
ORG00H
SJMPSTART
ORG30H
START:
MOVR0,#20H
MOVR6,#08H
MOVA,@R0
DECR6
LOOP:
INCR0
MOV40H,@R0
CJNEA,40H,CHK
JMPDD1
CHK:
JNCSQ
MOVA,40H
SQ:
DJNZR6,LOOP
DD1:
MOV41H,A
HERE:
SJMPHERE
END
附加功能:
编程实现内部RAM20H-27H单元八个数从小到大排序
2.将一个字节BCD码转换成二进制数
将R2中的内容转换成二进制数据,并传送到20H单元中。
程序清单如下:
ORG00H
AJMPSTART
ORG30H
START:
MOVR2,#99H
ACALLDTOB
HERE:
SJMPHERE
DTOB:
MOVA,R2
ANLA,#0F0H
SWAPA
MOVB,#10
MULAB
MOVR3,A
MOVA,R2
ANLA,#0FH
ADDA,R3
MOVR3,A
MOV20H,A
RET
三、实验步骤
要求:
写出实验步骤并记录程序调试结果。
硬件实验一并行口的使用
一、实验目的
1.熟悉单片机仿真实验箱XL600+使用方法
2.学会使用XLISP向单片机烧录程序
3.学会单片机并行口的使用方法
二、实验内容
使用单片机的并行口P1接8路LED灯,通过程序控制轮流点亮8个灯。
为0时灯亮,为1时灯灭。
参考程序:
ORG0000H
JMPMAIN
ORG0030H
;************************************************
MAIN:
MOVA,#0FEH;赋初始值
LOOP:
MOVR0,#07H;移动次数
LOOPL:
MOVP0,A
MOVP2,A
RLA;左移
CALLDELAY
DJNZR0,LOOPL
MOVR0,#07H;移动次数
LOOPR:
MOVP0,A
MOVP2,A
RRA;右移
CALLDELAY
DJNZR0,LOOPR
JMPLOOP
;************************************************
DELAY:
MOVR6,#0FFH
DEL:
MOVR7,#0FFH
DJNZR7,$
DJNZR6,DEL
RET
END
三、实验连线
P1(JP44)----八路指示灯(JP32)
四、实验步骤
1、按下实验箱的电源开关,使得实验箱接通电源,此时实验箱XL600+上指示灯闪烁显示3次后熄灭。
2、连接实验连线P1(JP44)---八路指示灯(JP32)
3、新建项目,新建文件,输入源程序,编译程序,生成*.hex文件。
方法:
在编译时选择project/optionsfortarget‘target1’在生成hex前打“勾”,然后编译程序,编译成功后*.hex跟源程序在同一位置。
4、烧录程序
方法:
(1)打开lisp软件
(2)操作/检测编程器显示编程器检测OK字样,表示编程器当前处于正常工作状态。
(3)打开*.hex文件
(4)选择智能一键通,完成*.hex文件烧录
5、烧录完成后,单片机自动执行程序,此时八路指示灯轮流点亮。
如果不能正常显示请修改程序,直到能够正确显示实验现象。
6、记录实验中遇到的问题及解决方案
硬件实验二定时计数器的使用
一、实验目的
1.学习定时计数器的编程使用
2.学习8位数码管的编程使用
3.再次熟悉单片机仿真实验箱XL600+使用方法
二、实验内容
编程使用单片机的定时计数器定时1s钟,并通过8位数码管显示当前秒表的时间,分辨率为0.01s,控键K01第一次按下时,启动开始计时,第二次按下时,停止计时,第三次按下时,归零。
三、实验连线
p0口-----数码管数据线(JP5)
p2口-----数码管显示位控制(JP8)
p3.2口---控制按键K01(JP37.0)
实验参考程序见编程实例F:
\单片机\编程实例\电子钟.计数器\数码管8位秒表计时
;*---秒单位----------数码管端口----缓冲区---------计时BCD码值寄存器*
;*十万位P20dis_buf[7]sec_bcd[7]*
;*万位P21dis_buf[6]sec_bcd[6]*
;*千位P22dis_buf[5]sec_bcd[5]*
;*百位P23dis_buf[4]sec_bcd[4]*
;*十位P24dis_buf[3]sec_bcd[3]*
;*个位(1.s)P25dis_buf[2]sec_bcd[2]*
;*十分位(0.1s)P26dis_buf[1]sec_bcd[1]*
;*百分位(0.01s)P27dis_buf[0]sec_bcd[0]*CODE_SEGSEGMENTCODE
DATA_SEGSEGMENTDATA
STACK_SEGSEGMENTIDATA
RSEGDATA_SEG
KEY_S:
DS1
KEY_V:
DS1
DIS_DIGIT:
DS1
DIS_INDEX:
DS1
SEC_BCD:
DS8;秒计数值,BCD码
KEY_TIMES:
DS1;K1按下次数
DIS_BUF:
DS8;显示缓冲区
RSEGSTACK_SEG
STACK:
DS20
K1BITP3.2
;===============================================================================
CSEGAT0000H
LJMPMAIN
CSEGAT0000BH
LJMPTIMER0
CSEGAT0001BH
LJMPTIMER1
;===============================================================================
RSEGCODE_SEG
MAIN:
USING0
MOVSP,#(STACK-1)
MOVP0,#0FFH;初始化端口
MOVP2,#0FFH
MOVTMOD,#011H;
MOVTH1,#0DCH
CLRA
MOVTL1,A
MOVTH0,#0FCH
MOVTL0,#017H
LCALLCLR_TIME;清零计时值
MOVDIS_DIGIT,#07FH;上电时选通P27数码管
CLRA
MOVDIS_INDEX,A
MOVKEY_TIMES,A
MOVKEY_V,#01H
MOVIE,#08AH;使能timer0,timer1中断
SETBTR0
CLRTR1
MAIN_LP:
LCALLSCAN_KEY;键扫描
JZMAIN_LP;无键返回
MOVR7,#10;延时10ms
LCALLDELAYMS;延时去抖动
LCALLSCAN_KEY;再次扫描
JZMAIN_LP;无键返回
MOVKEY_V,KEY_S;保存键值
LCALLPROC_KEY;键处理
SJMPMAIN_LP;调回主循环
;===============================================================================
CLR_TIME:
CLRA
MOVSEC_BCD,A;清零所有计时值
MOVSEC_BCD+01H,A
MOVSEC_BCD+02H,A
MOVSEC_BCD+03H,A
MOVSEC_BCD+04H,A
MOVSEC_BCD+05H,A
MOVSEC_BCD+06H,A
MOVSEC_BCD+07H,A
LJMPUPDATE_DISBUF;更新显示缓冲区
;===============================================================================
SCAN_KEY:
CLRA
MOVKEY_S,A
MOVC,K1;读按键状态
RLCA
ORLKEY_S,A
MOVA,KEY_S
XRLA,KEY_V;
RET
;===============================================================================
PROC_KEY:
MOVA,KEY_V
JBACC.0,END_PROC_KEY
INCKEY_TIMES
MOVA,KEY_TIMES
CJNEA,#01H,PROC_KEY1
SETBTR1;KEY_TIMES=1,第一次按下K1,启动开始计时
RET
PROC_KEY1:
MOVA,KEY_TIMES
CJNEA,#02H,PROC_KEY2
CLRTR1;KEY_TIMES=2,第二次按下K1,停止计时
RET
PROC_KEY2:
LCALLCLR_TIME;第三次按下K1,清零计时值
CLRA
MOVKEY_TIMES,A;清零KEY_TIMES
END_PROC_KEY:
RET
;===============================================================================
TIMER0:
;定时器0中断服程序,用于数码管的动态扫描
;DIS_INDEX---显示索引,用于标识当前显示的数码管和缓冲区的偏移量
;DIS_DIGIT---位选通值,传送到P2口用于选通当前数码管的数值,如等于0xfe时,
;选通P2.0口数码管
;DIS_BUF---显于缓冲区基地址
PUSHACC
PUSHPSW
PUSHAR0
MOVTH0,#0FCH
MOVTL0,#017H
MOVP2,#0FFH;先关闭所有数码管
MOVA,#DIS_BUF;获得显示缓冲区基地址
ADDA,DIS_INDEX;获得偏移量
MOVR0,A;R0=基地址+偏移量
MOVA,@R0;获得显示代码
MOVP0,A;显示代码传送到P0口
MOVP2,DIS_DIGIT;
MOVA,DIS_DIGIT;位选通值右移(P20<-P27),下次中断时选通下一位数码管
RRA
MOVDIS_DIGIT,A
INCDIS_INDEX;DIS_INDEX加1,下次中断时显示下一位
ANLDIS_INDEX,#0x07;当DIS_INDEX等于8(00001000)时,清0
POPAR0
POPPSW
POPACC
RETI
;===============================================================================
TIMER1:
PUSHACC
PUSHB
PUSHDPH
PUSHDPL
PUSHPSW
PUSHAR7
ORLTH1,#0DCH;恢复定时器初值
CLRA
MOVR7,A
MOVA,#LOW(SEC_BCD)
MOVR0,A;计时值寄存器地址到R0
TIMER_INC:
;
INC@R0;计时值加1
MOVA,@R0
CLRC
SUBBA,#10;
JCEND_INC;如果低位不满10,则结束
MOV@R0,#00H;低位满10,清零低位
INCR0;指向高位
INCR7;
CJNER7,#08H,TIMER_INC;如果达到最高位,则结束
END_INC:
LCALLUPDATE_DISBUF
POPAR7
POPPSW
POPDPL
POPDPH
POPB
POPACC
RETI
;===============================================================================
UPDATE_DISBUF:
;根据计时寄存器的值更新显示缓冲区
MOVDPTR,#DIS_CODE;保存表格地址
MOVA,sec_bcd
MOVDPTR,#dis_code
MOVCA,@A+DPTR;获得显示代码
MOVdis_buf,A;更新显示缓冲区
MOVA,sec_bcd+01H
MOVCA,@A+DPTR
MOVdis_buf+01H,A
MOVA,sec_bcd+02H
MOVCA,@A+DPTR
ANLA,#07FH;显示小数点
MOVdis_buf+02H,A
MOVA,sec_bcd+03H
MOVCA,@A+DPTR
MOVdis_buf+03H,A
MOVA,sec_bcd+04H
MOVCA,@A+DPTR
MOVdis_buf+04H,A
MOVA,sec_bcd+05H
MOVCA,@A+DPTR
MOVdis_buf+05H,A
MOVA,sec_bcd+06H
MOVCA,@A+DPTR
MOVdis_buf+06H,A
MOVA,sec_bcd+07H
MOVCA,@A+DPTR
MOVdis_buf+07H,A
RET
;ENDOFUPDATE_DISBUF
;===============================================================================
DELAYMS:
;延时子程序
;传入参数:
R7---延时值(MS)
;返回值:
无
MOVA,R7
JZEND_DLYMS
DLY_LP1:
MOVR6,#185
DLY_LP2:
NOP
NOP
NOP
DJNZR6,DLY_LP2
DJNZR7,DLY_LP1
END_DLYMS:
RET
;===============================================================================
DIS_CODE:
db28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h,0ffh
END
五、实验步骤
要求:
写出实验步骤,并记录实验中遇到的问题和解决方案
硬件实验三温度传感器液晶显示器的使用
一、实验目的
1.学习温度传感器18B20的使用
2.学习液晶显示器的使用
二、实验内容
DS18B20的管脚定义:
1、GND2、DQ3、VCC
温度显示用四位,当温度>=100度时,第四位才显示。
检测DS18B20状态:
DS18B20正常显示:
DS18B20OKTEMP:
25.8℃←显示实际温DS18B20不正常显示:
DS18B20ERRORTEMP:
----℃←显示----
主要功能:
一、查看温度报警值:
K1→进入查看温度报警值状态。
LCD1602显示:
LOOKALERTCODETH:
028℃TL:
18℃TH:
028高位报警值*
TL:
18低位报警值K3→退出查看温度报警值状态。
二、设定温度报警值:
K2→进入设定温度报警值状态?
LCD1602显示:
RESETALERTCODETH:
028℃TL:
18℃K1:
设定值加(UP)、减(DOWN)方式选择键(默认为减少)
K2:
TH值设定键
K3:
TL值设定键
K4:
确定键(退出设定状态)
K2或K3以减(DOWN)方式设定,当设定数值减到“0”时自动转换为加(UP)方K2或K3以加(UP)方式设定,当设定数值TH=120、TL=99时,设定数值均变为“0”
K4→确定并退出设定温度报警值状态。
将设定的温度报警值自动存入DS18B20的EEROM中,可永久保存。
每次开机时自动从DS18B20的EEROM读出温度报警值。
;三、报警状态的显示:
1、当实际温度大于TH的设定值时,LCD1602显示:
DS18B20OKTEMP:
88.8℃>H关闭继电器,蜂鸣器响,表示超温
2、当实际温度小于TL的设定值时,LCD1602显示:
DS18B20OKTEMP:
18.8℃ 3、当实际温度小于TH的设定值时,继电器吸合,开始加热。 加热标记为“! ” 三、实验连线 p1.0-----继电器(JP18) p3.7------喇叭(JP16) p3.3-----18b20 p1.4-p1.7------按键k1-k4 1602液晶 实验参考程序见编程实例F: \单片机\编程实例\温度试验\18b20液晶温度控制 TEMP_ZHDATA24H;实时温度值存放单元 TEMPLDATA25H; TEMPHDATA26H; TEMP_THDATA27H;高温报警值存放单元 TEMP_TLDATA28H;低温报警值存放单元 TEMPHCDATA29H; TEMPLCDATA2AH K1EQUP1.4 K2EQUP1.5 K3EQUP1.6 K4EQUP1.7 BEEPEQUP3.7 RELAYEQUP1.0 LCD_XEQU2FH;L
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 单片机 实验