ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:21.55KB ,
资源ID:12769552      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12769552.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(电子密码锁C程序.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

电子密码锁C程序.docx

1、电子密码锁C程序C51电子密码锁#include #include#define LCM_Data P0#define PCOM P1#define uchar unsigned char #define uint unsigned intsbit dula=P26;/数码管段选sbit wela=P27;/数码管位选sbit lcd1602_rs=P35;sbit lcd1602_rw=P36;sbit lcd1602_en=P34;sbit Scl=P21; /24C02串行时钟sbit Sda=P20; /24C02串行数据sbit ALAM = P25; /报警 sbit KEY =

2、P24; /开锁sbit open_led=P22; /开锁指示灯bit operation=0; /操作标志位bit pass=0; /密码正确标志bit ReInputEn=0; /重置输入充许标志 bit s3_keydown=0; /3秒按键标志位bit key_disable=0; /锁定键盘标志unsigned char countt0,second; /t0中断计数器,秒计数器void Delay5Ms(void);unsigned char code a=0xFE,0xFD,0xFB,0xF7; /控盘扫描控制表unsigned char code start_line = p

3、assword: ;unsigned char code name = =Coded Lock=; /显示名称 unsigned char code Correct = correct ; /输入正确 unsigned char code Error = error ; /输入错误unsigned char code codepass = pass ; unsigned char code LockOpen = open ; /OPENunsigned char code SetNew = SetNewWordEnable;unsigned char code Input = input: ;

4、 /INPUTunsigned char code ResetOK = ResetPasswordOK ;unsigned char code initword = Init password.;unsigned char code Er_try = error,try again!;unsigned char code again = input again ;unsigned char InputData6; /输入密码暂存区unsigned char CurrentPassword6=1,3,1,4,2,0; /当前密码值unsigned char TempPassword6;unsig

5、ned char N=0; /密码输入位数记数unsigned char ErrorCont; /错误次数计数unsigned char CorrectCont; /正确输入计数unsigned char ReInputCont; /重新输入计数unsigned char code initpassword6=0,0,0,0,0,0;/=5ms延时=void Delay5Ms(void) unsigned int TempCyc = 5552; while(TempCyc-);/=400ms延时=void Delay400Ms(void) unsigned char TempCycA = 5;

6、 unsigned int TempCycB; while(TempCycA-) TempCycB=7269; while(TempCycB-); /=24C02=void mDelay(uint t) /延时 uchar i; while(t-) for(i=0;i125;i+) ; void Nop(void) /空操作 _nop_(); _nop_(); _nop_(); _nop_();/*起始条件*/void Start(void) Sda=1; Scl=1; Nop(); Sda=0; Nop(); /*停止条件*/void Stop(void) Sda=0; Scl=1; Nop

7、(); Sda=1; Nop();/*应答位*/void Ack(void) Sda=0; Nop(); Scl=1; Nop(); Scl=0;/*反向应答位*/void NoAck(void) Sda=1; Nop(); Scl=1; Nop(); Scl=0; /*发送数据子程序,Data为要求发送的数据*/void Send(uchar Data) uchar BitCounter=8; uchar temp; do temp=Data; Scl=0; Nop(); if(temp&0x80)=0x80) Sda=1; else Sda=0; Scl=1; temp=Data1; Da

