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