单片机密码锁C程序完整代码.doc_第1页
单片机密码锁C程序完整代码.doc_第2页
单片机密码锁C程序完整代码.doc_第3页
单片机密码锁C程序完整代码.doc_第4页
单片机密码锁C程序完整代码.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机密码锁c程序完整代码2009-08-18 14:39#include #includeintrins.h#includekey.h#includexsh.h#include24c02.h#define ulong unsigned longbit bjcb=0;/报警标志 xg=0,/修改密码标志位 bj=0,/报警标志位 sj=0;/锁键盘标志位 / xg=0;/修改密码标志位uchar pswd0_016=0;/密码输入缓存存储单元/uchar code pswd0_116=1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8;/用户初始密码存储单元/uchar pswd1_016=0;/读出密码缓存存储单元uchar pswd1_116=1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8;/管理员初始密码存储单元sbit out=p35;/输出端口sbit l1=p02;/上电指示sbit l2=p01;/开锁指示sbit l3=p00;/报警指示uint mg=0,/密码个数 ksc=0,/开锁次数 bjc=0,/报警次数 tcnty=0,/用户按键定时次数累加 tcntg=0,/管理员输入密码定时次数 yhsh,/用户输入标志位 glsh,/管理员输标志位 shw;/密码输完标志位void yhmimaxig();/密码修改程序void glmimaxig();/管理员修改程序void bjyin(ulong t)ulong c;uint n;for(c=0;ct;c+)for(n=0;n50;n+); /延时beep=beep; /取反输出到喇叭的信号void delay_10ms(void)uint i = 1000;while(i-);/定时中断服务函数/void timer0() interrupt 1 uint i;th0=(65536-50000)/256; /对th0 tl0赋值50ms定时tl0=(65536-50000)%256; /重装计数初值if(yhsh=1) tcnty+;/用户定时计数if(shw=1)tr0=0;tcnty=0;if(tcnty=200) tr0=0;/关闭t0定时器 tcnty=0; mg=0;/密码个数清零l1=1;for(i=0;i2;i+)/声光报警电路 l3=0; bjyin(1000); l3=1; delay(1000); l1=0; else if(glsh=1) tcntg+;/管理员定时计数 if(shw=1) tr0=0; tcntg=0; if(tcntg=160) tr0=0;/关闭t0定时器 tcntg=0; mg=0;/密码个数清零l1=1; for(i=0;i2;i+)/声光报警电路 l3=0; bjyin(1000); l3=1; delay(1000); l1=0; void main() uint i; tmod=0x01; /定时器工作在方式1 et0=1; ea=1; th0=(65536-50000)/256; /对th0 tl0赋值 tl0=(65536-50000)%256; /使定时器0.05秒中断一次/read_page24c02(0x00,pswd1_1,16);/向24c02里读用户初始密码 /i2cwrite24lc16b(0,0x20);/第一次向24c02里写入初始管理员密码、用户密码、开锁次数/ksc=i2cread24lc16b(0x20);loop: l1=0;/上电红灯亮l2=1;/开锁成功后绿灯亮l3=1;/输错时黄灯亮报警out=0;/开信号关闭 display_0(ksc);/开锁前显示 /密码输入/if(sj=0)/锁键盘标志位为0 do flag=0;/键盘标志位 key();if(flag=1&num=12) /判断是否为管理员功能键按下goto gl; if(flag=1&num=1)/输入错误删除 mg=mg-1; if(mg=1) /有密码键按下开定时器限时 tr0=1; yhsh=1; while(num!=15); if(mg!=16) for(i=mg;i16;i+)pswd0_0i=0; /密码比较电路/if(flag=1&num=15) flag=0; yhsh=0; shw=1; num=0;for(i=0;i16;i+) /从24c02里读出16个密码 pswd1_1i=i2cread24lc16b(i); delay_10ms; for(i=0;i16;i+) if(pswd1_1i!=pswd0_0i) bjcb=1; break; else bjcb=0; if(bjcb!=0) bjc+; if(bjc!=3) bjcb=0; /第一次和第二次报警 delay(500); mg=0;/密码个数清零 l1=1; for(i=0;i3;i+)/声光报警电路 l3=0; display_3(); bjyin(1000); l3=1; delay(1000); goto loop; else if(bjc=3) bjc=0; bjcb=0; display_5();/三次输入密码失败,自锁 sj=1;/锁键盘标志位 mg=0;/密码个数清零 l1=1; for(i=0;i2;i+)/声光报警电路 l3=0; bjyin(1000); l3=1; delay(1000); goto loop; else if(bjcb=0) ksc+; display_1(ksc); i2cwrite24lc16b(ksc,0x20); if(ksc=100) sj=1; l2=0; l1=1; out=1; mg=0;/密码个数清零loop1:do /键盘扫描等待功能键按下 flag=0; key();if(flag) flag=0; switch(num) case 13: display_2(); do flag=0;/键盘标志位 key(); if(flag=1&num=1)/输入错误删除 mg=mg-1; if(mg=16) do /键盘扫描等待功能键按下 flag=0; key(); while(num!=15); while(num!=15); if(mg!=16&num=15) for(i=mg;i16;i+) pswd0_0i=0; if(flag=1&num=15) flag=0; mg=0; for(i=0;i16;i+) /用一次写一个向24c02里写 i2cwrite24lc16b(pswd0_0i,i); delay_10ms; display_1(ksc); do /键盘扫描等待功能键按下 flag=0;key();while(num!=11); /按下返回键,锁锁返回 goto loop; ;break; case 11: goto loop; /break; while(flag!=0);/如果设置密码键按下 goto loop1;/ i2cwrite24c02_page(0x00,pswd1_1,mg); else do flag=0; key();while(num!=12);/判断是否为管理员功能键按下 gl:do/管理员输入密码 flag=0; key(); if(flag=1&num=1)/删除键按下 mg=mg-1; if(mg=1) tr0=1; /开定时器to限5秒开锁 while(num!=15); if(mg!=16&num=15) for(i=mg;i16;i+)pswd0_0i=0; /管理员密码比较/read_page24c02(0x10,pswd0_1,16)for(i=0;i16;i+) /从24c02里读出16个密码 pswd1_1i=i2cread24lc16b(0x10+i); delay_10ms; if(flag=1&num=15) flag=0; shw=1; num=0;for(i=0;img;i+) if(pswd1_1i!=pswd0_0i) bjcb=1; break; else bjcb=0; if(bjcb!=0) bjc+; if(bjc!=3) bjcb=0; /第一次和第二次报警 mg=0;/密码个数清零 l1=1; for(i=0;i2;i+)/声光报警电路 l3=0; display_3(); bjyin(1000); l3=1; delay(1000); display_1(ksc); goto loop; else bjcb=0; display_5();/三次输入密码失败,自锁 mg=0;/密码个数清零 delay(10000); display_1(ksc); goto loop; else sj=0; display_4();/管理员开锁显示 mg=0; l2=0; l1=1; l3=0;/密码个数清零 do /键盘扫描等待功能键按下 flag=0; key(); while(flag=0); /如果设置密码键按下 if(flag=1&num=13) flag=0; display_2(); do flag=0;/键盘标志位 key(); if(flag=1&num=1)/输入错误删除 mg=mg-1; if(mg=16) do /键盘扫描等待功能键按下 flag=0; key(); while(num!=15); while(num!=15); if(mg!=16&num=15) for(i=mg;i16;i+) pswd0_0i=0; if(flag=1&num=15) flag=0; mg=0; for(i=0;i16;i+) /用一次写一个向24c02里写 i2cwrite24lc16b(pswd0_0i,(0x10+i); delay_10ms; display_4(); do /键盘扫描等待功能键按下 flag=0;key();while(num!=11); /按下返回键,锁锁返回 goto loop; if(flag=1&num=10) ksc=0;i2cwrite24lc16b(ksc,0x20);display_1(ksc); do /键盘扫描等待功能键按下 flag=0; key(); while(num!=11);/按下返回键,锁锁返回 goto loop; if(flag=1&num=11)/按下返回键,锁锁返回 goto loop; #ifndef _key_h#define _key_h#include #define uchar unsigned char #define uint unsigned intbit flag=0;/按键按下标志位sbit beep=p37;/蜂鸣器端口delay(int z)/延时1ms int x,y; for (x=z;x0;x-) for (y=140;y0;y-); uchar num;/按键返回值/按键音程序/ void yin() int c,n;if(flag=1) for(c=0;c80;c+) for(n=0;n50;n+); /延时 beep=beep; /取反输出到喇叭的信号 /键盘程序/int key() uchar temp; p2=0x7f; temp=p2&0x0f;if(temp!=0x0f) delay(5); if(temp!=0x0f) temp=p2; switch(temp) case 0x77:num=0; break; case 0x7b:num=1; break; case 0x7d:num=2; break; case 0x7e:num=3; break; do /等待按键抬起 temp=p2; temp=temp&0x0f; while(temp!=0x0f); flag=1;yin(); p2=0xbf; temp=p2&0x0f;if(temp!=0x0f)delay(5); if(temp!=0x0f) temp=p2; switch(temp) case 0xb7:num=4; break; case 0xbb:num=5; break; case 0xbd:num=6; break; case 0xbe:num=7; break; do temp=p2; temp=temp&0x0f; while(temp!=0x0f); flag=1;yin(); p2=0xdf; temp=p2&0x0f;if(temp!=0x0f)delay(5); if(temp!=0x0f) temp=p2; switch(temp) case 0xd7:num=8; break; case 0xdb:num=9; break; case 0xdd:num=10; break; case 0xde:num=11; break; do temp=p2; temp=temp&0x0f; while(temp!=0x0f);flag=1;yin(); p2=0xef; temp=p2&0x0f;if(temp!=0x0f)delay(5); if(temp!=0x0f) temp=p2; switch(temp) case 0xe7:num=12; break; case 0xeb:num=13; break; case 0xed:num=14; break; case 0xee:num=15; break; do temp=p2; temp=temp&0x0f; while(temp!=0x0f);flag=1;yin(); return(num);#endif#ifndef _xsh_h#define _xsh_h#include #define uchar unsigned char #define uint unsigned intsbit shj=p10;/串口数据口sbit sck=p11;/串口时钟uchar code tab20= 0x88,/*0*/ 0xbe,/*1*/ 0xc4,/*2*/ 0x94,/*3*/ 0xb2,/*4*/ 0x91,/*5*/ 0x81,/*6*/ 0xbc,/*7*/ 0x80,/*8*/ 0x90,/*9*/ 0xa0,/*a*/ 0x83,/*b*/ 0xc9,/*c*/ 0x86,/*d*/ 0xc1,/*e*/ 0xe1,/*f*/ 0xa8,/*n*/ 0xf7,/*-*/0x94,/*反e*/0xe0/*p*/ ; /共阳数码管uchar code sb03=8,8,8,/*开锁后显示*/ code sb13=0,15,15,/*开锁前显示*/ code sb26=17,17,17,17,17,17,/*修改显示*/ code sb36=16,0,16,0,16,0,/*第一二次报警显示*/ code sb46=8,8,8,8,8,8,/*管理员进入显示*/ code sb56=18,18,18,18,18,18;/*第三次报警显示*/*显示电路*/void writedata(uchar num)/传送一个字节uchar temp;int i;temp=tabnum;for(i=0;i8;i+) temp=temp1; shj=cy; sck=0; sck=1; void display_0(uchar temp)/开锁前状态 int i,g,s,q; uchar m;q=temp/100;s=temp%100/10;g=temp%10;for(i=0;i3;i+) m=sb1i; writedata(m);writedata(q); writedata(s);writedata(g);void display_1(uchar temp)/开锁后状态 int i,g,s,q;uchar m;q=temp/100;s=temp%100/10;g=temp%10;for(i=0;i3;i+) m=sb0i; writedata(m); writedata(q);writedata(s);writedata(g);void display_2()/修改密码显示 int i;uchar m;for(i=0;i6;i+) m=sb2i; writedata(m); void display_3()/报警显示 int i;uchar m;for(i=0;i6;i+) m=sb3i; writedata(m); void display_4()/管理员模式显示 int i;uchar m;for(i=0;i6;i+) m=sb4i; writedata(m); void display_5()/管理员模式显示 int i;uchar m;for(i=0;i6;i+) m=sb5i; writedata(m); #endif#ifndef _24c02_h#define _24c02_h#include #define writedeviceaddress 0xa0#define readdeviceaddress 0xa1sbit sda=p15;/i2c数据端sbit scl=p16;/i2c时钟端/24c0224c08读写驱动程序/void delayms(unsigned int number) unsigned char temp;for(;number=1;number-) for(temp=112;temp=1;temp-) ;void i2cstart(void)sda=1;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();sda=0;_nop_();_nop_();_nop_();_nop_();_nop_();scl=0;void i2cstop(void)sda=0;scl=1;_nop_();_nop_();_nop_();_nop_();_nop_();sda=1;_nop_();_nop_();_nop_();_nop_();_nop_(); void i2cack(void)sda=0;scl=1;_nop_();_nop_();_nop_();_nop_();sda=1;scl=0;void i2cnoack(void)sda=1;scl=1;_nop_();_nop_();_nop_();_nop_();sda=0;scl=0;void i2cwrite8bit(unsigned char input)unsigned char temp;for(temp=8;temp!=0;temp-) sda=(bit)(input&0x80); scl=1;_nop_(); _nop_(); _nop_();_nop_(); _nop_();scl=0;input=input1;delayms(20);unsigned char i2cread8bit(void)unsigned char temp,rbyte=0;for(temp=8;temp!=0;temp-) scl=1;_nop_(); _nop_(); _nop_();rbyte=rbyte1;rbyte=rbyte|(unsigned char)(sda);scl=0;return(rbyte);void i2cwrite24lc16b(unsigned char wdata,unsigned char romaddress)i2cstart();i2cwrite8bit(writedeviceaddress);i2cack();i2cwrite8bit(romaddress);i2cack();i2cwrite8bit(wdata);i2cack();i2cstop();delayms(20);/写

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论