当前位置:文档之家› 微机原理第二次实验报告

微机原理第二次实验报告

实验二定时器实验一、实验目的与要求利用定时器控制产生占空比可变的PWM波,通过实验验证进一步加强对定时器功能的认识,掌握定时器的使用方法。

1、用P1.0口输出PWM波,利用按键控制占空比的增加和降低,用示波器查看P1.0口的输出波形。

2、引导学生进行利用现有程序演示定时器动态显示数码管实验,了解数码管动态扫描方式。

二、实验注意事项1、启动KEIL软件,选择菜单“工程\新建工程”以建立工程(扩展名为.uv2,如T2a.uv2)。

2、选择菜单“文件\新文件”以建立一个新的文本编辑窗口,在窗口中输入参考源程序1并保存(扩展名为.asm),如test2a.asm,然后将其加入到源程序组1中。

3、在工程菜单的选项“目标1属性”中设置相应的选项,包括“输出\产生hex文件”选项以便汇编生成HEX代码供编程器使用,在“调试\使用KeilMonitor-51 Driver”的设置中选择相应的串口号。

4、使用“工程”中的“编译全部文件”完成相应的文件编译,如果程序格式正确将生成相应HEX代码文件,如T2a.hex。

如果提示有编译错误请自行修改源程序然后再重新编译。

5、用单根连线将P1.0(JP44)连接到8路指示灯部分(JP32)的LED0,将P1.6、P1.7(JP44)分别连接到JP37的K01、K02。

6、完成仿真器与计算机之间的连线并通电。

7、在KEIL软件中启动“调试\开启仿真模式”,然后用“运行”命令实现全速运行的仿真。

8、观察实验现象并分别依次按下K01、K02,观察并记录实验现象然后在KEIL软件中启动“中断运行-调试(debug)\关闭仿真模式”退出仿真,选择“工程\关闭工程”可关闭当前工程。

9、参考步骤1-4完成参考源程序2的建立与输入,如新项目T2b.uv2和新的源程序test2b.asm,完成编译与仿真设置。

10、用8PIN连线将P0口连接到数码管数据输入端,P2口连接到数码管控制端。

11、输入程序并仿真运行,注意数码管的显示内容。

12、根据参考源程序1和参考源程序2进行思考、修改和拓展,自行设计程序目标并编程验证。

13、本次实验主要连线如图三、实验内容1.利用定时器控制产生占空比可变的 PWM 波,通过按K01可PWMH值增加,则占空比增加,LED 灯渐暗。

按K2,PWM值减小,则占空比减少,LED 灯渐亮。

PWMH DATA 40H ;高电平脉冲的个数PWM DATA 41H ;PWM周期COUNTER DATA 42H ;TEMP DATA 43HOUTPWM EQU P1.0 ;PWM波输出引脚OUTPWMb EQU P1.1 ;PWM波输出引脚b,用于外接示波器探头INCKEY EQU P1.6 ;K01, PWMH值增加键。

DECKEY EQU P1.7 ;K02, PWMH值减小键。

ORG 0000HAJMP MAINORG 000BHAJMP INTT0ORG 0100HMAIN: MOV SP,#60H ;给堆栈指针赋初值MOV PWMH,#0bH ;赋初值MOV COUNTER,#01HMOV PWM, #15HMOV TMOD, #02H ;定时器0在模式2下工作MOV TL0, #38H ; 每200μs产生一次溢出MOV TH0, #38H ;自动重装初值SETB ET0 ;使能定时器0中断SETB EA ;使能总中断SETB TR0 ;开始计时KSCAN: SETB INCKEY ;端口输入状态,扫描按键SETB DECKEYJNB INCKEY,K1CHECK ;扫描K01,如果按下跳转到KEY1处理程序JNB DECKEY,K2CHECK ;扫描K02,如果按下跳转到KEY2处理程序SJMP KSCANK1CHECK: JB INCKEY,K1HANDLE;若按下K01后释放,跳转到KEY1处理程序,可考虑加延时去抖动程序SJMP K1CHECKK1HANDLE:MOV A,PWMH ;CJNE A,PWM,K1H0 ;判断是否到达上边界SJMP KSCAN ;是,则不进行任何操作K1H0: MOV A,PWMHINC ACJNE A,PWM,K1H1 ;如果在加1后到达最大值CLR TR0 ;定时器停止SETB OUTPWM ;置输出为高电平SETB OUTPWMbSJMP K1H2K1H1: CJNE A,#02H,K1H2 ;如果加1后到达下边界SETB TR0 ;重开定时器K1H2: INC PWMH ;增加占空比SJMP KSCANK2CHECK: JB DECKEY,K2HANDLE;若按下K02后释放,跳转到KEY1处理程序,可考虑加延时去抖动程序SJMP K2CHECKK2HANDLE: MOV A,PWMH ;CJNE A,#01H,K2H0 ;判断是否到达下边界,是,则不进行任何操作SJMP KSCAN ;K2H0: MOV A,PWMH ;MOV TEMP,PWMDEC ACJNE A,#01H,K2H1 ;如果在减1后到达下边界CLR TR0 ;定时器停止CLR OUTPWM ;输出为低电平CLR OUTPWMbSJMP K2H2K2H1: DEC TEMP ;CJNE A,TEMP,K2H2 ;如果到达上边界SETB TR0 ;启动定时器K2H2: DEC PWMHSJMP KSCAN ;降低占空比INTT0: PUSH PSWPUSH ACCINC COUNTERMOV A,COUNTERCJNE A,PWMH,INTT01CLR OUTPWMCLR OUTPWMbINTT01:CJNE A,PWM,INTT02MOV COUNTER,#01HSETB OUTPWMSETB OUTPWMbINTT02: P OP A CCPOP PSWRETIEND实验现象记录:(1)、每按一次K01,LED灯亮度变暗一些,同时示波器上显示负脉宽减少;每按一次K02,LED灯亮度变亮一些,同时示波器上显示负脉宽增加。

