楼主的源码如下:- //*********单片机各I/O的说明****************
- //P2和P0口用于12864显示器
- //P1口用于矩阵键盘
- //P3口的高四位用于步进电机信号的传入电机
- //P3^2口用于室内控制门的关
- //P3^3口用于室内控制门的开
- //P2^7控制蜂鸣器
- //A---用于显示家中无人这个提示界面
- //B---用于门铃
- //C---用于门外关门
- //D---无功能
- //*---用于密码的重置
- //#---用于门外开门---需经过密码验证
- #include<reg52.h>
- #include<intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- #define N 3 //步进电机中需要用的宏
- uchar y=0x00; //input函数中调用
- static uchar cs=0,gs=0;
- //***********************************************************
- static uchar mima[6]={"123456"}; //密码数组---可通过密码重置修改
- uchar lsmima[6]; //临时密码数组--用于开门时的密码验证
- uchar newmima1[6];
- uchar newmima2[6];
- uchar dizhi1[8]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87};
- uchar dizhi2[8]={0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97};
- uchar dizhi3[8]={0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F};
- uchar dizhi4[8]={0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F};
- uchar panduan_zhi=0;
- uchar i,enter; //在6位密码输入和密码重置时需要使用的变量
- uchar control_gn='Z'; //在非数字按键的控制函数中使用
- uchar newhaoma[11]; //重新设定预留号码-------
- //****************信息提示语*************************
- uchar code mimazq[]={"密码没问题"}; //密码正确
- uchar code mimacw[]={"密码错误"}; //密码有误提示
- uchar code xiugaicg[]={"修改成功"}; //密码,号码重置显示
- uchar code mimawsts[]={"请输入六位密码"}; //密码位数提示
- uchar code shurucw[]={"输入错误"}; //选择时的提示
- uchar code newsr[]={"请重新输入"}; //选择时的提示
- // *********功能提示**********
- uchar code kaimen[]={"马上为您开门"}; //开门提示语
- uchar code yuanshimima[]={"请输入原始密码"}; //原始密码
- uchar code newmima[]={"请输入新密码"}; //新密码
- uchar code ruqints[]={"有不法者试图入侵"};
- uchar code ruqinjb[]={"警报已经开启"};
- uchar code different[]={"两次输入不一致"};
- //***************界面提示语*****************************
- uchar code wenhou[]={"您好"};
- uchar code wr[]={"主人不在家"};
- uchar code lianxi[]={"有事请联系:"}; //界面_mr--->家中无人
- uchar code haoma[]={"18700596632"}; //界面_mr--->家中无人
- uchar code yr[]={"主人在家"}; //界面_yr--->家中有人
- uchar code menling[]={"有事请按门铃"}; //界面_yr--->家中有人
- uchar code huanying[]={"欢迎您的到访"}; //界面_yr--->家中有人
- //**********************函数声明***********************
- uchar key_scan(); //按键检测函数
- void delay_50us(uint u); //50us延时
- void write_zl(uchar cmd); //12864写指令
- void write_sj(uchar dat); //12864写数据
- void inti1(); //12864初始化
- void disp_dzf(uchar b,uchar zddz); //12864单字符显示
- void delay_50ms(uint u); //1286450ms延时
- void delay(uint x); //步进电机延时函数
- void bjzz(); //步进电机正转---开门
- void bjdz(); //步进电机反转----关门
- void disp_hzi(uchar a[],uchar num,uchar cmd); //12864字符串显示函数
- uchar input() reentrant; //按键输入
- void baojingsy(); //报警声音编码函数
- void anmenlingsy(); //按门铃的门铃声音编码函数
- void control(); //流程控制函数
- void control_A(); //家中无人时的界面控制,按键A所对应的的功能
- void control_C() ; //家中无人时的界面控制,按键C所对应的的功能
- void panduankg() reentrant; //#号所对应的功能函数
- void tishiyin1(); //提示音1
- void tishiyin2(); //提示音2
- uchar open(uchar x); //open函数
- uchar mimashuru_6() reentrant; //密码重置
- void panduancz() reentrant; //#号所对应的功能函数
- uchar bijiao(uchar x) reentrant; //密码重置时的二次比对
- void mimashuru1_6()reentrant; //二次输入第一次
- void mimashuru2_6()reentrant; //二次输入第一次
- void duizhao() reentrant ;
- //*********************************************************
- sbit RS=P2^2;
- sbit RW=P2^1;
- sbit E=P2^0;
- sbit PSB=P2^3;
- sbit RESET=P2^5;
- sbit beep=P2^7;
- //********************位 定 义**********************************
- void jiemian_mr()
- {
- write_zl(0x01); //-----清屏
- disp_hzi(wenhou,4,dizhi1[0]); //第二行开始显示 您好主人不在家
- disp_hzi(wr,10,dizhi2[2]);
- disp_hzi(lianxi,12,dizhi3[0]); // 显示 有事请联系:
- disp_hzi(haoma,11,dizhi4[2]); //显示 18700596632
- }
- //*********************家里有人时的界面*****************
- void jiemian_yr()
- { inti1();
- write_zl(0x01);
- disp_hzi(wenhou,4,dizhi1[0]); //-----清屏
- disp_hzi(yr,8,dizhi2[2]); //显示 您好主人在家
- disp_hzi(menling,12,dizhi3[0]); //显示 有事请按门铃B键
- disp_dzf('B',dizhi3[6]); //在有事按门铃之后显示B
- disp_hzi(huanying,12,dizhi4[1]); //显示欢迎您的到访
- }
- //************50us延时***************
- void delay_50us(uint u)
- {
- uchar j;
- uint i;
- for(i=0;i<u;i++)
- for(j=19;j>0;j--)
- ;
- }
- //**************50us延时************
- void delay_50ms(uint u)
- {
- uchar j;
- uint i;
- for(i=0;i<u;i++)
- for(j=6245;j>0;j--)
- ;
- }
- //********步进电机延时函数**********
- void delay(uint x)
- {
- uchar i;
- while(x--)
- for(i=0;i<100;i++);
- }
- //********步进电机正转********
- void bjzz()
- {
- uchar x;
- for(x=0;x<200;x++)
- {
- P3=0x3f;
- delay(N);
- P3=0x6f;
- delay(N);
- P3=0xcf;
- delay(N);
- P3=0x9f;
- delay(N);
- }
- }
- //********步进电机倒转********
- void bjdz()
- {
- uchar x;
- for(x=0;x<200;x++)
- {
- P3=0x9f;
- delay(N);
- P3=0xcf;
- delay(N);
- P3=0x6f;
- delay(N);
- P3=0x3f;
- delay(N);
- }
- }
- //**********写指令函数********
- void write_zl(uchar cmd)
- {
- RW=0;
- RS=0;
- delay_50us(1);
- P0=cmd;
- E=1;
- delay_50us(10);
- E=0;
- delay_50us(2);
- }
- //**********写数据函数********
- void write_sj(uchar dat)
- {
- RW=0;
- RS=1;
- delay_50us(1);
- P0=dat;
- E=1;
- delay_50us(10);
- E=0;
- delay_50us(2);
- }
- //**********初始化函数*********
- void inti1()
- {
- delay_50us(2);
- write_zl(0x30);
- delay_50us(4);
- write_zl(0x30);
- delay_50us(4);
- write_zl(0x0c);//开显示,关光标……
- delay_50us(2);
- write_zl(0x01);
- delay_50us(240);
- write_zl(0x06);
- delay_50us(10);
- write_zl(0x64);
- delay_50us(10);
- }
- //*******12864单字符显示函数*****
- void disp_dzf(uchar b,uchar zddz)
- {
- write_zl(zddz);
- delay_50us(1);
- write_sj(b);
- delay_50us(1);
- }
- //*********12864字符串显示函数******
- void disp_hzi(uchar a[],uchar num,uchar cmd)
- {
- uchar *p=a;
- write_zl(cmd);
- for(p=a;p<a+num;p++)
- {
- write_sj(*p);
- delay_50us(1);
- }
- }
- //*****按键扫描函数返回mz值去显示********
- uchar key_scan()
- {
- uchar t,key=0x99;//t临时变量
- P1=0x7f;
- t=P1;
- t=t&0x07f;
- if(t!=0x7f)
- {
- delay_50us(200);
- t=P1;
- t=t&0x7f;
- if(t!=0x7f)
- {
- t=P1;
- switch(t)
- {
- case 0x77:key='D';break;
- case 0x7b:key='C';break;
- case 0x7d:key='B';break;
- case 0x7e:key='A';break;
- }
- }
- }
- //第一行
- P1=0xbf;
- t=P1;
- t=t&0xbf;
- if(t!=0xbf)
- {
- delay_50us(200);
- t=P1;
- t=t&0xbf;
- if(t!=0xbf)
- {
- t=P1;
- switch(t)
- {
- case 0xb7:key='#';break;
- case 0xbb:key='9';break;
- case 0xbd:key='6';break;
- case 0xbe:key='3';break;
- }
- }
- }
- //第二行
- P1=0xdf;
- t=P1;
- t=t&0xdf;
- if(t!=0xdf)
- {
- delay_50us(200);
- t=P1;
- t=t&0xdf;
- if(t!=0xdf)
- {
- t=P1;
- switch(t)
- {
- case 0xd7:key='0';break;
- case 0xdb:key='8';break;
- case 0xdd:key='5';break;
- case 0xde:key='2';break;
- }
- }
- }
- //第三行
- P1=0xef;
- t=P1;
- t=t&0xef;
- if(t!=0xef)
- {
- delay_50us(200);
- t=P1;
- t=t&0xef;
- if(t!=0xef)
- {
- t=P1;
- switch(t)
- {
- case 0xe7:key='*';break;
- case 0xeb:key='7';break;
- case 0xed:key='4';break;
- case 0xee:key='1';break;
- }
- }
- }
- return(key);
- }
- //可重载的利用按键扫描函数的输入函数
- uchar input() reentrant//返回按下的按键,没有按键按下的时候等待
- {
- y=key_scan();
- if(y==0x99)//key=0x99代表没有按键按下
- input();
- else
- return (y);
- }
- //******6密码连续的输入并在屏幕显示*********
- //****6位密码显示,与已设进行比对的函数*****
- uchar mimashuru_6()reentrant
- {
- write_zl(0x01);
- disp_hzi(mimawsts,14,dizhi1[0]); //input的功能是,当有按键按下的时候才返回这个数值
- //6位密码的输入,而且每输入一个数字显示几ms后显示*
- for(i=0;i<6;i++)
- {
- enter=input();
- lsmima[i]=enter; //将返回的密码值储存在lsmima数组中
- disp_dzf(enter,dizhi2[i]); //在第二行显示刚刚输入的字符
- delay_50ms(2000);
- switch(lsmima[i])
- {
- case 'A':write_zl(0x01);mimashuru_6();break;//A的按键在这里的作用:如果有输入错误了重新输入。是重新输入
- }
- disp_dzf('*',dizhi2[i]); //在第二行用*号掩盖刚刚的输入结果
- delay_50ms(20);
- }
- for(i=0;i<6;i++)
- {
- if(lsmima[i]!=mima[i])
- {
- write_zl(0x01);
- tishiyin1();
- disp_hzi(mimacw,8,dizhi2[2]);
- delay_50ms(1000);
- break;
- }
- }
- return(i);
- }
- //这个函数的作用是输入密码并且进行输入的密码与预置密码进行比对
- //如果二者相符返回6.不相符返回非6
- //open函数是根据mimashuru_6的返回值是不是6而进行开门和提示密码错误
- uchar open(uchar x)
- {
- if(x==6)
- {
- tishiyin2();
- disp_hzi(kaimen,12,dizhi3[0]);
- delay_50ms(10000);
- bjzz();
- delay_50ms(5000);
- return(0);
- }
- else
- {
- delay_50ms(6000);
- tishiyin1();
- delay_50ms(100);
- write_zl(0x01); //进行清屏
- return(1);
- }
- }
- //********密码输错三次报警程序******
- //在报警响之后,经过连续的十次的响报警吓走图谋不轨者,然后重新回到control所控制的界面
- void panduankg() reentrant
- {
- delay_50ms(1000);
- panduan_zhi=open(mimashuru_6());
- if(panduan_zhi==1) //返回值是1说明输入密码错误
- {
- cs++;
- if(cs==3)
- baojingsy();
- else
- panduankg();
- }
- else
- cs=0;
- }
- void mimashuru1_6()reentrant
- {
- write_zl(0x01);
- disp_hzi(newmima,14,dizhi1[0]); //input的功能是,当有按键按下的时候才返回这个数值
- //6位密码的输入,而且每输入一个数字显示几ms后显示*
- for(i=0;i<6;i++)
- {
- enter=input();
- newmima1[i]=enter; //将返回的密码值储存在lsmima数组中
- disp_dzf(enter,dizhi2[i]); //在第二行显示刚刚输入的字符
- delay_50ms(2000);
- switch(newmima1[i])
- {
- case 'A':write_zl(0x01);mimashuru1_6();break;//A的按键在这里的作用:如果有输入错误了重新输入。是重新输入
- }
- disp_dzf('*',dizhi2[i]); //在第二行用*号掩盖刚刚的输入结果
- delay_50ms(20);
- }
- }
- void mimashuru2_6()reentrant
- {
- write_zl(0x01);
- disp_hzi(newsr,10,dizhi1[0]); //input的功能是,当有按键按下的时候才返回这个数值
- //6位密码的输入,而且每输入一个数字显示几ms后显示*
- for(i=0;i<6;i++)
- {
- enter=input();
- newmima2[i]=enter; //将返回的密码值储存在lsmima数组中
- disp_dzf(enter,dizhi2[i]); //在第二行显示刚刚输入的字符
- delay_50ms(2000);
- switch(newmima2[i])
- {
- case 'A':write_zl(0x01);mimashuru2_6();break;//A的按键在这里的作用:如果有输入错误了重新输入。是重新输入
- }
- disp_dzf('*',dizhi2[i]); //在第二行用*号掩盖刚刚的输入结果
- delay_50ms(20);
-
- }
- }
- void panduancz() reentrant
- {
- delay_50ms(1000);
- panduan_zhi=mimashuru_6();
- if(panduan_zhi!=6) //返回值是1说明输入密码错误
- {
- cs++;
- if(cs==3)
- {
- write_zl(0x01);
- baojingsy();
- }
- else
- panduancz();
- }
- else
- {
- cs=0;
- duizhao();
- }
- }
- void duizhao() reentrant
- {
- mimashuru1_6();
- delay_50ms(200);
- write_zl(0x01);
- mimashuru2_6();
- for(gs=0;gs<6;gs++)
- {
- if(newmima1[gs]!=newmima2[gs])
- break;
- }
-
- if(gs<6)
- {
- write_zl(0x01);
- disp_hzi(different,14,dizhi1[0]);
- disp_hzi(newsr,10,dizhi2[1]);
- delay_50ms(10000);
- duizhao();
- }
- else
- {
- for(gs=0;gs<6;gs++)
- {
- mima[gs]=newmima1[gs];
-
- }
- write_zl(0x01);
- disp_hzi(xiugaicg,8,dizhi1[0]);
- delay_50ms(10000);
- }
- }
- //**********报警声音**************
- void baojingsy()
- {
- uint i,j;
- disp_hzi(ruqints,16,dizhi1[0]);
- disp_hzi(ruqinjb,12,dizhi3[1]);
- for(j=0;j<60;j++)
- for(i=0;i<10000;i++)
- {
- beep=0;
- delay_50us(1);
- beep=1;
- delay_50us(1);
- }
- }
- //************门铃声音*************
- void anmenlingsy()
- {
- uint j;
- for(j=0;j<500;j++)
- {
- beep=0;
- delay_50us(1);
- beep=1;
- delay_50ms(10);
- }
- }
- //提示音
- void tishiyin1()
- {
- uint i;
- for(i=0;i<100;i++)
- {
- beep=0;
- delay_50us(5);
- beep=1;
- delay_50us(5);
- }
- }
- //提示音2
- void tishiyin2()
- {
- uint i;
- for(i=0;i<1000;i++)
- {
- beep=0;
- delay_50us(1);
- beep=1;
- delay_50us(1);
- }
- }
- //A函数的作用:当没有按键按下的时候停在这个界面,当有按键按下的时候返回
- //control控制的界面
- void control_A()
- {
-
- uchar temp1;
- delay_50ms(1000);
- write_zl(0x01);
- jiemian_mr();
- temp1=input();
- if(temp1!=0x99)
- ;
- }
- //在control控制界面下C按键所确定的函数
- //按下C之后步进电机关门,然后经过短暂延时重新回到control所确定的界面
- void control_C()
- {
- bjzz();
- delay_50ms(500);
- }
- //***************非密码按键的控制函数***************************
- //***此函数的作用即判断A,B,D,E,F,*,#这几个按键的按下************
- void control()//流程控制函数
- {
- control_gn='Z';
- jiemian_yr(); //显示家中有人的界面
- control_gn=input();
- if(control_gn!='Z')
- {
- delay_50ms(100);
- switch(control_gn)
- {
- case 'A':{control_A();delay_50ms(100);break;} //人离开家的时候按下A使得显示界面换成家中无人的界面 // 否则默认的都是家中有人
- case 'B':{anmenlingsy();delay_50ms(10);break;} //B键用于门外按门铃
- case 'C':{control_C();delay_50ms(10);break;} //C键的作用是室外的关门,仅用于关门
- case 'D':{control();break;}
- case '*':{write_zl(0x01);panduancz();delay_50ms(10);break;} //*键的作用 清除原有界面 后密码重置
- case '#':{write_zl(0x01);delay_50ms(100);panduankg();break;} //#键的作用是门外经过密码验证后开门
- default: {break;}
- }
- }
- }
- void mnkai() interrupt 0//门内开
- {
- delay_50ms(100);
- bjzz();
- }
- void mnguan() interrupt 2//门内关
- {
- delay_50ms(100);
- bjdz();
- }
- void main()
- {
- EA=1; //打开终端总开关
- EX0=1;//打开外部中断0
- EX1=1;
- IT0=0;//外部中断0是低电平触发
- IT1=0;
- P3=0x0f;//使步进电机的ABCD端的初始化都为低电平
- while(1)
- {
- inti1();
- control();
- }
- }
复制代码 |