微机原理第二次实验报告董东启.docx
- 文档编号:8939701
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:16
- 大小:4.09MB
微机原理第二次实验报告董东启.docx
《微机原理第二次实验报告董东启.docx》由会员分享,可在线阅读,更多相关《微机原理第二次实验报告董东启.docx(16页珍藏版)》请在冰点文库上搜索。
微机原理第二次实验报告董东启
实验二定时器实验
一、实验目的与要求
利用定时器控制产生占空比可变的PWM波,通过实验验证进一步加强对定时器功能的认识,掌握定时器的使用方法。
1、用P1.0口输出PWM波,利用按键控制占空比的增加和降低,用示波器查看P1.0口的输出波形。
2、引导学生进行利用现有程序演示定时器动态显示数码管实验,了解数码管动态扫描方式。
二、实验注意事项
1、启动KEIL软件,选择菜单“工程\新建工程”以建立工程(扩展名为.uv2,如T2a.uv2)。
2、选择菜单“文件\新文件”以建立一个新的文本编辑窗口,在窗口中输入参考源程序1并保存(扩展名为.asm),如test2a.asm,然后将其加入到源程序组1中。
3、在工程菜单的选项“目标1属性”中设置相应的选项,包括“输出\产生hex文件”选项以便汇编生成HEX代码供编程器使用,在“调试\使用KeilMonitor-51Driver”的设置中选择相应的串口号。
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灯渐亮。
PWMHDATA40H;高电平脉冲的个数
PWMDATA41H;PWM周期
COUNTERDATA42H;
TEMPDATA43H
OUTPWMEQUP1.0;PWM波输出引脚
OUTPWMbEQUP1.1;PWM波输出引脚b,用于外接示波器探头
INCKEYEQUP1.6;K01,PWMH值增加键。
DECKEYEQUP1.7;K02,PWMH值减小键。
ORG0000H
AJMPMAIN
ORG000BH
AJMPINTT0
ORG0100H
MAIN:
MOVSP,#60H;给堆栈指针赋初值
MOVPWMH,#0bH;赋初值
MOVCOUNTER,#01H
MOVPWM,#15H
MOVTMOD,#02H;定时器0在模式2下工作
MOVTL0,#38H;每200μs产生一次溢出
MOVTH0,#38H;自动重装初值
SETBET0;使能定时器0中断
SETBEA;使能总中断
SETBTR0;开始计时
KSCAN:
SETBINCKEY;端口输入状态,扫描按键
SETBDECKEY
JNBINCKEY,K1CHECK;扫描K01,如果按下跳转到KEY1处理程序
JNBDECKEY,K2CHECK;扫描K02,如果按下跳转到KEY2处理程序
SJMPKSCAN
K1CHECK:
JBINCKEY,K1HANDLE
;若按下K01后释放,跳转到KEY1处理程序,可考虑加延时去抖动程序
SJMPK1CHECK
K1HANDLE:
MOVA,PWMH;
CJNEA,PWM,K1H0;判断是否到达上边界
SJMPKSCAN;是,则不进行任何操作
K1H0:
MOVA,PWMH
INCA
CJNEA,PWM,K1H1;如果在加1后到达最大值
CLRTR0;定时器停止
SETBOUTPWM;置输出为高电平
SETBOUTPWMb
SJMPK1H2
K1H1:
CJNEA,#02H,K1H2;如果加1后到达下边界
SETBTR0;重开定时器
K1H2:
INCPWMH;增加占空比
SJMPKSCAN
K2CHECK:
JBDECKEY,K2HANDLE
;若按下K02后释放,跳转到KEY1处理程序,可考虑加延时去抖动程序
SJMPK2CHECK
K2HANDLE:
MOVA,PWMH;
CJNEA,#01H,K2H0;判断是否到达下边界,是,则不进行任何操作
SJMPKSCAN;
K2H0:
MOVA,PWMH;
MOVTEMP,PWM
DECA
CJNEA,#01H,K2H1;如果在减1后到达下边界
CLRTR0;定时器停止
CLROUTPWM;输出为低电平
CLROUTPWMb
SJMPK2H2
K2H1:
DECTEMP;
CJNEA,TEMP,K2H2;如果到达上边界
SETBTR0;启动定时器
K2H2:
DECPWMH
SJMPKSCAN;降低占空比
INTT0:
PUSHPSW
PUSHACC
INCCOUNTER
MOVA,COUNTER
CJNEA,PWMH,INTT01
CLROUTPWM
CLROUTPWMb
INTT01:
CJNEA,PWM,INTT02
MOVCOUNTER,#01H
SETBOUTPWM
SETBOUTPWMb
INTT02:
POPACC
POPPSW
RETI
END
实验现象记录:
(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%的状态,一直循环下去。
K01作用次数
负脉宽占空比
负脉宽
K02作用次数
正脉宽占空比
正脉宽
0
50%
1.085
0
50%
1.085
1
45%
0.9765
1
55%
1.1935
2
40%
0.868
2
60%
1.302
3
35%
0.7595
3
65%
1.4105
4
30%
0.651
4
70%
1.519
5
25%
0.5425
5
75%
1.6275
6
20%
0.434
6
80%
1.736
7
15%
0.3255
7
85%
1.8445
8
10%
0.217
8
90%
1.953
9
5%
0.1085
9
95%
2.0615
2.数码管显示演示程序:
在8个LED数码管上依次显示1,2,3,4,5,6,7,8。
引用端口:
数码管数据p0,数码管控制p2;
参考程序如下;
DIS_DIGITEQU40H
;位选通值,传送到P2口用于选通当前数码管的数值,
;如等于0xfe时,选通P2.0口数码管
DIS_INDEXDATA41H
;显示索引,用于标识当前显示的数码管和缓冲区的偏移量
DIS_BUFDATA50H
;显于缓冲区起始地址
ORG0000H
AJMPMAIN
ORG000BH
AJMPINTT0
ORG0100H
MAIN:
MOVP0,#0FFH;初始化I/O口
MOVP2,#0FFH
MOVTMOD,#02H;定时器0在模式2下工作
MOVTL0,#38H;每200μs产生一次溢出
MOVTH0,#38H;自动重装初值
SETBET0;使能定时器0中断
SETBEA;使能总中断
MOVDPTR,#DIS_CODE;设定显示初值为1-8
MOVA,#1;初值为1,以后顺序加1
MOVCA,@A+DPTR
MOVDIS_BUF,A
MOVA,#2
MOVCA,@A+DPTR
MOVDIS_BUF+01H,A
MOVA,#3
MOVCA,@A+DPTR
MOVDIS_BUF+02H,A
MOVA,#4
MOVCA,@A+DPTR
MOVDIS_BUF+03H,A
MOVA,#5
MOVCA,@A+DPTR
MOVDIS_BUF+04H,A
MOVA,#6
MOVCA,@A+DPTR
MOVDIS_BUF+05H,A
MOVA,#7
MOVCA,@A+DPTR
MOVDIS_BUF+06H,A
MOVA,#8
MOVCA,@A+DPTR
MOVDIS_BUF+07H,A
DISPLAY:
MOVDIS_DIGIT,#0FEH;初始从第一个数码管开始扫描
MOVDIS_INDEX,#0
SETBTR0;启动定时器0,开始动态扫描显示
MAIN_LP:
NOP
;主程序循环,可增加其它代码以改变50H-57H中的值以改变显示内容
SJMPMAIN_LP
;=====================================================
INTT0:
;定时器0中断服程序,用于数码管的动态扫描
PUSHACC
PUSHPSW
MOVP2,#0FFH;先关闭所有数码管
MOVA,#DIS_BUF;获得显示缓冲区基地址
ADDA,DIS_INDEX;获得偏移量
MOVR0,A;R0=基地址+偏移量
MOVA,@R0;获得显示代码
MOVP0,A;显示代码传送到P0口
MOVP2,DIS_DIGIT;
MOVA,DIS_DIGIT
;位选通值左移,下次中断时选通下一位数码管
RLA
MOVDIS_DIGIT,A
INCDIS_INDEX
;DIS_INDEX加1,下次中断时显示下一位
ANLDIS_INDEX,#0x07
;当DIS_INDEX等于8(00001000B)时,清0
POPPSW
POPACC
RETI
DIS_CODE:
DB28h,7eh,0a2h,62h,74h,61h,21h,7ah
DB20h,60h,30h,25h,0a9h,26h,0a1h,0b1h
;0-9和ABCDEF的数码管显示代码
END
实验现象如图所示:
四、思考题
1.试根据参考程序1中PWM波控制周期的大小进行验算,调整定时时间初值并进行调试验算,使PWM波控制周期为Nms(其中N值为学号的最后两位数值,如恰好是00则取值为50)。
答:
我的学号最后两位数字为14,PWM波控制周期应为14ms.
由公式(模数-初值)*(12/晶振)=T得,
(模数-初值)*(12/22.1184)=(14/20)*1000
(模式-初值)=1283
在模式2下能产生这个数,修改部分代码即可。
所以修改部分的代码如图所示:
将MAIN函数中的MOVPWM,#15H改成:
MOVPWM,#82H其他代码不变:
实验现象如图:
周期刚好是14.00ms,符合要求。
2.尝试改变参考程序2的显示内容为学生自己的学号的后8位。
答:
因为0-9和ABCDEF的数码管显示已经固定;
所以直接改变程序中赋给变量A的直接数即可改变数码管显示的数字。
改动部分的程序如下:
MOVA,#1
MOVCA,@A+DPTR
MOVDIS_BUF,A
MOVA,#5
MOVCA,@A+DPTR
MOVDIS_BUF+01H,A
MOVA,#1
MOVCA,@A+DPTR
MOVDIS_BUF+02H,A
MOVA,#2
MOVCA,@A+DPTR
MOVDIS_BUF+03H,A
MOVA,#4
MOVCA,@A+DPTR
MOVDIS_BUF+04H,A
MOVA,#0
MOVCA,@A+DPTR
MOVDIS_BUF-05H,A
MOVA,#1
MOVCA,@A+DPTR
MOVDIS_BUF+06H,A
MOVA,#4
MOVCA,@A+DPTR
MOVDIS_BUF+07H,A
所以最终显示我的学号如下:
15124014
五、心得体会
通过这次实验我学会了以及如何使用占空比来调节LED灯的亮度,初步掌握了数码管的动态扫描方式。
虽然汇编学习起来有点难,但是,这也是一种深入学习的方法,在编程过程中,我进一步了解了定时器不同模式的计算时间周期的方法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 第二次 实验 报告 董东启