51单片机定时器配置篇

1.需求

通过定时器设置1S延时。

2.方法

2.1 定时器原理

以定时100us为例,计算如下:

/****************************/

晶振为:11.0592MHz

定时器0,16位定时器模式

TMOD & = 0xF0;

TMOD |= 0x01;

如果是100us定时,那么TH0和TL0如何算呢?

其中一个脉冲得时间

t = 1*12/11.0592M = 1.085us

则需要的周期数为100/t=100/1.085=92个周期。

所以TH0高8位为(65536-0)/256,低八位为(65536-x)%256 (注:2^8=256)

所以:

TH0 = (65536-0)/256;

TL0 = (65536-92)%256=256-92=164=0xa4;

因此定时器初始化得配置为:

TH0=0Xff;                 //定时器设置,每隔100微秒发起一次中断。

TL0=0Xa4; // =(65536-100)%256

/***********************************************/

2.2 代码

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include "lcd1602.h"
#include "delay.h"
#include "customdef.h"
#include "DHT11.h"
#include "ADC0809.h"


char DHTdata1[5];
int DHT11_time = 0;        //控制温湿度采样频率
uint readDHTFlags=1;

char dis0[16];			   //打印数组初始化
char dis1[16];			   //打印数组初始化



void main (void)
{
	uint i;
	uint lock = 1;        //控制电机只执行一次       

	

	
	//TCON配置
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时


	TMOD=0x01;
	TH0 = 0xb8;
	TL0 = 0x00;//定时 ms
	
	//使能总中断
	//中断配置
	ET0=1; //enable time0 interrupt
	EA=1; //enable global interrupt switch
	PT0=0;//低优先级	
	
	LCD_Init();           //初始化液晶·
	DelayMs(20);          //延时有助于稳定
	LCD_Write_String(0,0," ");//显示
	LCD_Clear(); 
	DelayMs(20);          //延时有助于稳定


	for ( i=0;i<16;i++ ) dis0[i]=0;   //清空数组
	for ( i=0;i<16;i++ ) dis1[i]=0;   //清空数组
	
			DelayMs(200);          //延时有助于稳定
      DelayMs(200);          //延时有助于稳定	

	while(1){
		
//温湿度采集  --start

		if(readDHTFlags==1)
		//if(1)
		{
				P1=~P1;	
      DelayMs(200);          //延时有助于稳定
			//for ( i=0;i<5;i++ ) DHTdata1[i]=0;   //清空数组
		  RH(DHTdata1);
			readDHTFlags=0;
			sprintf(dis1,"TEMP%d.%dTUM%d.%d",(int)DHTdata1[2],(int)DHTdata1[3],(int)DHTdata1[0],(int)DHTdata1[1]);
			LCD_Write_String(0,1,dis1);//显示 内容
		}
      DelayMs(500);          //延时有助于稳定
//温湿度采集  --end				
			

	  //按键-----start
	
	 //按键-----end


			
	}
}

/**定时器0的中断服务函数**/
void timer_zeroInterrupt() interrupt 1{
	//TH0 = 0xb8;
	//TL0 = 0x00;//定时 ms
	TH0 = (65535-50000)/256;
	TL0 = (65535-50000)%256;//定时 ms	
	
	DHT11_time++;
	if(DHT11_time%2 == 0){
		readDHTFlags = 1;
		DHT11_time=0;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_51248645/article/details/130556067