51单片机学习4_计时器

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 51单片机学习4_计时器

本实验目的是当数码管在流动的过程中,每过1s,8个发光二极管会逐个流动,用定时器去实现。

通过学习,我们知道想实现定时器,必须满足以下条件:

  1. cpu开总中断;
  2. 定时器中断开放;
  3. 定时器选择定时模式,即TMOD的选择;
  4. 对定时器计时控制,即选择R0还是R1;
  5. 对定时器寄存器赋初值,计算方法是THX = (65536 - 计时数)/256,TLX=(65536-计时数)%256;

下面是实验代码实现:

/*
*包含头文件,定义宏 
*/ 
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char

void init();//初始化函数 
uchar num, count;
sbit wela = P2 ^ 7;
sbit dula = P2 ^ 6;
uchar code duantable[] = {
	0x06, 0x5b, 0x4f,
	0x66, 0x6d, 0x7d
};
uchar code weitable[] = {
	0xfe, 0xfd, 0xfb,
 	0xf7, 0xef, 0xdf
};

//延时函数 
void delay(uint time)
{
	uint x, y;
	for (x = time; x > 0; x--)
		for (y = 110; y > 0; y--);
}

void main()
{
	init();
	while (1) {
        //每个数码管间隔100ms以123456显示 
		for (num = 0; num < 6; num++) {
			wela = 1;
			P0 = weitable[num];
			wela = 0;

			dula = 1;
			P0 = duantable[num];
			dula = 0;
			delay(100);
		}
	}
}

void timer() interrupt 1
{
    //重新赋初值,每次计时50ms就重新开始 
	TH0 = (65536 - 50000) / 256;
	TH1 = (65536 - 50000) % 256;
	count++;
	//当为20次的时候,就是1s 
	if (count == 20) {
		count = 0;
		P1 = _crol_(P1, 1);
	}
}

void init()
{
	EA = 1;//开总中断 
	ET0 = 1;//开定时器中断0 
	TMOD = 0x01;//计数模式为16位计时器 
	TR0 = 1;//计数运行控制位 
	TH0 = (65536 - 50000) / 256;//给低8位装初始值 
	TH1 = (65536 - 50000) % 256;//给高八位装初始值 
	P1 = 0xfe;
}

以上代码在TX-1C板子正常运行,如有不对,敬请拍砖。

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: 51单片机学习4_计时器

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: