跳至主要内容

【转】用单片机实现的自动拨号器

自动拨号器是一种智能化的报警监控装置,它以单片机为核心器件,利用无线寻呼和程控电话可随时将警情发送给指定的BP机。它配备不同的传感器后,不但可以对有毒气体泄漏、家中被盗等情况进行报警,而且还可对通信设备及电源故障的发生进行告警,可广泛应用于仓库、小型商店、无人值守通信台站的监测以及家庭防盗、煤气报警等。

工作原理

  自动拨号器按功能的不同可分为可编码型和简易型两种。可编码型自动拨号器可人为设置、更改BP机号码,使用方便灵活;简易型自动拨号器的BP机号码已写入CPU的程序存储器中,具有成本低廉、稳定可靠的特点,缺点是不能人为更改BP机号码,需通过编程器写入,但成本较可编码型低。以下分别介绍这两种拨号器的工作原理。
  可编码的自动拨号器 如图1所示,可编码型自动拨号器核心部件IC1是ATMEL公司的89C51或台湾华邦公司的W78E51单片机,89C51和W78E51均为带4K字节快闪PROM的低电压CMOS八位微处理器,与标准的MCS-51系列单片机的指令、引脚全兼容。它有4K字节快闪PROM,128字节RAM,32个I/O端口,2个16位定时器/计数器,6个中断源。32个I/O口中,P1、P3可作为普通I/O口使用,P0、P2通常作为外部数据总线使用,当作为普通I/O口使用时,P0口必须外加上接电阻。IC2(PCD3311)是飞利浦公司生产的DTMF双音频发生器,可以和所有标准的单片微计算机直接接口,接收二进制码的并行或串行数据,串行数据格式为I2C总线方式。D0~D5(⑧~、④脚)为并行数据输入端口,MODE(③脚)为工作方式选择端口,在图1中该端口接成高电平方式,用于输入并行数据。STR(⑤脚)是数据选通输入端,由89C51或W78E51的P3.0控制。TONE(⑥脚)为DTMF双音频输出端。IC3(93C46)是MICRO-WIRE总线结构的串行EEPROM,用于保存从键盘输入的BP机号码,断电后数据不会丢失。IC3的①~④脚分别为片选端(CS)、串行移位时钟端(SK)、串行移位数据输入端(DI)和串行移位数据输出端(DO)。根据⑥脚电平的高低,有16位(⑥脚接VCC)和8位(⑥脚接地)两种操作方式。可编码的自动拨号器采用的是16位方式。

77.gif (4331 bytes)78.gif (4916 bytes)79.gif (5480 bytes)80.gif (4536 bytes)

  IC1的P1.0~P1.5(①~⑥脚)主要用于PCD3311的数据接口。P3.0(⑩脚)控制PCD3311的数据选通。P3.0~P3.5(②、③、⑥~⑨脚)用于PCD3311并行数据的输入。P3.6用来控制继电器。P3.7控制光耦合双向可控硅MOC3041,以接通220V交流电源。P3.1、P3.3、P3.4、P3.5连接93C46。P2作为键盘的输入接口。P0.7为告警信号输入(自动判断P0.7的状态,如从高电平变为低电平即拨号)。图1中的虚线部分为告警检测电路,M为探头(如有害气体探头、温度探头等)。某工作原理是:当探头检测到外界媒质发生变化时,表面阻值下降,同相"+"端输入电压升高,比较器LM324输出高电平,经过"非"门变为低电平送到CPU的P0.7端,P3.6、P3.7则由低电平变为高电平,通过控制继电器和可控硅,从而接通电话外线和220V交流电源。与此同时,CPU调用已写入93C46的BP机号码,并通过PCD3311向外线发出寻呼。RL为220V电源插座,可根据不同情况外接各种驱动装置或交流报警器。实际应用中,可根据需要自行设计前端的告警检测电路(如红外防盗报警电路)。图1中的K1是系统复位按钮,K2是正常/设置开关(闭合状态下键盘输入有效),K3为结束按钮。输入BP机号码时,先将K2拨到"设置"位,待输入完成后,应按一下K3,再将K2置于"正常"位。键盘上的"*"号为延时标志键,这与电话机上的"*"键不同。需说明的是,写入的传呼台号应为自动台,如电信局127自动台的写入格式为127×××××××(××为BP机号码)+延时标志。由于其它寻呼台的自动传呼格式可能不同于127台,通过灵活使用"*"键,可模仿其它自动台的传呼。为防止误拨号(因有些探头在初始加电时表面阻值下降会引起误判断),软件编写时,在程序初始状态加有30秒的延时。按图1连接无误后,可人为使P0.7为低电平,再仔细调节可调电阻R,使BP机能准确地收到拨号信号。需注意的是,如作为气体泄漏、防盗报警器使用时,应经过有关单位验证,以免产生意外。
  图2为拨号器软件流程,主程序完成BP机号码的写入及CPU初始参数的设置;中断子程序完成告警信号的检测、拨号子程序的调用及继电器、可控硅动作的控制。当程序检测到告警信号时,中断子程序将每隔30秒分三次调用拨号子程序,直至告警信号消失。当然,也可通过修改软件设置来反复调用拨号子程序。

