基于单片机的防盗报警器的所有专业(编辑修改稿)内容摘要:

的交流,通常采用显示器作为其输出设备,用于显示输入键值中间信息及运算结果等。 本设计采用常用的发光二极管( LED=Light Emitting Diode)显示器,即 7 段数码管和 LED指示灯。 他们具有耗电省、线路简单、价格低廉、安装方便、耐振动等优点。 我们最常用的是七段式和八段式 LED数码管,八段比七段多了一个小数点,其他的基本相同。 所谓的八段就是指数码管里有八个小 LED 发光二极管,通过控制不同的 LED 的亮灭来显示出不同的字形。 数码管又分为共阴极和共阳极两种类型,其实共阴极就是将八个 LED 的阴极连在一起,让其接地,这样给任何一个 LED 的另一端高电平,它便能点亮。 而共阳极就是将八个 LED 的阳极连在一起。 其原理图如下。 图 27 数码管显示器外形结构及两种连接方式 在本设计中采 用共阴极连接方式,原理图如图 28 所示。 图 28 数码管显示器连接电路 在图 28 所示的 数码管显示器连接电路中, 考虑到单片机的输出电流有限,所以在 P0 端口与数码管之间接入一个上拉电阻到 +5V,确使在 P0 口输出高电平时,VCC 与 P0 口同时给数码管供电,这样可以减小 P0 口的输出电流保护端口。 上拉电阻是 用来限制电流的。 对照 图 27 所示的字段,字型码各位定义如表 21 所示。 可以看出,如果要显示“ 7”字形, a、 b、 c、三个字段应点亮,所以对应的字型码为 00000111B,依此类推可写出所要显示的各字形码存放 在程序存储器的固定区域中,构成显示代码表。 表 21 a b c d e f g 对于系统中的 指示灯,本设计采用如图 29 所示的电路。 图中 D2 为 LED 指示灯, R5 作为限流电阻。 P1 口可输出 5V电压, LED 导通时压降为 ,通常电流限制在 10mA 以下,所以 R5 的阻值不小于 330 欧姆(( ) V/10mA)。 在本设计中采用 500 欧姆。 图 29 LED指示电路 EEPROM EEPROM (Electrically Erasable Programmable ReadOnly Memory),电可擦可编程只读存储器 , 一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。 一般用在即插即用。 在本设计中使用 24C04。 24C04 是一个 4K 位串行 CMOS EEPROM, 内部含有 512 个 8 位字节。 其内部有一个 16 字节页写缓冲器 , 该器件通过 I2C 总线接口进行操作 ,同时 有一个专门 的写保护功能。 其所具有的特性如下:  与 400KHz I2C 总线兼容  到 伏工作电压范围  低功耗 CMOS 技术  写保护功能 : 当 WP 为高电平时进入写保护状态  页写缓冲器  自定时擦写周期  1,000,000 编程 /擦除周期  可保存数据 100 年  8 脚 DIP、 SOIC 或 TSSOP 封装 图 210 为 24C04 的管脚配置,同时在表 22 给出了各管脚简易功能描述。 图 210 24C04管脚配置 表 22 24C04管脚描述 图 211 EEPROM 电路原理图 如图 211 所示为本设计的 EEPROM 电路原理图。 3 程序设计 本系统的单片机程序利用 Keil uVision 进行程序设计,以下 介绍整个系统的程序流程,具体程序 参见 附录。 主程序 流程 图 31 主程序流程图 如 31所示 图所示为 单片机的主程序流程图。 首先进行各个模块的初始化工作,如变量定义、单片机端口和 EERPOM 端口初始化、显示模块初始化等。 然后进入程序的主流程,判断系统的当前状态 , 扫描 键盘输入 确定状态后,执行相应的处理。 键盘输入模块的程序设计 本设计采用由软件消抖的非编码方式独立键盘电路 ,所以在 进行 键盘输入模块的 程序设计时 ,需考虑两个过程: 键盘按键的识别; 消抖。 开始 变量定义 端口初始化 无操作。 No Yes 数码管初始化 当前状态判断 报警。 显示、计时 Yes 输入。 显示、保存 Yes 查找。 显示、保存 Yes No No No 首先在程序中定义各个键盘的输入信号管脚,如下所示。 在 key_input=0 时代表 输号 键被按下,其他按键同此。 sbit key_input =P1^0。 //输号 sbit key_find =P1^1。 //查号 sbit key_reset =P1^2。 //复位 sbit key_jingbao=P1^6。 //警报信号 然后在一个子程序中实现键盘的识别及消抖。 本系统中把键盘的输入状态作为整个系统的状态 ,所以定义一个 uchar state(void)子程序,其返回值为键盘的当前状态 ,其定义如下: define state_null 0 //无按键 状态 define state_input 1 //输号键按下 define state_find 2 //查询键按下 define state_reset 3 //复位键按下 define state_jingbao 4 //报警键 按下 在 uchar state(void)子程序 中本设计利用变量 keycount 的条件自加来实现消抖和长短按键的识别 过程。 每次进入子程序时 keycount 清零,然后进入 循环, keycount自加,同时查询 按键状态 : 当 keycount 自加到 N1 时,表示长按,则返回状态值,退出子程序 ;当无按键按下时, 退出 按键查询循环,并判断 keycount 是否 小于 于N2,即是否为抖动 , 当 keycountN2 时,为抖动 信号则 返回 0,当 keycount=N2时,为有效按键返回状态值。 整个 uchar state(void) 子 程 序 流程 如 图 32 所示。 图 32 主程序流程图 数码管显示模块的程序设计 由上章所述,本设计利用 table 数组保存字形码,作为 显示代码表 , 如下所示: uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f, //0123456789 0x3e, 0x73, 0x7c, 0x40 //“ U” 10,“ P” 11,“ b” 12,“ ” 13 }。 由 table 数组可知,总共可以显示 0~ U、 P、 b、 共 14 个字符。 同时在程序中编写 Display(uchar data_disp)函数, data_disp 为要显示的字符,程序如下: void Display(uchar data_disp) { if (data_disp=13) //不在表内 P0=table[13]。 //显示“ ” else //表内 P0=table[data_disp]。 //查表显示 } 开始 Keycount=0 按键。 Yes Keycount自加 返回按键 值 长按。 返回按键值 No 保存按键值 抖动。 No No 退出子程序 Yes Yes 对于 LED 指示灯,本设计中采用高电平点亮的方 式,利用 端口控制。 由此在程序中定义 sbit Led =P1^7,当 LED=0 时,输出低电平, LED 灯灭,当 LED=1时,输出高电平, LED 灯亮。 EEPROM 的驱动程序设计 本设计中利用 EEPROM( 24C04)来存储报警用的电话号码, 24C04 支持 I2C总线数据传送协议 , 要在单片机系统中应用 I2C 总线的 24C04 做存储设备时,先要了解 I2C 总线的基本驱动方法 , 以下介绍 24C04 的 I2C 驱动程序 的 设计。 24C04 的 I2C 总线构成 及其协议 I2C 总线是由数据线 SDA 和时钟 SCL 构成 的串行总线,可发送和接收数据。 I2C 总线协议规定任何将数据传送到总线的 器件作为发送器 , 任何从总线接收数据的器件为接收器 , 数据传送是由产生串行时钟和所有起始停止信 号的主器件控制的。 主器件和从器件都可以作为发送器或接收器 , 但由主器件控制传送数据发送或接 收 的模式。 在本设计中 AT89S52 单片机作为主器件, 24C04 作为从器件。 通过器件地址输入端 A0、 A1 的不同设置, 可以实现将最多 4 个 24C04 器件连接到总线上。 由上一章所述的电路设计,本设计 中 只用一个 24C04, 其地址为 [AA0]为 [0、 0],写保护无效。 242C04 管脚描述 如下: SCL: 串行时钟输入管脚 , 用于产生器件所有数据发送或接收的时钟。 SDA: 双向 串行数据 /地址 管脚 , 用于器件所有数据的发送或接收 , SDA 是一个开漏 输出管脚 , 可与其它开漏输出或集电极开路输出进行线或 ( wireOR)。 A0、 A A2: 器件地址输入端 , 用于多个器件级联时设置器件地址 , 当这些脚悬空时默认值为 0 WP: 写保护 管脚 , 如果 WP 管脚连接到 Vcc, 所有的内容都被写保护 , 只能读 ; 当 WP 管脚连接到 Vss 或悬空 , 允许 器件进行正常的读 /写操作。 I2C 总线协议 定义如下 : 总线空闲 时, SDA、 SCL 为高电平,只有 在总线空闲时才允许启动数据传送。 数据传输 前 , 总线要求有一个 START(开始位)位做为数据开始的标识,它的要求是 SCL 为高时, SDA 有一个从高到低的电平跳变动作,完成这个动作后才可以进行数据传输,时序图参看图 33 中的“ 开始 ”。 数据 传输时, 总线要有一个稳定的数据状态,来保证数据为有效数据,它的要求是 在 SCL 为高电平时, SDA 必须保持 电平 稳定 , 不允许有跳变。 编写单片机向总线送数据程序时则可以在 SCL 还在低电平时,把数据电平送到 SDA,然后拉高 SCL,这 时 SDA 不应有电平跳变,延时后拉低 SCL,再进行下一位的数据传送直到完成。 在总线上读数据时也是只有在 SCL 为高时, SDA 为有效数据。 时序参看图 33 的“保持”。 数据 传输 后,总线要有一个 STOP(结束位)位,来通知总线本次传输已结束,它的要求是 SCL 为高时, SDA 有一个从低到高的电平跳变动作,正好和START 位相反。 时序参看图 33 的“ 停止 ”。 图 33 I2C 基本信号 I2C 总线在每接收完一个字节( 8 个二进制位)后,在第九个时钟信号时,会在 SDA 上回应一个低电平的 ACK 应答信号,以此表明当前 受控的器件已接收完一个字节,可以开始下一个字节的传送了。 若未收到应答信号,由判断为受控单元出现故障。 时序图可以参看图 34。 图 34 I2C 的 ACK 信号 I2C 总线在操作受控器件时,需要先发送受控器件的器件地址, 24C04 也不例外,在每次命令前需要先发送一个字节的器件地址和读写标识,也可称为器件录 址。 图 35 是 24C04 的器件寻址命令中每个位所代表的意思。 A A0 位是器件地址,它是对应于芯片的 A A0 引脚。 这样不难看出在同一总线可以挂 4 个 24C04。 器件地址字节中的 R/W位是用于标识当前操作 是读器件还是写器件,写器件时 R/W位设置 0,读器件时 R/W 位设置 1。 图 35 24C04的器件寻址命令 24C04 的 I2C 总线基本操作 24C04 的 I2C 总线基本操作包括写入单个字节、页写入、读当前地址数据、读任意地址数据、连续读取数据等。 在本设计中使用到了 写入单个字节 、 读当前地址数据、 读任意地址数据、 连续读取数据等操作,以下 对这 几个操作进行介绍。 单 字节 写入 写入字节指令每次只能向芯片中的一个地址写入一个字节的数据。 首先发送开始位来通知芯片开始进行指令传输,然后传送设置好的器件地 址字节, R/W 位应置0,接着是分开传送十六位地址的高低字节,再传送要写入的数据,最后发送停止位表示本次指令结束。 图 36 是写入单个字节的时序图。 图 36 24C04的 单字节写入 时序 读当前地址 数据 这种读取模式是读取当前芯片内部的地址指针指向的数据。 每次读写操作后,芯片会把最后一次操作过的地址作为当前的地址。 在这里要注意的是在微处理器接收完芯片传送的数据后不必发送给低电平的 ACK 给芯片,直接拉高 SDA 等待一个时钟后发送停止位。 图 37 是读当前地址时序图。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。