在线时间163 小时
UID388081
注册时间2012-9-11
NXP金币0
TA的每日心情 | 开心 2018-7-24 08:30 |
---|
签到天数: 50 天 连续签到: 1 天 [LV.5]常住居民I
金牌会员
 
- 积分
- 1713
- 最后登录
- 2019-12-7
|
本帖最后由 haifeng-388081 于 2017-4-16 12:45 编辑
本节主要是完成整个项目的工作,之前各个模块功能的测试都已经发贴了,具体的请去下面地址。
【LPC54114】学习+驱动NOKIA 5110屏幕
https://www.nxpic.org.cn/module/forum/thread-610143-1-1.html
【LPC54114】学习+RC522读卡,NOKIA 5110屏幕显示
https://www.nxpic.org.cn/module/forum/thread-610148-1-1.html
【LPC54114】学习+软件模拟IIC读写AT24C02
https://www.nxpic.org.cn/module/forum/thread-610154-1-1.html
【LPC54114】学习+4x4矩阵键盘使用5110显示
https://www.nxpic.org.cn/module/forum/thread-610159-1-1.html
本次设计的门禁系统可以验证的方式有IC卡和密码,其中任意一个通过验证就可以开门,系统设定管理员身份,用于对整个控制系统进行设置和管理,比如:可以修改系统的缺省密码,(系统烧录程序后,默认有两个密码:一个管理员密码777777,一个用户密码123456,管理员密码不能用于开门。这两个密码都可以修改。)添加或删除管理员IC卡,添加或删除用户密码。可以添加的用户密码和IC卡的个数与EEPROM的容量有关,作者使用的是AT24C02,容量较小,若改为大容量的可以存储更多的密码和IC卡,目前实现的功能主要有
按设置编号分:
10:修改管理员缺省密码
11:修改用户缺省密码
20:添加管理员IC卡
21:删除管理员IC卡
22:添加用户IC卡
23:按编号逐个删除用户IC卡
24:删除全部用户IC卡
25:添加用户密码
26:删除单个用户密码
27:删除全部用户密码
其他功能正在开发。视频地址
https://v.youku.com/v_show/id_XM ... j.8428770.3416059.1
系统的硬件原理图。指示灯用于指示状态和模拟开门继电器。
部分图片,具体的请看视频:
部分函数:
主函数
- /**
- * This is template for main module created by MCUXpresso Project Generator. Enjoy!
- **/
- #include <stdlib.h>
- #include "delay.h"
- #include "rc522_ctrl.h"
- #include "rc522.h"
- #include "rc522_main.h"
- #include "key_4x4.h"
- #include "beep_led.h"
- #include "24cxx.h"
- #include "myiic.h"
- #include "string.h"
- #include "system_ctrol.h"
- #include "nokia_5110.h"
- #include "definee.h"
- #include "display.h"
- #include "string.h"
- #include "relay.h"
- uint8_t KEY_LED_STATE;//背光灯状态 在main中测试
- //要写入到24c02的字符串数组
- const uint8_t TEXT_Buffer[]={"MiniSTM32F103RC"};
- const uint8_t text_pass[]={"12345"};//测试密码用
- uint8_t at24_read_temp[10];//从AT24C02中读出数据临时存放
- extern unsigned char AVR_bmp[];
- extern unsigned char home[];
- uint8_t receive_key_temp[10];
- uint8_t receive_key_cut_temp[10];
- uint8_t Admin_Mode;//管理员模式,
- uint8_t System_Display;//系统显示
- extern INT8U ID_ASC[8];////////////////////////////////////////////////////
- extern uint8_t ID_ASC_UINT8[8];//将卡号转换成uint8_t数据类型后的数组
- uint8_t TimerCounter=0;//定时器3定时计数用于按键背光,
- uint8_t Timer_Couner_State=0;//操作延时轮换状态
- uint8_t Open_Close_State=1;//开锁或上锁状态******1——为上锁状态,2为开锁状态
- /*
- 0---什么也不做
- 1---开始计数
- 2---计数时间到
- 3---有操作,停止计数
- */
- //矩阵键盘测试
- int main(void)
- {
- uint8_t k;
- uint8_t n;
- uint8_t Admin_Code;
- uint8_t ii;//长时间无操作提示延时用
- static uint32_t time_out_counter;//操作超时计数
- LED_Init(); //初始化与LED连接的硬件接口
- BEEP_Init();
- LCD_init(); //初始化液晶
- LCD_clear();
- IC_SPI_Init(); //RC522初始化
- // RELAY_Init(); //继电器初始化
- // DC_MOTOR_Init();//直流电机初始化
- // STEPPER_MOTOR_Init();//步进电机初始化
- // AH3144_Init(); //AAH3144霍尔中断初始化
- AT24CXX_Init(); //IIC初始化
- // KEY_LED_Init();//按键LED背光初始化
- // OPEN_BUTTON_Init();//开门按键初始化
- BEEP_RESET();//初始时关闭
- // LED0=0;//初始时关闭
- // LED1=0;//初始时关闭
-
-
- // KEY_LED_Init(); //键盘背光初始化
- // STEPPER_MOTOR_Open(100);
- // delay_ms(1000);
- // delay_ms(1000);
- // STEPPER_MOTOR_Close(100);
- //DC_MOTOR_Open(40);
- // while(1)//测试使用
- // {
- // KEY_LED_Reset();//背光亮//测试用
- // delay_ms(1000);
- // KEY_LED_Set();//背光亮//测试用
- // delay_ms(1000);
- // uint8_t key;
- // key=KeyPro();
- // if(key!='G')
- // {
- // BEEP_Rest();//关闭蜂鸣器
- // RELAY_Set;
- // delay_ms(1000);
- // RELAY_Reset;
- // delay_ms(1000);
- // DC_MOTOR_Open(10);
- // delay_ms(1000);
- // DC_MOTOR_Close(10);
- // delay_ms(1000);
- // }
- // }
- while(Factory_Rest())
- {
- LCD_write_english_string(0,0,"Factory RES. FaiL");
- }
- while(1)
- {
- LCD_draw_bmp_pixel(0,0,home,84,48);//j显示“家”
- System_Display=1;//显示“家”时有按键,清除屏幕显示
- n=Password_Change(receive_key_temp);
- if(n==Input_Too_Long)
- {
- dislay_input_too_long();//提示输入太长
- LCD_write_english_string(0,5," ");//清除最下面一行的输入显示区
- Clear_String(receive_key_temp,10);
- ERROR_BEEP_LED();//密码错误声光提示
- }
- if(n==Input_Finash)
- {
-
- if(receive_key_temp[0]=='*')//设置模式
- {
- AT24CXX_Read(240,at24_read_temp,10); //从EEPROM中读出管理员密码
- Clear_String(receive_key_cut_temp,10);
- Cut_String(receive_key_temp,receive_key_cut_temp);//清除临时数组内的数据
- if(strcmp(receive_key_cut_temp,at24_read_temp)==0)//管理员密码输入正确
- {
- admin_password_ok();//提示管理员密码正确
- Clear_String(receive_key_cut_temp,10);//清除临时数组内的数据
- LCD_write_english_string(0,5," ");//清除最下面一行的输入显示区
- Admin_Mode=ADMIN_MODE;
- Timer_Couner_State=1;//无操作延时——定时器开始计数
- }
- else//管理员密码输入错误
- {
- admin_password_error();
- Clear_String(receive_key_cut_temp,10);//清除临时数组内的数据
- LCD_write_english_string(0,5," ");//清除最下面一行的输入显示区
- Admin_Mode=0;
- }
- while(Admin_Mode==ADMIN_MODE)
- {
- if(Timer_Couner_State==2)//无操作延时时间到
- {
- Timer_Couner_State=0;//回到初始状态0
- time_out();//提示长时间无操作,退出
- for(ii=0;ii<15;ii++)
- Delay_ms(200);
- ERROR_BEEP_LED();//错误声光报警
- break;
- }
-
- n=Password_Change(receive_key_temp);
- if(n==Input_Finash)
- {
- if(receive_key_temp[0]=='*')//设置模式
- {
- // time_out_counter=0;//清除计数
- Timer_Couner_State=3;//有操作退出无操作延时模式
- Clear_String(receive_key_cut_temp,10);
- Cut_String(receive_key_temp,receive_key_cut_temp);//清除临时数组内的数据
- Admin_Code=(uint8_t)atof(receive_key_cut_temp);//将字符串转换成数字并强制转换成uint8_t型
- switch(Admin_Code)
- {
- case ADD_ADMIN_IC:
- {
- ad_admin_ic();//添加管理员IC卡
- }
- break;//添加管理员卡
- case ADD_USER_IC:
- {
- // ad_user_ic();//添加用户卡
- adminic_add_ic();
- }break;//添加用户卡
- case ADD_USER_PASSWORD:
- {
- add_user_password();//添加用户密码
- }
- break;
- case DELETE_ALL_USER_PASSWORD:
- {
- deleting_all_user_password();//删除所有用户密码
- }
- break;//删除所有用户密码
- case DELETE_USER_PASSWORD:
- {
- deleting_user_pass();
- }
- break;//删除指定的用户密码
- case DELETE_ADMIN_IC:
- {
- delete_admin_ic();
- }
- break;//删除管理员卡
- case DELETE_USER_IC: //按用户卡编号删除用户卡
- {
- delete_user_ic();
- }break;//删除用户卡
- // case DELETE_NUM_IC: break;
- case DELETE_ALL_USER_IC:
- {
- delete_all_user_ic();
- }break;//删除所有用户卡
- case CHANGE_ADMIN_PASSWORD: //修改管理员密码
- {
- change_admin_password();//显示提示
- Change_ADMIN_Password();
- }break;//修改管理员密码
- case CHANGE_USER_PASSWORD: //修改用户密码
- {
- change_auser_password();//显示提示
- Change_USER_Password();
- }break;//修改用户密码
- default: break;
-
- }break;
- }
- else break;
- }
- }
- }
- else //密码开门模式
- {
- //先对比系统内置的用户密码
-
- Clear_String(receive_key_cut_temp,10);//清除临时数组内的数据
- Cut_String(receive_key_temp,receive_key_cut_temp);
- AT24CXX_Read(USER_PASSWPRD,at24_read_temp,10); //从EEPROM中读出数据 datatemp用户密码
- if(strcmp(receive_key_cut_temp,at24_read_temp)==0)
- {
- OK_BEEP_LED();//密码成功声光提示
- user_password_ok();//提示用户密码正确,开门
- Open_Close_State=2;//设为开锁状态
- RELAY_Open();//开锁程序
- Clear_String(receive_key_cut_temp,10);//清除临时数组内的数据
- Delay_ms(1000);
- }
- else
- {
- for(k=0;k<USER_MAX_COUNTER;k++)
- {
- AT24CXX_Read(USER_PASSWORD_START+k*10,at24_read_temp,10); //从EEPROM中读出数据 datatemp用户密码
- if(strcmp(receive_key_cut_temp,at24_read_temp)==0)
- {
- OK_BEEP_LED();//密码成功声光提示
- user_password_ok();//提示用户密码正确,开门
- Open_Close_State=2;//设为开锁状态
- RELAY_Open();//开锁程序
- // DC_MOTOR_Open(10);//开锁程序
- // STEPPER_MOTOR_Open(100);//开锁程序
- // KEY_LED_Reset();//背光亮//测试用
- Clear_String(receive_key_cut_temp,10);//清除临时数组内的数据
- Delay_ms(1000);
- break;//跳出密码比对
- }
- if(k>=USER_MAX_COUNTER-1)//对比到最后一组密码时还没有相同的密码
- {
- ERROR_BEEP_LED();//密码错误声光提示
- user_password_error();//提示用户密码错误,重新输入
- Clear_String(receive_key_cut_temp,10);//清除临时数组内的数据
-
- }
-
- }
-
- }
- LCD_write_english_string(0,5," ");//清除最下面一行的输入显示区
- }
- }
- else
- {
- ic_read_open();//刷卡开门模式
- }
- }
- }
复制代码 修改密码函数
- /********************************************************************
- 函数名称:uint8_t Password_Change()
- 功 能:根据按键来进行模式和功能的设置
- 参 数:无
- 返 回 值:
- 0:成功
- 1:密码输入个数过长
- 2:密码不匹配
- 3:输入超时
- 说 明:无
- *********************************************************************/
- uint8_t Password_Change(uint8_t *key_temp)
- {
- uint8_t t;//用于清除接收按键的临时数组
- static uint8_t h=0;//i用于将按键值存入临时数组计数,j用于清除临时数组计数
-
- key=KeyPro(); //读取按键值
- if(key!='G') //有有效键按下时
- {
- // LCD_clear();
- if(System_Display==1)
- {
- LCD_clear();
- System_Display=0;
- }
- if(key=='*')//以‘*’开关的输入为进入设置模式
- {
- Set_Mode=SET_MODE;//进入设置模式标志
- Key_Temp[h]=key;//将按键值存入按键临时数组中
- h++;
- LCD_write_english_string(0,5," ");//清空原来的显示
- LCD_write_english_string(0,5,Key_Temp); //显示输入的按键值
- }
- else if(key>='0'&&key<='9')//以‘*’开关的输入为进入设置模式
- {
- Set_Mode=PASSWORD_MODE;//进入设置模式标志
- Key_Temp[h]=key;//将按键值存入按键临时数组中
- Key_Temp_Mark[h]='*';//将按键值存入按键临时数组中
- h++;
- LCD_write_english_string(0,5," ");//清空原来的显示
- LCD_write_english_string(0,5,Key_Temp_Mark); //显示输入的按键值
- }
- while(Set_Mode==SET_MODE)
- {
- key=KeyPro(); //读取按键值
- if(key!='G')
- {
- Key_Temp[h]=key;//将按键值存入按键临时数组中
- LCD_write_english_string(0,5," ");//清空原来的显示
- LCD_write_english_string(0,5,Key_Temp); //显示输入的按键值
- h++;
- if(key=='#')//‘#’为输入结束标志
- {
- h=0;//清除之前输入的数据计数
- Set_Mode=0;//返回模式0
- strlcpy(key_temp,Key_Temp,sizeof(Key_Temp));
- Clear_String(Key_Temp,sizeof(Key_Temp));//清除Key_Temp中的所有数据
- return Input_Finash;//输入完成
- }
- if(h>PASSWORD_MAX_BIT_NUM) //+1是为了多出来的‘*’
- {
- h=0;//清除之前输入的数据计数
- Set_Mode=0;//返回模式0
- Clear_String(Key_Temp,sizeof(Key_Temp));//清除Key_Temp中的所有数据
- // ERROR_BEEP_LED();//密码错误声光提示
- return Input_Too_Long; //密码输入个数过长
- }
- }
-
- }
- while(Set_Mode==PASSWORD_MODE)
- {
- key=KeyPro(); //读取按键值
- if(key!='G')
- {
- Key_Temp[h]=key;//将按键值存入按键临时数组中
- Key_Temp_Mark[h]='*';//将按键值存入按键临时数组中
- LCD_write_english_string(0,5," ");//清空原来的显示
- LCD_write_english_string(0,5,Key_Temp_Mark); //显示输入的按键值
- h++;
- if(key=='#')//‘#’为输入结束标志
- {
- h=0;//清除之前输入的数据计数
- Set_Mode=0;//返回模式0
- strlcpy(key_temp,Key_Temp,sizeof(Key_Temp));
- Clear_String(Key_Temp,sizeof(Key_Temp));//清除Key_Temp中的所有数据
- Display_Space(Key_Temp_Mark,PASSWORD_MAX_BIT_NUM);
- return Input_Finash;//输入完成
- }
- if(h>PASSWORD_MAX_BIT_NUM) //+1是为了多出来的‘*’
- {
- h=0;//清除之前输入的数据计数
- Set_Mode=0;//返回模式0
- Clear_String(Key_Temp,sizeof(Key_Temp));//清除Key_Temp中的所有数据
- Display_Space(Key_Temp_Mark,PASSWORD_MAX_BIT_NUM);
- // ERROR_BEEP_LED();//密码错误声光提示
- return Input_Too_Long; //密码输入个数过长
- }
- }
-
- }
-
-
-
- }
-
- }
复制代码 添加用户卡函数
- /********************************************************************
- 函数名称:uint8_t ic_read_at24cx(uint8_t add)
- 功 能:将读到的卡号写入AT24CX
- 参 数:uint8_t add,要写入的AT24CX的地址
- 返 回 值:返回TRUE
- 说 明:无
- *********************************************************************/
- uint8_t ad_admin_ic()
- {
- uint8_t at24_read_temp[10];
- uint8_t clear_at24[10]={0};
- uint32_t time_counter=0;//操作超时计数
- uint8_t key_temp;//按键临时存储
- uint8_t ii;//长时间无操作提示延时用
- // add_admin_ic();//提示添加管理员卡
- BEEP_Rest();
- LCD_clear();
- Timer_Couner_State=1;//无操作延时开始计时
- while(IC_READ()!=TRUE) //等待读卡
- {
- key_temp=KeyPro();
- if(key_temp=='*')//“*”键按下时,退出操作
- {
- time_counter=0;
- return 0;
- }
- add_admin_ic();//提示添加管理员卡
- // time_counter++;
- // if(time_counter>500)
- // {
- // time_counter=0;
- // return TIME_OUT;//操作超时,退出
- // }
- if(Timer_Couner_State==2)//无操作延时时间到
- {
- Timer_Couner_State=0;//回到初始状态0
- ERROR_BEEP_LED();//错误声光报警
- time_out();//提示长时间无操作,退出
- for(ii=0;ii<15;ii++)
- Delay_ms(100);
-
- return TIME_OUT;//返回长时间无操作标志
- }
- }
- Timer_Couner_State=3;//有操作退出无操作延时模式
- OK_BEEP_LED();//正确声光报警
- // LCD_clear();
- AT24CXX_Write(ADMIN_IC,clear_at24,sizeof(clear_at24));//将EEPROM的210地址清空,用来存储管理员卡号
- AT24CXX_Write(ADMIN_IC,ID_ASC_UINT8,sizeof(ID_ASC_UINT8));//将管理员卡号写入EEPROM的210地址
- AT24CXX_Read(ADMIN_IC,at24_read_temp,10); //从EEPROM中读出数据 datatemp用户密码
- add_admin_ic_ok();//提示添加管理员卡成功
- LCD_write_english_string(0,5,ID_ASC_UINT8);//清除最下面一行的输入显示区
- Delay_ms(1000);
- return TRUE;
- //读卡成功
-
- }
复制代码 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
|
|