利用52单片机制作一个PWM调光台灯,但同时加上一个DHT11温湿度传感器,结果加上DHT11程序直接跑飞,怀疑是PWM的中断问题,该如何解决
```c
//主函数
#include "REG52.H"
#include "INTRINS.H"
#include "SYSTEM.H"
#include "DHT11.H"
#include "KEY.H"
#include "LCD1602.H"
#include "ADC0832.H"
//---------------------------------------------------------------------------------------//
int INTENSITY;
uchar m;
uchar SCALE;
//---------------------------------------------------------------------------------------//
void main(void)
{
//-------------------------------------------------------------------------------------//
LCD_INITIAL();
LCD_OUTPUT(1,0,"TEMP&HUM&INT:",13);
//DHT_delay_ms(100);
MOD_STATE = 0;
HUM_STATE = 0;
m = 0;
SCALE = 20;
TIME0_INITIAL();
while(1)
{
//-----------------------------------------------------------------------------------//
DHT_OUTPUT();
PHO_OUTPUT();
DATA_UNITE();
LCD_OUTPUT(2,0,INPUT_LCD_DATA,15);
//-----------------------------------------------------------------------------------//
CHECK_MODE_STATE();
CHECK_HUM_STATE();
HUM_CTRL();
SCALE_CTRL();
}
}
//---------------------------------------------------------------------------------------//
void TIME0() interrupt 1
{
TR0 = 0;
TH0 = 0xEC;
TL0 = 0x78;
m++;
if(m < SCALE)
{
PWM = 0;
}
else if(m >= SCALE)
{
PWM = 1;
}
if(m == 40)
{
m = 0;
}
TR0 = 1;
}
//DHT11
#include "REG52.H"
#include "INTRINS.H"
#include "SYSTEM.H"
#include "DHT11.H"
uchar DHT_OUTPUT_DATA[8];
uchar RH,RL,TH,TL;
//---------------------------------------------------------------------------------------//
void DHT_delay_us(uchar us)
{
while(--us);
}
//---------------------------------------------------------------------------------------//
void DHT_delay_ms(int ms)
{
int i;
for(; ms>0; ms--)
{
for(i=125;i>0;i--)
{;}
}
}
//---------------------------------------------------------------------------------------//
void DHT_START(void)
{
DHT_IO = 1;
DHT_delay_us(2);
DHT_IO = 0;
DHT_delay_ms(30);
DHT_IO = 1;
DHT_delay_us(30);
}
//---------------------------------------------------------------------------------------//
uchar DHT_BYTE(void)
{
uchar i,DATA = 0;
for(i=0; i<8; i++) //´Ó¸ßµ½µÍÒÀ´Î½ÓÊÕ8λÊý¾Ý
{
while(!DHT_IO); //µÈ´ý50usµÍµçƽ¹ýÈ¥
DHT_delay_us(8); //ÑÓʱ60us£¬Èç¹û»¹Îª¸ßÔòÊý¾ÝΪ1£¬·ñÔòΪ0
DATA<<=1; //ÒÆλʹÕýÈ·½ÓÊÕ8λÊý¾Ý£¬Êý¾ÝΪ0ʱֱ½ÓÒÆλ
if(DHT_IO == 1) //Êý¾ÝΪ1ʱ£¬Ê¹DATA¼Ó1À´½ÓÊÕÊý¾Ý1
{
DATA += 1;
}
while(DHT_IO); //µÈ´ýÊý¾ÝÏßÀµÍ
}
return DATA;
}
//---------------------------------------------------------------------------------------//
void DHT_OUTPUT(void) //½ÓÊÕ40λµÄÊý¾Ý
{
uchar R_H,R_L,T_H,T_L,REVISE;
DHT_START();
if(DHT_IO == 0)
{
while(DHT_IO == 0); //µÈ´ýÀ¸ß
DHT_delay_us(40); //À¸ßºóÑÓʱ80us
R_H = DHT_BYTE(); //½ÓÊÕʪ¶È¸ß°Ëλ
R_L = DHT_BYTE(); //½ÓÊÕʪ¶ÈµÍ°Ëλ
T_H = DHT_BYTE(); //½ÓÊÕζȸ߰Ëλ
T_L = DHT_BYTE(); //½ÓÊÕζȵͰËλ
REVISE = DHT_BYTE(); //½ÓÊÕУÕýλ
DHT_delay_us(25); //½áÊø
if((R_H+R_L+T_H+T_L) == REVISE) //УÕý
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
//Êý¾Ý´¦Àí
DHT_OUTPUT_DATA[0]='0'+(RH/10);
DHT_OUTPUT_DATA[1]='0'+(RH%10);
DHT_OUTPUT_DATA[2]='R';
DHT_OUTPUT_DATA[3]='H';
DHT_OUTPUT_DATA[4]='0'+(TH/10);
DHT_OUTPUT_DATA[5]='0'+(TH%10);
DHT_OUTPUT_DATA[6]=0xDF;
DHT_OUTPUT_DATA[7]=0x43;
}
}
//LCD1602
#include "REG52.H"
#include "INTRINS.H"
#include "LCD1602.H"
#include "SYSTEM.H"
//---------------------------------------------------------------------------------------//
void CHECK_BUZY(void)
{
uchar sym;
do
{
sym = 0xFF;
LCD_EN = 0;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
sym = LCD_IO;
}
while(sym & 0x80);
LCD_EN = 0;
}
//---------------------------------------------------------------------------------------//
void WRITE_COMMAND(uchar COM)
{
CHECK_BUZY();
LCD_EN = 0;
LCD_RS = 0;
LCD_RW = 0;
LCD_IO = COM;
LCD_EN = 1;
_nop_();
LCD_EN = 0;
delay(1);
}
//---------------------------------------------------------------------------------------//
void WRITE_DATA(uchar DATA)
{
CHECK_BUZY();
LCD_EN = 0;
LCD_RS = 1;
LCD_RW = 0;
LCD_IO = DATA;
LCD_EN = 1;
_nop_();
LCD_EN = 0;
delay(1);
}
//---------------------------------------------------------------------------------------//
void LCD_INITIAL(void)
{
WRITE_COMMAND(0x38);
WRITE_COMMAND(0x0C);
WRITE_COMMAND(0x06);
WRITE_COMMAND(0x01);
delay(1);
}
//---------------------------------------------------------------------------------------//
void LCD_OUTPUT(uchar ROW, uchar COLUMN, uchar INPUT_LCD_DATA[], uchar N)
{
uchar i;
if(ROW == 1)
{
WRITE_COMMAND(0x80+COLUMN);
}
else
{
WRITE_COMMAND(0x80+0x40+COLUMN);
}
for(i=0;i<N;i++)
{
WRITE_DATA(INPUT_LCD_DATA[i]);
delay(10);
}
}
```