81.gif (6184 bytes)

  简易型自动拨号器 简易型自动拨号器电路如图3所示。与可编码型自动拨号器相比它的核心部件采用89C2051单片机(89C51的精简型号),寻呼台号及传呼号码已固定写入89C2051单片机程序存储器中。89C2051内带一个模拟比较器,具有15个I/O端口。P1口是8位双向I/O端口,可作普通I/O端口使用。P3口的P3.0~P3.5和P3.7是带有内部上拉电阻的7个双向I/O口。P3.6固定用于片内比较器的输出端而不可作为普通I/O端口使用。89C2051的P1.1、P1.0可作为各种探头的比较信号输入端,P1.0和P1.1还分别作为片内模拟比较器的同相输入(AIN0)和反相输入(AIN1)端口。P1.4(a16.gif (67 bytes)脚)控制

82.gif (5367 bytes)83.gif (4976 bytes)84.gif (5036 bytes)

  PCD3311的数据选通。P3.0~P3.5(②、③、⑥~⑨脚)用于PCD3311并行数据的输入。P3.7用来控制继电器。P1.7控制MOC3041。P1.2可作为其它告警(如防盗开关、红外探头)信号的输入端。图3的虚线部分为告警检测电路,M为探头(如有害气体探头、温度探头等),其工作原理同图1,这里不再赘述。如不用89C2051的内部模拟比较器,而将P1.2作为告警信号的输入端时,最好外接一个电阻,使比较器的"+"端电压小于"-"端电压,以避免P3.6输出高电平而误告警。

系统扩展

  图1和图3所示自动拨号器的电路经过扩展后,还可用于通信设备,特别是电源设备的故障报警。图4为应用于通信设备故障自动报警的电原理框图。

85.gif (5978 bytes)

  与图3相比,图4主要增加了一片ADC0809,用于外部模拟电压的采集。ADC0809为八位8路A/D转换芯片。由W78E51的P2.0、P2.1控制ADC0809的选通。模拟量的输入电压标称值为0~5V,而通信电源一般采用交流220V或直流-24V和-48V。交流220V可通过整流、稳压后得到标准的5V电压;直流-24V、-48V电压的采样可通过极性转换,将负电压转换为正电压后再分压得到;单片机的空余I/O口作为设备告警信号输入端,在程序中可灵活设置报警阈值。一旦电源电压过低或过高,W78E51便将ADC0809采样的电压值通过拨号器发送到值班人员的BP机,从而达到无人值守的目的。

15-3.gif (8298 bytes) 

评论

此博客中的热门博文

【转】AMBA、AHB、APB总线简介

AMBA 简介 随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大。数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用。在基于IP复用的SoC设计中,片上总线设计是最关键的问题。为此,业界出现了很多片上总线标准。其中,由ARM公司推出的AMBA片上总线受到了广大IP开发商和SoC系统集成者的青睐,已成为一种流行的工业标准片上结构。AMBA规范主要包括了AHB(Advanced High performance Bus)系统总线和APB(Advanced Peripheral Bus)外围总线。   AMBA 片上总线        AMBA 2.0 规范包括四个部分:AHB、ASB、APB和Test Methodology。AHB的相互连接采用了传统的带有主模块和从模块的共享总线,接口与互连功能分离,这对芯片上模块之间的互连具有重要意义。AMBA已不仅是一种总线,更是一种带有接口模块的互连体系。下面将简要介绍比较重要的AHB和APB总线。 基于 AMBA 的片上系统        一个典型的基于AMBA总线的系统框图如图3所示。        大多数挂在总线上的模块(包括处理器)只是单一属性的功能模块:主模块或者从模块。主模块是向从模块发出读写操作的模块,如CPU,DSP等;从模块是接受命令并做出反应的模块,如片上的RAM,AHB/APB 桥等。另外,还有一些模块同时具有两种属性,例如直接存储器存取(DMA)在被编程时是从模块,但在系统读传输数据时必须是主模块。如果总线上存在多个主模块,就需要仲裁器来决定如何控制各种主模块对总线的访问。虽然仲裁规范是AMBA总线规范中的一部分,但具体使用的算法由RTL设计工程师决定,其中两个最常用的算法是固定优先级算法和循环制算法。AHB总线上最多可以有16个主模块和任意多个从模块,如果主模块数目大于16,则需再加一层结构(具体参阅ARM公司推出的Multi-layer AHB规范)。APB 桥既是APB总线上唯一的主模块,也是AHB系统总线上的从模块。其主要功能是锁存来自AHB系统总...

