单片机实验报告
姓名 学号 时间 2014.11.10
评 阅 实验题目 单片机内部定时器实验
一、 实验目的与要求
实验目的:学习单片机的定时器功能和应用,学习蜂鸣器的使用。
实验要求:①编写定时16秒的程序,1秒、2秒、3秒……的变化由数码管体现,到
16秒的时间时,停止计数,蜂鸣器报警。
②在①的基础上添加一个中断子程序,完成当有外部中断时,开始计时的
功能。定时16秒,1秒、2秒、3秒……的变化由数码管体现,到16秒的时间时,停止计数,数码管变暗,蜂鸣器报警。蜂鸣器报警效果为响0.5秒,停0.5秒循环(增加定时器0,工作方式为方式1)。
③思考题:请问,在晶振为6MHz时,定时器能设置的最大定时宽度是多
少?在晶振为12MHz时,定时器能设置的最大定时宽度是多少?请写出模式1的定时宽度的计算方法。
二、 实验环境(硬件环境、软件环境)
硬件环境:TMD-2模块化单片机实验仪
CPU:89C51RD2HXX 工作频率:6MHz
RAM:62256(32K X8) 地址范围:0000H~7FFFH I/O口输入输出设备:8个拨动开关,8个LED灯
数据显示设备:1个共阴极数码管,1个两行16字符的液晶显示器 逻辑笔
输出时钟频率(YCLK):1MHz
系统电源:+5V/2A ,+12V/0.5A ,-12V/0.5A
软件环境:系统编程软件Flash Magic ,汇编语言程序编辑软件Keil
三、 实验电路
图3.4.1 定时器报警实验原理图
说明:CPU通过输出端口(8700H)将数码管的字形码锁存在74LS374的输出端,再通过74LS244驱动数码管显示数据。B1为蜂鸣器,T0通过正与门驱动器DS75451控制蜂鸣器。当DS75451(U29B)输出低电平时,蜂鸣器鸣叫。T1通过DS75451控制共阴极数码管(LED)的公共端。当DS75451(U29A)输出低电平时,数码管显示。
四、 程序流程图
① 编写定时16秒的程序,1秒、2秒、3秒……的变化由数码管体现,到16秒的时间时,停止计数,蜂鸣器报警。
开始
置定时器1为方式1(GATE=0,C/T=0,M1=0,M0=1) 置定时器1初值为3CB0 允许定时器1中断(IE=88H) R5=16 P3.4=1 ,P3.5=0 从首地址取出第一个字形码送数码管 启动定时器1(TR1=1) 1秒时间到? R5=R5-1 取出下一个字形码送到数码管 R5=0?(是否计到16秒) P3.4=0(蜂鸣器鸣叫) 数码管显示全亮 定时器1停止计数(TR1=0) 结束
② 在①的基础上添加一个中断子程序,完成当有外部中断时,开始计时的功能。定时16秒,1秒、2秒、3秒……的变化由数码管体现,到16秒的时间时,停止计数,数码管变暗,蜂鸣器报警。蜂鸣器报警效果为响0.5秒,停0.5秒循环(增加
定时器0,工作方式为方式1)。 开始 置定时器1为方式1(GATE=0,C/T=0,M1=0,M0=1) 置定时器0为方式1(GATE=0,C/T=0,M1=0,M0=1) 置定时器1初值为3CB0,置定时器0的初值为3CB0 允许定时器1、定时器0、外部中断0中断(IE=8BH) R5=16 P3.4=1 ,P3.5=0 中断标志是否为1 从首地址取出第一个字形码送数码管 启动定时器1(TR1=1) 1秒时间到? R5=R5-1 取出下一个字形码送到数码管 R5=0?(是否计到16秒) P3.4=1(蜂鸣器不叫),TR0=1(启动定时器0) 数码管显示不亮,定时器1停止计数(TR1=0) P3.4=0(蜂鸣器鸣叫),TR0=1(启动定时器0) 0.5秒时间到? 0.5秒时间到?
③ 程序测试报告:(调试输入数据、结果数据或状态。)
① 程序开始运行后,数码管依次显示数字0、1、2、3……E、F,间隔为1秒,计到F后,数码管变为全亮,蜂鸣器报警。 ② 程序开始运行后,数码管无显示,当有外部中断时,数码管依次显示0、1、2、3……E、F,间隔为1秒,计到F后,数码管变暗,蜂鸣器报警。蜂鸣器报警效果为响0.5秒,停0.5秒循环。 ③ 思考题:请问,在晶振为6MHz时,定时器能设置的最大定时宽度是多少?在晶振为12MHz时,定时器能设置的最大定时宽度是多少?请写出模式1的定时宽度的计算方法。
答:fosc=6MHz:Tmax=2^16*12/6MHz=131.072ms
fosc=12MHz:Tmax=2^16*12/12MHz=65.536ms 模式1:T=(2^16-X)*12/fosc ;X为定时器初值
六、 体会:(碰到的问题、如何解决、有何体会)
本次实验综合性较高,结合了定时器和外部中断的程序设计方法。需要注意的地方也比较多,像定时器初值的计算、查表程序的设计、TMOD、IE的赋值等都需要注意。还有就是由于定时器采用方式1,因此需要多次赋初值,当完成一次定时器溢出后,注意重置初值;由于采用方式1,在本题的条件下,定时器的定时宽度最大为131.072ms,达不到0.5s的要求,因此我们可以拆分为5*0.1s,这样每次计时0.1s,计时5次,便可以达到要求,但是要注意每次循环结束后要重置次数的初值5。
在程序的设计过程中,刚开始的几次出现不少错误,像忘记重置次数5这样的漏洞,经过多次检查及实验,得到了最终的正确的程序,能够满足要求。总之,实验原理是基础,只有学好了单片机原理,才能真正熟练掌握其应用,我们还有待锻炼。
七、 源程序代码
① 编写定时16秒的程序,1秒、2秒、3秒……的变化由数码管体现,到16秒的时间时,停止计数,蜂鸣器报警。 ADRLED EQU 8700H
ORG 0000H LJMP MAIN ORG 1BH