断(定时器0, 1, 2)和串行口中断。
(13)时钟振荡器:
89C51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。
这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起构成自激振荡器,振荡电路参见图13(a)图所示。
外接石英晶体(或陶瓷谐振器)及电容C1、C2接在放大器的反馈回路中构成并联振荡电路,对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程度及温度稳定性,如果使用石英晶体,我们推荐电容使用30pF士10pF,而如果使用陶瓷谐振器,建议选择40pF士l0pF。
用户也可以采用外部时钟。采用外部时钟的电路如图13(b)图所示。这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。
4 系统软件设计
4.1 系统程序设计思想及流程图
系统初始化后, 温湿度部分:复位传感器, 读取温湿度数据, 进行处理, 当温度处于快速变化过程中时,系统不停的进行温度信号的采集,数据输入单片机,并在显示器上进行显示。
图15 程序流程图
4.2 系统主要程序
主程序:
主函数: #include unsigned int temp=0; unsigned char DHT11_H,DHT11_T; Delay_ms(1000); lcd_init(); 初始化LCD Delay_ms(10); DisplayInit(); while(1) { temp = Read_DHT11(); DHT11_H=temp256; if(DHT11_H<100) { lcd_pos(11); lcd_wdat(DHT11_H10+'0'); lcd_wdat(DHT11_H+'0'); lcd_pos(0x0d); lcd_wdat('%'); lcd_wdat('R'); lcd_wdat('H'); lcd_pos(0x0e); }if DHT11_T=temp%6; if(DHT11_T<100) { } } lcd_pos(0x4C); lcd_pos(0x4D); lcd_pos(0x4e); lcd_wdat(DHT11_T10+'0'); lcd_wdat(DHT11_T+'0'); lcd_wdat(0xdf); 显示℃ lcd_wdat('C'); Delay_ms(1000); } DHT11驱动程序 #include unsigned int Read_DHT11() { unsigned char flag; unsigned DHT11_H_H,DHT11_H_L,DHT11_T_H,DHT11_T_L,DHT11_Check; unsigned emp,DHT11_Check_temp; unsigned int DHT11_H=0,DHT11_T=0,DHT11_temp=0; Delay_ms(18); DHT11=1; Delay_10us(); DHT11=0; char DHT11_H_H_temp,DHT11_H_L_temp,DHT11_T_H_temp,DHT11_T_L_t char Delay_10us(); Delay_10us(); Delay_10us(); if(!DHT11) { flag=2; while((!DHT11)&&flag++); flag=2; while((DHT11)&&flag++); DHT11_H_H_temp=Read_DHT11_Byte(); DHT11_H_L_temp=Read_DHT11_Byte(); DHT11_T_H_temp=Read_DHT11_Byte(); DHT11_T_L_temp=Read_DHT11_Byte(); DHT11_Check_temp=Read_DHT11_Byte(); DHT11=1; DHT11=1; if(DHT11_Check_temp=(DHT11_H_H_temp+DHT11_H_L_temp+DHT11_T_H_temp+DHT11_T_L_temp)) { DHT11_H_H=DHT11_H_H_temp; DHT11_H_L=DHT11_H_L_temp; DHT11_T_H=DHT11_T_H_temp; DHT11_T_L=DHT11_T_L_temp; DHT11_Check=DHT11_Check_temp; } } DHT11_H=DHT11_H_H; DHT11_T=DHT11_T_H; DHT11_H=23;