单片机课程设计报告
基于STM32单片机的智能家居系统设计
姓 名:sssssssssbbbbbbbb
班 级: 333334444 学 号: xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx 指导老师: yyyyyyyyy 日期: 2012.05.27~2012.06.07
华南农业大学工程学院
摘 要
目前市场上针对普通家庭的智能防盗、防火等产品很多,但基于远程报警系统的智能家居产品价格不菲。本次设计的基于STM32的智能家居报警系统实用性非常强,设计成本低廉,非常适合普通家庭使用,而且随时可以升级。本产品采用的是以意法半导体公司生产的单片机STM32F103RBT6作为主控芯片,AT24C02作为静态存储芯片,4*4 薄膜键盘和红外热式感应作为探测器,GSM和扬声器的家庭报警模块。
随着信息技术的发展,实现家居的信息化、网络化,是当前智能家居系统发展的新趋势。本设计将通信技术与防盗系统紧密结合,为一款便敏小巧,低成本,适合普通室内报警的智能报警系统。本系统通过传感器获取室内人员信息,并将信号发送到单片机微处理器。系统收到报警信息后通过辨认密码的方式确定目标身份,并通过蜂鸣器报警的方式警示入侵者。另外,系统配备具手机通信功能的GSM模块,能将室内安全状况第一时间发送至用户手机终端。不仅大大提高系统安全性及智能性,也方便用户的使用。
经测试,本系统稳定可靠,同时具有友好的人机界面,为用户提供安全服务的同时,实现系统智能化管理。
关键字:智能报警 存储器 传感器 GSM
目 录
1 方案比较与选择·················································1
1.1 方案一:采用数字电路控制································1 1.2 方案二:采用双音多频电路与语音电路相结合的控制方案······1 1.3 方案三:采用以STM32单片机为核心的控制方案··············2 2 主要元器件介绍·················································3
2.1 主芯片—STM32···········································3 2.2 显示屏--OLCD12864·······································4 2.3 外部存储芯片--AT24C02···································5 3 模块分析·······················································7
3.1 STM32控制模块···········································7 3.2 密码锁键盘输入及存储模块································7 3.3人体热释感应模块········································7 3.4显示模块················································7 3.5报警模块················································7 4 硬件组成部分··················································8
4.1 硬件组成部分···········································8 4.2 仿真分析··············································11
5 电路板的制作,焊接,调试·····································13
5.1电路板制作·············································13 5.2电路板焊接·············································14 5.3电路板调试·············································14 6 讨论及进一步研究和建议·······································15 7 课程设计心得·················································16 附录···························································17 参考文献·······················································34
1、方案的比较与选择
1.1 方案一:
由数字电路搭建的智能家居安全系统,用以双JK触发器构成的数字逻辑电路作为密码控制系统的核心控制,共设了9个数字输入键,还有确认键和取消键等。如果用户输入密码错误,则电路将报警;若电路连续报警三次,即密码输入错误3次,电路将锁定键盘并长时间报警。这样可以防止他人潜入进入家居住宅。方案系统框图如图1所示。
图1
1.2 方案二:
通过微处理器控制技术将双音多频电路与语音电路相结合,利用电话网络技术和相关的传感器,开发一种具有联网功能的智能报警系统。该报警系统由传感器终端、计算机控制中心、小区管理中心的接警主机及相关软件组成。如图2所示,主机电路由射频接收模块接收传感器发来的报警信号,通过解码电路解码后得到报警传感器预先设定的地址码和数据码类型。主机和传感器两者设定的地址码相同时才能被主机接收。解码输出信号进入主控制器的中断输入端,触发中断处理程序。
图2
4
1.3 方案三:
本方案以STM32单片机作为控制核心,通过密码锁进行验证,使用LCD模块进行显示,当密码输入错误次数大于三次时,将被视为非法入侵,语音报警模块发出报警。若通过其他途径非法侵入时,该系统将通过热释人体感应模块启动报警模块进行报警。总体系统框图如图3所示: 人体热释感应模块 E2PROM
方案一设计简单且操作容易,但没有可发展空间,而且后期修改几乎是不可能的;方案二的系统功能齐全,但是设计复杂,该系统适用于小区式管理,实现小区与物业管理中心的安全状态保障,最终实现小区联网控制,适合在小区管理用户大规模使用;方案三虽然功能偏少,设计相对简单,而且实现相对容易,适合于家庭个人用户使用,最重要的是该方案具有极大的扩展空间,设计灵活,可以自由嵌入各模块,同时可以通过修改程序来改变功能。综上三种方案,结合自身的设计水平,我们组选择方案三作为我们的最终设计方案。
液晶显示模块 GSM模块 STM32控制模块 语音芯片 功放 扬声器 4x4密码锁键盘输入模块 图3
5
2、主要元器件介绍
2.1 主芯片—STM32F103RBT6
STM32F103RBT6/STM32F103是 ST 公司基于ARM最新Cortex-M3架构内核的32位处理器产品,内置128KB的Flash、20K的RAM、12位AD、4个16位定时器和3路USART通讯口等多种资源,时钟频率最高可达72MHz。 参数介绍如图4:
图4
6
2.2 显示屏--OLCD12864
2.2.1概述
OLCD12864带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 2.2.2基本特性:
(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℃ 2.2.3、应用说明
①欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。
②显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显
7
示的字符中将会有一个空ASCII字符位置。
③当字符编码为2字节时,应先写入高位字节,再写入低位字节。 ④模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明。
⑤“RE”为基本指令集与扩充指令集的选择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位。
2.3 外部存储芯片--AT24C02
EEPROM (Electrically Erasable Programmable Read-Only Memory),电可擦可编程只读存储器,是一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。
它是可用户更改的只读存储器(ROM),其可通过高于普通电压的作用来擦除和重编程(重写)。不像EPROM芯片,EEPROM不需从计算机中取出即可修改。
AT24CXX是美国ATMEL公司的低功耗CMOS串行EEPROM,典型的型号有AT24C01A/02/04/08/16
等
5
种,它们的存储容量分别是
1024/2048/4096/8192/16384位;也就是128/256/512/1024/2048字节;使用电压级别有5V,2.7V,2.5V,1.8V。
AT24C02是一个CMOS标准的EEPROM存储器,是AT24CXX系列(AT24C01/02/04/08/16)成员之一,这些EEPROM存储器的特点是功耗小、成本低、电源范围宽,静态电源电流约30uA~110uA,具有标准的I2C总线接口,是应用广泛的小容量存储器之一。
图5
图5是AT24C02的引脚图,这个芯片是一个8脚芯片,内部存储器有256
8
字节。引脚功能介绍如下:
A0(引脚1):器件地址的A0位,是器件地址的最低位,器件地址排列是A6 A5 A4 A3 A2 A1 A0 R/W。
A1(引脚2):器件地址的A1位。 A2(引脚3):器件地址的A2位。 GND(引脚4):地线。 SDA(引脚5):数据总线引脚。SCL(引脚6):时钟总线引脚。TEST(引脚7):测试引脚, Vcc(引脚8):电源线引脚。
9
3、模块分析
本系统的硬件部分主要由单片机STM32F103RBT6、晶振电路、报警电路、4×4矩阵键盘和OLCD12864显示电路和人体热释感应模块组成;其中报警电路使用扬声器进行声音报警。总的来说,智能家居系统主要由微处理器模块(MCU)、模块、人体红外检测报警模块、键盘模块、显示模块构成。
3.1 STM32控制模块
微处理器模块,也就是由STM32F103RBT6单片机构成,因为本系统要实现密
码检测、密码设定、声光提醒等功能,要求微处理器必须提供足够的I/O口,而且由于系统体积限制,所以选用STM32F103RBT6单片机。
3.2 4x4密码锁键盘输入及存储模块
本设计采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。
本设计中使用的这个4*4键盘不但能完成密码的输入还能作特别功能键使用,比如修改密码后退功能等。键盘的每个按键功能可以在程序设计中设置。
存储模块不仅可以存储及修改用户的6位密码,还可以动态地存储修改用户的手机号码,手机号码的最大容量为7个,方便用户更换手机后不影响GSM模块的报警功能的使用。
3.3人体热释感应模块
当检测到非法入侵的人体时,启动报警模块报警。
3.4显示模块
考虑到友好的人机界面,采用OLCD12864液晶显示。显示模块的作用主要是
显示当前家居安全情况、提示信息和输入的密码,以方便用户使用。
3.5报警模块
报警模块主要有两大部分组成。第一部分是由语音芯片、功放、扬声器组成
的声音报警电路,当密码输入错误次数大于三次,或者有非法侵入等行为,系统会用扬声器实现声音报警;第二部分主要是由GSM模块构成的短信通知电路,当遇到前面所述的情况时,GSM模块会向主人手机发送短信提醒有非法入侵。
10
4、硬件组成部分及仿真分析
4.1 硬件组成部分:
4.1.1 STM32单片机控制模块:
图6
4.1.2 存储芯片AT24C02模块电路图:
图7
11
4.1.3 4x4密码锁键盘输入模块:
图8
4.1.4 GSM模块:
图9
4.1.5 SW调试接口:
图10
12
4.1.6 报警模块:
图11
4.1.7 电源模块:
图12
4.1.8 人体热释感应模块:
图13
13
4.1.9 显示模块:
图14
4.2 仿真分析
由于电路的其它部分功能相对简单,所以在硬件上直接可以实现,并未对它们进行仿真,这里只对GSM模块进行仿真调试,分析结果如下:
通过RS-232将GSM模块和主控制板连接起来。这样要注意要将RXD-RXD,TXD-TXD连接起来,不要凭经验交叉连接。
这里我采用串口调试助手,通过RS-232与电脑连接来调试。把串口波特率设置为9600,效验为设置为NONE,数据位8位,停止位1位。
图15
模块有两种发送方式:TEXT模式和PDU模式。PDU模式可以用Unicode编码发送英文、汉字。采用PDU模式比较复杂,TEXT模式虽然只能发送英文,但其无需编码,发送简单,所以我在测试时采用TEXT模式。 TEXT 发送模式:(相对简单很多。) 发送:AT<回车>
返回:AT<回车> OK
14
发送:AT+CMGF=1<回车> 返回:AT+CMGF=1<回车> OK
发送:AT+CSCA=+8613010130500<回车> 返回:AT+CSCA=+8613010130500<回车> OK
发送:AT+CMGS=13132061066<回车> 返回:AT+CMGS=13132061066<回车> >
发送:XXXXXX(0-9,A-Z)[XXXXX 是指阿拉伯数字0-9,英文26 个字母A-Z] 返回:XXXXXX(0-9,A-Z)[XXXXX 是指阿拉伯数字0-9,英文26 个字母A-Z] 发送:1A(十六进制发送)<回车> 返回:+CMGS: XXX OK
以上为 TEXT 方式发送截图:
如果不能正常发送,返回ERROR,则说明需要格式化。可以发送AT&F 命令格式化。
发送:AT&F<回车> 返回:AT&F<回车>
15
5、电路板的制作,焊接,调试
5.1电路板制作
在制作电路板之前,先画好PCB电路图。注意点有三个:①、元件的封装。注意焊盘的大小和焊盘之间的距离。②、注意线宽大小,本设计把线宽调至0.8mm。③、布局和布线。注意尽量少飞线和单层PCB板布线。 电路板制作有以下5步:
(1)打印电路图:先设置相关的参数,后在油性纸面上进行PCB电路图的打印,将图纸打印好之后后,注意不要刮落到碳粉。
(2)过塑:把打印的PCB图紧紧贴到电路板上,并且用胶纸来黏好。之后把电路板放到过塑机上进行过塑,约20~40次。若印得不太理想,但是基本脉络都在,则可以使用油性笔进行线路修补。
(3)腐蚀:把过塑好的电路板放到盐酸与双氧水的混合物上面进行腐蚀。腐蚀过后,电路板要用清水清洗。
(4)用洗板水把碳粉清理干净,此时可以看到清晰的铜线线路。 (5)对焊盘中间进行钻孔,钻孔之后就是最终完成的电路板。
图16 PCB图
16
5.2电路板焊接
电路板制作好后,便可以进行焊接了。焊接时要注意下问题:
(1)检查一下电路板铜线是否存在隔断,若存在,则进行焊锡把隔断的铜线线路进行相连。
(2)对照原理图以及PCB图来进行焊接。 (3)注意排阻和电容的极性,插座的方向等问题。 (4)焊锡时注意某些相近的管脚是否相连导致短路。
5.3电路板调试
在电路板调试的过程中,我们是分模块进行调试,同时软件和硬件相结合,最开始的是检查LCD模块的实现,在接上各元器件之后,整个电路表面运行良好,屏幕也无法显示。我们再次检查电路,最开始以为是焊接出现问题,便再进行一次电路的检查,同时调节液晶显示的对比度,以希望得到最好的我亮度显示。最终经反复检查,发现时液晶接口的第三口的滑动变阻器的封装问题导致该滑动变阻器无法正常工作,经过讨论我们将其进行跳线连接。
然后进行蜂鸣器报警功能的检查,通过改变限流电阻的大小并烧写合适程序,我们是蜂鸣器达到预想期的效果。
第三就是进行人体红外感应模块的调试,该电路和程序较为简单,较为容易实现。
第四总系统的调试,经过前一轮的奋战,我们将所有模块按设想结合起来,修改程序并经过多次测试终于实现了预定功能。
17
6、讨论及进一步研究和建议
本设计的功能主要包括,手动修改和清除密码,手动输入、修改和删除手机号码(最大容量为7个),输入密码错误3次报警,人体红外检测入侵及入侵报警,密码断电保护,GSM短信报警,手动复位。应该特别提到的是密码断电保护,由于修改密码后,如果没有断电保护装置的话,在下一次启动电路的时候,上一次的密码是不会保存的,这对密码的安全性有很大的威胁;在此次设计中,我们是通过AT24C02芯片可实现密码和手机号码的存储,进行掉电保护。同时GSM短信报警可以实现远距离监控。
18
7、课程设计心得
我们主要是运用单片机设计了一个报警系统,并且用模块化的设计方法来实现这个电路。在程序编写结束后,我们还对该程序进行了调试, 能按预期的效果进行模拟,基本完成课程设计的要求。
通过这次单片机课程设计,我们收获了很多:首先是对单片机的整个认识和把握,这个过程包括选题,利用c语言设计程序,选元器件,画电路原理图和PCB电路图,制板,到最后利用自制的板进行下载调试和检验,整个过程哪怕有一个细节错了,整个设计也就失败。我们一开始编好程序后,出现一些小错误导致无法完成编译。在解决程序设计问题之后,我们开始画电路原理图和PCB电路图,特别是在画PCB的时候,元器件的放置,布线出现很多问题。通过查阅相关资料,完成PCB之后我们又在制板的过程中遇到很多问题,如PCB线宽设置、焊盘直径设置等等,因为这些小问题会影响制板后电路板的制作效果,甚至会影响元器件的焊接。在焊接完程序片机后用单开发板进行下载调试和检验,最后才完成了这个课程设计。因为一开始没有经验,所以在整个过程中遇到了很多错误和麻烦,然而我们对一些错误却不能一步到位的判断出来,这就告诉我们设计一个实验或者做一件事情时,首先有一个大局意识,而且能够预见出现的问题和能够快速作出对这些问题或错误的反应与处理。同时通过这个实验,我们也深刻的发现理论与实际的区别,特别是电路的仿真与实际电路的运行有着很大的差别,往往能够在电脑进行成功仿真的电路在实际电路上却相差甚远。其次是通过写实验报告,我们也学到了一些东西,例如我们把我们的实验过程和成果弄出来了,如何把它们展示给其他人看,这就是规则的问题,虽然我们写的时候有时候会很麻烦,但是这也是方便大家交流的一种好方法。最后,通过这次设计实验,我们发现了编程软件有时候并不很好的放映实践情况,因此我们应该设计一个更好的软件来仿真,一个好的仿真软件可以减少对试验箱的依赖而且更方便仿真调试与程序的修改。
总之,这次实验不仅仅加强了我们的动手编程能力,也大大加强了我们团队合作以及设计的能力,使我们在理论学习和编程练习方面都获得了较大的收获。
19
附录
#include \"stdint.h\" #include \"string.h\" #include \"stm32f10x.h\" #include \"CoOS.h\" #include \"app.h\" #include \"BSP.h\"
//用户任务函数 //与开发板相关的函数
#include \"LED.h\" #include \"key_4x4.h\" #include \"vir_key.h\"
#include \"vir_intrude_check.h\" #include \"vir_warning.h\" #include \"vir_ext_memory.h\" #include \"vir_gui.h\" #include \"vir_gsm.h\"
#define MEM_BK20_NUM 10 #define MEM_BK20_SIZE 200 #define NULL 0
#define PHONE_IADD 8 #define PHONE_NADD 8 #define PHONE_MAX 7 #define PHONE_NMLEN 16
OS_STK StartUp_Stk[STARTUP_STK_SIZE]; OS_STK LED0_Stk[LED0_STK_SIZE];
//定义栈
//定义栈
//定义栈
OS_STK MainApp_Stk[MainApp_STK_SIZE];
OS_STK Alarm_Stk[Alarm_STK_SIZE]; //定义栈 uint8_t FlagFirstInter = 1;
typedef enum app_state {ST_PREVENT_DIS,ST_PREVENT_EN} APP_STATE; APP_STATE ST_Current = ST_PREVENT_DIS; OS_MMID MemBk20_ID;
unsigned int MemBk20[MEM_BK20_SIZE/4]; uint8_t Alarm_Flag = 0; uint8_t Alarm_EN = 0;
APP_STATE StPreventDis(void); APP_STATE StPreventEn(void); APP_STATE SetPassWord(void); uint8_t CheckPassWord(void); uint8_t SetIPhone(void); void Phone_Init(void);
20
void Task_StartUp(void *pdata) {
(void)pdata; BSP_Init(); GUI_Init(); VirKey_Init();
VirIntrudeCheck_Init(); VirWarning_Init(); VirExtMemory_Init();
// GUI_P8x16Str(0, 0,\"JJJJ\"); VirGsmInit();
MemBk20_ID = CoCreateMemPartition((U8*)MemBk20,20, MEM_BK20_NUM);
CoCreateTask(Task_LED0, (void *)0, LED0_PRIO,
&LED0_Stk[LED0_STK_SIZE-1], LED0_STK_SIZE);
CoCreateTask(Task_Alarm, (void *)0, Alarm_PRIO,
&Alarm_Stk[Alarm_STK_SIZE-1], Alarm_STK_SIZE);
CoCreateTask(Task_MainApp, (void *)0, MainApp_PRIO,
&MainApp_Stk[MainApp_STK_SIZE-1], MainApp_STK_SIZE);
CoExitTask(); }
void Task_LED0(void *pdata) {
while(1) {
LED_REG_ON;
CoTickDelay(500); LED_REG_OFF; CoTickDelay(500); } }
21
void Task_Alarm(void *pdata) {
uint8_t i;
uint8_t tab_buf[8]; char phone[13]={0}; uint8_t phone_time = 0; while(1) {
if(Alarm_EN == 1) {
if(VirIntrudeCheck()==1) {
CoTickDelay(20);
if(VirIntrudeCheck()==1) {
Alarm_Flag = 1; } } }
if(Alarm_Flag == 1) {
Alarm_Flag = 0;
VirWarningEnable(); if(phone_time % 10 == 0) {
VirExtMemoryRead(PHONE_IADD,tab_buf,8); for(i=1;i<=tab_buf[0];i++) {
VirExtMemoryRead(tab_buf[i]+2,phone,11); GUI_P8x16Str(32,6,phone);
GUI_DrawNum16x8_uint16_t(0,6,phone[11],2);
VirGsmSendChinaMsg(phone,\"534E519C75354FE163D091924F60FF1A7CFB7EDF68C06D4B523067094E0D660E52A8726951655BA4FF0C8BF78B6660D53002\");//);\"91775B664E4B5BB6\"华农电
信提醒你:有不速之客!
}
}GUI_P8x16Str(0,6,\" \"); CoTimeDelay(0,0,30,0); VirWarningDisable(); phone_time++; }
CoTickDelay(80); } }
22
void Task_MainApp(void *pdata) {
// VirExtMemoryWrite(0,\"000000\// Phone_Init(); while(1) {
switch(ST_Current) {
case ST_PREVENT_DIS:
ST_Current = StPreventDis(); break;
case ST_PREVENT_EN:
ST_Current = StPreventEn(); break; default:
ST_Current = ST_PREVENT_EN; break; }
CoTickDelay(50); } }
APP_STATE StPreventDis(void) {
char key_val; uint8_t res;
if(FlagFirstInter == 1) {
Alarm_EN = 0;
FlagFirstInter = 0; GUI_CLS();
GUI_DrawHz16x16(16,2,HzBaoDiao,6); GUI_DrawHz16x16(0,4,HzDiaoYu,8); }
key_val = VirKeyValGet(2000); if(key_val != '#') {
return ST_PREVENT_DIS; }
GUI_CLS();
23
GUI_DrawHz16x16(24,0,HzZaYang,5); GUI_DrawHz16x16(8,2,HzFanDao,3); GUI_DrawHz16x16(8,4,HzGaiMiMa,5); GUI_DrawHz16x16(8,6,HzSheZhiSJ,5); while(1) {
key_val = VirKeyValGet(20000); if(key_val == KEY_NULL) {
FlagFirstInter = 1; return ST_PREVENT_DIS; }
switch(key_val) {
case 'A':
FlagFirstInter = 1; return ST_PREVENT_EN; //break;
case 'B':
GUI_CLS();
GUI_DrawHz16x16(24,2,HzShuJiuMiMa,5); CoTimeDelay(0,0,1,0); res = CheckPassWord(); if(res == 1) {
SetPassWord();
} FlagFirstInter = 1; return ST_PREVENT_DIS; //break;
case 'C':
res = CheckPassWord(); if(res == 1) {
SetIPhone();
} FlagFirstInter = 1; return ST_PREVENT_DIS; //break;
case '*':
FlagFirstInter = 1;
24
return ST_PREVENT_DIS; //break; default:
//continue; break; } } }
APP_STATE StPreventEn(void) {
char key_val; uint8_t res;
if(FlagFirstInter == 1) {
Alarm_EN = 1;
FlagFirstInter = 0; GUI_CLS();
GUI_DrawHz16x16(16,2,HzYouGou,10); }
key_val = VirKeyValGet(2000); if(key_val != '#') {
return ST_PREVENT_EN; }
res = CheckPassWord(); if(res == 0) {
FlagFirstInter = 1; return ST_PREVENT_EN; }
else if(res == 1) {
FlagFirstInter = 1; return ST_PREVENT_DIS; }
return ST_PREVENT_EN; }
uint8_t CheckPassWord(void) {
uint8_t i;
char key_val;
25
char * ppw_buf1; char * ppw_buf2; char * ppw_buf3;
uint8_t in_times = 1; int cmp_res;
while(ppw_buf1 == NULL) {
ppw_buf1 = (char *)CoGetMemoryBuffer(MemBk20_ID); CoTickDelay(50); }
while(ppw_buf2 == NULL) {
ppw_buf2 = (char *)CoGetMemoryBuffer(MemBk20_ID); CoTickDelay(50); }
while(ppw_buf3 == NULL) {
ppw_buf3 = (char *)CoGetMemoryBuffer(MemBk20_ID); CoTickDelay(50); }
for(i=0;i<7;i++) {
ppw_buf1[i] = 0; ppw_buf2[i] = 0; ppw_buf3[i] = 0; }
i = 0;
VirExtMemoryRead(0,ppw_buf2,6); while(1) {
GUI_CLS();
GUI_DrawHz16x16(32,2,HzInPassWord,4); GUI_DrawHz16x16(8,6,HzQueRen,3);
GUI_DrawHz16x16(72,6,HzShanChu,3);
GUI_P8x16Str(40,4,ppw_buf3); key_val = VirKeyValGet(20000);
if(key_val >= '0' && key_val <= '9' && i < 6) {
ppw_buf1[i] = key_val; ppw_buf3[i++] = '*'; }
else if(key_val == 'D') {
26
if(i > 0) {
i--; }
ppw_buf1[i] = 0; ppw_buf3[i] = 0; }
else if(key_val == '#') {
cmp_res = strncmp(ppw_buf1, ppw_buf2, 6); if(cmp_res == 0) {
CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf1); CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf2); CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf3); return 1; } else {
switch(in_times) {
case 1:
GUI_CLS();
GUI_DrawHz16x16(16,0,HzPWRong1,21); CoTimeDelay(0,0,2,0); break; case 2:
GUI_CLS();
GUI_DrawHz16x16(16,0,HzPWRong2,17);
CoTimeDelay(0,0,2,0); break; case 3:
Alarm_Flag = 1; GUI_CLS();
GUI_DrawHz16x16(24,2,HzPWRong3,6); CoTimeDelay(0,0,10,0);
CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf1); CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf2); CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf3);
return 0; //break;
27
default: break; }
in_times++; for(i=0;i<7;i++) {
ppw_buf1[i] = 0; ppw_buf3[i] = 0; }
i = 0; } }
else if( (key_val == KEY_NULL) || (key_val == '*')) {
CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf1); CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf2); CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf3); return 0; } else {
continue; } } }
uint8_t SetPassWord(void) {
uint8_t i; char key_val; char * ppw_buf1; char * ppw_buf2; char * ppw_buf3;
uint8_t in_times = 1; int cmp_res;
while(ppw_buf1 == NULL) {
ppw_buf1 = (char *)CoGetMemoryBuffer(MemBk20_ID); CoTickDelay(50); }
while(ppw_buf2 == NULL) {
28
ppw_buf2 = (char *)CoGetMemoryBuffer(MemBk20_ID); CoTickDelay(50); }
while(ppw_buf3 == NULL) {
ppw_buf3 = (char *)CoGetMemoryBuffer(MemBk20_ID); CoTickDelay(50); }
for(i=0;i<7;i++) {
ppw_buf1[i] = 0; ppw_buf2[i] = 0; ppw_buf3[i] = 0; }
i = 0; while(1) {
GUI_CLS();
GUI_DrawHz16x16(24,0,HzShuXinMiMa,5); GUI_DrawHz16x16(8,6,HzQueRen,3);
GUI_DrawHz16x16(72,6,HzShanChu,3); GUI_P8x16Str(40,3,ppw_buf3); key_val = VirKeyValGet(20000);
if(key_val >= '0' && key_val <= '9' && i < 6) {
if(in_times == 1) {
ppw_buf1[i] = key_val; }
else if(in_times == 2) {
ppw_buf2[i] = key_val; }
ppw_buf3[i++] = '*'; }
else if(key_val == 'D') {
if(i > 0) {
i--; }
if(in_times == 1) {
29
ppw_buf1[i] = 0; }
else if(in_times == 2) {
ppw_buf2[i] = 0; }
ppw_buf3[i] = 0; }
else if(key_val == '#') {
if(i == 6) {
if(in_times == 1) {
in_times = 2; for(i=0;i<7;i++) {
ppw_buf3[i] = 0; }
i = 0; }
else if(in_times == 2) {
cmp_res = strncmp(ppw_buf1, ppw_buf2, 6); if(cmp_res == 0) {
VirExtMemoryWrite(0,ppw_buf2,6); GUI_CLS();
GUI_DrawHz16x16(16,2,HzCrPWSucs,7); CoTimeDelay(0,0,2,0);
CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf1); CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf2); CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf3); return 1; } else {
in_times = 1; for(i=0;i<7;i++) {
ppw_buf1[i] = 0; ppw_buf2[i] = 0; ppw_buf3[i] = 0; }
30
i = 0; GUI_CLS();
GUI_DrawHz16x16(32,2,HzRInPassWord,4); CoTimeDelay(0,0,2,0); } } } }
else if( (key_val == KEY_NULL) || (key_val == '*')) {
CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf1); CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf2); CoFreeMemoryBuffer(MemBk20_ID, (void* )ppw_buf3); return 0; } else {
continue; } } }
char PBuf1[14]; char PBuf2[14]; char PBuf3[14];
uint8_t SetIPhone(void) {
uint8_t i,index = 1; uint8_t focus = 0; uint8_t cmp_res; char key_val;
// char p_buf1[14]; // char p_buf2[14]; // char p_buf3[14]; char p_index[8]; // char * p_buf1; // char * p_buf2; // char * p_buf3; // char * p_index;
// while(p_buf1 == NULL) // {
// p_buf1 = (char *)CoGetMemoryBuffer(MemBk20_ID);
31
// CoTickDelay(50); // }
// while(p_buf2 == NULL) // {
// p_buf2 = (char *)CoGetMemoryBuffer(MemBk20_ID); // CoTickDelay(50); // }
// while(p_buf3 == NULL) // {
// p_buf3 = (char *)CoGetMemoryBuffer(MemBk20_ID); // CoTickDelay(50); // }
// while(p_index == NULL) // {
// p_index = (char *)CoGetMemoryBuffer(MemBk20_ID); // CoTickDelay(50); // }
for(i=0;i<14;i++) {
PBuf1[i] = 0; PBuf2[i] = 0; PBuf3[i] = 0; p_index[i] = 0; }
VirExtMemoryRead(PHONE_IADD,p_index,8); while(1) {
while(1) {
VirExtMemoryRead(p_index[index],PBuf1,14); VirExtMemoryRead(p_index[index+1],PBuf2,14); VirExtMemoryRead(p_index[index+2],PBuf3,14); GUI_CLS();
GUI_DrawHz16x16(32,0,HzDQHM,4); GUI_P8x16Str(8,2,PBuf1); GUI_P8x16Str(8,4,PBuf2); GUI_P8x16Str(8,6,PBuf3);
key_val = VirKeyValGet(20000);
if(key_val >= '1' && key_val <= '7') {
focus = key_val - 48; break; }
32
else if(key_val == 'A') {
if(index > 1) {
index--; continue; } }
else if(key_val == 'B') {
if(index < PHONE_MAX - 2) {
index++; continue; } }
else if( (key_val == KEY_NULL) || (key_val == '*')) {
// CoFreeMemoryBuffer(MemBk20_ID, (void* )p_buf1); // CoFreeMemoryBuffer(MemBk20_ID, (void* )p_buf2); // CoFreeMemoryBuffer(MemBk20_ID, (void* )p_buf3); // CoFreeMemoryBuffer(MemBk20_ID, (void* )p_index); return 1; } else {
//continue; } }
for(i=2;i<14;i++) {
PBuf1[i] = 0; }
i = 0; while(1) {
GUI_CLS();
GUI_DrawHz16x16(32,2,HzSRHM,4); GUI_DrawHz16x16(8,6,HzQueRen,3);
GUI_DrawHz16x16(72,6,HzShanChu,3);
GUI_P8x16Str(20,4,&PBuf1[2]); key_val = VirKeyValGet(20000);
if(key_val >= '0' && key_val <= '9' && i < 11)
33
{
PBuf1[i+2] = key_val; i++; }
else if(key_val == 'D') {
if(i > 0) {
i--; }
PBuf1[i+2] = 0; }
else if(key_val == '#') {
if(i == 11) {
cmp_res = strncmp(&PBuf1[2], \"00000000000\ if(cmp_res == 0) {
if(focus < p_index[0]) {
for(i=focus;i < p_index[0]; i++) {
VirExtMemoryRead(p_index[i+1]+2,&PBuf1[2],11); VirExtMemoryWrite(p_index[i]+2,&PBuf1[2],11); }
for(i=2;i<14;i++) {
PBuf1[i] = 0; }
focus = p_index[0]; PBuf1[0] = focus + 48;
VirExtMemoryWrite(p_index[focus],PBuf1,14); p_index[0]--; }
else if(focus == p_index[0]) {
for(i=2;i<14;i++) {
PBuf1[i] = 0; }
PBuf1[0] = focus + 48;
VirExtMemoryWrite(p_index[focus],PBuf1,14); p_index[0]--;
34
} } else {
if(focus > p_index[0]) {
p_index[0]++;
focus = p_index[0]; }
PBuf1[0] = focus + 48;
VirExtMemoryWrite(p_index[focus],PBuf1,14); }
VirExtMemoryWrite(PHONE_IADD,p_index,8); GUI_CLS();
GUI_DrawHz16x16(32,2,HzSetSucss,4); CoTimeDelay(0,0,2,0); break; } }
else if( (key_val == KEY_NULL) || (key_val == '*')) {
break; } else {
//continue; } } } }
void Phone_Init(void) {
uint8_t i;
uint8_t add_tab[8] = {0,16,32,48,64,80,96,112}; char data_tab[2] = {0,' '};
for(i=PHONE_IADD;i<120;i++) {
VirExtMemoryWrite(i,data_tab,14); }
VirExtMemoryWrite(PHONE_IADD,add_tab,8); for(i=1;i<8;i++) {
35
data_tab[0] = i + 48;
VirExtMemoryWrite(add_tab[i],data_tab,2); } } /**
*********************************************************************************************************
* @ 函数功能:1分钟定时器 * @
* @ 说明: 本函数为独立运行的任务,功能相当于控制板程序中1s定时器中断服务例程中用于高低压告警的1分定时功能 * @
********************************************************************************************************* */ /**
*********************************************************************************************************
* @ 函数功能:低压告警处理程序 * @
* @ 说明: 本函数为独立运行的任务,功能相当于控制板程序中低压告警状态处理程序 uchar St_5_L_Warning(void) 的部分程序
* @
********************************************************************************************************* */
36
参考文献
[1].李广第等.单片机基础.北京航天航空大学出版. [2].吴国敬等.单片机应用和技术.中国电力出版.
[3].王卫星等.单片机原理与应用开发技术.中国水利水电出版社. [4].康华光等.电子技术基础模拟部分.高等教育出版社. [5].康华光等.电子技术基础数字部分.高等教育出版社.
37
因篇幅问题不能全部显示,请点此查看更多更全内容