的写保护功能。其所具有的特性如下:
? 与400KHz I2C总线兼容 ? 1.8 到 6.0 伏工作电压范围 ? 低功耗 CMOS 技术
? 写保护功能:当WP为高电平时进入写保护状态 ? 页写缓冲器 ? 自定时擦写周期 ? 1,000,000 编程/擦除周期 ? 可保存数据 100 年
? 8 脚 DIP、SOIC或TSSOP 封装
图2-10 为24C04的管脚配置,同时在表2-2给出了各管脚简易功能描述。
图2-10 24C04管脚配置
表2-2 24C04管脚描述
图2-11 EEPROM电路原理图
如图2-11所示为本设计的EEPROM电路原理图。
3 程序设计
本系统的单片机程序利用Keil uVision V4.02进行程序设计,以下介绍整个系统的程序流程,具体程序参见附录。 3.1 主程序流程
开始 变量定义 端口初始化 数码管初始化 当前状态判断 无操作? No 报警? No Yes Yes 显示、计时 输入? No Yes 显示、保存 查找? No Yes 显示、保存
图3-1 主程序流程图
如3-1所示图所示为单片机的主程序流程图。首先进行各个模块的初始化工作,如变量定义、单片机端口和EERPOM端口初始化、显示模块初始化等。然后进入程序的主流程,判断系统的当前状态,扫描键盘输入确定状态后,执行相应的处理。 3.2 键盘输入模块的程序设计
本设计采用由软件消抖的非编码方式独立键盘电路,所以在进行键盘输入模块的程序设计时,需考虑两个过程:1、键盘按键的识别;2、消抖。
首先在程序中定义各个键盘的输入信号管脚,如下所示。在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 #define state_input #define state_find #define state_reset #define state_jingbao
0
//无按键状态
1 //输号键按下 2 //查询键按下 3 //复位键按下 4 //报警键按下
在uchar state(void)子程序中本设计利用变量keycount的条件自加来实现消抖和长短按键的识别过程。每次进入子程序时keycount清零,然后进入循环,keycount自加,同时查询按键状态:当keycount自加到N1时,表示长按,则返回状态值,退出子程序;当无按键按下时,退出按键查询循环,并判断keycount是否小于于N2,即是否为抖动,当keycount
开始 Keycount=0 Keycount自加 No 按键? Yes Yes 保存按键值 No 抖动? No 返回按键值 长按? Yes 返回按键值 退出子程序
图3-2 主程序流程图
3.3 数码管显示模块的程序设计
由上章所述,本设计利用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~9、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];
对于LED指示灯,本设计中采用高电平点亮的方式,利用P0.7端口控制。由此在程序中定义sbit Led =P1^7,当LED=0时,输出低电平,LED灯灭,当LED=1时,输出高电平,LED灯亮。 3.4 EEPROM的驱动程序设计
本设计中利用EEPROM(24C04)来存储报警用的电话号码,24C04支持I2C总线数据传送协议,要在单片机系统中应用I2C总线的24C04做存储设备时,先要了解I2C总线的基本驱动方法,以下介绍24C04的I2C驱动程序的设计。 3.4.1 24C04的I2C总线构成及其协议
I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。I2C总线协议规定任何将数据传送到总线的器件作为发送器,任何从总线接收数据的器件为接收器,数据传送是由产生串行时钟和所有起始停止信号的主器件控制的。主器件和从器件都可以作为发送器或接收器,但由主器件控制传送数据发送或接收的模式。在本设计中AT89S52单片机作为主器件,24C04作为从器件。
通过器件地址输入端A0、A1的不同设置,可以实现将最多4个24C04器件连接到总线上。由上一章所述的电路设计,本设计中只用一个24C04,其地址为[A1、A0]为[0、0],写保护无效。242C04管脚描述如下:
SCL:串行时钟输入管脚,用于产生器件所有数据发送或接收的时钟。 SDA:双向串行数据/地址管脚,用于器件所有数据的发送或接收,SDA 是一个开漏输出管脚,可与其它开漏输出或集电极开路输出进行线或(wire-OR)。
A0、A1、A2:器件地址输入端,用于多个器件级联时设置器件地址,当这些脚悬空时默认值为0
WP:写保护管脚,如果 WP 管脚连接到 Vcc,所有的内容都被写保护,只能读;当 WP 管脚连接到 Vss 或悬空,允许器件进行正常的读/写操作。
I2C 总线协议定义如下:
1、总线空闲时,SDA、SCL为高电平,只有在总线空闲时才允许启动数据传送。
2、数据传输前,总线要求有一个START(开始位)位做为数据开始的标识,它的要求是SCL为高时,SDA有一个从高到低的电平跳变动作,完成这个动作后才可以进行数据传输,时序图参看图3-3中的“开始”。