【转】VxWorks套接口

int m_socket;   // Open a socket        m_socket = socket(AF_INET, SOCK_STREAM, 0);   第一个参数 domain 说明我们网络程序所在的主机采用的通讯协族 (AF_UNIX 和 AF_INET 等 ). AF_UNIX 只能够用于单一的 Unix 系统进程间通信 , 而 AF_INET 是针对 Internet 的 , 因而可以允许在远程主机之间通信 . VxWorks 套接字仅支持 Internet 域地址族 , 不支持 UNIX 域地址族 . 因此在需要 domain 参数的函数中 , 使用 AF_INET 作为函数参数值 . 第二个参数 type 说明我们网络程序所采用的通讯协议 ( SOCK_STREAM , SOCK_DGRAM 等 ). SOCK_STREAM 表明我们用的是 TCP 协议 , 这样会提供按顺序的 , 可靠 , 双向 , 面向连接的比特流 . SOCK_DGRAM  表明我们用的是 UDP 协议 , 这样只会提供定长的 , 不可靠 , 无连接的通信 . 此外,还有 SOCK_RAW 代表是原始协议套接字 . 第三个参数 protocol, 由于我们指定了 type, 所以这个地方我们一般只要用 0 来代替就可以了 . socket 为网络通讯做基本的准备 , 成功打开则返回一个套接字描述符 , 如果失败则返回 ERROR. 套接字描述符是一个标准的 I/O 系统文件描述符 (fd, file descriptor), 可以被 close(), read(), write() 和 ioctl() 函数使用 .   // Make the socket sending alive messages when connected int flag = 1; setsockopt(m_socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&flag, sizeof(flag));   // increase receive buffer siz...

【转】C++/CLI程序进程之间的通讯

 现在,把大型软件项目分解为一些相交互的小程序似乎变得越来越普遍,程序各部分之间的通讯可使用某种类型的通讯协议,这些程序可能运行在不同的机器上、不同的操作系统中、以不同的语言编写,但也有可能只在同一台机器上,实际上,这些程序可看成是同一程序中的不同线程。而本文主要讨论C++/CLI程序间的通讯,当然,在此是讨论进程间通讯,而不是网络通讯。    简介   试想一个包含数据库查询功能的应用,通常有一个被称为服务端的程序,等待另一个被称为客户端程序发送请求,当接收到请求时,服务端执行相应功能,并把结果(或者错误信息)返回给客户端。在许多情况中,有着多个客户端,所有的请求都会在同一时间发送到同一服务端,这就要求服务端程序要更加高级、完善。   在某些针对此任务的环境中,服务端程序可能只是众多程序中的一个程序,其他可能也是服务端或者客户端程序,实际上,如果我们的数据库服务端需要访问不存在于本机的文件,那么它就可能成为其他某个文件服务器的一个客户端。一个程序中可能会有一个服务线程及一个或多个客户线程,因此,我们需小心使用客户端及服务端这个术语,虽然它们表达了近似的抽象含义,但在具体实现上却大不相同。从一般的观点来看,客户端即为服务端所提供服务的"消费者",而服务端也能成为其他某些服务的客户端。    服务端套接字   让我们从一个具体有代表性的服务端程序开始(请看例1),此程序等待客户端发送一对整数,把它们相加之后返回结果给客户端。   例1: using namespace System; using namespace System::IO; using namespace System::Net; using namespace System::Net::Sockets; int main(array<String^>^ argv) { if (argv->Length != 1) { Console::WriteLine("Usage: Server port"); Environment::Exit(1); } int port = 0; try { port = Int32::Parse(argv[0]); } catch (FormatException^ e) { Console::Wri...