单片机实验报告1.docx_第1页
单片机实验报告1.docx_第2页
单片机实验报告1.docx_第3页
单片机实验报告1.docx_第4页
单片机实验报告1.docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验1 开发环境使用及常用指令功能一、实验目的1、掌握集成开发环境的使用;2、初步了解实验装置的使用方法;3、熟悉常用指令的功能;4、熟悉程序调试的方法;5、学习自己编写、调试计算程序。二、实验说明利用单片机及keil uvision4软件实现程序的编译、运行、调试,学会利用软件硬件的几次开发使用。三、实验内容1、自行编写一段计算程序,实现双字节二进制数除以单字节二进制数,将所编程序录入、编译加载并调试。分析运行过程2、用排线将单片机p2口与通用板上led指示灯连接,单步执行下列指令:setbp2.0clrp2.0cplp2.1cplp2.1mova,#55hmovp2,axrla,#0ffhmovp2,arlcamovp2,a观察指令执行后,指示灯的亮、熄现象,理解指令的功能。在实验报告中记录实验现象和分析。四、实验程序1、双字节二进制数除以单字节二进制数程序如下:org 0000hstart:ljmp clateorg 0030hclate: mov 34h,#10;被除数高位34h设为10mov 33h,#0 ;被除数低位33h设为0mov 35h,#10;除数35h设为10mov r3,34h;被除数高位移至r3mov r2,33h;被除数高位移至r2mov r4,35h;除数移至r4mov 32h,0;设置商存放在32hmov b,#8;设置循环次数loop:clr c;mov a,r3;被除数高位移至asubb a,r4;r3-r4mov 31h,a;余数暂存31hjnc loop1;若够减,则跳转loop1mov a,r2;若不够减,则r3r2整体左移rlc a;mov r2,a; mov a,r3;rlc a;mov r3,a; 至此r3r2整体左移ljmp loop2;loop1: inc 32h;够减商增1mov r3,31h;余数存回至除数高位loop2: mov a,32hrl amov 32h,adjnz b,loop;未做完除法,则转loop继续mov r6,32hend五、实验现象1、双字节二进制数除以单字节二进制数程序:运行结束后,r6为ox0a,即商为102、p2口与led指示灯亮暗实验:setbp2.0l1l2l3l4l5l6l7l8clrp2.0亮暗暗暗暗暗暗暗cplp2.1亮亮暗暗暗暗暗暗cplp2.1亮暗暗暗暗暗暗暗mova,#55hmovp2,axrla,#0ffh暗亮暗亮暗亮暗亮movp2,arlca亮暗亮暗亮暗亮暗movp2,aend亮亮暗亮暗亮暗亮六、思考题1、跨越式单步运行方式和进入式单步运行方式有什么区别?答:进入式单步:在调试状态下,点击图标,或执行快捷键f11,或者使用“debug”菜单栏“step into”选项,可以执行进入式单步操作。每进行一次操作,程序将运行一条指令。每执行一行指令,表征pc指针的图标都会向下移动一行,已执行过的语句呈现绿色。进入式单步当遇到子程序调用时,将会跟踪到子程序中执行。跨越式单步:点击图标,或者执行快捷键f10,或者使用“debug”菜单栏的“step over”选项,可以执行跨越式单步。跨越式单步当遇到子程序调用指令时,不跟进子程序中执行,直接把整个子程序一步执行完。对于其它指令来说,跨越式单步和进入式单步的作用相同。2、如何设置程序指针到光标所在程序行?答:(1)移动pc到光标所在行在光标所在程序行,点击鼠标右键,弹出一个菜单,选中“set program counter”选项,可以将程序指针pc 图标强行移到光标所在行。调试程序时,如果希望改变程序的起始运行地址,可以利用此功能移动程序指针pc指向需运行的程序位置。(2)执行到光标所在行点击图标,或者使用快捷键ctrl+f10,或者使用“debug”菜单栏中的 “run to cursor line”选项,可以使程序从当前图标所在行执行到光标所在行。3、如何修改内部ram存储单元的值?答: 通过打开数据存储器观察窗口,用户可以观察指定范围内的数据存储器内容。指定一个内部ram存储单元所包含的一个地址,将鼠标放到该地址数值上,在右键弹出的窗口中,可以人为强行修改相应地址单元的值。程序调试时,也可以采用指令给ram单元赋值,也可以人为强行修改ram中的值。实验2 “跑马灯”实验一、实验目的1、 了解发光二极管的使用方法;2、 熟悉串行、并行输出扩展接口的方法;3、 学习常用指令用法和简单程序编写技巧。二、实验说明利用单片机的p1口低4位,通过一片74hc595控制8位发光二极管,方法是在实验箱通用板上将p1口的低4位与74hc595的输入信号相连,将74hc595的输出分别与发光二极管相连,由此构成的实验电路原理如图3.1.1所示。图3.1.1 发光二极管串行控制电路在图3.1.1中,74hc595的si(串行数据输入端)、sclk(串行移位时钟输入端)、rclk(输出寄存器锁存时钟端)、/oe(输出引脚使能端)分别与单片机的p1.0、p1.1、p1.2、p1.3引脚相连。74hc595输出低电平时点亮发光二极管。图3.1.1中595的输出使能引脚(/oe)已直接连接到“地”,使输出总是使能。三、实验内容1、 按图3.1.1连接电路,调试参考程序,单步执行部分指令,观察有关寄存器中值的变化,理解指令的功能和执行效果;2、 自行对实验箱核心板上的发光二极管电路进行编程,采用并行接口控制的方法,实现“跑马灯”的功能,画出实验电路,记录实验程序。四、实验程序利用图3.1.1电路实现“跑马灯”功能的参考程序如下:lightequ62h;定义指示灯数据存放地址单元 org0000hajmpstartorg0030hstart:movsp,#30h;初始化堆栈指针clrp1.0clrp1.1clrp1.2clrp1.3;初始化有关i/o口;p1.3始终为0,输出使能恒有效movlight,#01h;初始化指示灯数据nopmain:lcallfly_led;调用指示灯循环点亮子程序lcalldelay;延时子程序同参考例程一ajmpmain;循环执行主程序;*;通过595循环点亮指示灯子程序;*flyled:mova,lightclrcrlca;累加器a中最高位移到ccplc;因低电平点亮,故取反movp1.0,c;light中数据最高位送到ser输入端setbp1.1nopclrp1.1;产生一个输入锁存脉冲setbp1.2nopclrp1.2;产生一个寄存器锁存脉冲cjnea,#0,flycon;a中不为0则继续mova,#01h;a中为0,循环完一轮;重新赋初值flycon:movlight ,aret;延时子程序delay:movr7,#20;将r7赋值20delay1:movr6,#0;将r6赋值0,相当于赋值256delay2:djnzr6,$;r6中的值减1不为0则循环执行当前行djnzr7,delay1;r7中的值减1不为0则循环ret五、实验现象led灯从l1到l8依次循环点亮,实现了“跑马灯”的功能六、思考题1、什么是led?led的工作电流一般为多大?为什么在led电路上要串联一个电阻?串联电阻的取值应为多少?答: led(light emitting diode)是发光二极管的英文缩写。单个led在各种仪器、仪表中常用作各种指示灯,根据外形直径的大小,常用的有3、5(mm)等型号,每一种直径下,还有普通亮度、高亮度、超高亮度等种类。普通亮度发光二极管工作电流一般为十几个毫安,高亮和超亮发光二极管在同样工作电流下,亮度更高。在led电路上要串联一个电阻,称为限流电阻,起到了限流的作用,其阻值约为500欧,实际使用中,选择330到510欧的限流电阻,都是可行的。2、串行接口器件和并行接口器件各有什么优缺点?答:串行接口需要的cpu口线要少一些,但是占用cpu的时间要长一些;并行接口需要的cpu口线要多一些,但是占用cpu的时间要少一些。3、单片机的晶振为12mhz,参考程序中的延时子程序的延时时间约为多少?如何修改延时时间?答:机器周期=12fosc=1s,如下列出了延时子程序中各条指令的机器周期数:延时子程序delay:movr7,#20 ;1 delay1:movr6,#0;1 delay2:djnzr6,$;2djnzr7,delay1;2ret ;2整个程序执行所用的机器周期数为:1+(1+2256+2)20+2=10303因此延时时间约为10.3ms可以通过修改r6或r7的值来改变程序循环次数,从而修改延时时间。实验3 数码管显示功能的实现一、实验目的1、 了解数码管显示器的特性和使用方法;2、 进一步熟悉常用指令和编程技巧;3、 熟悉单片机i/o口的使用方法。二、实验说明1、数码管电路结构内部8个led处于不同的位置,每个led显示一个笔画,称为一段;通过外接电路控制点亮不同的led组合,显示一位相应的数字(符号)。对于单个数码管来说,一般有十个引脚。8个发光二极管的阳极连接在一起称为共阳极数码管显示器。实验箱上通用版上的数码管即为共阳极的。若将所有发光二级管的极性调换一下,所有的阴极连接到一起则称为共阴极数码管。2、数码管显示器的动态控制电路实验箱的核心板上,有6个共阴极数码管显示器,被设计成既可为并行接口动态控制,又可为串行接口动态控制。三、实验内容1、 读懂串行接口和并行接口的led显示参考示例程序;2、 分别运行并验证参考示例程序3、 要让次低位led数码管显示中总是带有小数点,即显示的6位数值中包括一位小数,修改参考程序实现;四、实验程序1、并行接口led显示d_dat0 equ 6ahd_dat1 equ 6bhd_dat2 equ 6chd_dat3 equ 6dhd_dat4 equ 6ehd_dat5 equ 6fh ;定义显示数据单元 org 0000hajmp startorg 0030hstart: mov sp, #30h ;初始化堆栈指针mov d_dat0, #0mov d_dat1, #1mov d_dat2, #2mov d_dat3, #3mov d_dat4, #4mov d_dat5, #5 ;初始化显示数据mov p0, #0 ;clr p1.1 ;初始化有关i/o口clr p1.2mov r0, # d_dat0 ;初始化显示数据指针寄存器r0 ;指向第一位需显示数字mov r1, #01h ;初始化需点亮数码管位置代码nopmain: lcall disp ;调用数码管循环点亮子程序lcall delay ;延时子程序同前,应修改延时时间ajmp main ;循环执行主程序;*;通过574显示6位数字子程序;*disp: mov a, r1 ;取位代码mov p0, a ;位代码送p0抠(用于产生位选信号)setb p1.2nopclr p1.2mov a, r0 ;取需显示的数字值mov dptr, #dispd ;装载笔画编码表首地址movc a, a+dptr ;取需显示数字笔画代码mov p0, a ;笔画代码送到p0口(勇于产生段选信号)setb p1.1nopclr p1.1 ;产生一个锁存脉冲,锁存输出笔画代码inc r0 ;r0增1指向下一个需显示数字mov a, r1clr crlc amov r1, a ;r1中的值左移一位,指向下一位数码管cjne r1, #40h, disp1 ; r1中不为40h(未显示完6位)继续mov r0, #d_dat0 ;r1中为40h,循环完一轮 ;重新赋初值mov r1, #1 ;位置代码初值disp1: nop ret ;数字笔画代码表; 0 1 2 3 4 5 6 7 8 9 熄dispd: db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h, 7fh, 6fh, 0;延时子程序delay:movr7,#20;将r7赋值20delay1:movr6,#0;将r6赋值0,相当于赋值256delay2:djnzr6,$;r6中的值减1不为0则循环执行当前行djnzr7,delay1;r7中的值减1不为0则循环ret2、串行led显示程序d_dat0 equ 6ahd_dat1 equ 6bhd_dat2 equ 6chd_dat3 equ 6dhd_dat4 equ 6ehd_dat5 equ 6fh ;定义显示数据单元 org 0000hajmp startorg 0030hstart: mov sp, #30h ;初始化堆栈指针mov d_dat0, #0mov d_dat1, #1mov d_dat2, #2mov d_dat3, #3mov d_dat4, #4mov d_dat5, #5 ;初始化显示数据mov p0, #0 ;clr p1.1 ;初始化有关i/o口;以上内容与前面相同clr p1.3clr p1.1clr p1.2 ; 初始化有关i/o口mov r0, #d_dat0 ; 初始化数据指针 ; r0指向第一位显示数字mov r1, #01h ;初始化需点亮数码管位置代码nopmain: lcall disp ;调用数码管循环点亮子程序lcall delay ;延时子程序同前ajmp main ;死循环;*;通过595显示4位数字子程序;*disp: mov a, r1 ;取位代码数据mov r2, #8 ;r2中为循环次数disp1: clr crlc amov p1.3, c ;一个位选信号送到ser的输入端setb p1.1nopclr p1.1 ;产生一个串行移位时钟脉冲djnz r2, disp1 ;一次将8个位选信号移入 ;实际只有6位有用mov a,r0 ;取需显示的数字mov dptr,#dispd ;笔画编码表同前movc a,a+dptr ;去需显示数字笔画代码(段选信号)mov r2,#8disp2: clr crlc amov p1.3, c ;段选信号送到si引脚setb p1.1nopclr p1.1 ;产生一个移位时钟脉冲djnz r2, disp2 ;依次将8个笔画信号(段选信号)移入setb p1.2nopclr p1.2 ;产生一个输出锁存脉冲inc r0 ;r0中不为40h则继续mov a,r1clr crlc amov r1, a ;r1中的值左移1位,指向下一位数码管cjne r1, #40, disp3 ;r1中不为40h则继续mov r0, #d_dat0 ;r1中为40h,循环完一轮 ;重新赋初值mov r1, #01h ;位选数据重新赋初值disp3: ret;延时子程序delay:movr7,#20;将r7赋值20delay1:movr6,#0;将r6赋值0,相当于赋值256delay2:djnzr6,$;r6中的值减1不为0则循环执行当前行djnzr7,delay1;r7中的值减1不为0则循环ret3、带小数点led显示:将代码表中4对应的66h改为0e6h即可。五、实验现象1、并行led显示程序实验:六个数码管依次显示0 1 2 3 4 52、串行led显示程序实验:六个数码管依次显示0 1 2 3 4 53、带小数点led显示实验:六个数码管依次显示0 1 2 3 4. 5六、思考题1、要让led数码管显示a、b、c、d、e、f六个字母,请列写笔画代码表。;数字笔画代码表; abcdefdispd: db 77h7ch39h5eh79h71h2、led数码管动态显示和静态显示各有什么优缺点?动态:需要器件数量少,功率低,印刷电路面积少,但占用cpu时间多静态:需要器件数量多,功率大,印刷电路面积多,但占用cpu时间少实验5 按键功能的实现一、实验目的1、 理解按键电路的作用;2、 学习按键功能的编程方法;3、 熟悉单片机i/o口连接独立式按键的编程应用方法。二、实验说明实验箱核心板上有4个按键,其一端全部与地线相连,另一端顺次与p1.4p1.7相连,本实验需要用到核心板上的3个按键,3个指示灯和6个数码管,所用到的实验电路原理如图所示。 本实验中3个按键设计的功能,是一个使用的简单温度控制系统的按键功能,要求通过按键设定一个温度上限值和一个温度下限值。本实验只涉及按键和显示功能,在今后的试验中,将进一步增加硬件和软件功能,利用单片机实现实际的温度控制系统,是温度维持在上、下限值之间。 “功能”键:在内存数据区定义一个名称为“krm”的字节,存放功能编号,共有3种功能,分别对应编号为0,1,2。每按一次“功能”键,“krm”中的值在这三个数字中循环改变一次。与三种功能对应,设计三个led(发光二极管)指示灯,有单片机p3口控制,当处于某种功能状态时,相应的指示灯亮。本实验的内容,实际上是后面进一步做温度测量控制系统的一部分。三种功能的含义如下: 功能号0:显示测量的温度值; 功能号1:对温度上限值进行修改; 功能号2:对温度下限值进行修改。 “”键:每按一次“”键,内存数据区中指定变量单元的值增1,持续按住则连续增1。 “”键:与“”键对应,每按一次“”,内存数据区中指定变量单元的值减1,持续按住则连续减1。 功能号为0时,数码管显示被测温度值,此时按另外两个按键不起作用。功能号为1时,数码管显示设定温度的上限值,按两外两个按键可以修改温度上限值,功能号为2时,数码管显示设定温度的下限值,此时按另外连个按键可以修改温度上限值。 三、实验任务1、 理解单片机i/o口与按键,指示灯和led数码管的综合使用方法;2、 理解如图所示电路,读懂参考程序;3、 自行设计按键显示功能(比如将6位数码管分成三组,分别显示上限、下限、测量值),并编程实现所设计的功能。四、实验程序实现按键和显示参考程序如下:d_dat0equ60hd_dat1equd_dat0+1d_dat2equd_dat1+1d_dat3equd_dat2+1d_dat4equd_dat3+1d_dat5equd_dat4+1;定义显示数据单元lightequd_dat5+1h_dat0equlight+1h_dat1equh_dat0+1kbmequh_dat1+1;定义按键功能号存放单元d_maxequkbm+1;定义上限值存放单元d_minequd_max+1;定义下限值存放单元t_dat0equd_min+1t_dat1equt_dat0+1;定义测量值存放单元org0000hajmpstartorg0030hstart:movsp,#30h;初始化堆栈指针movd_dat0, #0movd_dat1, #0movd_dat2, #0movd_dat3, #0mov d_dat4, #0mov d_dat5,#0;初始化显示数据movlight, #80hclrp1.0clrp1.1clrp1.2clrp1.3;初始化有关i/o口movr0,#d_dat0;初始化数据指针,r0指向第一位显示数字movr1,#01h;初始化需点亮数码管位置代码movkbm,#0;初始化功能号movd_max, #80movd_min, #70;初始化上、下限值movt_dat0, #66movt_dat1,#0;目前人为赋给测量值一个值,将来有实际测量值就存放在此 movh_dat0, t_dat0movh_dat1, t_dat1lcallhtd;将测量值二进制数转换为十进制数main:lcalldisp;刷新显示lcalldelay;显示、延时子程序同前;*;按键处理程序;*jbp1.7,key1;查询k0,若k0未按下则跳转lcalldisplcalldelay;延时去抖动,顺便刷新显示jbp1.7,key1;若k0未真正按下则跳转inckbm;k0真正按下,功能号增1mova,kbmcjnea,#3,key01movkbm,#0;若功能号为3,则清0 key01:nopajmpkend;跳转至按键结束处理程序key1:jbp1.6,key2;查询k1lcalldisplcalldelayjbp1.6,key2mova,kbmcjnea,#1,key11;功能号不为1则跳转incd_max;功能号1,上限值加1ajmpkendkey11:cjnea,#2,key12;功能号不为2则跳转incd_min;功能号2,下限值加1key12:ajmpkend;跳转至按键结束处理程序key2:jbp1.5,kend;查询k2lcalldisplcalldelayjbp1.5,kendmova,kbmcjnea,#1,key21decd_max;功能号1,上限值减1ajmpkendkey21:cjnea,#2,kenddecd_min;功能号2,下限值减1kend:nop;以下程序根据功能号显示不同内容mova, kbmcjnea, #0, kend1movh_dat0, t_dat0movh_dat1,t_dat1;功能号0,准备显示测量数据movlight,#0bfh;点亮相应指示灯ajmpkend3;跳转到刷新显示处kend1:nopcjnea, #1, kend2movh_dat0, d_maxmovh_dat1,#0;功能号1,准备显示上限值movlight,#7fh;点亮相应指示灯ajmpkend3;跳转到刷新显示处kend2:nopcjnea, #2,kend3movh_dat0, d_minmovh_dat1,#0;功能号2,准备显示下限值movlight,#0dfh;点亮相应指示灯kend3:movp0, lightsetbp1.0nopclrp1.0;产生一个指示灯输出锁存脉冲lcallhtd;将需显示数据转换成4个十进制数movr4, #80hkend4:lcalldisplcalldelay;刷新显示,延时djnzr4,kend4;此处循环延时是为了避免按键多次重入ljmpmain;跳转到主程序开始处循环执行;*;通过595显示4位数字子程序;*disp:mova,r1;取位代码数据movr2,#8disp1:clrcrlcamovp1.3,c; 位代码送到ser的输入端setbp1.1nopclrp1.1;产生一个输入锁存脉冲djnzr2,disp1;依次将8位位代码移入,实际只有6位有用mova,r0;取需显示的数字movdptr,#dispd;笔画编码表同前movca,a+dptr;取需显示数字笔画代码movr2, #8disp2:clrcrlcamovp1.3,c;笔画代码送到ser的输入端setbp1.1nopclrp1.1;产生一个输入锁存脉冲djnzr2,disp2;依次将8位笔画代码(段代码)移入incr0;r0增1指向下一个需显示数字mova,r1rlamovr1,a;r1中的值左移1位,指向下一位数码管cjner1,#40h,disp3;r0中不为70h则继续movr0, #d_dat0movr1,#01h;r0中为70h,循环完一轮;重新赋初值disp3:setbp1.2clrp1.2ret;数字笔画代码表; 0 1 2 3 4 5 6 7 8 9 熄dispd: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,0;*;延时子程序;*delay:movr7,#2dely1:movr6,#0ffhdely2:djnzr6,$;$代表当前行(与djnz r6,dely2相同)djnzr7, dely1ret;二进制转换十进制子程序htd:movd_dat5,#00h;将结果千位清0movd_dat4, #00hmovd_dat3, #00hmovd_dat2, #00hh1000:clrc;进位位c清0mova,h_dat0;源数据低位装载到累加器a中movr6,a;备份源数值低位到寄存器r6中subba,#0e8h;源数值低位减去1000的低位0e8hmovh_dat0,a;余数存回到源数值低位存储单元mova,h_dat1;源数值高位装载到累加器a中movr7,a;备份源数值高位到寄存器r7中subba,#03h;源数值高位带借位减1000的高位03hmovh_dat1,a;余数存回到源数值低位存储单元incd_dat2;千位增1jnch1000;如果没有借位则利用余数循环再减;有借位表明为最后一次无效减;程序顺序执行,应还原最后一次修改值movh_dat0,r6movh_dat1,r7;用备份值作为新的源数值(余数)decd_dat2;千位数减1,去掉最后一次无效减的影响h100:mova,h_dat0;源数值低位装载到累加器a中movr6,a;备份源数值低位到寄存器r6中clrc;清0进位位csubba,#100;减去100movh_dat0,a;存回余数低位mova,h_dat1;取源数值高位subba,#00h;减100的高位0,实际上是减去借位位movh_dat1,a;存回余数高位jch10;有借位则跳到下一步继续运算incd_dat3;没有借位,百位增1ajmph100;没有借位继续减;注意本轮循环中最后一次减时百位未增1;所以不存在还原的问题;进入下一轮时,源数值(余数)都在r6中h10:clrcmova,r6;源数值(低位)装载到累加器a中;到此源数值高位已经为0,不用再参加计算movd_dat5,a;存回源数值低位;如果是最后一次减,则此值即为个位subba,#10;减去10movr6,a;保存余数jch1;有借位,运算结束incd_dat4;没有借位,十位增1ljmph

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论