定时器计数内容
如何使用定时器进行计数
定时器计数模式下,每一个脉冲,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
#define uchar unsigned char
#define uint unsigned intsbit 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。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
