《微机原理第二次实验报告-董东启30699.pdf》由会员分享,可在线阅读,更多相关《微机原理第二次实验报告-董东启30699.pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验二 定时器实验 一、实验目的与要求 利用定时器控制产生占空比可变的 PWM 波,通过实验验证进一步加强对定时器功能的认识,掌握定时器的使用方法。1、用口输出 PWM 波,利用按键控制占空比的增加和降低,用示波器查看口的输出波形。2、引导学生进行利用现有程序演示定时器动态显示数码管实验,了解数码管动态扫描方式。二、实验注意事项 1、启动 KEIL软件,选择菜单“工程新建工程”以建立工程(扩展名为.uv2,如)。2、选择菜单“文件新文件”以建立一个新的文本编辑窗口,在窗口中输入参考源程序1 并保存(扩展名为.asm),如,然后将其加入到源程序组 1中。3、在工程菜单的选项“目标 1 属性”中设
2、置相应的选项,包括“输出产生 hex 文件”选项以便汇编生成 HEX 代码供编程器使用,在“调试使用KeilMonitor-51 Driver”的设置中选择相应的串口号。4、使用“工程”中的“编译全部文件”完成相应的文件编译,如果程序格式正确将生成相应 HEX 代码文件,如。如果提示有编译错误请自行修改源程序然后再重新编译。5、用单根连线将(JP44)连接到 8 路指示灯部分(JP32)的 LED0,将、(JP44)分别连接到 JP37 的 K01、K02。6、完成仿真器与计算机之间的连线并通电。7、在 KEIL软件中启动“调试开启仿真模式”,然后用“运行”命令实现全速运行的仿真。8、观察实验
3、现象并分别依次按下 K01、K02,观察并记录实验现象然后在 KEIL 软件中启动“中断运行调试(debug)关闭仿真模式”退出仿真,选择“工程关闭工程”可关闭当前工程。9、参考步骤 14 完成参考源程序 2 的建立与输入,如新项目和新的源程序,完成编译与仿真设置。10、用 8PIN 连线将 P0 口连接到数码管数据输入端,P2 口连接到数码管控制端。11、输入程序并仿真运行,注意数码管的显示内容。12、根据参考源程序 1和参考源程序 2 进行思考、修改和拓展,自行设计程序目标并编程验证。13、本次实验主要连线如图 三、实验内容 1.利用定时器控制产生占空比可变的 PWM 波,通过按 K01
4、可 PWMH 值增加,则占空比增加,LED 灯渐暗。按 K2,PWM 值减小,则占空比减少,LED 灯渐亮。PWMH DATA 40H ;高电平脉冲的个数 PWM DATA 41H ;PWM 周期 COUNTER DATA 42H;TEMP DATA 43H OUTPWM EQU ;PWM 波输出引脚 OUTPWMb EQU ;PWM 波输出引脚 b,用于外接示波器探头 INCKEY EQU ;K01,PWMH 值增加键。DECKEY EQU ;K02,PWMH 值减小键。ORG 0000H AJMP MAIN ORG 000BH AJMP INTT0 ORG 0100H MAIN:MOV S
5、P,#60H ;给堆栈指针赋初值 MOV PWMH,#0bH ;赋初值 MOV COUNTER,#01H MOV PWM,#15H MOV TMOD,#02H;定时器 0 在模式 2下工作 MOV TL0,#38H ;每 200s 产生一次溢出 MOV TH0,#38H ;自动重装初值 SETB ET0 ;使能定时器 0中断 SETB EA ;使能总中断 SETB TR0 ;开始计时 KSCAN:SETB INCKEY ;端口输入状态,扫描按键 SETB DECKEY JNB INCKEY,K1CHECK;扫描 K01,如果按下跳转到 KEY1处理程序 JNB DECKEY,K2CHECK;扫
6、描 K02,如果按下跳转到 KEY2处理程序 SJMP KSCAN K1CHECK:JB INCKEY,K1HANDLE;若按下 K01 后释放,跳转到 KEY1处理程序,可考虑加延时去抖动程序 SJMP K1CHECK K1HANDLE:MOV A,PWMH ;CJNE A,PWM,K1H0 ;判断是否到达上边界 SJMP KSCAN ;是,则不进行任何操作 K1H0:MOV A,PWMH INC A CJNE A,PWM,K1H1 ;如果在加 1 后到达最大值 CLR TR0 ;定时器停止 SETB OUTPWM ;置输出为高电平 SETB OUTPWMb SJMP K1H2 K1H1:C
7、JNE A,#02H,K1H2;如果加 1 后到达下边界 SETB TR0 ;重开定时器 K1H2:INC PWMH ;增加占空比 SJMP KSCAN K2CHECK:JB DECKEY,K2HANDLE;若按下 K02后释放,跳转到 KEY1处理程序,可考虑加延时去抖动程序 SJMP K2CHECK K2HANDLE:MOV A,PWMH ;CJNE A,#01H,K2H0;判断是否到达下边界,是,则不进行任何操作 SJMP KSCAN ;K2H0:MOV A,PWMH ;MOV TEMP,PWM DEC A CJNE A,#01H,K2H1;如果在减 1 后到达下边界 CLR TR0 ;
8、定时器停止 CLR OUTPWM ;输出为低电平 CLR OUTPWMb SJMP K2H2 K2H1:DEC TEMP ;CJNE A,TEMP,K2H2;如果到达上边界 SETB TR0 ;启动定时器 K2H2:DEC PWMH SJMP KSCAN ;降低占空比 INTT0:PUSH PSW PUSH ACC INC COUNTER MOV A,COUNTER CJNE A,PWMH,INTT01 CLR OUTPWM CLR OUTPWMb INTT01:CJNE A,PWM,INTT02 MOV COUNTER,#01H SETB OUTPWM SETB OUTPWMb INTT02
9、:POP ACC POP PSW RETI END 实验现象记录:(1)、每按一次 K01,LED灯亮度变暗一些,同时示波器上显示负脉宽减少;每按一次 K02,LED灯亮度变亮一些,同时示波器上显示负脉宽增加。在连续按下 K02 的过程中,LED 灯逐渐变亮至最亮,同时示波器上的波形和各参数变化如以下图形所示:初始状态:正占空比 50%,正负脉宽各占一半。K02作用 1 次,负脉宽变大,led灯变亮。K02作用第 2 次,负脉宽继续变大,led灯继续变亮。这符合预期现象。(2)、连续按下 K01时,负脉宽逐渐变小,LED灯亮度逐渐变暗,同时示波器上的波形和各参数变化如图所示:初始状态:正占空比
10、 50%,正负脉宽相等。K01作用一次,负脉宽减少,正脉宽增加,led灯变暗。K01作用多次,负脉宽继续减少,正脉宽继续增加,led灯继续变暗。符合实验预期现象。实验现象分析:由实验代码可知,定时周期有 20 个,每按下一次 K01,增加一个正占空比即增加 5%的正占空比;每按下一次 K02,增加一个负占空比即增加 5%的负占空比。当正占空比到 100%或负占空比到 100%时,跳到正占空比到 0%或负占空比到 0%的状态,一直循环下去。K01 作 用次数 负脉宽占空比 负脉宽 K02 作 用次数 正脉宽占空比 正脉宽 0 50%0 50%1 45%1 55%2 40%2 60%3 35%3
11、65%4 30%4 70%5 25%5 75%6 20%6 80%7 15%7 85%8 10%8 90%9 5%9 95%2.数码管显示演示程序:在 8个 LED 数码管上依次显示 1,2,3,4,5,6,7,8。引用端口:数码管数据 p0,数码管控制 p2;参考程序如下;DIS_DIGIT EQU 40H;位选通值,传送到 P2 口用于选通当前数码管的数值,;如等于 0 xfe时,选通口数码管 DIS_INDEX DATA 41H ;显示索引,用于标识当前显示的数码管和缓冲区的偏移量 DIS_BUF DATA 50H;显于缓冲区起始地址 ORG 0000H AJMP MAIN ORG 00
12、0BH AJMP INTT0 ORG 0100H MAIN:MOV P0,#0FFH ;初始化 I/O口 MOV P2,#0FFH MOV TMOD,#02H;定时器 0 在模式 2下工作 MOV TL0,#38H ;每 200s 产生一次溢出 MOV TH0,#38H ;自动重装初值 SETB ET0 ;使能定时器 0中断 SETB EA ;使能总中断 MOV DPTR,#DIS_CODE;设定显示初值为 18 MOV A,#1 ;初值为 1,以后顺序加 1 MOVC A,A+DPTR MOV DIS_BUF,A MOV A,#2 MOVC A,A+DPTR MOV DIS_BUF+01H,
13、A MOV A,#3 MOVC A,A+DPTR MOV DIS_BUF+02H,A MOV A,#4 MOVC A,A+DPTR MOV DIS_BUF+03H,A MOV A,#5 MOVC A,A+DPTR MOV DIS_BUF+04H,A MOV A,#6 MOVC A,A+DPTR MOV DIS_BUF+05H,A MOV A,#7 MOVC A,A+DPTR MOV DIS_BUF+06H,A MOV A,#8 MOVC A,A+DPTR MOV DIS_BUF+07H,A DISPLAY:MOV DIS_DIGIT,#0FEH;初始从第一个数码管开始扫描 MOV DIS_IN
14、DEX,#0 SETB TR0 ;启动定时器 0,开始动态扫描显示 MAIN_LP:NOP;主程序循环,可增加其它代码以改变 50H57H中的值以改变显示内容 SJMP MAIN_LP;=INTT0:;定时器 0 中断服程序,用于数码管的动态扫描 PUSH ACC PUSH PSW MOV P2,#0FFH ;先关闭所有数码管 MOV A,#DIS_BUF ;获得显示缓冲区基地址 ADD A,DIS_INDEX ;获得偏移量 MOV R0,A ;R0=基地址+偏移量 MOV A,R0 ;获得显示代码 MOV P0,A ;显示代码传送到 P0 口 MOV P2,DIS_DIGIT ;MOV A,
15、DIS_DIGIT ;位选通值左移,下次中断时选通下一位数码管 RL A MOV DIS_DIGIT,A INC DIS_INDEX ;DIS_INDEX 加 1,下次中断时显示下一位 ANL DIS_INDEX,#0 x07 ;当 DIS_INDEX 等于 8(0000 1000B)时,清 0 POP PSW POP ACC RETI DIS_CODE:DB 28h,7eh,0a2h,62h,74h,61h,21h,7ah DB 20h,60h,30h,25h,0a9h,26h,0a1h,0b1h;09 和 ABCDEF的数码管显示代码 END 实验现象如图所示:四、思考题 1.试根据参考程
16、序 1 中 PWM 波控制周期的大小进行验算,调整定时时间初值并进行调试验算,使 PWM 波控制周期为 N ms(其中 N值为学号的最后两位数值,如恰好是 00 则取值为 50)。答:我的学号最后两位数字为 14,PWM 波控制周期应为 14ms.由公式(模数-初值)*(12/晶振)=T 得,(模数-初值)*(12/)=(14/20)*1000 (模式-初值)=1283 在模式 2 下能产生这个数,修改部分代码即可。所以修改部分的代码如图所示:将 MAIN函数中的 MOV PWM,#15H 改成:MOV PWM,#82H 其他代码不变:实验现象如图:周期刚好是,符合要求。2.尝试改变参考程序
17、2的显示内容为学生自己的学号的后 8 位。答:因为 0-9 和 ABCDEF 的数码管显示已经固定;所以直接改变程序中赋给变量 A 的直接数即可改变数码管显示的数字。改动部分的程序如下:MOV A,#1 MOVC A,A+DPTR MOV DIS_BUF,A MOV A,#5 MOVC A,A+DPTR MOV DIS_BUF+01H,A MOV A,#1 MOVC A,A+DPTR MOV DIS_BUF+02H,A MOV A,#2 MOVC A,A+DPTR MOV DIS_BUF+03H,A MOV A,#4 MOVC A,A+DPTR MOV DIS_BUF+04H,A MOV A,#0 MOVC A,A+DPTR MOV DIS_BUF-05H,A MOV A,#1 MOVC A,A+DPTR MOV DIS_BUF+06H,A MOV A,#4 MOVC A,A+DPTR MOV DIS_BUF+07H,A 所以最终显示我的学号如下:五、心得体会 通过这次实验我学会了以及如何使用占空比来调节 LED 灯的亮度,初步掌握了数码管的动态扫描方式。虽然汇编学习起来有点难,但是,这也是一种深入学习的方法,在编程过程中,我进一步了解了定时器不同模式的计算时间周期的方法。