基于51单片机的密码锁(可改密码内容摘要:

88,1. [10] 戴佳 , 戴卫恒 .C 语言应用程序设计 [M].电子工业出版社, 2020,1. [11] 龚运新 . 单片机 C 语言开发技术 [M].清华大学出版社 2020,1. 16 附 录 附录 1 总原理图 (T2)1(T2EX)2345678RESET9(RXD)10(TXD)11(INT0)12(INT1)13(T0)14(T1)15(WR)16(RD)17XTAL218XTAL119GND20(A0)21(A1)22(A2)23(A3)24(A4)25(A5)26(A6)27(A7)28PSEA29ALE30EA31(AD7)32(AD6)33(AD5)34(AD4)35(AD3)36(AD2)37(AD1)38(AD0)39VCC40U1AT89C51123456781615141312111094K7RP1Res Pack4S?SWPBS?SWPBS?SWPBS?SWPBS?SWPBS?SWPBS?SWPBS?SWPBS?SWPBS?SWPBS?SWPBS?SWPBS?SWPBS?SWPBS?SWPBS?SWPB12XXTAL1161KR?ARes Pack21 161KARes Pack2Q?PNPD?Photo Sen30pFC2Cap30pFC1Cap10uFC3Cap Pol1S1SWPBVSS1VDD2VEE3RS4RW5E6D07D18D29D310D411D512D613D714====CODED LOCK===*LCD_1602LS?Bell12345K?RelayABCD1 2 3 4ABCD1234GNDD0D1D2D3D4D5D7D61KR1Res TapGNDGNDVCCVCCGNDVCCVCCGNDVCCVCCVCCGNDGND1KR?Res2VCCA01A11A23GND4SDA5SCL6WP7VCC8*AT24C02GNDVCC 附录 2 源程序 源程序 include include define LCM_Data P0 define uchar unsigned char define uint unsigned int //define Busy 0x80 //用于检测 LCM 状态字中的 Busy 标识 define w 6 //定义密码位数 17 sbit lcd1602_rs=P2^5。 sbit lcd1602_rw=P2^6。 sbit lcd1602_en=P2^7。 sbit Scl=P3^4。 //24C02 串行时钟 sbit Sda=P3^5。 //24C02 串行数据 sbit ALAM = P2^1。 //报警 sbit KEY = P2^0。 //开锁 sbit open_led=P2^2。 //开锁指示灯 bit operation=0。 //操作标志位 bit pass=0。 //密码正确标志 //bit ResetEn=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[]={password: }。 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 }。 //OPEN unsigned char code SetNew[]= {SetNewWordEnable}。 unsigned char code Input[]= {input: }。 //INPUT unsigned 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 InputData[6]。 //输入密码暂存区 unsigned char CurrentPassword[6]={1,3,1,4,2,0}。 //当前密码值 18 unsigned char TempPassword[6]。 unsigned char N=0。 //密码输入位数记数 unsigned char ErrorCont。 //错误次数计数 unsigned char CorrectCont。 //正确输入计数 unsigned char ReInputCont。 //重新输入计数 unsigned char code initpassword[6]={0,0,0,0,0,0}。 //=====================5ms 延时 ============================== void Delay5Ms(void) { unsigned int TempCyc = 5552。 while(TempCyc)。 } //===================400ms 延时 ============================== void Delay400Ms(void) { unsigned char TempCycA = 5。 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_()。 19 _nop_()。 _nop_()。 } /*起始条件 */ void Start(void) { Sda=1。 Scl=1。 Nop()。 Sda=0。 Nop()。 } /*停止条件 */ void Stop(void) { Sda=0。 Scl=1。 Nop()。 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。 } 20 /*发送数据子程序, Data 为要求发送的数据 */ void Send(uchar Data) { uchar BitCounter=8。 uchar temp。 do { temp=Data。 Scl=0。 Nop()。 if((tempamp。 0x80)==0x80) Sda=1。 else Sda=0。 Scl=1。 temp=Data1。 Data=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=tempamp。 0xfe。 if(BitCounter1) { 21 temp1=temp1。 temp=temp1。 } BitCounter。 } while(BitCounter)。 return(temp)。 } 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。 iNum。 i++) { Start()。 Send(0xa0)。 Ack()。 Send(Address+i)。 Ack()。 Start()。 Send(0xa1)。 Ack()。 22 *(PData+i)=Read()。 Scl=0。 NoAck()。 Stop()。 } } //============================LCD1602=================== define yi 0x80 //LCD 第一行的初始位置 ,因为 LCD1602 字符地址首位 D7 恒定为 1( 100000000=80) define er 0x80+0x40 //LCD 第二行初始位置(因为第二行第一个字符位置地址是 0x40) //延时函数,后面经常调用 void delay(uint xms)//延时函数,有参函数 { uint x,y。 for(x=xms。 x0。 x)。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。