51 Configuration de la minuterie MCU

1. Demande

Le délai de 1 S est défini par la minuterie.

2. Méthode

2.1 Principe de la minuterie

En prenant le timing 100us comme exemple, le calcul est le suivant :

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

L'oscillateur à cristal est : 11,0592 MHz

Minuterie 0, mode minuterie 16 bits

TMOD & = 0xF0 ;

TMOD |= 0x01 ;

S'il s'agit d' un timing de 100us , comment calculer TH0 et TL0 ?

L'une des impulsions est le temps

t = 1*12/ 11,0592 M = 1,085 us

Le nombre de cycles requis est alors de 100/t=100/1,085=92 cycles.

Ainsi, les 8 bits supérieurs de TH0 sont (65536-0 ) /256, et les 8 bits inférieurs sont (65536-x)%256 (Remarque : 2^8=256)

donc:

TH0 = (65536-0 ) /256 ;

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

Ainsi, l'initialisation de la minuterie est configurée comme :

TH0 = 0Xff ; // Réglage de la minuterie, lance une interruption toutes les 100 microsecondes.

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

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

Code 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;
	}
}

Guess you like

Origin blog.csdn.net/weixin_51248645/article/details/130556067