GSM 远程控制密码锁的设计的工程文件程序(C语言编写),详情见附件,欢迎评论,51单片机制作
单片机源程序如下:
- #include <reg52.h> //调用单片机头文件
- #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
- #define uint unsigned int //无符号整型 宏定义 变量范围0~65535
- uchar value,i; //变量
- #include "lcd1602.h"
- #include "iic.h"
- uchar flag_lj_en; //边加
- uchar flag_lj_en_value;
- sbit relay = P2^2; //继电器定义
- sbit beep = P3^3; //蜂鸣器定义
- sbit beiguang = P2^3; //背光
- //sbit red = P2^4;
- uint flag_time;
- uint flag_guan;
- sbit VBUSY= P3^4; //语音模块IO口定义
- sbit VSDA = P3^5;
- sbit VCS = P3^6;
- sbit VSCL = P3^7;
- uchar lcd_i;
- uchar dis_lcd[7]={0};
- uchar dis_smg[11];
- uchar idata password1[7]={3,2,1,3,2,1}; //密码保存
- uchar idata password_bj[7]={1,2,3,4,5,6}; //密码比较
- uchar code password_r1[6] = {3,2,1,3,2,1} ;
- uchar code password_gl[6] = {5,2,0,0,2,5} ;
- uchar idata password_xg[6]; //密码修改
- uchar flag_password; //密码正确否
- uchar flag_password_cichu1;//密码错误次数
- bit flag_200ms=1; //200ms标志位
- uchar phone1_i = 0; //电话号码是多少位
- uchar phone1_call[11]={1,8,3, 2,4,1,3, 1,8,3,2};
- uchar key_can; //键值
- uchar flag_mm1; //判断密码是否正确
- uchar flag_en1;
- uchar menu_1;
- char menu_i ;
- uchar smg_i;
- /***********************1ms延时函数*****************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /***************把数组清空**********************/
- void clear1_shuzu(uchar *p,uchar num)
- {
- for(i=0;i<num;i++)
- p[i] = ' ';
- }
- #include "iic.h"
- #include "gsm.h"
- void key() //独立按键程序
- {
- static uchar key_new = 0, key_l;
- key_can = 20; //按键值还原
- P1 = 0x0f;
- if((P1 & 0x0f) != 0x0f) //按键按下
- {
- delay_1ms(1); //按键消抖动
- if(((P1 & 0x0f) != 0x0f) && (key_new == 1))
- { //确认是按键按下
- key_new = 0; //清零
- key_l = (P1 | 0xf0); //矩阵键盘扫描
- P1 = key_l; //读P1端口的值
- switch(P1)
- {
- case 0xee: key_can = 10; break; //得到按键值
- case 0xde: key_can = 7; break; //得到按键值
- case 0xbe: key_can = 4; break; //得到按键值
- case 0x7e: key_can = 1; break; //得到按键值
-
- case 0xed: key_can = 0; break; //得到按键值
- case 0xdd: key_can = 8; break; //得到按键值
- case 0xbd: key_can = 5; break; //得到按键值
- case 0x7d: key_can = 2; break; //得到按键值
-
- case 0xeb: key_can = 3; break; //得到按键值
- case 0xdb: key_can = 6; break; //得到按键值
- case 0xbb: key_can = 9; break; //得到按键值
- case 0x7b: key_can = 11; break; //得到按键值
-
- case 0xe7: key_can = 15; break; //得到按键值
- case 0xd7: key_can = 14; break; //得到按键值
- case 0xb7: key_can = 13; break; //得到按键值
- case 0x77: key_can = 12; break; //得到按键值
- }
- beep = 0;
- delay_1ms(20);
- beep = 1;
- }
- }
- else
- {
- key_new = 1; //无键按下
- flag_lj_en = 0;
- }
- }
- void write_mm() //保存密码
- {
- write_24c02_8(6,0,password1);
- write_24c02(30,phone1_call[0]) ;
- write_24c02(31,phone1_call[1]) ;
- write_24c02(32,phone1_call[2]) ;
- write_24c02(33,phone1_call[3]) ;
- write_24c02(34,phone1_call[4]) ;
- write_24c02(35,phone1_call[5]) ;
- write_24c02(36,phone1_call[6]) ;
- write_24c02(37,phone1_call[7]) ;
- write_24c02(38,phone1_call[8]) ;
- write_24c02(39,phone1_call[9]) ;
- write_24c02(40,phone1_call[10]) ;
- write_24c02(58,phone1_i) ;
- }
- void read_mm() //读出密码
- {
- read_24c02_8(6,0,password1);
- phone1_call[0] = read_24c02(30);
- phone1_call[1] = read_24c02(31);
- phone1_call[2] = read_24c02(32);
- phone1_call[3] = read_24c02(33);
- phone1_call[4] = read_24c02(34);
- phone1_call[5] = read_24c02(35);
- phone1_call[6] = read_24c02(36);
- phone1_call[7] = read_24c02(37);
- phone1_call[8] = read_24c02(38);
- phone1_call[9] = read_24c02(39);
- phone1_call[10] = read_24c02(40);
- phone1_i = read_24c02(58);
- }
- /***************把数组清空**********************/
- void clear_shuzu(uchar *p)
- {
- for(i=0;i<8;i++)
- p[i] = 0;
- }
- /*************定时器0初始化程序***************/
- void time_init()
- {
- EA = 1; //开总中断
- TMOD = 0X01; //定时器0、工作方式1
- ET0 = 1; //开定时器0中断
- TR0 = 1; //允许定时器0定时
- }
- /***********************语音子程序************************/
- void Send_threelines(unsigned char addr)
- {
- unsigned char i;
- VCS=0;
- for(i=0;i<8;i++)
- {
- VSCL=0;
- if(addr&0x80)
- {
- VSDA=1;
- }
- else
- VSDA=0;
- addr>>=1;
- VSCL=1;
- }
- VCS=1;
- }
- /****************按键功能处理********************/
- void key_with()
- {
- static uchar value;
- if(key_can == 14) //手动关闭密码锁
- {
- relay = 1;
- clear_shuzu(password_bj); //清空报警
- clear_shuzu(password_xg);
- clear_shuzu(dis_lcd);
- }
- if(key_can == 10) //还原密码
- {
- flag_lj_en = 1; //连加使能
- flag_lj_en_value = 0;
- }
- if(menu_1 == 0)
- {
- if(key_can <= 9)
- if(menu_i < 6) //密码输入
- {
- menu_i ++;
- if(menu_i > 6)
- menu_i = 6;
- lcd_i = menu_i;
- for(i=6;i>0;i--)
- password_bj[i] = password_bj[i-1]; //依次装入密码比较数组
- password_bj[0] = key_can;
- for(i=0;i<lcd_i;i++)
- dis_lcd[i] ='*';// 显示占位符*
- write_string(2,7,dis_lcd);
- lcd1602_guangbiao(1,7 + menu_i + 0x40); //开光标
- }
- if(key_can == 11) //密码删除
- {
- if(menu_i != 0)
- {
- for(i=0;i<menu_i;i++)
- password_bj[i] = password_bj[i+1]; //依次从比较数组中取出密码
- menu_i --;
- password_bj[menu_i] = ' '; //清除占位符
- dis_lcd[menu_i] = ' ';
- write_string(2,7,dis_lcd);
- lcd1602_guangbiao(1,7 + menu_i + 0x40); //开光标
- }
- }
- if(key_can == 15) //确认键
- {
- value = 0;
- for(i=0;i<6;i++)
- {
- if(password_bj[i] == password_gl[i]) //判断管理员密码
- {
- value ++;
- if(value >= 6) //密码正确
- {
- write_string(2,0," return ");
- beep = 0;
- write_24c02(10,value);
- delay_1ms(200);
- write_24c02_8(6,0,password_r1);
- delay_1ms(200);
- read_mm(); //读出密码
- delay_1ms(2000);
- beep = 1;
- }
- }
- }
- if(value < 6)
- {
- for(i=0;i<6;i++)
- {
- if(password_bj[i] == password1[i])
- {
- flag_password = 1 ; //密码正确
- }
- else
- {
- flag_password = 0; //密码错误
- flag_password_cichu1 ++; //密码错误次数
- write_string(1,0," Password error ");
- write_string(2,0," cishu: ");
- write_sfm2(2,9,flag_password_cichu1);
- delay_1ms(280);
-
- for(i=0;i<6;i++)
- {
- beep = ~beep; //提示三声
- delay_1ms(200);
- }
- beep = 1;
- //发送短信
- send_PUD_fdbj(); //发送报警信息 请注意!密码错误!
- delay_1ms(800);
- break; //密码不正确
- }
- }
- for(i=0;i<6;i++)
- dis_lcd[i] = 0xbf;
- if(flag_password == 1) //密码正确
- {
- flag_password_cichu1 = 0;
- relay = 0; //打开密码锁
- write_string(2,0," Input: Open ");
- delay_1ms(1500);
- }
- }
- clear_shuzu(password_bj); //数据清空
- clear_shuzu(dis_lcd);
- write_string(1,0," Password Lock ");
- write_string(2,0," Input: ");
- lcd1602_guangbiao(1,7+0x40); //开光标
- menu_i = 0;
- }
- }
- }
- #include "menu.h"
- /****************修改密码********************/
- void xiugai_password()
- {
- /*******************修改密码******************/
- if(menu_2 == 1)
- {
- if(menu_3 == 1) //第一次输入修改的密码
- {
- if(key_can <= 9)
- {
- if(menu_i < 6)
- {
- menu_i ++;
- if(menu_i > 6)
- menu_i = 6;
- lcd_i = menu_i;
- for(i=5;i>0;i--)
- password_bj[i] = password_bj[i-1];
- password_bj[0] = key_can;
- for(i=0;i<menu_i;i++)
- dis_lcd[i] ='*';
- write_string(1,7,dis_lcd);
- lcd1602_guangbiao(1,7 + menu_i); //开光标
- }
- }
- if(key_can == 11) //删除键
- {
- if(menu_i != 0)
- {
- for(i=0;i<menu_i;i++)
- password_bj[i] = password_bj[i+1];
- menu_i --;
- password_bj[menu_i] = ' ';
- dis_lcd[menu_i] = ' ';
- write_string(1,7,dis_lcd);
- lcd1602_guangbiao(1,7 + menu_i); //开光标
- }
- }
- if(key_can == 15) //确定键
- {
- clear_shuzu(password_xg);
- clear_shuzu(dis_lcd);
- lcd1602_guangbiao(1,7 + 0x40); //开光标
- menu_3 = 2;
- menu_i = 0;
- key_can = 20;
- }
- }
- if(menu_3 == 2) //第二次输入修改的密码
- {
- if(key_can <= 9)
- {
- if(menu_i < 6)
- {
- menu_i ++;
- if(menu_i > 6)
- menu_i = 6;
- for(i=5;i>0;i--)
- password_xg[i] = password_xg[i-1];
- password_xg[0] = key_can;
- for(i=0;i<menu_i;i++)
- dis_lcd[i] ='*';//0x30 + password_xg[i];
- write_string(2,7,dis_lcd);
- lcd1602_guangbiao(1,7 + menu_i + 0x40); //开光标
- }
- }
- if(key_can == 11) //删除键
- {
- if(menu_i != 0)
- {
- for(i=0;i<menu_i;i++)
- password_xg[i] = password_xg[i+1];
- menu_i --;
- password_xg[menu_i] = ' ';
- dis_lcd[menu_i] = ' ';
- write_string(2,7,dis_lcd);
- lcd1602_guangbiao(1,7 + menu_i + 0x40); //开光标
- }
- }
- if((key_can == 15)) //确定键
- {
- for(i=0;i<6;i++)
- {
- if((password_bj[i] == password_xg[i]) && (menu_i >3 ))
- {
- flag_password = 1; //两次输入的密码一样
- }
- else
- {
- flag_password = 0;
- write_string(1,0," Password Error ");
- write_string(2,0," reenter ");
- delay_1ms(300);
- Send_threelines(104); //语音
- for(i=0;i<6;i++)
- {
- beep = ~beep; //提示三声
- delay_1ms(300);
- }
- beep = 1;
- delay_1ms(1000);
- break; //密码不正确
- }
- }
- if(flag_password == 1) //两次输入的密码一样的
- {
- for(i=0;i<6;i++)
- {
- if(menu_1 == 1)
- password1[i] = password_bj[i]; //保存密码
- }
- write_string(1,0," Password ");
- if(menu_1 == 1)
- write_string(2,0," Succeed ");
- Send_threelines(111); //语音
- write_mm(); //保存密码
- beep = 0;
- delay_1ms(2000);
- beep = 1;
- read_mm(); //读出密码
- }
- clear_shuzu(password_bj);
- clear_shuzu(password_xg);
- clear_shuzu(dis_lcd);
- write_string(1,0," Password Lock ");
- write_string(2,0," Input: ");
- lcd1602_guangbiao(1,7+0x40); //开光标
- menu_1 = 0;
- menu_2 = 0;
- menu_3 = 0;
- menu_i = 0;
-
- }
- }
- }
- if((menu_1 != 0) && (menu_1 != 0))
- {
- key_with1();
- }
- if(key_can == 13) //修改密码
- {
- if((menu_1 == 0))
- {
- key_sure_1(); // 确定键
- menu_1 = 1;
- menu_i = 0;
- }
- }
- /******************输入手机号码**********************/
- if(menu_1 == 2)
- {
- if(key_can < 10) //只有数字键
- {
- if(phone1_i < 11)
- {
- phone1_call[phone1_i] = key_can;
- dis_smg[phone1_i] = 0x30 + key_can;
- phone1_i ++;
- if(phone1_i > 11)
- phone1_i = 11;
- write_string_num(2,0,dis_smg,phone1_i); //显示号码
- lcd1602_guangbiao(1,0 + phone1_i + 0x40); //开光标
- }
- }
- if(key_can == 11) //删除键
- {
- if(phone1_i != 0)
- {
- phone1_i --;
- phone1_call[phone1_i] = ' ';
- dis_smg[phone1_i] = ' ';
- write_string(2,0," ");
- write_string_num(2,0,dis_smg,phone1_i); //显示号码
- lcd1602_guangbiao(1,0 + phone1_i + 0x40); //开光标
- }
- }
- write_mm(); //保存密码
- }
- }
-
- /******************主程序**********************/
- void main()
- {
- static uint value ; //静态变量
- beiguang = 0;
- delay_1ms(150);
- P0 = P1 = P2 = P3 = 0xff; //初始化单片机IO口为高电平
- time_init(); //定时器初始化
- init_1602();
- write_string(1,0," Init GSM ");
- write_string(2,0," ");
- beiguang = 0;
- beep = 0; //开机叫一声
- init_uart(); //串口初始化
- delay_1ms(100);
- beep = 1; //开机叫一声
- for(i=0;i<6;i++) //叫三声说明已经初始化
- {
- beep = ~beep; //叫三声
- delay_1ms(200);
- }
- init_1602();
- delay_1ms(500);
- while(1)
- {
- if(flag_password_cichu1 < 3) //错误三次按键不能用了
- {
- key(); //按键函数
- if(key_can < 20)
- {
- if(beiguang == 0)
- {
- if(menu_1 == 0)
- key_with(); //按键处理函数
- xiugai_password(); //修改密码
- }
- else
- beiguang = 0;
- flag_time = 0;
- }
- }
- if(flag_200ms == 1)
- {
- flag_200ms = 0;
- message_kaiguanmen(); //用短信接收处理函数
- if(beiguang == 0) //延时关闭锁30秒关闭背光
- {
- flag_time ++;
- if(flag_time >= 5 * 30) //30秒
- {
- flag_time = 0;
- beiguang = 1; //关闭背光
- }
- }
- if(relay == 0) //延时关闭锁
- {
-
- flag_guan++;
- if(flag_guan >= 5 * 20) //20秒
- {
- flag_guan = 0;
- relay = 1; //关闭密码锁
- flag_en1 = 0;
- }
- }else
- flag_guan = 0;
- if(flag_password_cichu1 >= 3)
- {
- value ++; //200ms
-
- beep = ~beep; //蜂鸣器报警
- if(value >= 5 * 60 * 2) //2分钟
- {
- value = 0;
- beep = 1;
- flag_password_cichu1 = 0;
- }
- }
- }
- delay_1ms(1);
- }
- }
- /*************定时器0中断服务程序***************/
- void time0_int() interrupt 1
- {
- static uchar value;
- TH0 = 0x4c;
- TL0 = 0x00; // 50ms 12M
- value ++;
- if(value % 4 == 0)
- {
- flag_200ms = 1;
- }
-
- }
复制代码
所有资料51hei提供下载:
程序.rar
(71.14 KB, 下载次数: 28)
|