定时器计数内容

如何使用定时器进行计数

定时器计数模式下,每一个脉冲,T0/T1内部寄存器+1
此次学习以定时器T0为例。
实验要求:小灯在一秒闪烁2次,产生一个方波,计数器+1。

初始化部分

TCON寄存器

首先是对定时器T0进行初始化。
在这里插入图片描述
在使用T0定时器时,要先切换其模式为计数模式。在TCON寄存器中TR0为定时器0的运行控制位,TR0=1时,允许定时器0进行计数。TCON寄存器可位寻址,设置TR0=1。

TMOD寄存器

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
此处只摘录了TMOD寄存器中和定时器T0有关的部分。
TMOD.3置0。
TMOD.2置1用作计数器(从T0/P3.4脚输入)。因此在进行计数时,可以用一根杜邦线将产生脉冲的脚与P3.4连在一起,每产生一次脉冲,会通过杜邦线传给P3.4.
TMOD.1/TMOD.0 设置为0,1,16位定时器/计数器,TL0,TH0全用。
需要注意的是TMOD不可位寻址,因此需要对其每一位进行赋值。其他位默认为0,因此TMOD=0x50。

代码部分

//代码头文件部分
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit du=P2^6;
sbit we=P2^7;
sbit led1=P1^0;
uchar code LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

led灯P1.0 口与定时器0输入口P3.4通过杜邦线连在一起。

//延时函数部分
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
 for(y=114;y>0;y--);
}
//数码管动态显示部分
void display(uchar z)
{
 uchar ge,shi;
 ge=z%10;
 shi=z/10;
 
P0=0xff;//清除断码
 we=1;
 P0=0xfe;//打开第一个数码管
 we=0;
 du=1;
 P0=LED[shi];
 du=0;
 delay(5);
  

 we=1;
 P0=0xfd;//打开第二个数码管
 we=0;
 du=1;
 P0=LED[ge];
 du=0;
 delay(5);
}
//计数部分
void timeinit()	
{
TR0=1; //允许T0计数
TMOD|=0X05;//选定16位计数器模式
TH0=0;
TL0=0;
}

因为定时器0使用的是计数模式,因此16位计数器赋初值为0。

//定时器1定时部分
void time()
{
TR1=1;//TR1为定时器1的运行控制位
TMOD|=0X10;//16位定时器	 防止冲突
TH1=0X4B;
TL1=0X4D;//计时50ms
}

上述;两段代码是对两个定时器进行的初始化。因为两者均使用到了TMOD寄存器,所以在我第一次进行运行的时候,keil并没有报错,但单片机的数码管显示中的数字变化的飞快,小灯闪烁的也很快。通过学习后得知,TMOD寄存器冲突。因此在使用时用上了或运算。

//主函数部分代码
void main()
{
uchar cnt;
timeinit();//定时器0计数
time();//定时器1定时
while(1)
{
if(TF1==1)
{
TF1=0;//使用程序法时,要软件清0
TH1=0X4B;
TL1=0X4D;//重新计数
cnt++;
if(cnt==10)
{
cnt=0;
led1=~led1;//产生方波
}
}
display(TL0);
}
}

小灯每亮/灭一次,产生一个下降/上升沿,此时使用500ms,在进行同样的操作,产生一个完整脉冲,此时消耗1s,计数器+1。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值