平,同时电容通过7脚放电,2脚电平下降;当2脚电平下降到VCC5/3V时,输出端3脚转变为高电平。电容HS1101放电所需时间为:
Td=RH4*C(HS1101)*㏑2
当放电结束时,VCC5将通过RH3、RH4向电容HS1101充电。2脚电压由VCC5/3上升到2*VCC5/3所需的时间为:
Tu=(RH4+RH3)*C(HS1101)*㏑2
当3脚上升到2*VCC5/3时,电路又翻转为低电平。如此周而复始,就在电路的输出端3脚得到一个周期性的矩形波,通过单片机的外部中断口可以检测这个矩形波并得到其频率,频率的计算公式如下:
f=1/(Td+Tu)=1/[(2*RH4+RH3)* C(HS1101)*㏑2];
进而得到电容值的计算公式:C(HS1101)=1/[(2*RH4+RH3)*f*㏑2]
这样就能得到测湿电容C(HS1101)的电容值并与湿度一一对应起来了。
图3-3转换及测湿电路图
3.3报警电路设计
报警电路如图3-4所示。
当湿度超过设定值时,单片机会控制蜂鸣器发声报警。电路中的三极管9013当做开关管使用,从而实现对LED灯和蜂鸣器进行控制。9013给高电平就会导通,低电平截止。
图3-4报警电路图
3.4 LCD1602显示
显示部分采用LCD 1602液晶屏进行数据显示,其主要技术参数如表3-1所示。
表3-1液晶屏技术指标
显示容量: 芯片工作电压: 工作电流: 模块最佳工作电压: 字符尺寸: 16×2个字符 4.5~5.5V 2.0mA(5.0V) 5.0V 2.95×4.35(WXH)mm 接口信号说明如表3-2所示。 表3-2 液晶屏接口信号说明
编号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 符号 GND VDD VL RS R/W EN D0 D1 D2 D3 D4 D5 D6 D7 BL+ BL- 引脚说明 电源地 电源正极 液晶显示偏压信号 数据/命令选择端(H/L) 读/写选择端(H/L) 使能信号 Data I/O Data I/O Data I/O Data I/O Data I/O Data I/O Data I/O Data I/O 背光源正极 背光源负极
与单片机接口电路如图3-5所示。
图3-5接口电路图
3.5软件编程 3.5.1主程序
#include \
#define uchar unsigned char #define uint unsigned int long int f; long int q; double k; sbit rs=P2^0; sbit rw=P2^1; sbit ep=P2^2; sbit bell=P1^3;
uchar code table1[10]={%uchar code table2[13]={%uchar code table3[12]={\ The RH is\void delay(int ms)
{ // 延时子程序 int i;
while(ms--) {
for(i = 0; i<2; i++); } }
void writec(unsigned char cmd) { rs=0; rw=0; ep=0; P0=cmd; delay(1); ep=1; delay(1); ep=0; }
void writed(unsigned char date) {
rs=1; rw=0; ep=1; P0=date; delay(1); ep=0; }
void Init_timer() {
TMOD=0x51; //0101 0001 定时器0在模式1下工作16位定时器,定时方式 定时器1在模式1下工作16位计数器,T1负跳变加1
TL0=0x00; //定时器0初值 定时50000us TH0=0x4C;
TL1=0x00; //定时器1清零 TH1=0x00;
ET0=1; //使能定时器0中断 ET1=1; //使能定时器1中断 EA=1; //使能总中断 TR0=1; //开始计时 TR1=1; }
void init() {
writec(0x38); //delay(1); writec(0x0c); //delay(1); writec(0x06);
//delay(1);
writec(0x01); //清除LCD的显示内容 }
void display(double k1) {
int a,b,c,d,e,k; k1=k1*100; k= (int) k1; a=k/1000; k=k00; b=k/100; k=k0; c=k/10; k=k; d=k/1;
writec(0xc8);
if((a==0)&&(b==0)) writed(table2[0]); else if((a==0)&&(b!=0)) writed(table2[b]); else {
writed(table2[a]); writed(table2[b]); writed(table2[11]); writed(table2[c]); writed(table2[d]); /*writed(table2[e]);*/ writed(table2[10]); /* writed(table2[a]); writed(table2[b]); writed(table2[11]); writed(table2[c]); writed(table2[d]); writed(table2[e]); writed(table2[10]); */ } }
//初值
/****************************************************************************
* 名称: timer0()
* 功能: 定时器1,每50000us中断一次。 * 入口参数: