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