怎么把头未能向文件写入命令行中的参数以相应的命令写入射频芯片

当前位置: >>
电话网络和无线射频
湖南科技大学本科生毕业设计(论文)目第一章录前言 ...................................................................................... 错误!未定义书签。1.1 设计任务及特点 ......................................................................................................... 1 1.2 功能概述 ..................................................................................................................... 2 1.3 控制流程图 ................................................................................................................. 4第二章设计方案选择论证与设计.............................................................................. 52.1 系统设计目标 ............................................................................................................. 5 2.2 各模块电路方案选择与设计 ..................................................................................... 5 2.2.1 主控系统电路方案及设计 .............................................................................. 5 2.2.2 双音多频解码电路设计 .................................................................................. 8 2.2.3 振铃检测计数电路设计 ................................................................................ 10 2.2.4 自动摘挂机电路设计 .................................................................................... 11 2.2.5 时钟电路设计 ................................................................................................ 12 2.2.6 模拟外设控制电路设计 ................................................................................ 13 2.2.7 液晶显示系统设计 ........................................................................................ 14 2.2.8 温度采集电路设计 ........................................................................................ 16 2.2.9 密码存储电路设计 ........................................................................................ 18 2.2.10 无线电路设计 ............................................................................................... 20 2.2.11 操作提示音电路设计 ................................................................................... 20 2.2.12 音频放大电路设计 ....................................................................................... 21 2.3 系统电路工作总体介绍 ........................................................................................... 22第三章系统软件设计 ................................................................................................... 243.1 软件设计总括 .......................................................................................................... 24 3.2 系统程序设计部分 .................................................................................................. 24 3.2.1 语音录放程序设计模块 ................................................................................ 24 3.2.2 液晶显示程序设计模块 ................................................................................ 25 3.2.3 实时时钟程序设计模块 ................................................................................ 26 3.2.5 存储器读写程序设计模块 ............................................................................ 28 3.2.6 电话数字解码程序设计模块 ........................................................................ 29 3.2.7 振铃和摘机程序设计模块 ............................................................................ 29 3.2.8 密码校验程序设计模块 ................................................................................ 30 3.2.9 设备状态控制程序设计模块 ........................................................................ 30ii - 湖南科技大学本科生毕业设计(论文)3.2.10 无线射频程序模块 ....................................................................................... 31 3.2.11 主程序设计 ................................................................................................... 32第四章 结论 ........................................................................................................................ 34 参考文献 ............................................................................................................................... 35 致谢 ....................................................................................................................... 35 附录 A 总的原理图.............................................................................................. 35 附录 B 部分源程序.............................................................................................. 35iii - 湖南科技大学本科生毕业设计(论文)第一章 前言在这信息时代中,电话网络和无线射频的发展非常迅速。这两个系统的综合设计可 充分利用相互之间的资源,现实方便而快捷的通信。 工业、生活中有很多设备需要实现智能控制,利用现有的资源可以大大减少投资。 我们的设计思想就是利用现有的电话网络和无线通信系统来实现家用电器或工业设备 的远程和近程的控制,用最少的投资来实现智能控制。 电话遥控作为一种新型的遥控与常规的遥控方式相比具有一定的优越性。 如只需利 用现有的电话线路,无需另外布置线路,初期工作量小且投资较少,且基于电话网络传 输控制信号无需占用无线电资源,没有电磁污染。本遥控系统的另一个突出特点就是有 电话线路的地方就可以实现控制,目前电话线路已经实现各地互联,所以可以实现跨省 甚至跨国遥控。 同样,在一定范围内,可以通过无线射频同样可以方便的控制周边的设备,让很多 电器的状态都显现在一个上位机上面, 通过一台电脑或微控制器来控制整个小区或工厂 的所有设备实现了家电或工业设备的一体化控制。 1.1设计任务及特点本电话控制装置的设计任务如下: 1) 通过现有的电话网络,遥控者通过电话或手机拨打指定电话实现远程智能控 制; 2) 能够实现振铃信号的检测和计数,能够自动摘机和挂机; 3) 可根据语音提示进行操作; 4) 具有密码验证功能,能够在线(通过电话)修改密码; 5) 能够在液晶显示屏上显示当前时间及实时温度及接通电话后的各状态情况; 6) 控制电器数至少3路以上 7) 并且用户在家使用时可以通过电脑上的上位机或者在主单片机上直接控制, 无需拨打电话。 为了更好的阐述本系统具有的功能,系统硬件结构框图如图 1.1。1 - 湖南科技大学本科生毕业设计(论文)图 1.1 系统硬件结构框图1.2功能概述(1). 主要功能: 本系统在已有电话网基础上, 通过电话拨号或直接操作来实现远程或近程的相关智能控制。具体功能如下: 1)可实现基本的电话机功能,自动摘机和挂机。 2)根据语音提示进行接入密码确认,可修改接入密码和查询、控制相关电器的运行 状态。 3)主单片机上的液晶显示器,能显示当前的温度、时间、湿度、各个设备的运作状 态。 4)可通过上位机控制的无线通信的分系统来近程控制相关的设备,查询当前的实时 温度、湿度、设定范围内有无人的情况,并将这些信息显示在上位机上和主单片机的液 晶显示器上。 (2). 具体功能实现: 1)主单片机的主程序: 主单片机将实时检测当前的湿度、温度、各个设备的运作状态,调整当前时间, 检测室内是否有人,并将这些信息显示在液晶屏上,同时还向上位机发送这些数 据信息,如果没电话接进来,那么每 2 秒钟通过无线发送一次数据,来更新上位 机的数据。 2)没有电话接入时:2 - 湖南科技大学本科生毕业设计(论文)使用无线 NRF24L01 跟上位机通信,上位机显示温度,湿度,有人无人,设备 1, 设备 2,设备 3 的状态,上位机通过串口跟单片机通信,发送数据,然后单片机 通过 NRF24L01,发送数据到主控制芯片,然后提取控制设备 1,2,3 的数据,对 相应的设备进行操作,主控制芯片这边用 12864 显示温度和时间。 3)有电话接入时: 首先,进行振铃检测,当响铃 5 次还没人接听时,自动摘机。接着关闭定时 器 1 的中断和检测电话振铃的中断,因为定时器 1 是用来显示时间温度的,然后 进入电话控制状态,首先输入密码,如果输入不正确,会有相应语音提示信息, 有两次重输入密码的机会,两次都不对,将自动挂机。本系统对输入密码所用时 间有一定的限制,输入密码等待超出时间,系统也将自动挂机,如果你输入的密 码正确,那么进入下一个模式,语音提示你将有两个选择(在现有实验中只设置 了两个)(1)查询或者修改设备状态(2)修改密码。 : 在所有输入的过程中,都有一个超时检测,如果等待时间过长会从你当前的 状态跳出来,接着执行下一个程序,直到挂机。 (1)修改密码状态: (进入此状态,每步都将有智能的语音提示)将你要修改的密码,分两次输 入(第二次是对密码的确认) ,输入格式是六位数字密码加#确认键,如果两次密 码输入一致包括#,责修改成功,修改的密码会保存在外部存储器 24c02 中,然 后通过设定的按键,可以跳回上一个状态,就是选择修改密码还是查看设备状态 的菜单中 (2)查看和修改设备状态 查看设备目前的状态,也可以进行修改,具体通过相应的设备序号对应电 话按键来切换状态,最后按确认键退出到上一个菜单。 4)如果都已经设置好了,则可以直接挂机! 注意:在电话远程控制中的每一步设置,都将有语音提示。3 - 湖南科技大学本科生毕业设计(论文)1.3控制流程图图 1.2 系统流程图4 - 湖南科技大学本科生毕业设计(论文)第二章2.1 系统设计目标设计方案选择论证与设计此系统的设计是通过利用现有的通信资源, 以实现对工业设备和生活电器的一个智 能控制, 可以根据要实现智能控制的要求及地点, 来对这个系统的模块进行适当的选择, 以减少成本。只要是在有电话通信的地方,都可以使用这个系统来实现要达到的功能, 同时可以减少人力资源,保密性好,适合无人的地点,外部的存贮器同时还可以用来存 放要保存的数据,同时可以在远程查看相应地点的状况,带来了极大的方便。为实现系 统的目标,使用了三个硬件模块(可根据需求增减) :主控制相关电路,从控制相关电 路 1,从控制相关电路 2。具体各个模块的功能目标如下: (1) 主控制相关电路: 1) 主控系统电路 2) 双音多频解码电路 3) 振铃检测计数电路 4) 自动摘挂机电路 5) 时钟电路 6) 电器控制电路 7) 液晶显示电路 8) 温度采集电路 9) 密码存储电路 10) 无线控制电路 (2) 从控制相关电路 1: 1) 从控系统电路 1 2) 语音提示电路 3) 音频放大电路 (3) 从控制相关电路 2: 1) 从控系统电路 2 2) 无线控制电路2.2 各模块电路方案选择与设计2.2.1 主控系统电路方案及设计 (1) 方案选择 方案一:采用数字芯片搭接控制电路,此法将使得本系统的控制电路非常庞大且复 杂,并且也较难实现本设计系统的要求。5 - 湖南科技大学本科生毕业设计(论文)方案二:采用单片机控制,通过硬件电路及编程可实现本系统的控制电路,并且采 用此方案可以使得电路更加简洁,稳定性更高。所以选用了此方案。 这一部分是整个系统的信息处理部分,相当于人的大脑。所以这部分的设计是相当 重要的。本系统的主控 CPU 经过比较选择了 STC 公司的 51 内核单片机,型号为 STC89C58 和 STC89C52,这两款型号的区别只是在存储容量有差别,主控制芯片的程 序较为庞大,而后者只有 8K 的容量,所以我们主控制芯片选择了 STC89C58,从控制 所需的容量小,所以芯片选择的是后者,更节省成本。 STC公司的单片机具有如下特点:它是一款性价比非常高的单片机,它完全兼容 ATMEL公司的51单片机,除此之外它自身还有很多特点,如:无法解密、低功耗、高速、 高可靠、强抗静电、强抗干扰等。 其次STC公司的单片机内部资源比起ATMEL公司的单 片机来要丰富的多,它内部有1280字节的SRAM、8-64K字节的内部程序存储器、2-8K字 节的ISP引导码、除P0-P3口外还多P4口(PLCC封装)、片内自带8路8位AD(AD系列),片内 自带EEPROM、片机自带看门狗、双数据指针等,该单片机价格非常低,如果大批量生产 的话可以大大较少成本。 (2) 单片机主控制系统需要包括以下电路模块: 1) 电源模块的设计 由于单片机工作电压在 5V 左右,电压过高会引起单片机工作不正常,甚至烧坏单 片机,电压过低也会引起单片机工作失常。所以为了保证单片机正常工作需要为其设计 较稳定的 5V 电源。图 2.1 5 伏稳压电源J2 是交流电源引入插座,首先变压器输出线连接到此插座,为电源模块提供 5V 以 上 12V 以下的交流电压,通过 D2 整流桥的整流作用后,变为脉动的直流电,经过 C2、 C3 的滤波后输入到稳压芯片 LM7805 中,从 LM7805 的第三脚输出的电压即为 5V 直流 电压,再通过 C4、C5 的再次滤波后,便能输出较稳定的直流电压。其中 C3、C5 为瓷片 电容,其可以滤除电源的高频尖脉冲信号干扰; C2、C4 为电解电容,起到平波的作用。 参数选择: 1)整流二极管选用 1N4007;6 - 湖南科技大学本科生毕业设计(论文)2) C2、 4 为电解电容分别选用 470μF16V 和 100μF16V, C3、 5 均选用 104 瓷片电容; C C 3)稳压芯片选用 LM7805,正 5V 稳压输出芯片。 2) 单片机复位电路的设计 复位电路图如 2.2。本复位电路采用的是电平复位方式,接通电源后,电容相当于 是短路的,单片机的复位引脚 RST 为高电平,通过 R5 对 C16 进行充电,RST 端电压渐 渐降低直到为零,单片机开始工作。电阻、电容的参数选择跟所采用的晶振有关, ,必 须保证复位信号高电平持续时间大于两个机器周期。本系统采用 11.0592MHz 的晶振, 一个机器周期的时间为约为 1μ s。 所以复位的高电平持续时间必须大于 2μ s, 一般晶振 电路起振时间为 10ms,所以根据经验值选择电阻 R37 为 10K,C20 为 10μ F,经验证可以 满足本电路需求。按键 KEY 可在单片机“死机”时进行手动复位。如果直接将按键并联 在电容两端,按下按键后电容直接通过按键的触点放电,将会在瞬时产生较大的冲击电 流,容易使按键的触点氧化。为了保护按键,通过一个电阻 R4 串联于按键和电容之间, 这样当按下按键时,电容将通过 R4 放电,使得电流较小,不易使触点氧化,而且不影响 复位功能。图 2.2单片机复位电路3) 单片机晶振电路的设计 单片机的内部时钟的晶振频率一般选择在 4MHz~12MHz 之间, 外接两个谐振电容。 该电容的作用是对晶振的振荡频率起到了微调作用。 本系统选择了 11.0592MHz 的晶振,谐振电容选择典型值 30pF 的瓷片电容。电路 如图 2.3。7 - 湖南科技大学本科生毕业设计(论文)图 2.3单片机晶振电路2.2.2双音多频解码电路设计 DTMF(Dual Tone Multi Frequency)双音多频信号解码电路是目前在按键电话(固定电话、移动电话)、程控交换机及无线通信设备中广泛应用的集成电路。它包括 DTMF 发送器与 DTMF 接收器,前者主要应用于按键电话作双音频信号发送器,发送一组双音多 频信号,从而实现音频拨号。 双音多频信号是一组由高频信号与低频信号叠加而成的组合 信号,CCITT 和我国国家标准都规定了电话键盘按键与双音多频信号的对应关系如表 1 所示。 表1数字键盘
低频组/Hz 852 941 7 * 8 0 9 # C D 1 4
1633 A B电话拨号数字对应的高低频率组合关系高频组/Hz方案一:电话远程控制系统采用 MITEL 公司生产的 MT8870 DTMF 接收器作为 DTMF 信号的解码核心器件。MT8870 主要用于程控交换机、遥控、无线通信及通播系 统,实现 DTMF 信号的分离滤波和译码功能,输出相应 16 种频率组合的四位并行二进制 码。MT8870 具有拨号音抑制和模拟信号输入可调功能。 方案二:直接使用单片机解码,通过程序的设计也可以实现将电话线上的 DTMF 信号解码,这样程序比较复杂,而且不是非常稳定。 为了简化程序的编写,并提高系统的稳定性,选择了方案一。电路连接图如图 2-4。8 - 湖南科技大学本科生毕业设计(论文)图 2.4MT8870 双音多频解码电路系统采用常用的双音多频解码芯片 MT8870,该芯片外围电路简单、功耗小、抗干 扰能力强。由电话线送进来的双音多频(DTMF)信号经电容隔直后送到 MT8870,由 MT8870 内部放大后送入两级滤波器,第一级为拨号音滤波器,滤除 350Hz 和 440Hz 的 信号,防止拨号音干扰电路正确解码,然后将信号送人高频音和低频音信号滤波器,取 出高频音和低频音,送入数字计数电路解调出高频音和低频音的频率,当检测到正确的 高频音和低频音信号后,解调出对应按键并将解调值锁存,置 STD 信号为高,输入到 单片机中外部中断 0,由于单片机的外部中断是低电平或者下跳沿有效,我们设计了一 个三极管将 STD 的电平反向后再送单片机,通过 Q1~Q4 引脚读入指令代码,在 Q1~ Q4 引脚我们连接了四个指示灯,这样方便看出按键之后译出的 BCD 码,容易调试。收 到代表拨号值的 BCD 码后送往单片机对信号进行处理。MT8870 的输入与解码如表 2。 表2低频(Hz) 高频(Hz) 697 697 697 770 770 770 852 852 852 941 941 941 77 47 47 47 数码 1 2 3 4 5 6 7 8 9 0 * #DTMF 输入与解码输出表TOE H H H H H H H H H H H H Q3 L L L L L L L H H H H H Q2 L L L H H H H L L L L H Q1 L H H L L H H L L H H L Q0 H L H L H L H L H L H L9 - 湖南科技大学本科生毕业设计(论文) 697 770 852 941 ― 注:Z 表示高阻状态 33 1633 ― A B C D ANY H H H H L H H H L Z H H H L Z L H H L Z H L H L Z电路参数选择如下: 1) R3,R4, R9, R10,取 56KΩ ; R5 取 47K;R7 取 68K;R6 取 150K;C1 和 C6 取 0.1μ F 瓷片电容; 2)芯片外部晶振选择 3.58MHz; 3) U1 是双音频解码芯片,选取 MT8870; 4) D3,D6 ,D7 , D8 和 D9 选取贴片发光二极管;R12 ,R13 , R14 和 R16 选取 1K 电阻 5) R1 选取 330K,R2 选取 100K ; D1 选取 1N4148 二极管 6) Q1 选 8050,R84 取 1K 2.2.3 振铃检测计数电路设计 振铃检测计数关键在于检测,振铃可以检测到计数也就容易实现了。我们的设计如 下: 振铃原理是在电话线路来铃流前, 电话线路由电话交换机提供大约 48V 的直流电压。 当用户被呼叫时,电话交换机发来铃流信号。振铃信号为 25± 3Hz 的正弦波,谐铃失真 不大于 10%,电压有效值 90± 15V。振铃以 5 秒为周期,即 1 秒送,4 秒断。所以我设 计电路如图 2.5。图 2.5电话振铃信号检测电路无振铃信号时,电话线上的直流电压被 C13、C15 电容隔离,当有振铃信号到来时,10 - 湖南科技大学本科生毕业设计(论文)由于是交流信号所以可以通过 C13、C15,再经过 D13、D14、D16、D17 整流,变为脉动直 流,通过 R22 给 C14 充电。R22 和 C14 共同组成振铃信号音滤波电路,根据电话振铃的技 术指标:频率 25Hz 的正弦波,1 秒通,4 秒断,τ =RC 且 τ ≤1S,即电容必须在有振铃 信号的一秒钟内充电完成。为了使振铃信号音输出很好的方波波形,计算后选取 R22=10kΩ ,C14=4.7μ F,τ =47ms;然后通过 33V 稳压管 D12 稳压,再通过 5V 稳压管 D15 的再次稳压将信号送往光耦, 15 和 R23 共同组成光耦的保护电路, D 可以限压和限流。 通过光耦可以将电话线上的电源与单片机电源隔离, 避免了来振铃信号时电话线上的干 扰信号对单片机直流电源造成干扰,从而影响单片机工作。光耦的输出再接两个连接成 达林顿管形式的三极管放大信号,在 PHONE RING 端输出低电平到单片机 I/O 口检测。 采用这种接法可以提高电路检测的灵敏度,这样当 Q4 的基极有较小的电流信号时也可 以使得电路工作,当接收到振铃信号之后,发光二极管 D18 会亮下,表示接收到振铃信 号,这样比较直观,也给测试带来极大方便。当检测到振铃信号后,采用软件计数的方 法记录中断次数即为振铃次数,通过判断这个次数来进行相应的操作。 本部分电路元件参数选择如下: 1) C13、C15 为电话线路隔直电容,由于振铃信号的电压比较高,所以应采用耐压在 100V 以上的型号,这里选用 6.8μ F-400V 的 CBB 电容; 2) D13、D14、D16、D17 为整流二极管,采用 1N4007。D12 、D15 稳压管采用 1W33V、 5V 稳压二极管; 3)电阻 R22、R20、R26 选用 10k, R21 , R23 选用 100Ω ,R17 选用 1K; 4)三极管选用 NPN 型 8050 及 PNP 型 8550,光耦选用 4N25。 2.2.4 自动摘挂机电路设计 根据国家有关标准规定:不论任何电话机,摘机状态的直流电阻应≤300Ω,有“R” 键的电子电话机的摘机状态直流电阻应≤350Ω。在挂机状态下,其漏电流≤5μA。 当用户摘机时,电话机通过叉簧接上约 300Ω 的负载,使整个电话线回路流过约 30mA 的电流。交换机检测到该电流后便停止铃流发送,并将线路电压变为十几伏的直 流,完成接续。所以根据此原理我们可以通过在电话线路接入假负载的形式来完成模拟 摘机,接入大约 300Ω 的电阻从而完成模拟摘机。电路原理如图 2.6。11 - 湖南科技大学本科生毕业设计(论文)图 2.6电话自动摘挂机电路此部分电路和振铃检测电路前面的桥路、滤波及稳压部分相似,但少了前面的隔直 电容。此电路将电话线上的直流电经过整流、滤波、稳压后为光耦供电,从而控制达林 顿管接通与断开 300Ω 的假负载。采用光耦将电话线与单片机电源隔离,有效抑制了电 话线上的干扰信号对单片机的影响。PHONE ON/OFF 接到单片机的自动摘挂机控制脚,当 此控制脚输出低电平时,光耦工作,将控制信号传递给两个连接成达林顿管形式的三极 管,在电话线两端接入了 300Ω 的假负载,实现模拟摘机。 元件参数选择: 1)此部分电路与振铃检测电路共用前面的桥路部分,R28 选用 1W300Ω 的电阻作 为假负载,其余电阻参数如图所示; 2)三极管选用 NPN 型 8050,PNP 型 8550; 3)光耦选用 4N25,C16 选取为 4.7uF 的电解电容。 2.2.5 时钟电路设计 方案一:采用单片机定时器产生时钟。 方案二:采用专门的时钟芯片 PCF8563,此芯片是 I2C 总线通信,可以利用一个纽 扣电池为其供电,使得单片机掉电的情况下时钟仍然在运行,无需每次单片机复位后调 整时间。 方案一这种方法的缺点有两点一个是不准确,一个是程序比较复杂,而方案是靠硬 件来自动生成,我们只是读取里面的数值即可,简单方便,更重要的是准确和稳定,所 以我们选择了方案二。 PCF8563 是 PHIL IPS 公司推出的一款工业级内含 I2C 总线接口功能的具有极低功 耗的多功能时钟/ 日历芯片, PCF8563 的多种报警功能、定时器功能、时钟输出功能、 以及中断输出功能能完成各种复杂的定时服务, 甚至可为单片机提供看门狗功能, 内 部时钟电路、内部振荡电路、内部低电压检测电路(110V) 以及两线制 I2 C 总线通讯方 式, 不但使外围电路简洁, 而且也增加了芯片的可靠性, 同时每次读写数据后内嵌的12 - 湖南科技大学本科生毕业设计(论文)字地址寄存器会自动产生增量, 时钟芯片 PCF8563 亦解决了 2000 年问题。 主要的性能指标: 1)宽电压范围 1.0-5.5V, 复位电压标准值 Vlow=0.9V ; 2)超低功耗,典型值为 0.25uA VDD=3.0V,Tamb=25℃ ; 3)可编程时钟输出频率为: 32.768KHz ,1024Hz, 32Hz ,1H 4)四种报警功能和定时器功能; 5)内含复位电路,振荡器电容和掉电检测电路 ; 6)开漏中断输出 ; 7)400kHz I2C 总线(VDD=1.8-5.5V),其从地址:读,0A3H;写,0A2H; 电路原理图如图2.7。图 2.7 参数选择:时钟电路图1)时钟芯片选用 PCF8563,DIP8 封装。 2)外部晶振选用 32.768K。 3)J4 是备用电池的接口,也可以用大容量电容替代电池,为芯片在掉电时供电。 2.2.6 模拟外设控制电路设计电器控制在本系统中采用的是继电器控制电路, 即单片机通过控制继电器的开闭进 而控制家用电器,由于单片机的驱动电流比较小,所以我选择使用 ULN2003 来驱动继电 器。 ULN2003 的功能特点:ULN2003 是高耐压、大电流达林顿陈列,由七个硅 NPN 达林 顿管组成。 它的每一对达林顿都串联一个 2.7K 的基极电阻,在 5V 的工作电压下它能与 TTL 和 CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。13 - 湖南科技大学本科生毕业设计(论文)ULN2003 工作电压高,工作电流大,灌电流可达 500mA,并且能够在关态时承受 50V 的 电压,输出还可以在高负载电流并行运行。 ULN2003 它的输出端允许通过电流为 200mA,饱和压降 VCE 约 1V 左右,耐压约为 36V。用户输出口的外接负载可根据以上参数估算。采用集电极开路输出,输出电流大, 故可 直接驱动继电器或固体继电器,也可直接驱动低压灯泡。电路如图 2.8。图 2.8继电器控制电路 30V DC,线圈工作电压参数选择:继电器根据控制电流选择型号,这里选用 3A5V,双路开关。继电器驱动采用 ULN2003。D21 ,D25 , D26 为 1N4148 保护二极管。 2.2.7 液晶显示系统设计 方案一:采用 LED 数码管显示。 方案二: 采用液晶显示模块, 能显示图形及汉字信息, 使得工作状态显示更加直观, 内容更加丰富。 方案一此法显示控制电路简单成本低,但电路设计相对复杂,显示内容非常有限, 比较特殊的字符,图形等不能显示出来,给设计带来了极大的局限性,根据本系统的特 点,需要显示的信息较多,而且本系统需要显示汉字,所以采用了方案二显示方法,另 外根据显示方式和内容的不同,液晶模块可以分为数显液晶模块,液晶点阵字符模块, 和点阵图形液晶模块3种,经过比较,本系统选择了点阵图形液晶显示模块,该液晶屏14 - 湖南科技大学本科生毕业设计(论文)具有更高的性价比,型号为 QC12864B。 液晶显示器特点: 带中文字库的 128X64 是一种具有 4 位/8 位并行、2 线或 3 线串 行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其 显示分辨率为 128×64, 内置 8192 个 16*16 点汉字,和 128 个 16*8 点 ASCII 字符集. 利用该模块灵活的接口方式和简单、 方便的操作指令, 可构成全中文人机交互图形界面。 可以显示 8×4 行 16×16 点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著 特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件 电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模 块。 基本特性: 1) 低电源电压(VDD:+3.0--+5.5V) 2) 显示分辨率:128×64 点 3) 内置汉字字库,提供 8192 个 16×16 点阵汉字(简繁体可选) 4) 内置 128 个 16×8 点阵字符 5) 2MHZ 时钟频率 6) 显示方式:STN、半透、正显 7) 驱动方式:1/32DUTY,1/5BIAS 8) 视角方向:6 点 9) 背光方式:侧部高亮白色 LED,功耗仅为普通 LED 的 1/5―1/10 10)通讯方式:串行、并口可选 11)内置 DC-DC 转换电路,无需外加负压 12)无需片选信号,简化软件设计 13)工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 为了使本系统更加具有市场,采用了液晶屏显示工作状态,为了节省单片机端口, 采用串行方式通信,此液晶可以显示的点阵数为 128×64 个点,一屏可显示的汉字数为 每行 8 个汉字,共可以显示 4 行,一屏总共可显示 32 个汉字。本显示系统可以显示当 前的时间及当前室温,并可以显示家用电器的工作状态,使得用户对电器的开关状态一 目了然,另外还有一些操作提示。电路原理图如图 2.9。15 - 湖南科技大学本科生毕业设计(论文)图 2.9液晶显示电路该显示系统还利用一个三极管来控制液晶屏的背光, 即可以通过软件来开关背光显 示, 为系统节电并延长液晶屏的使用寿命, 避免了因长期点亮背光造成液晶屏老化加快, 同时节省电量。 电路参数选择: 1)液晶屏选用 QC12864B; 2)VR1 为液晶屏对比度调节电位器,选用 10K3296 封装的精密可调电位器; 3)三极管为液晶屏背光控制,选用 PNP 型的 8050; 2.2.8 温度采集电路设计 方案一:采用热敏电阻及电容组成的 RC 电路,并由单片机控制,但精度较低。 方案二:采用专门的温度传感器 DALLAS 公司的 DS18B20,此芯片为 TO92 封装,体 积小,而且是单总线通信,只需一个 I/O 口即能实现控制,在一定程度上可以节约 I/O 口资源。 DALLAS 公司的数字化温度传感器 DS18B20 支持单总线接口, 具有单总线独特而经济的 特点,使用户可以轻松的组建传感器网络,为测量系统的创建引入全新概念。DS18B20 体积小,使用灵活,可以充分发挥单总线的优势。其测温范围为-55~+125℃,在- 10~16 - 湖南科技大学本科生毕业设计(论文)+85 范围内,精度为±0.5℃。支持 3V~3.5V 的宽电压,使系统设计更灵活,更方便。 DS18B20 可通过程序设置 9~12 位的分辨率。 采用 TO92 封装, 体积只有普通三极管那么 大,并可以支持用户设定报警温度,设置值保存于芯片自带的 EEPROM 中,掉电后依然 保存。并且外围元件只需要一个 4.7k 上拉电阻。 下面简单介绍下单总线。单总线即只有一根数据线,系统中的数据交换控制都通过 这根线完成。主机或从机通过一个漏极开路或三态端口连至该数据线,以允许设备在不 发送数据时能够释放总线, 而让其他设备使用总线。 单总线通常要求外接一个约为 4.7K 的上拉电阻,当总线闲置时,其状态为高电平。主机和从机的通信可以分为三个步骤完 成,分别为初始化 1Wire 器件、识别 1Wire 器件和交换数据。由于他们是主从结构, 只有主机呼叫从机时,从机才能应答,因此主机访问 1Wire 器件都必须严格遵循单总线 命令序列,即初始化、ROM、命令功能命令。如果出现序列混乱,1Wire 器件将不响应主 机。 所有的单总线器件都要遵循严格的通信协议,以保证数据的完整性。1Wire 协议定 义了复位脉冲、应答脉冲、写 0、读 0 和读 1 时序等几种信号类型。所有的单总线命令 系列都是由这些基本的信号类型组成的。在这些信号中,除了应答脉冲外,其他均由主 机发出同步信号,并且发送的所有命令和数据都是字节的低位在前。 温度寄存器中的温度值以 9 位数据格式表示,最高位为符号位,其余 8 位以二进制 补码形式表示温度值。测温结束时,这 9 位数据转换到暂存存储器的前两个字节中,符 号位占用第一字节,8 位温度数据占用第二字节。 本系统采用 DALLAS 公司的单总线温度传感器 DS18B20, 此传感器只需占用单片机一 个 I/O 口, 可以在一定程度上解决单片机 I/O 口紧张的情况。 此芯片的测温范围为-55~ +125℃ ,可以满足一般的室温测量要求,其测量精度通过软件设置最大可达 到 0.0625℃,在本系统中设置其测温精度为 0.1℃。此芯片的连接电路非常简单,外部电 路只需要一个上拉电阻即可,电路原理图如图 2.10。17 - 湖南科技大学本科生毕业设计(论文)图 2.10 电路参数选择:单总线温度传感器原理图1)度传感器为 DS18B20,TO92 小型封装。 2)R33 为上拉电阻,选 10K。 2.2.9 密码存储电路设计 方案一:直接存在单片机内,无需另外购买元件,节约系统成本。但掉电后密码将 初始化。 方案二:采用 AT24C02 存储器,此芯片为 I2C 总线,控制简单占用 I/O 口少,存储 内容多等特点。 因为 I2C 总线的芯片硬件电路简单,程序易写,并且存储信息量大,存储的信息可 掉电保存,为了防止密码丢失,我们选择方案二。 AT24C02 是美国 ATMEL 公司的串行 EEPROM,它是内含 256×8 位存储空间,具有工 作电压宽(2.5~5.5V) 、擦写次数多(大于 10000 次) 、写入速度快(小于 10ms)等特 点。AT24C02 的 1、2、3 脚是三条地址线,用于确定芯片的硬件地址。在 AT89C51 试验 开发板上它们都接地,第 8 脚和第 4 脚分别为正、负电源。第 5 脚 SDA 为串行数据输入 /输出, 数据通过这条双向 I2C 总线串行传送, AT89C51 试验开发板上和单片机的 P3.5 在 连接。第 6 脚 SCL 为串行时钟输入线,在 AT89C51 试验开发板上和单片机的 P3.6 连接。 SDA 和 SCL 都需要和正电源间各接一个 5.1K 的电阻上拉。第 7 脚需要接地。 24C02 中带有片内地址寄存器。每写入或读出一个数据字节后,该地址寄存器自动 加 1,以实现对下一个存储单元的读写。所有字节均以单一操作方式读取。为降低总的 写入18 - 湖南科技大学本科生毕业设计(论文)时间,一次操作可写入多达 8 个字节的数据。 I2C 总线的数据传送格式是: I2C 总线开始传送信号后, 在 送出的第一个字节数据是 用来选择从器件地址的,其中前 7 位为地址码,第 8 位为方向位(R/W)。方向位为“0” 表示发送,即主器件把信息写到所选择的从器件;方向位为“1”表示主器件将从从器 件读信息。开始信号后,系统中的各个器件将自己的地址和主器件送到总线上的地址进 行比较,如果与主器件发送到总线上的地址一致,则该器件即为被主器件寻址的器件, 其接收信息还是发送信息则由第 8 位(R/W)确定。 在 I2C 总线上每次传送的数据字节数不限,但每一个字节必须为 8 位,而且每个传 送的字节后面必须跟一个认可位(第 9 位) ,也叫应答位(ACK) 。数据的传送过程如图 3 所示。 每次都是先传最高位, 通常从器件在接收到每个字节后都会作出响应, 即释放 SCL 线返回高电平,准备接收下一个数据字节,主器件可继续传送。如果从器件正在处理一 个实时事件而不能接收数据时, (例如正在处理一个内部中断,在这个中断处理完之前 就不能接收 I C 总线上的数据字节)可以使时钟 SCL 线保持低电平,从器件必须使 SDA 保持高电平,此时主器件产生 1 个结束信号,使传送异常结束,迫使主器件处于等待状 态。当从器件处理完毕时将释放 SCL 线,主器件继续传送[11]。 当主器件发送完一个字节的数据后接着发出对应于 SCL 线上的一个时钟(ACK)认 可位,在此时钟内主器件释放 SDA 线,一个字节传送结束而从器件的响应信号将 SDA 线 拉成低电平,使 SDA 在该时钟高电平期间为稳定的低电平。从器件的响应信号结束后, SDA 线返回高电平,进入下一个传送周期。2图 2.11 参数选择: 1)存储芯片 AT24C02AT24C02 存储电路图2)上拉电阻两个 R18,R19 都是 4.7K19 - 湖南科技大学本科生毕业设计(论文)2.2.10无线电路设计无线模块我们采用了 Nordic 公司的 RF 芯片 NRF24L01,因为我们对此芯片比较熟 悉所以直接采用这款芯片,价格便宜,容易操作。 NRF24L01 的功能特点: nRF24L01 是单片射频收发芯片, 工作于 2.4~2.5 GHz ISM 频段。工作电压为 1.9~3.6 V,有多达 125 个频道可供选择。可通过 SPI 写入数据,最 高可达 10 Mb/s,数据传输率最快可达 2 Mb/s,并且有自动应答和自动再发射功能。 和上一代 nRF2401 相比,nRF2401 数据传输率更快,数据写入速度更高,内嵌的功能更 完备。 芯片内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融进 了增强式 ShockBurst 技术,其中输出功率和通信频道可通过程序进行配置。芯片能耗非 常低,以-6 dBm 的功率发射时,工作电流只有 9 mA,接收时工作电流只有 12.3 mA, 多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。图 2.12无线电路本模块是参考官方给的图所设计的,各个器件的参数都是按照官方给的。2.2.11操作提示音电路设计方案一: 采用多种不同频率的提示音。 特点是直接由单片机输出不同的频率提示音, 设计简单,无需另购芯片节约成本。 方案二:采用专用的语音芯片,如 ISD4004 能录制 8-16 分钟的语音信息,并能直 接由单片机控制,且采用此法能提高本装置的性能,并且采用语音提示能使操作更加简20 - 湖南科技大学本科生毕业设计(论文)便,减少误操作。 ISD4004 芯片功能特点:ISD 系列语音芯片是美国 ISD 公司推出的产品。该系列语 音芯片采用多电平直接接模拟存储(Chip Corder)专利技术,声音不需要 A/D 转换和 压缩, 每个采样值直接存储在片内的闪烁存储器中, 没有 A/D 转换误差, 因此能够真实、 自然地再现语音、音乐及效果声。避免了一般固体录音电路量化和压缩造成的量化噪声 和金属声。ISD4004 语音芯片采用 CMOS 技术,内含晶体振荡器、防混叠滤波器、平滑滤 波器、自动静噪、音频功率放大器及高密度多电平闪烁存储阵列等,因此只需很少的外 围器件就可构成一个完整的声音录放系统。芯片设计是基于所有操作由微控制器控制, 操作命令通过串行通信接口(SPI 或 Microwire)送入。采样频率可为 4.0Hz、5.3Hz、 6.4Hz、8.0kHz,频率越低,录放时间越长,而音质则有所下降。片内信息存于内烁存 储器中,可在断电情况下保存 100 年(典型值)反复录音 10 万次。器件工作电压 3V, 工作电流 25~30mA,维持电流 1μ A?单片录放语音时间 8~16min,音质好,适用于移动 电话机及其它便携式电子产品中。图 2.13 元件参数选择如下:ISD4004 语音播放和音频放大器原理图1)C23、C24、C25 使用高压瓷片电容,型号为 104,用于高频滤波。 2)C27、C28 为麦克风音频输入耦合电容,采用的是一般的瓷片电容,但是最好采用 高质量的 CBB 电容,能更好的耦合声音信号,型号为 0.1uF,其它极性电容均为电解电 容。 3)MIC1 为驻极话筒。 2.2.12 音频放大电路设计为了能得到更好的语音播放效果,我们又加了语音驱动电路,将放大后的语音信号 通过变压器耦合到电话线上。驱动芯片采用了 LM386 运放。21 - 湖南科技大学本科生毕业设计(论文)LM386 是美国国家半导体公司生产的音频功率放大器,主要应用于低电压消费类产 品。为使外围元件最少,电压增益内置为 20。但在 1 脚和 8 脚之间增加一只外接电阻和 电容,便可将电压增益调为任意值,直至 200。输入端以地为参考,同时输出端被自动 偏置到电源电压的一半, 6V 电源电压下, 在 它的静态功耗仅为 24mW,使得 LM386 特别适 用于电池供电的场合。 LM386 的封装形式有塑封 8 引线双列直插式和贴片式。特性如下: 1)静态功耗低,约为 4mA,可用于电池供电; 2)工作电压范围宽,4~12V or 5~18V; 3)外围元件少; 4)电压增益可调,20~200; 5)低失真度。 其电路设计参考图 2.14图 2.14音频放大器原理图参数选择: 1)音频放大器选用 LM386,增益为 50; 2)C19 为音频信号耦合电容,选用 220μ F,C22 选取瓷片电容,其他都是电解电容。 3)T1 为音频信号耦合变压器,选用电话机中使用的音频变压器。2.3 系统电路工作总体介绍根据以上的方案选择,使用 PROTEL 设计硬件电路原理图,总体硬件电路图附于附 录中,现对系统硬件工作方式进行简单介绍。 首先用户远程拨打该系统所并接电话机的电话号码,振铃计数电路开始振铃次数计 数,当振铃 5 次仍无人接听后,启动自动摘机电路,接通电话,并启动语音提示电路, 提示输入密码进行身份认证,此时音频解码电路工作,将用户输入的按键信息转换成单 片机能够识别的 BCD 码,然后通过单片机进行密码校验,如果连续输入 3 次错误密码,22 - 湖南科技大学本科生毕业设计(论文)该系统的自动挂机电路启动,挂断电话。当输入密码正确时,语音提示可进行电器工作 状态的查询和控制,控制电器的工作状态可通过单片机发送命令给电器控制电路,然后 开闭相应的继电器从而实现电器的断开和启动。本系统还具有温度时钟显示功能,能显 示当前室温和当前时间。并且还能实时监测一定范围内有无人出现,当有人进入到红外 感应的范围内, 将会显示其有人状态, 也可依次来设置报警。 当用户在家使用本设备时, 可以直接通过主控制部分的按键和液晶显示器的提示来进行设备的控制。 当然, 管理人员可以坐在一个 PC 机旁就能在室内近程的控制所有的电器外设, 以及 在上位机上查看当前的温度,湿度,有无人,各个设备的运行状态,和对各个设备进行 定时操作。在 PC 机上装上我们用 VC 编写的上位机,对上位机发送指令,PC 机需要用串 口连接一个从功能单片机, 此单片机用于接收和发生上位机和主单片机的交换数据和控 制指令,从上位机,到从单片机,通过串口进行通信,上位机可以灵活的控制从机上的 扩展设备运转;上位机的指令要发给主单片机时,则需要先根据我们自己定义的一种协 议将指令编码为底层的一串数据, 然后由通过串口传输给从单片机, 从单片机通过 24L01 射频芯片,通过射频将数据发送给主单片机,主单片机接收到数据根据协议解码,并控 制设备的运作。同样,主单片机依照同样的协议将当前的时间,温度,湿度,有无人状 态和各个设备的运作状态信息生成底层的一串数据,每 1 秒向上位机发出更新信息。23 - 湖南科技大学本科生毕业设计(论文)第三章 系统软设计3.1 软件设计总括硬件设计是相当简单,因为很多的功能都已经封装好在一个个的芯片里面,但是 要将这些功能部件完美的组合在一起,则需要软件的力量,底层代码的编写那将是一个 不小的工程,每个模块传输数据的方法都不一样,对应每一个功能部分我们都写一个.h 的头文件,将其功能函数封装在里面,这样,在主函数中,我们只调用这些函数就可以 了,底层代码一定要精确,对于每个部件像 12864 液晶,pcf8563 时钟芯片,18B20 温 度传感器这些芯片,对时序的要求是非常的严格的,必须不断的调试,反复的校验,这 个必须要将对应的手册吃透。当然,当每个部件的.h 文件都写好了,再去调用则将没有 那么吃力了,因为不再需要考虑底层的时序,而只要调用该函数就行了。一个主函数贯 穿整个功能文件,简洁的将系统的功能统一起来。3.2 系统程序设计部分程序设计即软件设计,此系统的软件模块和硬件模块类似,划分有语音模块、液晶 显示模块、实时时钟模块、温度检测模块、存储器读写模块、电话数字解码模块、振铃 和摘机模块、密码校验模块、设备状态控制模块、无线射频模块、主程序。 这些程序模块都封装在了各自对应的.h 头文件中,在最后由主函数通过: #include&12864.h& #include&PCF85631.h& #include&24C02.h& #include&MT8870.h& #include&phonering.h& #include&password.h& #include&equipment_station.h& #include&18b20.h& #include&ISD4004.h& #include &api1.h& #include &nrf_api.h& 将所有的功能模块调用起来。 3.2.1 语音录放程序设计模块 由于这部分是整个系统的特色功能也是系统的关键之一, 所以在这部分的调试相当 繁琐。 语音的相关参数在 ISD4004.h 的头文件里定义。在程序中,我们先定义好各个地址: #define ISD_ADDS1 #define ISD_ADDS2 0x0+30024 - 湖南科技大学本科生毕业设计(论文)#define ISD_ADDS3 #define ISD_ADDS40xx以便录音,放音能够直接找到相应的地址段。然后将一些指令集都集中的定义下来, #define POWER_UP 0x20 #define SET_PLAY 0xE0 #define PLAY 0xF0 #define SET_REC 0xA0 #define REC 0xB0 #define SET_MC 0xE1 #define MC 0xF1 #define STOP 0x30 #define STOP_WRDN 0xF1 #define RINT 0x30 从而方便了后面指令直接的掉用,最后我们将 ISD4004 基本的函数整体封装了起来: void ISD_SPI_Send8( uchar isdx8 ); void ISD_SPI_Send16( uint isdx16 ); uint ISD_SPI_Radd(void); void ISD_Stop(void); void ISD_PowerUp(void); void ISD_PowerDown(void); void ISD_Play(void); void ISD_SetPlay(uint add); void ISD_Rec(void); void ISD_SetRec(uint add); uchar ISD_Chk_Isdovf(void); void PLAY_now(uchar add_sect); void REC_now(uchar add_sect); 此块便是语音设计的主要功能实现的软件模块。 语音的实现对硬件电路的要求比较高,我们仿佛试了好几种电路,调试的过程非常 麻烦,最后的效果还是跟想要的有点差距,语音芯片与单片机通信主要通过 ISD_MOSI, ISD_MISO 来交换数据,用 ISD_SCLK 来模拟时钟将数据进行交换。 3.2.2 液晶显示程序设计模块 用于显示当前时间, 温度及其他相关的信息, 液晶显示是直接获得相关信息的方式, 直观且能同时获得多个相关的信息,其底层函数都封装在了#include&12864.h&的头文 件里了,具体的程序流程设计如下: #ifndef __12864_H__ #define __12864_H__ #define uchar unsigned char25 - 湖南科技大学本科生毕业设计(论文)#define uint unsigned int sbit SID = P0^0; sbit SCLK = P0^1; sbit Lcd_bl =P0^2; uchar code addr_tab[]={ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, 0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, 0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f, }; 主要用到的子函数及功能如下: void LCD_Delay(uint t) //延时子函数,单位为 ms void LCD_SendByte(uchar Dbyte) //串行发送一个字节函数 void Lcd_WriteCmd(uchar Cbyte ) //写指令函数 void Lcd_WriteData(uchar Dbyte ) //写数据函数 void Lcd_Init(void) void PIC_Display(uchar *pic) void LCD_Display() //初始化 LCD 函数 //显示 Gdram 内容(显示图片) //液晶上电显示函数void Hanzi_Display(uchar x,uchar y,uchar code *s) //显示汉字函数具体的相关子函数内部操作,见整体程序中。 3.2.3 实时时钟程序设计模块 实时时钟所用的芯片是 PCF8563, PCF8563 有 16 个 位寄存器, 所有 16 个寄存 器设计成可寻址的 8 位并行寄存器。 PCF8563 时钟编写的功能函数都封装在了 PCF85631.h 的头文件中, 文件先将主要的 时间地址进行统一定义:/*PCF8563 地址的宏定义*/ #define #define #define #define #define #define #define #define #define PCF8563 SUBADDR MINUTE_ALARM HOUR_ALARM DAY_ALARM WEEK_ALARM CLKOUT TIME_CONTROL 0xA2 0x02 0x09 0x0A 0x0B 0x0C 0x0D //CLKOUT 输出寄存器 0x0E //定时器控制寄存器 //定时器倒计数寄存器 //定义器件地址 //指定操作地址TIME_COUNTDOWN 0x0F对主要的通信端口进行设置:26 - 湖南科技大学本科生毕业设计(论文)/*PCF8563 端口位*/ sbit PCF8563_SDA=P0^7; sbit PCF8563_SCL=P0^6; 主要功能函数如下: void Start_I2c(); void Stop_I2c(): void uchar RcvByte() //启动 I2C 总线,即发送 I2C 起始条件. //结束 I2C 总线,即发送 I2C 结束条件. //将数据 c 发送出去,可以是地址,也可以是数据 //接收从器件传来的数据 /*模拟 I2C 数据传送位*/ /*模拟 I2C 时钟控制位*/SendByte(uchar c):void Ack_I2c(bit a) //主控器进行应答 bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件地址 sla,子地 址 suba,发送内容是 s 指向的内容,发送 no 个字节。 bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件地址 sla,子 地址 suba,读出的内容放入 s 指向的存储区,读 no 个字节。 void PCF_Init() void PCF_Display() 12864.h 头文件。 PCF8563 这样的时钟芯片,对时序的要求是相当的严格,在测试中,必须对延时有 相当准确的控制, 在很多函数中我们并没有使用抽象延时的双 for 循环或者是 while 循 环,而是直接用的 nop 机器周期来控制延时的时间长度。在硬件设计中我们预留了可以 给 PCF8563 提供备用电源的纽扣电池接口,这样我们将很精确的读取时间,即使是主系 统掉电了, 也不影响时间的准确性。 由于时钟显示只是本系统的附加功能, 为简化代码, 节省单片机资源, 因此在此头文件中只直接调用 void PCF_Display()函数就能进行时间 显示,但修改时间则需要在代码中进行。 3.2.4 温度传感器程序设计模块 此系统的温度传感器采用的是 18B20,18B20 这样集成为三极管封装样的器件为硬 件设计带来了极大的方便,18B20 的传输接收数据的引脚只有一个。 同时钟芯片一样,18B20 对时序的要求也是非常严格的。延时函数都是控制在 us 级的,并且对相应的延时时间都是经过软件反复的测试,才定下来的。 void tmpDelay(int num)//延时函数 { while(num--) ; } 输入参数:num,写入延时的数,注意:这里要求延时很严格 向 PCF8563 中写入初始的时间 在 ST 上显示年月日分时秒,在此处要调用27 - 湖南科技大学本科生毕业设计(论文)其它函数: void Init_DS18B20() //初始化 ds1820 //读一个字节 //写一个字节 //读取温度 //在 12864 中显示读取的温度. uchar Tem_Read_One_Char() uint Read_Temperature() void Temperture_Display()void Tem_Write_One_Char(uchar dat)最后只需要调用 void Temperture_Display()函数就能将温度显示在 12864 液晶上 面了。所有的关于 18B20 的函数都封装在了 18b20.h 的头文件里面。 此部分采用专用的温度传感器 DS18B20, 此传感器采用的是单总线计数, 硬件简单, 外围电路只需要一个 4.7K 上拉电阻就可以了,但此传感器对电源及软件的时序要求比 较严格。 由于采用的电路是 1 脚接地,3 脚接 5V 电源,所以接反了很容易就将芯片击穿。我 在调试这部分电路的过程中非常小心, 因为此传感器价格较贵。 刚开始连接好硬件电路, 并写好程序,在 KEIL 里面编译通过,下载到 STC89C58 单片机里进行仿真实验,但显示 结果一直是 85℃, 此传感器在电源电压不足或软件时序错误及芯片损坏的情况就是显示 85℃。首先我怀疑软件时序有错,经过查阅大量资料,发现我的程序并没有错误,测量 供电也正常,只有一种可能就是传感器坏了,更换传感器后,显示当前室温 23.5℃一切 正常。由于此传感器以前使用过,后来有一段时间并未使用,所以其好坏并不清楚。 3.2.5 存储器读写程序设计模块 存储器主要用于对密码和对相关数据的存储,操作程序如下: #ifndef __2402_H__ #define __2402_H__ sbit AT_SCL = P2^1; sbit AT_SDA = P2^0; #define TRUE 1 #define FALSE 0 #define Delay_TIME 60 相关子函数如下: void Delay2402(unsigned int t) void I2C_Start(void) void I2C_Stop(void) void SEND_0(void) void SEND_1(void) bit Check_Acknowledge(void) void WriteI2CByte(unsigned char b) uchar ReadI2CByte(void)28 - 湖南科技大学本科生毕业设计(论文)void Write_One_Byte(uchar addr,uchar thedata) uchar Read_One_Byte(uchar addr) 用 I2C 总线实现与存储器的通信,实现对相关数据的存储,可以划分块来存储相应 的数据,方便对数据的读存,该系统中使用该存储器作为密码输入,校验密码和保存密 码。 3.2.6 电话数字解码程序设计模块 此模块主要实现对数字码的解码,其程序设计相对简单,具体如下: #ifndef __mt8870_h_ #define __mt8870_h_ sbit Q1 = P1 ^ 0; sbit Q2 = P1 ^ 1; sbit Q3 = P1 ^ 2; sbit Q4 = P1 ^ 3; sbit STD = P3 ^ 2; void MT8870_Delay(uint t) { while(t--) { for(i=0;i&125;i++); } } void int0(void) interrupt 0 { EX0 = 0; phonekey = P1&0x0f;//读取电话按键的值 MT8870_Delay(1); EX0 = 1; } #endif 用以实现对电话的输入键值的识别,以灵活实现主单片机对系统的控制。 //这个延时初步是想防止抖动 //约延时 n(ms)3.2.7 振铃和摘机程序设计模块 振铃检测是后面自动摘挂机的一个基础,为自动摘挂机提供信息源,很好的实现了 一个智能的控制,以达到设计的目的。振铃次数检测和摘挂机程序如下:29 - 湖南科技大学本科生毕业设计(论文)#ifndef __phonering_h_ #define __phonering_h_ sbit phonepickup = P3^6;//宏定义 //摘挂机端口#define uchar unsigned char #define uint unsigned int uchar phonering_flag = 0,phonepickup_flag = 0; void int1(void) interrupt 2 { ET1=0; phonering_flag++; ET1=1; } #endif 3.2.8 密码校验程序设计模块 本系统是通过在线输入密码而改变 24C02 存储器中的密码值的。 用户进入密码修改 界面后,首先语音提示用户输入 7 位新密码,先将其存储于单片机内,并记录输入的位 数,达到 6 位后,要求用户再次输入密码确认,达到 7 位后,与第一次输入的逐位进行 比较,相同则将密码写入 24C02 做为新密码,并提示用户密码修改成功;只要有一位不 通则放弃当前密码,并提示用户密码修改失败,提示用户重新输入新密码,当错误次数 达到 3 次后系统自动挂机,防止有人恶意破解密码。同时,在每个阶段系统都设定了超 时时间, 在用户修改密码期间, 当计数器的时间已经计满时, 系统将自动跳出当前菜单。 程序设计如下: #ifndef __password_H__ #define __password_H__ uchar Change_Check_ uchar Check_Password(void)//密码校验程序 uchar Change_Password(void) //修改密码函数,和密码校验很相似 在这块的程序设计中,实际中会有相应的语音提示,在程序中有体现,为这个系统 的设计,提供了可靠的安全性。 3.2.9 设备状态控制程序设计模块 此模块的设计主要是实现对工业设备和家用电器的智能控制,在此程序中只设计 到了三个设备或者电器,可以根据需要进行适当的增减,程序设计如下: #ifndef __equipment_station_H__ #define __equipment_station_H__ //检测振铃的次数30 - 湖南科技大学本科生毕业设计(论文)sbit relay1= P2^6;//三个继电器定义端口 sbit relay2= P2^7; sbit relay3= P1^4; uchar Station_Phone_Key() uchar Change_Station(void) //查询并且可以修改设备的状态. 具体的控制过程,还涉及到了译码电路的译码,对于具体的程序,在原程序中有详 细的叙述,在这块的设计还可以更深入,可以根据设备具体来设计。 3.2.10 无线射频程序模块 射频部分采用的是 Norid 公司的的 NRF24L01 模块, 由单片机控制发送和接受数据, 程序中将所有的寄存器地址和函数接口都封装在 NRF_API.h 的头文件中。 在 nrf_api.h 文件中定义了必须的一些命令: #define READ_REG #define WRITE_REG #define RD_RX_PLOAD #define WR_TX_PLOAD #define FLUSH_TX #define FLUSH_RX #define REUSE_TX_PL #define NOP 相关的寄存器地址: // SPI(nRF24L01) registers(addresses) #define CONFIG 0x00 // 'Config' register address #define EN_AA 0x01 // 'Enable Auto Acknowledgment' register address #define EN_RXADDR 0x02 // 'Enabled RX addresses' register address #define SETUP_AW 0x03 // 'Setup address width' register address #define SETUP_RETR 0x04 // 'Setup Auto. Retrans' register address #define RF_CH 0x05 // 'RF channel' register address #define RF_SETUP 0x06 // 'RF setup' register address #define STATUS 0x07 // 'Status' register address #define OBSERVE_TX 0x08 // 'Observe TX' register address #define CD 0x09 // 'Carrier Detect' register address #define RX_ADDR_P0 0x0A // 'RX address pipe0' register address #define RX_ADDR_P1 0x0B // 'RX address pipe1' register address #define RX_ADDR_P2 0x0C // 'RX address pipe2' register address #define RX_ADDR_P3 0x0D // 'RX address pipe3' register address #define RX_ADDR_P4 0x0E // 'RX address pipe4' register address #define RX_ADDR_P5 0x0F // 'RX address pipe5' register address #define TX_ADDR 0x10 // 'TX address' register address31 -0x00 // Define read command to register 0x20 // Define write command to register 0x61 // Define RX payload register address 0xA0 // Define TX payload register address 0xE1 // Define flush TX register command 0xE2 // Define flush RX register command 0xE3 // Define reuse TX payload register command 0xFF 湖南科技大学本科生毕业设计(论文)#define RX_PW_P0 #define RX_PW_P1 #define RX_PW_P2 #define RX_PW_P3 #define RX_PW_P4 #define RX_PW_P5 #define FIFO_STATUS0x11 0x12 0x13 0x14 0x15 0x16 0x17// 'RX payload width, pipe0' register address // 'RX payload width, pipe1' register address // 'RX payload width, pipe2' register address // 'RX payload width, pipe3' register address // 'RX payload width, pipe4' register address // 'RX payload width, pipe5' register address // 'FIFO Status Register' register address函数直接通过调用这些定义好的形象的命名或地址,便于程序的操作。下面是实现 的相关函数: // FUNCTION's PROTOTYPES // /****************************************************************/ BYTE SPI_RW(BYTE byte); BYTE SPI_Read(BYTE reg); BYTE SPI_RW_Reg(BYTE reg, BYTE byte); BYTE SPI_Write_Buf(BYTE reg, BYTE *pBuf, BYTE bytes); BYTE SPI_Read_Buf(BYTE reg, BYTE *pBuf, BYTE bytes); BYTE NRF24L01_RxPacket(BYTE *rx_buf); void NRF24L01_TxPacket(BYTE *tx_buf); void NRF24L01_Config(void); void check_ACK(); void NRF24L01_Delay(unsigned int x); 上面的函数,在程序主体调用中,主要用 NRF24L01_Config(void)来配置射频芯片 内 部 的 寄 存 器 , 调 用 NRF24L01_RxPacket(BYTE *rx_buf) 来 接 收 信 息 , 用 NRF24L01_TxPacket(BYTE *tx_buf)来发送数据。上面这些函数在 nrf_api.h 头文件中 只是声明,真正的定义是 nrf24l01.h 头文件中实现的。 3.2.11 主程序设计 主程序中主要是实现对各个功能模块的调用,以实现相应的功能,主程序的设计思 路如下: void main(void) { uchar return_station_Phone_K//用于返回读取的所要修改的设备的号码 uchar return_Change_P uchar return_Check_P uchar return_Change_S Power_Up_Init();//上电初始化 //用于返回修改密码成功与否 //用于返回检测密码成功与否32 - 湖南科技大学本科生毕业设计(论文)while(1) { PCF_Display(); //时间显示 Temperture_Display();//温度显示 if(phonering_flag &= 5)//振铃响四次后没人接听时 { phonering_flag=0;//先将振铃标志位清零 phonepickup = 0; /*检测密码*/ Lcd_WriteCmd(0x01);//清屏,需要 1.6m 秒,所以后面一定要有延时,否 则会出错。 LCD_Delay(1); Hanzi_Display(0,0,&**检测密码状态**&); Hanzi_Display(1,0,&输入密码:&); Lcd_WriteCmd(addr_tab[13]);//将光标定在第一行 0x95 的地方,然后开 始输入密码 // play(inputpassword_add); //播放&输入密码& //密码校验 //如果密码正确 return_Check_Password=Check_Password(); if(return_Check_Password) { Lcd_WriteCmd(0x01);//清屏,需要 1.6m 秒,后面一定要有延时,否 则会出错。 LCD_Delay(1); Hanzi_Display(0,0,&输入功能数字:&); Hanzi_Display(1,0,& 1:查询电器状态&); Hanzi_Display(2,0,& 2:修改密码&); return_Check_Password=0; //play(inputnumber); //播放&输入 1 为查询修改电器状态, 为修改密 2 码& return_station_Phone_Key=Station_Phone_Key();//获取要检测状态的 //接通电话值 switch(return_station_Phone_Key) {33 - 湖南科技大学本科生毕业设计(论文)case 1:return_Change_Station=Change_Station();//1 为查询修 改电器状态 case 2:return_Change_Password=Change_Password();//2 为修 改密码 default: } Hang_Up_Phone();//挂断电话 } else { Check_passwordwrong++; if(Check_passwordwrong == 3) { Hang_Up_Phone();//挂断电话 } } } } } 主程序是这个系统的关键,是系统良好运行的基础,也是对各个功能是否能实现的 一个控制,在此处可以根据你要实现的控制来调整程序,所以在很大程度上节省了功能 变动带来的影响。第四章 结论本系统最大的特色是使用了语音提示电路,使本系统的使用非常简便,首次使用本 系统插上电源打开开关后, 系统显示当前时间及当前室温, 将本装置并联在电话线两端, 本装置即能使用,并且不影响电话的正常使用。 当用户远程控制电器时,首先通过通信设备(电话或手机)拨打该设备所连接的电 话线的相应电话号码,电话机照常振铃,不影响电话的使用,同时本系统的振铃检测电 路在检测到有振铃信号时,开始振铃次数计数,当 5 次振铃后仍无人接听电话,自动摘 机电路启动,接通电话,并通过语音告知远程用户输入用户密码,当用户通过电话输入34 - 湖南科技大学本科生毕业设计(论文)密码,DTMF 解码电路工作,解出用户输入的号码,并先存储于单片机内部,当用户输 完密码,将其与原来存储于单片机内部的原始密码相比较,如果密码错误,语音提示用 户再次输入。错误次数达到3次的时候自动挂断电话;如果密码正确,则语音提示用户 查询并控制电器请按 1,修改密码请按 2。按 1 键进入电器状态查询控制,并再要求用 户输入电器代码,如输入 1 按“#”号结束,单片机通过查询相应电器工作状态,然后 语音播报设备名及状态。如 1 号代码表示的电器为空调,则输入“1”按“#”结束, 单片机查询得该设备为关闭,则播放“空调状态关闭” 。接着可改变设备工作状态,语 音提示用户,开启当前设备请按 1,关闭当前设备请按 0,并以“#”号结束。控制完 一路后询问,控制其他设备请按9,操作完成请先按“*”然后挂机;用户按 2 键进入 密码修改状态,语音提示用户输入新密码“#”号结束,输入一遍后要求用户再次输入 密码确认“#”号结束。如果两次输入密码相同则语音提示密码修改成功,若两次密码 不相同,则提示密码修改失败。用户挂机前可以按“*”号键让系统自动挂机。 当用户在家使用本装置时可以直接操作主单片机进行电器的控制, 通过主单片机连 接的矩阵键盘来控制外设,无需拨打电话。同样比较方便的是,用户可以在电脑旁实时 监测当前室内状况,和控制单片机连接的所有设备。打开上位机,在上位机上会实时显 示当前的室温,湿度,和有无人状态,并且监测当前设备的运作情况,通过刷新按钮, 可以及时更新当前数据。 通过开启/关闭按钮可以对相应的设备进行操控, 在定时设置中 可以定时开启和关闭外部电器,让电器控制集中,而且灵活。参考文献[1](美)Mark D.Birnbaum. Electronic Design Automation[M].USA:Technical publishing house,2005: 78-85 [2]王俊峰,薛鸿德. 现代遥控技术及应用[M].北京:人民邮电出版社,0 [3]丁镇生.传感器及传感技术应用[M].北京:电子工业出版社,2 [4]杨恢先,黄辉先.单片机原理及应用[M].长沙:国防科技大学出版社, [5]电子爱好者编辑部.小型程控电话机研究[J].电子爱好者,) :125-172 [6]何立民.单片机应用技术选编(6)[M].北京:北京航空航天大学出版社,5 [7]中国科学技术信息研究所.电子设计应用三例[J].电子设计应用,) :102-12435 - 湖南科技大学本科生毕业设计(论文)[8]陈宝江,杜庆柏.MCS 单片机应用系统实用指南[M].北京:机械工业出版社,9 [9]李广弟.单片机基础[M].北京:北京航空航天大学出版社,0 [10]张占松,杨宜民,许立梓.现代电工手册[M].广东:广东科技出版社,:154 [11]求是科技.单片机典型模块设计实例导航[M].北京:人民邮电出版社,36 - 湖南科技大学本科生毕业设计(论文)致谢本次设计是利用单片机及音频解码电路来实现对电器的远程控制, 由于知识掌握有 限,在设计中遇到了不少难题。我衷心感谢卢明老师的精心指导和帮助,卢老师一方面 要完成繁重的教学任务,一方面还要指导和带领我们一组同学完成毕业设计。每隔一段 时间我们都要向指导老师汇报设计进展状况,并提出在设计过程中遇到的难点,卢老师 每次都给我们详细的讲解,给我们指明方向。卢明老师在工作上认真负责,一丝不苟, 对我们每个人的论文都进行了多次审核及修改。 在此, 我向卢明老师表示最诚挚的谢意! 同时我还要感谢学院其他老师及同组、同专业同学曾给我的帮助,对你们深表谢意。 大学生活随着毕业设计的完成而即将结束,衷心感谢母校对我的教育和培养,感 谢信息与电气工程学院的全体老师对我的教诲。37 - 湖南科技大学本科生毕业设计(论文)附录 A 总的原理图:1 2 3 4 5 6 7 J1 VCC R2 1 00 K D3 17 16 15 14 13 12 11 10 1K 1K 1K 1K D8 D9 D6 D7 + C7 4 70 UF C8 1 04 Q1 8 05 0 8 87 0 Q4 8 87 0 Q3 8 87 0 Q2 8 87 0 Q1 VCC 8 87 0 STD VCC J2 2 1 AC1 2V 4 D2 2 4 00 7 * 4 + C2 4 70 UF38D1 R1 C1 IC1 LM7 80 5 1 C3 1 04 VinGND1VCC +5V 3 + C4 1 00 UF C5 1 04 VR1 1 0K LCD_SID LCD_SCLK1 N41 4 8 3 30 K R3 5 6K R4 5 6K U1 1 04 J3 D 2 1 PHONE C6 R9 5 6K R1 05 6K D5 1 N41 4 8 D4 1 N41 4 8 R7 6 8K Y1 R5 4 7K 1 2 3 4 5 6 7 8 IN+ ST/GT INEST GS STD V REF Q4 INH Q3 PWDN Q2 OSC1 Q1 OSC2 TOE MT8 87 0 R1 2 R1 3 R1 4 R1 6R61 50 KR81K VCC 3U2 ASM11 1 7 -3 .3 ASM11 1 7 -3 .3 VINGNDVDD_3 . 3V 2 C1 0 + C9 4 70 UF1 04 LCD_BLR1 1 VCC VCC R1 5 4 K7 Q2 1K1 043 .5 8 MVOUT1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20VSS VDD VO RS R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 PSB NC RST Vo ut A K2D1 28 6 4 -LCD1D1 0 C1 1 C1 2 J4 2 1 D1 1 1 N41 4 8 U3 1 2 3 4 VCC R2 5 4 .7 K 8 87 0 Q1 8 87 0 Q2 8 87 0 Q3 8 87 0 Q4 S1 S5 S9 S2 S6 S10 S3 S7 S11 S4 PCF_ SCL S8 PCF_ SDA S12 A0 A1 A2 GND AT24 C0 2 4 K7 VCC VCC VCC P0. 0 P0. 1 P0. 2 P0. 3 P0. 4 P0. 5 P0. 6 P0. 7 EA ALE PSEN P2. 7 P2. 6 P2. 5 P2. 4 P2. 3 P2. 2 P2. 1 P2. 0 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 VCC WP SCL SDA 8 7 6 5 R1 8 4 K7 1 0u F 0 .1 u F 1 N41 4 8 VCC VCC VCCVCCPH O N E RI N GR1 7 1KBu tto n Battery C U4 Y2 3 2K7 6 8 1 2 3 4 OSCI VCC OSCO CLK INT SCL VSS SDA PCF8 5 6 3 8 7 6 5 4 .7 K R2 4R1 9 4 K7D1 3 4 00 7 J5 RR11 2 3 4 5 6 7 8 9D1 4 R2 2 4 00 7 1 0kD1 2 3 3VR2 0 1 0KR2 3 1 00 IC2R2 1 1 00Q3 8 55 0C2 40 2 CLK 2 40 2 DATAPCF_ SCL PCF_ SDA2 1 PHONE IN P? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Head er 2 0 C1 5 1UC1 3 1U + C1 4 4 .7 U 4 N25 D1 6 4 00 7 D1 7 4 00 7 D1 5 5V R2 6 1 0KQ4 8 05 0P? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Head er 2 0 8 87 0 Q1 8 87 0 Q2 8 87 0 Q3 8 87 0 Q4 1 2 3 4 5 6 7 8 RST 9 10 11 8 87 0 STD 12 PHONE RING 1 3 14 15 PHONE ON/OFF 6 1 17 XTAL2 18 XTAL1 19 20IC3 P1. 0 P1. 1 P1. 2 P1. 3 P1. 4 P1. 5 P1. 6 P1. 7 RST P3. 0 /RXD P3. 1 /TXD P3. 2 /INT0 P3. 3 /INT1 P3. 4 /T0 P3. 5 /T1 P3. 6 /WR P3. 7 /RD X2 X1 GND STC8 9 C58 VDD_3 . 3V27 18D1 8LCD_SID LCD_SCLK LCD_BL RELAY 1 RELAY 2 RELAY 3 PCF_ SCL PCF_ SDA R2 7 ISD_ SS ISD_ MOSI ISD_ SCLK ISD_ INT DS18 B2 0 2 40 2 CLK 2 40 2 DATA 4 .7 K VCCD1 9 4 00 7 J6 2 1 PHONE IN D2 3 4 00 7D2 0 R2 9 4 00 7 1 0k R3 1 + 1 0KR2 8 3 00 R3 0 2 2K VCC IC4Q5 8 05 0Q6 8 55 0VCC R3 3 U5 B VCC I/O GND DS18 B2 0 3 2 1 1 0K DS18 B2 0D2 4 4 00 7C1 6 4 .7 UD2 2 5VR3 4 4 N25 RES2 D2 7 PHONE ON/OFFR3 2 4 K7 BU8 16 15 14 13 12 11 10 VCC 9 OUT1 OUT2 OUT3 OUT4 OUT5 OUT6 OUT7 COM ULN20 0 3A ISD_ INT J82 1IN1 IN2 IN3 IN4 IN5 IN6 IN7 GNDXTAL2ISD_ MOSI 2 ISD_ SCLK 2 8MOSI SCLK MISO INT RACAM CAP14 C2 1 1 uF3 2C1 9 2 20 u F C2 2 0 .0 4 7u F R3 9 10 Trans T1 C2 9 PHONE IN 1 uF 1 2 K3 KEY R3 6 10 7 R3 1 0K + C2 0 1 0U RSTY38 3 R3 8 4 .7 K 25 24XCLK26VS LM3 86 N-16 VCC C2 5 1 0u F1 1. 0 59 2 M C2 3 3 0P C2 4 3 0PJ 102 1J 12 VCC2 1R4 0 4 .7 KANA IN+ ANA IN-17 16 C2 6 0 .1 u f R4 3 1 0K C2 7 0 .1 u fV SSDV SSAAD2 1 1 N41 4 8K1 RELAYD2 5 1 N41 4 8K2 RELAYD2 6 1 N41 4 8R4 1 1 0KR4 2 VCC 1 0K C2 8 2 2u FXTAL11 2 3 4 5 RELAY 1 6 RELAY 2 7 RELAY 3V CCDV CCAU6 ISD4 00 4 C1 8 13 1 uF W1 1 0K 4 U7 GND GAIN GAIN BYP 8 1 7 5R3 5 1 .2 KC1 7 1 0u F VCCISD_ SS1SSAUD OUTAK4 RELAY11 4MIC1TitleVCC1 2VCC1 2VCC1 2Size A3 Date: File:Nu mberRev isio nJ7J9J 112 -J un -2 0 1 1 Sheet o f C:\Do cu men ts an d Settin g s\Ad min is trato r\桌Drawn之 的 电 控 系 1 .DDB 面修 By: 远程 话 制 统 \ 改 后 7 812345638 - 湖南科技大学本科生毕业设计(论文)附录 B部分源程序:1,主函数部分 void main(void) { uchar return_station_Phone_K uchar return_Check_P //用于返回读取的所要修改的设备的号码 //用于返回检测密码成功与否uchar nrf_relay1,nrf_relay2,nrf_relay3; //用于提取无线接收到的设备值 Power_Up_Init();//上电初始化 while(1) { ET1 = 1; PCF_Display(); //时间显示 Temperture_Display();//温度显示 if(NRF24L01_RxPacket(rx_buf)) //无线模块处于接收状态 { /*接收到的数据的格式,参考 nrf24l01.h 文件*/ lcd_string(rx_buf,0,0); //将收到的上位机的数据显示在液晶 0 行 0 列上 //将显示温度和时间的定时器打开/*提取接收到的设备的控制数据*/ nrf_relay1=rx_buf[5]; nrf_relay2=rx_buf[6]; nrf_relay3=rx_buf[7]; /*对应赋到相应的端口*/ relay1=nrf_relay1; relay2=nrf_relay2; relay3=nrf_relay3; } if(phonering_flag &= 5)//振铃响四次后没人接听时 { EX1=0; ET1 = 0; //将检测响铃次数的中断屏蔽 //将无线发送数据的定时器关掉39 - 湖南科技大学本科生毕业设计(论文)phonepickup = 0; /*检测密码*///接通电话Lcd_WriteCmd(0x01);//清屏,需要 1.6m 秒,所以后面一定要有延时,否则 会出错。 LCD_Delay(1); Hanzi_Display(0,0,&**检测密码状态**&); Hanzi_Display(1,0,&输入密码:&); Lcd_WriteCmd(addr_tab[13]); 方,然后开始输入密码 return_Check_Password=Check_Password(); if(return_Check_Password) { Lcd_WriteCmd(0x01);//清屏,需要 1.6m 秒,所以后面一定要有延时,否 则会出错。 LCD_Delay(1); Hanzi_Display(0,0,&输入功能序号:&); Hanzi_Display(1,0,& 1:查询电器状态&); Hanzi_Display(2,0,& 2:修改密码&); return_Check_Password=0; return_station_Phone_Key=0//这里的初值只要不是 0,1,2 就可以 while(return_station_Phone_Key!=0x0B)//这里是用*号来表示挂机 { switch(return_station_Phone_Key) { case 1:Change_Station(); default: } Lcd_WriteCmd(0x01);//清屏, 需要 1.6m 秒, 所以后面一定要有延时, 否则会出错。 LCD_Delay(1);40 -//将光标定在第一行 0x95 的地 //密码校验//如果密码正确进来这个 if//1 为查询修改电器状态case 2:Change_Password(); //2 为修改密码 湖南科技大学本科生毕业设计(论文)Hanzi_Display(0,0,&输入功能序号:&); Hanzi_Display(1,0,& 1:查询电器状态&); Hanzi_Display(2,0,& 2:修改密码&); LCD_Delay(100); return_station_Phone_Key=Station_Phone_Key();//获取要检测状态的 值 } ET1=1; phonering_flag=0; } else 测密码错误的次数 { Check_passwordwrong++; if(Check_passwordwrong &= 3) { Check_passwordwrong=0; ET1=1; phonering_flag=0; } } } } } //先将振铃标志位清零 Hang_Up_Phone();//挂断电话 //如果密码不正确,进来记录检 //先将振铃标志位清零 Hang_Up_Phone();//挂断电话2,12864 液晶函数部分 /******************************************************************* 串行发送一个字节函数 函数原型: LCD_SendByte(uchar Dbyte) 输入参数:t 返回参数:无 功能: 延时 tms. ********************************************************************/ void LCD_SendByte(uchar Dbyte)41 - 湖南科技大学本科生毕业设计(论文){ for(i=0;i&8;i++) { SCLK = 0; Dbyte=Dbyte&&1; SID = CY; SCLK = 1; SCLK = 0; } } /******************************************************************* 写指令函数 函数原型: Lcd_WriteCmd(uchar Cbyte ) 输入参数:Cbyte,这是要写入的指令 返回参数:无 功能: 写入指令. ********************************************************************/ void Lcd_WriteCmd(uchar Cbyte ) { //LCD_Delay(1); LCD_SendByte(0xf8); //11111,RW(0),RS(0),0 LCD_SendByte(0xf0&Cbyte); LCD_SendByte(0xf0&Cbyte&&4); //高四位 //低四位(先执行&&) //左移一位 //移出的位给 SID} /******************************************************************* 写数据函数 函数原型: Lcd_WriteData(uchar Dbyte ) 输入参数:Dbyte,这里是要写入的数据 返回参数:无 功能: 写入数据. ********************************************************************/ void Lcd_WriteData(uchar Dbyte ) { //LCD_Delay(1); LCD_SendByte(0xfa); //11111,RW(0),RS(1),0 LCD_SendByte(0xf0&Dbyte); //高四位42 - 湖南科技大学本科生毕业设计(论文)LCD_SendByte(0xf0&Dbyte&&4);//低四位(先执行&&)} /******************************************************************* 初始化 LCD 函数 函数原型: Lcd_Init(void) 输入参数:无 返回参数:无 功能: 初始化 LCD. ********************************************************************/ void Lcd_Init(void) { LCD_Delay(50); Lcd_WriteCmd(0x30); LCD_Delay(1); Lcd_WriteCmd(0x30); LCD_Delay(1); Lcd_WriteCmd(0x0c); LCD_Delay(1); Lcd_WriteCmd(0x01); LCD_Delay(2); // // } Lcd_WriteCmd(0x0f); LCD_Delay(2); //开显示,有游标,反白 //清除显示,并且设定地址指针为 00H //开显示(无游标、不反白) //选择 8bit 数据流 //选择基本指令集/******************************************************************* 显示汉字函数 函数原型: Hanzi_Display(uchar x,uchar y,uchar code *s) 输入参数:x,是要写入的列地址 y,是要写入的行地址 s,是要写入的汉字 返回参数:无 功能: 显示汉字. ********************************************************************/ void Hanzi_Display(uchar x,uchar y,uchar code *s) { Lcd_WriteCmd(addr_tab[8*x+y]); //写地址 while(*s&0)43 - 湖南科技大学本科生毕业设计(论文){ Lcd_WriteData(*s); s++; } } /******************************************************************* t(ms)延时子程序函数 函数原型: LCD_Delay(uint t) 输入参数:P: 表示要写入的字符 xx:表示行 yy:表示列 返回参数:无 功能: 显示字符. ********************************************************************/ void lcd_string( uchar *p, uchar xx,uchar yy ) { // Lcd_WriteCmd(addr_tab[8*xx+yy]); //写地址 while(*p!=0) { Lcd_WriteData(*p); p++; } } /******************************************************************* 绘图显示的步骤: 1 关闭绘图显示功能 2 先将垂直的坐标(Y)写入绘图 RAM 地址 3 再将水平的位元组坐标(X)写入绘图 RAM 地址 4 将 D15-D8 写入 RAM 中 5 将 D7-D0 写入到 RAM 中 6 打开绘图显示功能 ********************************************************************/ /******************************************************************* 显示图片函数 //写数据 0-3 0-7 //写数据44 - 湖南科技大学本科生毕业设计(论文)函数原型: PIC_Display(uchar *pic) 输入参数:*pic,这个是要显示的图片 输出参数:无 功能: 显示图片. //显示 Gdram 内容(显示图片) ********************************************************************/ void PIC_Display(uchar *pic) { uchar x,y,i; Lcd_WriteCmd(0x34);//切换到扩充指令, Lcd_WriteCmd(0x34);//关闭图形显示 /*注意这里的写法,总的来说就是按照先写垂直的坐标再写水平坐标,但是我们 取字模的时候是按照高位在前,低位在后,从左到右,从上到下,明白这里下面 的三个 for 语句就不难理解了*/ for(i=0;i&9;i=i+8) for(y=0;y&32;y++) for(x=0;x&8;x++) { Lcd_WriteCmd(0x80+y); //行地址,一共有三十二个地址,从 80H 到 9FH Lcd_WriteCmd(0x80+x+i); //列地址 Lcd_WriteData(*pic++); //写数据 D15-D8 Lcd_WriteData(*pic++); //写数据 D7-D0 } Lcd_WriteCmd(0x36);//打开图形显示 } 3,PCF8563 时钟函数部分: /******************************************************************* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动 I2C 总线,即发送 I2C 起始条件. ********************************************************************/ void Start_I2c() { PCF8563_SDA=1; //发送起始条件的数据信号45 - 湖南科技大学本科生毕业设计(论文)_Nop(); PCF8563_SCL=1; _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); PCF8563_SDA=0; _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); PCF8563_SCL=0; _Nop(); _Nop(); } /******************************************************************* 结束总线函数 函数原型: void Stop_I2c(); 功能: 结束 I2C 总线,即发送 I2C 结束条件. ********************************************************************/ void Stop_I2c() { PCF8563_SDA=0; PCF8563_SCL=1; _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); PCF8563_SDA=1; _Nop(); _Nop(); _Nop(); _Nop(); } //发送 I2C 总线结束信号 //发送结束条件的数据信号 //结束条件建立时间大于 4μ s _Nop(); //发送结束条件的时钟信号 //钳住 I2C 总线,准备发送或接收数据 //发送起始信号 // 起始条件锁定时间大于 4μ s //起始条件建立时间大于 4.7us,延时46 - 湖南科技大学本科生毕业设计(论文)/******************************************************************* 字节数据发送函数 函数原型: void SendByte(uchar c); 功能: 将数据 c 发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使 ack=0) 发送数据正常,ack=1; ack=0 表示被控器无应答或损坏。 ********************************************************************/ void SendByte(uchar c) { uchar BitC for(BitCnt=0;BitCnt&8;BitCnt++) //要传送的数据长度为 8 位 { if((c&&BitCnt)&0x80)PCF8563_SDA=1; else PCF8563_SDA=0; _Nop(); PCF8563_SCL=1; _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); PCF8563_SCL=0; } _Nop(); _Nop(); PCF8563_SDA=1; _Nop(); _Nop(); PCF8563_SCL=1; _Nop(); _Nop(); _Nop(); if(PCF8563_SDA==1)ack=0; else ack=1; PCF8563_SCL=0; _Nop(); //判断是否接收到应答信号 //8 位发送完后释放数据线,准备接收应答位 //保证时钟高电平周期大于 4μ s //置时钟线为高,通知被控器开始接收数据位 //判断发送位47 - 湖南科技大学本科生毕业设计(论文)_Nop(); } /******************************************************************* 字节数据接收函数 函数原型: uchar RcvByte(); 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数应答从机。 ********************************************************************/ uchar RcvByte() { uchar BitC retc=0; PCF8563_SDA=1; for(BitCnt=0;BitCnt&8;BitCnt++) { _Nop(); PCF8563_SCL=0; _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); PCF8563_SCL=1; _Nop(); _Nop(); retc=retc&&1; if(PCF8563_SDA==1)retc=retc+1; _Nop(); _Nop(); } PCF8563_SCL=0; _Nop(); _Nop(); return(retc); } /******************************************************************** //读数据位,接收的数据位放入 retc 中 //置时钟线为高使数据线上数据有效 //时钟低电平周期大于 4.7μ s //置时钟线为低,准备接收数据位 //置数据线为输入方式48 - 湖南科技大学本科生毕业设计(论文)应答子函数 函数原型: 功能: void Ack_I2c(bit a); 主控器进行应答信号(可以是应答或非应答信号,由位参数 a 决定)********************************************************************/ void Ack_I2c(bit a) { if(a==0)PCF8563_SDA=0; else PCF8563_SDA=1; _Nop(); _Nop(); _Nop(); PCF8563_SCL=1; _Nop(); _Nop(); _Nop(); _Nop(); _Nop(); PCF8563_SCL=0; _Nop(); _Nop(); } /******************************************************************* 用户接口函数 *******************************************************************/ /******************************************************************* 向有子地址器件发送多字节数据函数 函数原型: bit 功能: ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件 地址 sla,子地址 suba,发送内容是 s 指向的内容,发送 no 个字节。 如果返回 1 表示操作成功,否则操作有误。 注意: 使用前必须已结束总线。 ********************************************************************/ bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) { Start_I2c(); SendByte(sla); //启动总线 //发送器件地址49 -//在此发出应答或非应答信号//时钟低电平周期大于 4μ s//清时钟线,钳住 I2C 总线以便继续接收 湖南科技大学本科生毕业设计(论文)if(ack==0)return(0); SendByte(suba); if(ack==0)return(0); for(i=0;i&i++) { SendByte(*s); if(ack==0)return(0); s++; } Stop_I2c(); return(1); } /******************************************************************* 向有子地址器件读取多字节数据函数 函数原型: bit 功能: ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 从启动总线到发送地址,子

我要回帖

更多关于 linux 命令行写入文件 的文章

 

随机推荐