8、ta=temp; BitCounter-; while(BitCounter); Scl=0;/*读一字节的数据,并返回该字节值*/uchar Read(void) uchar temp=0; uchar temp1=0; uchar BitCounter=8; Sda=1; do Scl=0; Nop(); Scl=1; Nop(); if(Sda) temp=temp|0x01; else temp=temp&0xfe; if(BitCounter-1) temp1=temp1; temp=temp1; BitCounter-; while(BitCounter); return(temp

9、); void WrToROM(uchar Data,uchar Address,uchar Num) uchar i; uchar *PData; PData=Data; for(i=0;iNum;i+) Start(); Send(0xa0); Ack(); Send(Address+i); Ack(); Send(*(PData+i); Ack(); Stop(); mDelay(20); void RdFromROM(uchar Data,uchar Address,uchar Num) uchar i; uchar *PData; PData=Data; for(i=0;i0;x-)

10、 for(y=110;y0;y-);/-写指令-write_1602com(uchar com)/*液晶写入指令函数* lcd1602_rs=0;/数据/指令选择置为指令 lcd1602_rw=0; /读写选择置为写 P0=com;/送入数据 delay(1); lcd1602_en=1;/拉高使能端,为制造有效的下降沿做准备 delay(1); lcd1602_en=0;/en由高变低,产生下降沿,液晶执行命令/-写数据-write_1602dat(uchar dat)/*液晶写入数据函数* lcd1602_rs=1;/数据/指令选择置为数据 lcd1602_rw=0; /读写选择置为写 P

11、0=dat;/送入数据 delay(1); lcd1602_en=1; /en置高电平,为制造下降沿做准备 delay(1); lcd1602_en=0; /en由高变低,产生下降沿,液晶执行命令/-初始化-void lcd_init(void) write_1602com(0x38);/设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据 write_1602com(0x0c);/开显示不显示光标 write_1602com(0x06);/整屏不移动,光标自动右移 write_1602com(0x01);/清显示/=将按键值编码为数值=unsigned char coding(uns

12、igned char m) unsigned char k; switch(m) case (0xee): k=1;break; case (0xde): k=2;break; case (0xbe): k=3;break; case (0x7e): k=A;break; case (0xed): k=4;break; case (0xdd): k=5;break; case (0xbd): k=6;break; case (0x7d): k=B;break; case (0xeb): k=7;break; case (0xdb): k=8;break; case (0xbb): k=9;br

13、eak; case (0x7b): k=C;break; case (0xe7): k=*;break; case (0xd7): k=0;break; case (0xb7): k=#;break; case (0x77): k=D;break; return(k);/=按键检测并返回按键值=unsigned char keynum(void) unsigned char row,col,keynum; PCOM=0xf0; if(PCOM&0xf0)!=0xf0) Delay5Ms(); /Delay5Ms(); if(PCOM&0xf0)!=0xf0) row=PCOM&0xf0; /确

14、定行线 keynum=row|0x0f; PCOM=keynum; col=PCOM&0x0f; keynum=row+col; while(PCOM&0xf0)!=0xf0) PCOM=0xf0; return keynum; else return 0; else return 0; /无键按下时返回0/=一声提示音,表示有效输入=void OneAlam(void) ALAM=0; Delay5Ms(); ALAM=1;/=二声提示音,表示操作成功=void TwoAlam(void) ALAM=0; Delay5Ms(); ALAM=1; Delay5Ms(); ALAM=0; Del

15、ay5Ms(); ALAM=1;/=三声提示音,表示错误=void ThreeAlam(void) ALAM=0; Delay5Ms(); ALAM=1; Delay5Ms(); ALAM=0; Delay5Ms(); ALAM=1; Delay5Ms(); ALAM=0; Delay5Ms(); ALAM=1;/=显示提示输入=void DisplayChar(void) unsigned char i; if(pass=1) write_1602com(er); for(i=0;i16;i+) write_1602dat(LockOpeni); else if(N=0) write_160

16、2com(er); for(i=0;i16;i+) write_1602dat(Errori); else write_1602com(er); for(i=0;i16;i+) write_1602dat(start_linei); /=重置密码=void ResetPassword(void) unsigned char i; unsigned char j; if(pass=0) /函数 Ensure(void)中第一次输入正确密码就会将PASS置1 pass=0; DisplayChar(); ThreeAlam(); else if(ReInputEn=1) /在键确认函数 Ensur

17、e(void)中两次输入正确密码就会将ReInputEn置1 if(N=6) ReInputCont+; if(ReInputCont=2) for(i=0;i6;) if(TempPasswordi=InputDatai) /将两次输入的新密码作对比 i+; else write_1602com(er); for(j=0;j16;j+) write_1602dat(Errorj); ThreeAlam(); /错误提示 pass=0; ReInputEn=0; /关闭重置功能, ReInputCont=0; DisplayChar(); break; if(i=6) write_1602co

18、m(er); for(j=0;j16;j+) write_1602dat(ResetOKj); /显示密码更新OK TwoAlam(); /操作成功提示 WrToROM(TempPassword,0,6); /将新密码写入24C02存储 ReInputEn=0; ReInputCont=0; CorrectCont=0; else / if(ReInputCont!=2) OneAlam(); write_1602com(er); for(j=0;j16;j+) write_1602dat(againj); /显示再次输入一次 for(i=0;i6;i+) TempPasswordi=Inpu

19、tDatai; /将第一次输入的数据暂存起来 N=0; /输入数据位数计数器清零 /=输入密码错误超过三过,报警并锁死键盘=void Alam_KeyUnable(void) P1=0x00; ALAM=ALAM; Delay5Ms(); /=取消所有操作=void Cancel(void) unsigned char i; unsigned char j; write_1602com(er); for(j=0;j16;j+) write_1602dat(start_linej); TwoAlam(); /提示音 for(i=0;i6;i+) InputDatai=0; KEY=1; /关闭锁

20、 ALAM=1; /报警关 operation=0; /操作标志位清零 pass=0; /密码正确标志清零 ReInputEn=0; /重置输入充许标志清零 ErrorCont=0; /密码错误输入次数清零 CorrectCont=0; /密码正确输入次数清零 ReInputCont=0; /重置密码输入次数清零 open_led=1; s3_keydown=0; key_disable=0; N=0; /输入位数计数器清零/=确认键,并通过相应标志位执行相应功能=void Ensure(void) unsigned char i,j; RdFromROM(CurrentPassword,0,

21、6); /从24C02里读出存储密码 if(N=6) /N的值由main函数确定 if(ReInputEn=0) /重置密码功能未开启 for(i=0;i6;) if(CurrentPasswordi=InputDatai) i+; else / if(CurrentPasswordi!=InputDatai) ErrorCont+; if(ErrorCont=3) /错误输入计数达三次时,报警并锁定键盘 write_1602com(er); for(i=0;i16;i+) write_1602dat(Errori); do Alam_KeyUnable(); /输入密码错误超过三次,报警并锁死键盘 while(1); / if(ErrorCont=3) else / if(ErrorCont!=3) TR0=1; /开启定时 key_disable=1; /锁定键盘 pass=0; break; /else_1 if(CurrentPasswordi!=InputDatai) /跳出for(i=0;i6;)循环 if(i=6) CorrectCont+; if(C

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1