定时计数器实验单片机.docx
- 文档编号:10339196
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:16
- 大小:115.59KB
定时计数器实验单片机.docx
《定时计数器实验单片机.docx》由会员分享,可在线阅读,更多相关《定时计数器实验单片机.docx(16页珍藏版)》请在冰点文库上搜索。
定时计数器实验单片机
单
片
机
实
验
报
告
实验五定时/计数器实验
一、实验目的
1.学习8051内部定时/计数器的工作原理及编程方法;
2.掌握定时/计数器外扩中断的方法。
二、实验原理
8051单片机有2个16位的定时/计数器:
定时器0(T0)和定时器1(T1)。
它们都有定时器或事件计数的功能,可用于定时控制、延时、对外部事件计数和检测等场合。
T0由2个特殊功能寄存器TH0和TL0构成,T1则由TH1和TL1构成。
作计数器时,通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数,当输入脉冲信号从1到0的负跳变时,计数器就自动加1。
计数的最高频率一般为振荡频率的1/24。
定时/计数器的结构:
定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。
TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
计数器初值的计算:
设计数器的最大计数值为M(根据不同工作方式,M可以是213、216或28),则计算初值X的公式如下:
X=M-要求的计数值(十六进制数)
定时器初值的计算:
在定时器模式下,计数器由单片机主脉冲fosc经12分频后计数。
因此,定时器定时初值计算公式:
X=M-(要求的定时值)/(12/fosc)
80C51单片机定时/计数器的工作由两个特殊功能寄存器控制。
TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。
v工作方式寄存器TMOD:
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。
其格式如下:
GATE:
门控位。
GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。
即此时定时器的启动条件,加上了或引脚为高电平这一条件。
M1M0:
工作方式设置位。
定时/计数器有四种工作方式,由M1M0进行设置。
v控制寄存器TCON
TCON的低4位用于控制外部中断,已在前面介绍。
TCON的高4位用于控制定时/计数器的启动和中断申请。
其格式如下:
TF1(TCON.7):
T1溢出中断请求标志位。
T1计数溢出时由硬件自动置TF1为1。
CPU响应中断后TF1由硬件自动清0。
T1工作时,CPU可随时查询TF1的状态。
所以,TF1可用作查询测试的标志。
TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
TR1(TCON.6):
T1运行控制位。
TR1置1时,T1开始工作;TR1置0时,T1停止工作。
TR1由软件置1或清0。
所以,用软件可控制定时/计数器的启动与停止。
TF0(TCON.5):
T0溢出中断请求标志位,其功能与TF1类同。
TR0(TCON.4):
T0运行控制位,其功能与TR1类同。
三、实验电路图
第一、三部分电路图:
第二部分电路图(加入一个脉冲计数的开关):
四、实验设备
微型计算机、单片机仿真器、实验仪、示波器(各一台);
实验连线(若干)。
五、实验内容
*由于汇编语言程序中已经做了相应的注释,C语言的编程原理与之相同不再做重复注释,请见谅。
◆实验例程
使8个发光二极管点亮,点亮时间间隔一秒,要求用定时器中断方式产生延时。
汇编语言代码:
ORG0000H
AJMPSTART
ORG000BH
AJMPT0INT;定时器T0中断入口
ORG0030H
START:
MOVSP,#60H
MOVTMOD,#01H
MOVTL0,#0B0H;晶振为12兆赫资时,50ms溢出一次
MOVTH0,#3CH
SETBET0
SETBEA
SETBTR0;启动定时器
MOVA,#0FEH
MOVR1,#20;定时器溢出20次为1秒
MOVP1,A
LOOP:
CJNER1,#0,LOOP
MOVR1,#20
DECA
MOVP1,A;发光二极管低电平点亮,因此为记数加显示
AJMPLOOP
T0INT:
MOVTH0,#3CH;定时器重新初始化
MOVTL0,#0B0H
DECR1
RETI;中断返回
END
C语言程序代码:
#include
#defineTIMEINT0x01
#defineTIMEH0x3C
#defineTIMEL0xB0
externunsignedchart_count;
voidtimer0(void)interrupt1using1
{
TH0=TIMEH;
TL0=TIMEL;
t_count--;
}
main()
{
unsignedcharDisNum;
DisNum=0xFE;
t_count=20;
TMOD=TIMEINT;
TH0=TIMEH;
TL0=TIMEL;
ET0=1;
EA=1;
TR0=1;
while
(1)
{
while(t_count!
=0)
{
P1=DisNum;
}
t_count=20;
DisNum--;
}
}
◆将定时器T0设置成定时方式,由P1.0输出50%占空比的500Hz方波。
汇编语言代码:
ORG0000H
AJMPSTART
ORG000BH
AJMPT0INT
ORG0030H
START:
MOVSP,#60H
MOVTMOD,#01H
MOVTL0,#18H
MOVTH0,#0FCH
SETBET0;开中断
SETBEA
SETBTR0
AJMP$;等待中断
T0INT:
CPLP1.0
MOVTL0,#18H;初始化T0定时器
MOVTH0,#0FCH
RETI
END
C语言程序代码:
#include
#defineTIMEINT0x01
#defineTIMEH0x00
#defineTIMEL0x00
externunsignedchart_count,flag;
voidtimer0(void)interrupt1using1
{
TH0=TIMEH;
TL0=TIMEL;
flag=flag^1;
}
main()
{
flag=1;
TMOD=TIMEINT;
TH0=TIMEH;
TL0=TIMEL;
ET0=1;
EA=1;
TR0=1;
while
(1)
{
if(flag==0)
{
P1=0xff;
}
if(flag==1)
{
P1=0xfe;
}
continue;
}
}
◆将定时器T0设置成对外部脉冲计数方式,T0引脚每来一次外部脉冲,记数加1,计数结果以二进制格式显示在8个发光二极管上。
汇编语言代码:
ORG0000H
AJMPSTART
ORG000BH
AJMPT0INT
ORG0030H
START:
MOVSP,#60H
MOVTMOD,#0DH;设置为计数状态
MOVTL0,#0FFH;设置计数值为1时就溢出
MOVTH0,#0FFH
SETBET0;开中断
SETBEA
SETBTR0;启动定时器
MOVA,#0FFH
MOVR1,#1;中断处理标志
MOVP1,A
LOOP:
CJNER1,#0,LOOP;等待中断
MOVR1,#1
DECA
MOVP1,A;计数显示
AJMPLOOP
T0INT:
MOVTH0,#0FFH
MOVTL0,#0FFH
DECR1
RETI
END
C语言程序代码:
#include
#defineTIMEINT0x0D
#defineTIMEH0xFF
#defineTIMEL0xFF
externunsignedcharflag;
main()
{
unsignedcharDisNum;
DisNum=0xFF;
TMOD=TIMEINT;
TH0=TIMEH;
TL0=TIMEL;
ET0=1;
EA=1;
TR0=1;
flag=1;
P1=DisNum;
while
(1)
{
if(flag==0)
{
flag=1;
DisNum--;
P1=DisNum;
}
continue;
}
}
voidtimer0(void)interrupt1using1
{
TH0=TIMEH;
TL0=TIMEL;
flag=0;
}
◆使用T0、T1两个定时器分别控制从P1.0输出波形的高、低电平的宽度。
汇编语言代码:
ORG0000H
AJMPSTART
ORG000BH
AJMPT0INT
ORG001BH
AJMPT1INT
ORG0030H
START:
MOVSP,#60H
MOVTMOD,#11H;定时/计数器设置
MOVTL0,#00H;两个定时器的初值设置
MOVTH0,#00H
MOVTL1,#00H
MOVTH1,#00H
SETBET0;开中断T0、T1
SETBET1
SETBEA
MOVR1,#0;R1作为标志位使用
SETBTR0
LOOP1:
CJNER1,#1,SECOND;若标志位等于1则跳转
MOVP1,#0FFH
AJMPRETURN
SECOND:
MOVP1,#0FEH
RETURN:
AJMPLOOP1;循环执行
T0INT:
CLRTR0;T0定时时间到,关闭
MOVTL0,#00H;T0定时器设置初值
MOVTH0,#00H
MOVR1,#01H;标志位置1
SETBTR1;T1定时开启
RETI
T1INT:
CLRTR1;T1定时时间到,关闭
MOVTL1,#00H;T1定时器设置初值
MOVTH1,#00H
MOVR1,#00H;标志位置0
SETBTR0;T0定时开启
RETI;中断返回
END
C语言程序代码:
#include
#defineTIMEINT0x11
#defineTIMEH0x00
#defineTIMEL0x00
externunsignedcharflag;
main()
{
TMOD=TIMEINT;
TH0=TIMEH;
TL0=TIMEL;
ET0=1;
TH1=TIMEH;
TL1=TIMEL;
ET1=1;
EA=1;
flag=1;
TR0=1;
while
(1)
{
if(flag==0)
{
P1=0xff;
}
if(flag==1)
{
P1=0xfe;
}
continue;
}
}
voidtimer0(void)interrupt1using1
{
TR0=0;
TH0=TIMEH;
TL0=TIMEL;
flag=1;
TR1=1;
}
voidtimer1(void)interrupt3using1
{
TR1=0;
TH0=TIMEH;
TL0=TIMEL;
flag=0;
TR0=1;
}
六、实验小结
通过本次实验,我对单片机的定时/计数功能有了一定的了解,熟悉了定时/计数器的设置、控制和最基本的应用,初步获悉了定时/计数器的内部结构,再结合上一次实验对终端的了解,二者配合,编写一些简单的程序,完成诸如产生固定频率的方波、脉冲计数和占空比调整的功能,巩固对中断和定时/计数的知识,为下一步的学习打下坚实的基础。
以上程序均已经过实验仪现象验证,如有什么不足,请老师指出并告知,谢谢。
4.1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 定时 计数器 实验 单片机
![提示](https://static.bingdoc.com/images/bang_tan.gif)