管组成的复合管放大,通将输出放大一百倍,从而由扬声器发出洪亮的声音,由软件设计输出信号高低电平时间间隔的不同,从而可发出警车似的声音。电路图如图6所示
图6 报警电路的原理图
2.3.5稳压电源电路的设计
稳压电路由变压器、桥式整流堆、电容与芯片78L05组成,使输入220V的交流电经过变压为输出5V的直流电。其电路图如
7所示
U178L051V220V/9V~220V21INPUTT013VINOUTGND23R1560 D2BRIDGE142+C11C20.33UF/25V0.1UF/25VC3+C41000UF/25VD1LED2200UF25V
图7 5V稳压电路
电源是系统中最重要的模块之一,输入电源经稳压块后输出稳定的+5V电源,用以驱动整个系统。
2.3.6 系统硬件电路的选择及说明
硬件电路的设计见附图示,从以上的分析可知在本设计中要用到如下器件:ST89C52、红外发射/接收管、反相器74LS14、扬声器等,以及一些单片机外围就用电路,其中D2为电源工作指示灯,R4为扬声器起报警作用,当P3.7f输出高低电平时报警器开始报警
三软件的程序实现
3.1红外报警模块设计编程程序
主程序清单如下:
ORG 00H
LOOP3: MOV P1,#0FFH
CLR P1.2 mov A,P1 JNB ACC.1,STAR SJMP LOOP3 STAR:MOV R2,#2 LOOP2:MOV R1,#4 LOOP1:MOV R6,#126 MOV R5,#193 ACALL SOUND MOV R6,#95 MOV R5,#255 ACALL SOUND DJNZ R1,LOOP1 DJNZ R2,LOOP2 SETB P3.7 AJMP LOOP3 SOUND:CLR P3.7 ACALL DELAY SETB P3.7 ACALL DELAY DJNZ R5,SOUND RET DELAY: MOV B, R6 DL: MOV R7,#6 DJNZ R7,$ DJNZ R6,DL MOV R6,B RET END
3.2温度测量模块系统的调试
DS18B20 数据的部分程序代码为:
#include
#include
#define uchar unsigned char #define uint unsigned int
sbit DQ=P3^7; uint temp;
uchar code ditab[16]=
{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; //
uchar code dis_7[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; //共阴LED段码表 \ \ \ \ \ \ \ \ \ \不亮\ uchar code scan_con[4]={0xef,0xdf,0xbf,0x7f}; //列扫描控制字
uchar data temp_data[2]={0x00,0x00}; //读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用
void delay(uint t){
for(;t>0;t--); }
/***********18B20复位函数**********/
ow_reset(void) { char presence=1;
while(presence){ while(presence){ }
DQ=1;
_nop_();_nop_(); DQ=0; //
delay(50); // 550us
DQ=1; // delay(6); // 66us
DQ=presence; // presence=0继续下一步
}
delay(45); //延时500us presence = ~DQ;
DQ=1;
delay(1); }
//向 1-WIRE 总线上写一个字节 void write_byte(uchar val){ }
//从总线上读取一个字节 uchar read_byte(void){ uchar i;
uchar value = 0; for (i=8;i>0;i--){ }
DQ=1;
_nop_();_nop_(); value>>=1;
DQ = 0; _nop_();_nop_(); _nop_();_nop_(); //4us DQ = 1;
_nop_();_nop_();
_nop_();_nop_(); //4us if(DQ)value|=0x80; delay(6); //66us uchar i;
for (i=8; i>0; i--){ DQ=1;
_nop_();_nop_(); DQ = 0;
_nop_();_nop_();
_nop_();_nop_(); _nop_();//5us
DQ = val&0x01; //最低位移出 delay(6); //66us
val=val/2; //右移一位
}
DQ = 1; delay(1);
DQ=1; return(value);
}
read_temp(){ ow_reset();