在连续按下K02的过程中,LED灯逐渐变亮至最亮,同时示波器上的波形和各参数变化如以下图形所示:初始状态:正占空比50%,正负脉宽各占一半。

K02作用1次,负脉宽变大,led灯变亮。

K02作用第2次,负脉宽继续变大,led灯继续变亮。

这符合预期现象。

(2)、连续按下K01时,负脉宽逐渐变小,LED灯亮度逐渐变暗,同时示波器上的波形和各参数变化如图所示:初始状态:正占空比50%,正负脉宽相等。

K01作用一次,,负脉宽减少,正脉宽增加,led灯变暗。

K01作用多次,负脉宽继续减少,正脉宽继续增加,led灯继续变暗。

符合实验预期现象。

实验现象分析:由实验代码可知,定时周期有20个,每按下一次K01,增加一个正占空比即增加5%的正占空比;每按下一次K02,增加一个负占空比即增加5%的负占空比。

当正占空比到100%或负占空比到100%时,跳到正占空比到0%或负占空比到0%的状态,一直循环下去。

2.数码管显示演示程序:在8个LED数码管上依次显示1,2,3,4,5,6,7,8。

引用端口:数码管数据p0,数码管控制p2;参考程序如下;DIS_DIGIT EQU 40H;位选通值, 传送到P2口用于选通当前数码管的数值,; 如等于0xfe时, 选通P2.0口数码管DIS_INDEX DATA 41H;显示索引, 用于标识当前显示的数码管和缓冲区的偏移量DIS_BUF DATA 50H;显于缓冲区起始地址ORG 0000HAJMP MAINORG 000BHAJMP INTT0ORG 0100HMAIN: MOV P0,#0FFH ; 初始化I/O口MOV P2,#0FFHMOV TMOD, #02H ;定时器0在模式2下工作MOV TL0, #38H ; 每200μs产生一次溢出MOV TH0, #38H ;自动重装初值SETB ET0 ;使能定时器0中断SETB EA ;使能总中断MOV DPTR, #DIS_CODE ; 设定显示初值为1-8MOV A,#1 ;初值为1,以后顺序加1MOVC A,@A+DPTRMOV DIS_BUF,AMOV A,#2MOVC A,@A+DPTRMOV DIS_BUF+01H,AMOV A,#3MOVC A,@A+DPTRMOV DIS_BUF+02H,AMOV A,#4MOVC A,@A+DPTRMOV DIS_BUF+03H,AMOV A,#5MOVC A,@A+DPTRMOV DIS_BUF+04H,AMOV A,#6MOVC A,@A+DPTRMOV DIS_BUF+05H,AMOV A,#7MOVC A,@A+DPTRMOV DIS_BUF+06H,AMOV A,#8MOVC A,@A+DPTRMOV DIS_BUF+07H,ADISPLAY: MOV DIS_DIGIT,#0FEH ; 初始从第一个数码管开始扫描MOV DIS_INDEX,#0SETB TR0 ; 启动定时器0,开始动态扫描显示MAIN_LP: NOP; 主程序循环,可增加其它代码以改变50H-57H中的值以改变显示内容SJMP MAIN_LP;=====================================================INTT0:; 定时器0中断服程序, 用于数码管的动态扫描PUSH ACCPUSH PSWMOV 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,DIS_DIGIT; 位选通值左移, 下次中断时选通下一位数码管RL AMOV DIS_DIGIT,AINC DIS_INDEX; DIS_INDEX加1, 下次中断时显示下一位ANL DIS_INDEX,#0x07; 当DIS_INDEX等于8(0000 1000B)时, 清0POP PSWPOP ACCRETIDIS_CODE: DB 28h,7eh,0a2h,62h,74h,61h,21h,7ahDB 20h,60h,30h,25h,0a9h,26h,0a1h,0b1h;0-9和ABCDEF的数码管显示代码END实验现象如图所示:四、思考题1.试根据参考程序1中PWM波控制周期的大小进行验算,调整定时时间初值并进行调试验算,使PWM波控制周期为N ms(其中N值为学号的最后两位数值,如恰好是00则取值为50)。

答:我的学号最后两位数字为14,PWM波控制周期应为14ms.由公式(模数-初值)*(12/晶振)= T 得,(模数-初值)*(12/22.1184)= (14/20)*1000(模式-初值)=1283在模式2下能产生这个数,修改部分代码即可。

相关主题