C51单片机学习笔记之定时器

简介

“定时器/计数器”说的是一个东西,因为它既能计时也能计数。是存在于单片机内部的一个独立的硬件部分,依赖晶振产生固定的时间间隔,产生了一定量的固定时间间隔后会引发定时器中断从而将其产生的时间信息传送给由CPU执行的主程序中。

相关寄存器

TMOD寄存器:决定定时器/计数器的工作方式,C51单片机中一共有两个16位定时器/计数器,分别为T1,T0。

76543210
符号T1T1T1T1T0T0T0T0
GATEC/TM1M0GATEC/TM1M0
GATEC/T
门控制位定时器/计数器

0:仅受TCON的TR位控制。

1:由TR和外部中断一起控制。

0:定时器。1:计数器
M1M0控制方式
00方式0,为13位定时器/计数器
01方式1,为16位定时器/计数器
10方式2,8位初值自动重装的8位定时器/计数器
11方式3,仅适用于T0,分成两个8位计数器,T1停止计数

TCON寄存器:控制启动、关闭、标志其溢出和中断情况

76543210
符号TF1TR1TF0TR0IE1IT1IE0IT0
TFTR
溢出标志位运行控制位

溢出时该位自动置1。中断执行时硬件清0或软件清0

置1开始计时,清0停止计
TF0和TR0对应定时器0TF1和TR1对应定时器1。
IEIT
外部中断请求标志外部中断触发方式选择位
IE0与IT0对应外部中断0IE1与IT1对应外部中断1

中断具体见——C51单片机学习笔记之中断系统

原理图

代码部分

实现一个秒表

/*数码管部分*/
#include <REGX52.H>
#include "delay.h"
sbit U3=P2^0;
sbit U4=P2^1; 
unsigned char DX[]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7F,0x6F,0X40};//¶ÎÑ¡
char dx(unsigned int x)
{
	unsigned char y;
	y=DX[x];
	return y;
}
void wx(unsigned char locaton)
{
	switch(locaton)
	{
	case 1:P0=0xfe;break;
	case 2:P0=0xfd;break;
	case 3:P0=0xfb;break;
	case 4:P0=0xf7;break;
	case 5:P0=0xef;break;
	case 6:P0=0xdf;break;
	case 7:P0=0xbf;break;
	case 8:P0=0x7f;break;
	}

}
void print(unsigned char x,y)
{
	U3=1;
	P0=dx(x);
	U3=0;
	U4=1;
	wx(y);
	U4=0;
	delay();
	P0=0x00;

}


#ifndef __DigitalTube_h__
#define __DigitalTube_h__
void print(unsigned char x,y);
char dx(unsigned int x);
void wx(unsigned char locaton);
#endif




/*按键部分*/
#include <REGX52.H>

void delay1()
{
	unsigned int i;
	for(i=0;i<30000;i++);
}
unsigned char MatrixKey()
{
	unsigned char KeyNumber;
	P1=0xFF;
	P1_0=0;
 if(P1_4==0)
{
		delay1();
	 while(P1_4==0);
	 delay1();
	 KeyNumber=1;
 }
 if(P1_5==0)
 {
		delay1();
	 while(P1_4==0);
	 delay1();
	 KeyNumber=2;
 }
 if(P1_6==0)
 {
		delay1();
	 while(P1_4==0);
	 delay1();
	 KeyNumber=3;
 }
 return KeyNumber;
}

#ifndef __MatrixKey_H__
#define __MatrixKey_H__

unsigned char MatrixKey();
#endif

 

/*延时部分*/
#include <REGX52.H>
#include "intrins.h"
void delay()		
{
unsigned int i;
	for(i=0;i<200;i++);
}

#ifndef __delay_h__
#define __delay_h__
void delay();
#endif

/*中断部分*/
#include <REGX52.H>
#include "delay.h"
#include "DigitalTube.h"
unsigned int time=0,num=0,num2=0,num3=0;

void InitTimer0()//中断初始化
{
	  TMOD=0X01;
   	TH0=(65535-50000)/256;//高八位
   	TL0=(65535-50000)%256; //低八位
   	EA=1;//中断打开
	ET0=1;//定时器中断打开
   	TR0=1;//定时器打开
}
void delay1()
{
	unsigned int i;
	for(i=0;i<30000;i++);
}
void show()
{
		
		while(1)
	{
		print(num3/10,1);
		print(num3%10,2);
	  print(10,3);
		P0=0x00;
		print(num2/10,4);
		print(num2%10,5);
		print(10,6);
		print(num/10,7);
		print(num%10,8);
		
	P1=0xFF;
	P1_0=0;
 if(P1_4==0)
{
		delay1();
	 while(P1_4==0);
	 delay1();
	 num++;
 }
 if(P1_5==0)
 {
		delay1();
	 while(P1_4==0);
	 delay1();
	 num2++;
 }
 if(P1_6==0)
 {
		delay1();
	 while(P1_4==0);
	 delay1();
	 num3++;
 }
		
	}
}
void exter1() interrupt 1
{
	TH0 = (65535-50000)/256;
	TL0 = (65535-50000)%256;	
			time++;
		if(time==20)
		{
			time=0;	
			num++;
		
		}	
	
		if(num==60)
		{
				num=0;
		  	num2++;
		} 
		if(num2==60)
		{
			num2=0;
			num3++;
		}
		if(num3==24)
		{
			num3=0;
		}
}

#ifndef __Time_h__
#define __Time_h__
void show();
void InitTimer0();
void MatrixKey();
#endif

/*主函数*/
#include <REGX52.H>
#include "DigitalTube.h"
#include "Time.h"
main()
{

	InitTimer0();
	while(1)
	{
		show();
	}
}

结论

  这一章重点就是理解定时器/计数器的寄存器,能够配置寄存器。代码实现秒表的原理是——中断时间是50毫秒,累计20次就是1秒,每累计20次就置0。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值