找回密码
 注册
关于网站域名变更的通知
查看: 423|回复: 1
打印 上一主题 下一主题

单片机数字密码锁(源代码)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-21 09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机数字密码锁(源代码)" E  |+ X+ E$ j: x( p
# U1 {! J& s  f9 C$ E$ R# u

0 ]3 A5 F: B1 W* o; A$ m4 g& p4 K单片机数字密码锁:
6 f8 X' M- d& Z' k1 U" a. S0 k
3 ?# ]1 Z0 f, e' f
, z" y7 F( @- x$ g1 _* A程序源代码:
* b) ^$ S: d' y7 u8 p. }. X
//************************************************************************************************************************************
9 J& m+ g# g! f# H( q& g//库调用.宏类型定义.位定义//# Z2 M; c( e* Z2 m& B" o  J' g1 J
//************************************************************************************************************************************
& \- T3 a2 h, p9 w9 T+ T$ B#include <reg52.h>                                    
, R+ t) U8 ^1 A: Z: `- c* W#include <intrins.h>
% q0 y0 [. ^5 W' h& |. k/ x1 R" w#define uchar unsigned char
+ s1 l, n4 C2 e, r# b' k#define uint unsigned int% _/ v: C6 L, g( \+ `! q* ~
#define ushort unsigned short' t( z3 t; \9 x
& k: ^; Z. A, E* p
#define GPIO_KEY P1                 //矩阵键盘烧扫描端口
8 o* j8 U. ^6 F" @# F$ ksbit RS = P2^2;                                       //液晶显示器控制端口
/ S# H. l0 j: A- V( C1 dsbit RW = P2^3;
5 S3 L4 w9 z* k) j9 S+ hsbit E = P3^7;
3 V. `/ w/ w2 }( `- Vsbit shuchu=P2^0;                                      //继电器控制端口
6 T" x0 o4 G; B' W5 Dsbit beep=P2^1;                                              //报警器端口- Z4 x) ]2 F) t4 N  S. o
sbit DoorBell=P3^6;                                    //门铃端口+ s3 ]. `7 Q% `* ~6 G
sbit SCL = P2^6;                    //AT24C04的时钟5 N' U8 J. L2 q3 B0 H
sbit SDA = P2^7;                    //AT24C04的数据: O( j0 G( i2 H/ m' n" N
5 I8 E; a8 w' \/ W% A$ L# x! [& S
uchar idata upxs[16]={"Password:"}; //上排存放数组
/ `# F( ]0 Q0 R- Juchar idata dwxs[16]={""};          //下排存放数组8 f) _! g3 B2 f8 A% D
uint idata tempword[6]={0};                     //临时密码数组5 c+ r& _5 X6 |# ~, H
uint idata password[6]={1,1,1,1,1,1};//初始密码; l1 P/ D' v0 E7 L7 H3 q
uint idata now=0;                                                  //数组伪指针: g+ W7 F; p8 i) z7 a% d% ]* ^' T
uint idata key=0;                   //密钥# C. [4 |+ D+ H9 ]' }( C- k1 N
uint idata keyboard=0;              //键盘锁定标志
# D1 a2 K4 k' e+ n- u2 Z  Fuint idata key1=0;                                          //用于密码修改" B6 E( \* C( u. L3 H2 f
uint idata KeyValue=16;             //用来存放读取到的键值8 T0 c& I7 U) \5 L6 v, ~2 ]9 P
uint idata warn=0;                                          //错误累计6 q8 x) r  s! |/ H
uint idata time=0;                                          //用于定时
. u4 V$ \  U/ Xuint idata time1=0;                 //用于定时4 p3 q" o% j! ]0 r
uint idata time2=0;                 //用于定时- X* j4 T' y" }3 o
uint idata moshi=0;                                          //定时器内部模式
% ?+ Z" V% k* T+ ruchar idata BUF[8];                 //掉电数据缓存区
  ^- G  w. T- ruchar idata TESTDATA[8]={0};        //掉电新密码存储6 b; z$ ]- A$ }' `. D( l4 m
uint idata menu=0;                                    //menu用于密码修改2 U0 @* ?8 R0 z6 r6 B
uint idata tempword1[8]={0};        //用于密码修改0 i2 U5 Z, e: t; W7 O7 D- `2 g) ~
//*********************************************************************************************************************************3 \5 _+ f/ H- T' m
//函数声明//) s  v5 V+ x" H
//*********************************************************************************************************************************
1 t5 C! s; \; N  b0 i4 Nvoid delete(void);
4 _% f0 y, y" L8 x* w//*********************************************************************************************************************************
, m: Q1 c: T0 P0 `# E0 \/*模块名称:液晶驱动显示模块*/! ]+ L- X5 G. l8 L
/*模块功能:驱动LCD1602的显示,并时时显示按键值*/' D( P9 N8 ^. w
//*********************************************************************************************************************************3 ]: P% v) r  j; J1 q2 C. X2 S( B" J" p
void delay(uint dell)//毫秒延时//
  V6 `. j3 C# x5 H# h& C1 z{
4 W. a1 @' W  }1 J" g; q     uchar x;, I9 M1 y! r6 g. ]: P6 N% N. c
     for(dell;dell>0;dell--): `2 A* U+ b. F+ e* g+ a; g
     for(x=110;x>0;x--);2 B! I3 r& W; B: o7 Q+ x1 g7 z
}, v! Z1 M% Z& \2 i
void wr_com(uchar temp)//写指令//8 k0 v* I/ i! f$ U0 y2 \
{5 |9 c5 Z% V4 _. G9 B
     RS=0;  a1 m3 c$ |; i: R  v6 @
     RW=0;- u5 ]7 x) s- Q5 c
     P0=temp;
4 ~( y8 a8 o4 s; b$ m     E=1;  O" h+ S1 W% e$ B/ R0 F
     E=0;4 z' p0 u% v: d
}+ N* T1 K7 G5 v, R* f, P' W7 N
void wr_data(uchar num)//写数据//$ {# K# m) R+ `- ^% j2 ^0 R& }
{( p4 o3 {+ j3 v/ k! Y
     RS=1;2 r8 D1 y; @& s. m$ |8 ]" ^; r
     RW=0;
( x7 p5 c8 S: j+ D2 w     P0=num;
5 v% @/ t; N0 e6 o     E=1;
6 K8 j* \# o; o3 G, J! {     E=0;
- U5 N% N" Y7 C) f3 p6 a) f1 S}" `- Y6 Y7 g  P  b
void disp_lcd(uchar addr,char *templ)//显示函数//+ z" I; b4 v/ w9 j
{. d$ K$ }2 n) m6 ]
     uchar i;2 J) v# ]5 h0 b; H2 X
     wr_com(addr);
" T" E: T- B' \6 Z/ s! r+ J& d           delay(50);2 T, m& [. w: X5 a) t( e
     for(i=0;i<16;i++)
$ G' E! e6 R% n  c- w: A    {
! {4 A6 v3 b3 ?! l. z* Z" t" F7 {     wr_data(templ);
; W4 N" k* O2 [. y' z0 C+ l$ ^, D           delay(50);: _4 t' f: H/ g. s2 c1 ?
    }         
6 D1 g4 g1 V% ?; m- x}
$ E7 K9 x1 k; O6 k/ S$ p/ B9 nvoid lcd_init()//初始化液晶//
" j! w( Q+ _, F* ]2 N- y8 n{& G2 O# y: k0 W. y$ d1 O8 U
     wr_com(0x30);
! M5 [9 T" L  B5 U7 U+ Q      delay(50);
* h6 i; C+ s" K     wr_com(0x38);
8 F9 H9 f6 m: O* |* d$ d: G+ G! F      delay(50);
0 D; K* S  {" i* {8 ^% q     wr_com(0x01);: Y- k7 i$ P3 g3 u; M, l7 ?
      delay(50);! g7 x+ l8 s" p
     wr_com(0x06);1 `3 @. u" T! Q4 U8 m" N
      delay(50);
9 D" d+ A, u4 V& `+ @9 e$ {     wr_com(0x0c);6 ?6 Q2 w& d& r2 g3 E
      delay(50);9 `" Q- X8 f! P2 ~
}  a2 J( @- q* F9 T# _- m$ N
void lcdxianshi(void)//液晶总显示//" b0 q) i" P, H
{
& e, ]9 u. d/ b. A+ @     disp_lcd(0x80,upxs);
4 E6 F# s% g9 S) B     disp_lcd(0xc0,dwxs);
; o5 j0 o/ d: z  U9 K}7 }7 V1 {3 x& n' H. A
//*********************************************************************************************************************************
. \) m7 ?, U! v+ V2 U/*模块名称:矩阵键盘扫描模块*/
" T( F& y$ c# D4 n3 `/*模块功能:时时扫描按键值*/2 I& }" F% X1 O/ d3 H
//*********************************************************************************************************************************
  b! r7 e* z4 y2 S# V* Gvoid Delay10ms(void)//延时函数//
! I) V( d1 C/ }* l# Q4 O{
- u8 F. H, ]% N5 @9 E    unsigned char a,b,c;
* `: P# U2 }2 H; }4 \    for(c=1;c>0;c--)5 I/ j: W; m! S0 [+ U% t. @! J; x
        for(b=38;b>0;b--)( g& G" s& s% f8 `9 J, r
            for(a=130;a>0;a--);
$ M! Z; M3 A9 y6 S0 |- W}
. t1 I4 P. k7 D4 E8 wvoid KeyDown(void)//键盘检测函数//
" G2 e. f1 c7 K; s- |8 m{
/ i+ B% d( X5 U' I2 r" j        char a=0;
' f) B) D* }3 o0 n* J        GPIO_KEY=0x0f;  s; q+ ]1 \5 j9 B0 @6 C
        if(GPIO_KEY!=0x0f)     //读取按键是否按下+ _% Z4 j( y: Z1 E
        {* d% N' e$ I# s; w5 K5 N
                Delay10ms();         //延时10ms进行消抖+ E2 W9 T7 D( u1 u! m1 |
                if(GPIO_KEY!=0x0f)   //再次检测键盘是否按下: {- f$ d4 U; g/ i0 j9 H
                {
( ^& M& u  H& [8 H/ E' q6 D0 @( s; O8 M# m2 A0 f7 \7 U2 o
                        //扫描列
  @; P) n* A! x  O2 ?. C4 S                        GPIO_KEY=0X0F;
7 [( ^- J, p3 {                        switch(GPIO_KEY)$ m. Z2 A. V1 ]
                        {2 f9 w  r% |2 M& _6 Z
                                case(0X07):        KeyValue=0;break;6 F, T# e& u* Y+ U+ ?3 M/ K& d7 H
                                case(0X0b):        KeyValue=1;break;- H. `6 }* `  |
                                case(0X0d): KeyValue=2;break;
, @8 r+ n5 {) i) b+ l) i                                case(0X0e):        KeyValue=3;break;- q4 O! `5 y; s  y
                        }
+ g$ o' e% N- T4 A; W" O* D' f                        //扫描行
- Q- ]+ Z  B% j                        GPIO_KEY=0XF0;3 V. B6 T( n# [$ f! N
                        switch(GPIO_KEY)/ B% W% {8 @2 {
                        {3 R1 s4 ~: k7 G2 I9 E; ^
                                case(0X70):        KeyValue=KeyValue;break;# }* c% y: L& F/ D/ H8 n" T5 {
                                case(0Xb0):        KeyValue=KeyValue+4;break;0 L. S5 {  V8 y6 Z: B% S
                                case(0Xd0): KeyValue=KeyValue+8;break;3 l  @9 o2 @/ ?+ R* Y; {
                                case(0Xe0):        KeyValue=KeyValue+12;break;9 \; ~* T$ X) M" w5 X
                        }
& X. \+ |' {8 \  e* O4 o                        while((a<10)&&(GPIO_KEY!=0xf0))//按键松手检测
* f0 E( G* d" `5 \4 n9 ?# ?! z                        {/ r0 h, o* k* q* {) ~2 i
                                Delay10ms();  ]) Q3 [& b* c1 h9 N, `' t: i
                                a++;5 W. |: ~: h( Z; O4 ~
                        }) q0 m% r! N2 h+ c
                }
8 f5 g; W9 V9 p" E. V4 M8 o        }/ L0 R/ g8 }2 C7 L$ P; |9 J# R0 v
}( R$ q9 k+ i0 f+ `7 u
//*******************************************************************************************************************************
2 j/ z+ c  _8 I) s- h3 N/*模块名称:数据处理模块*/$ C$ t/ m. q8 ?7 C4 B
/*模块功能:(1)将按键值传递给各种缓存数祝(2)包含数据清除函数*/
. [8 C2 \  q/ A% t//*******************************************************************************************************************************
5 G0 \3 d3 O1 _- ^' O& h1 avoid keysend(void)//键值传递//; Q* D, l8 {8 x0 I
{0 d" T. E! O% ^; z) L2 V# w, J3 x
                 switch(KeyValue)& `8 [. \* i. D* E1 V1 d. f
           {5 e# y) ^% s& k6 F/ L" D3 C5 J
             case 0:{dwxs[now]='0';tempword[now]=0;TESTDATA[now]=0;now++;break;}% }/ U0 `  u: N2 h9 E! o
                   case 1:{dwxs[now]='1';tempword[now]=1;TESTDATA[now]=1;now++;break;}
, N0 [% @4 o# q/ |) B                   case 2:{dwxs[now]='2';tempword[now]=2;TESTDATA[now]=2;now++;break;}4 t) e# M6 B! a) `7 L' L8 m
                   case 3:{dwxs[now]='3';tempword[now]=3;TESTDATA[now]=3;now++;break;}: |* I& U$ k9 z0 p6 p* h
                   case 4:{dwxs[now]='4';tempword[now]=4;TESTDATA[now]=4;now++;break;}
: G6 u. _- ?0 `( d7 H                   case 5:{dwxs[now]='5';tempword[now]=5;TESTDATA[now]=5;now++;break;}
4 y& R4 W, \- v                   case 6:{dwxs[now]='6';tempword[now]=6;TESTDATA[now]=6;now++;break;}
/ _+ b6 q. b4 Z: t. ?                   case 7:{dwxs[now]='7';tempword[now]=7;TESTDATA[now]=7;now++;break;}
$ v5 r- [2 ^8 n% ~                   case 8:{dwxs[now]='8';tempword[now]=8;TESTDATA[now]=8;now++;break;}0 ?$ I0 R' T2 r4 H2 `  v' ]* e& Q: J; ^
                   case 9:{dwxs[now]='9';tempword[now]=9;TESTDATA[now]=9;now++;break;}
; f; }. h* G: C+ c; I6 H6 f                   case 11:{
* b. H9 K* k  J' r. {$ P( Y$ F                                        upxs[12]='S';
) E' a' M8 f4 b1 f                                       upxs[13]='U';
: X: B6 V: k9 i2 e. q' K                                       upxs[14]='R';
! V% I- r+ P) T6 M  z5 E                                       upxs[15]='E'; break;8 ~2 n( r* T. s. P' H! `$ g
                   }
" G5 U. ^  S1 @3 H  E3 d                   case 14:{
; @6 D2 V1 p) h' E/ O) v6 b6 D/ v0 _9 w                           menu++;                         //密码修改模式启动模式一
8 p( M& I0 @( E/ A3 e                                  if(menu>1)                     //再次按下跳出密码修改模式
$ T/ m! r& h3 u0 Q/ \. n                                  {& X) u0 _# P: U' o! l: o
                                           upxs[0]='P';           //显示“password”# p$ s, b% y; Z& Q( T% w
                             upxs[1]='a';: V3 ^, R7 c9 }  g$ b# t
                             upxs[2]='s';
- [, ]# D( i* X; [5 i                             upxs[3]='s';) m1 T5 H( n1 i9 L" d) C6 j5 t
                             upxs[4]='w';5 W: K6 q2 _% V  L
                             upxs[5]='o';
6 B6 S# l; g( c                             upxs[6]='r';
* ~: c5 f5 N* O2 C! N& {                             upxs[7]='d';
# F: E9 N- z3 a                                 upxs[8]=':';# y+ ?" L' \! c8 {8 A) E: @& o
                                         delete();
! U8 f6 R1 G4 h1 g$ V                                         menu=0;
+ e' S5 |5 @' e" `                                  }
' y! B8 Q6 g. J4 x% \% `' i) L* o, y                                  break;! A3 W/ [( t5 i+ F( \
                   }! H+ j4 z/ P$ N9 U  P+ }% `8 V6 |( M: T
                   case 15:{
& y& N+ q" J/ Q6 g0 S                          TR0=1;                     //定时器0打开1 \% R  O$ y. W* g* o$ a/ b
                                     moshi=1;                           //模式1为门铃模式
3 o$ K7 K1 {+ j  ^' N9 q( ^                                  KeyValue=16; break;//键值缓存清零
  U7 ?6 d" _: E                   }
3 L* i) \1 w8 n2 ?4 I* O                  }# h- [& W" Q' H2 {) ^" E+ x
                  if(now==6) now=0;      //只存储8位,只显示八位
  Y/ x  I/ f% M4 r$ G4 r}
7 l* W  F/ x% Lvoid delete(void)//清除函数//* {* Z) Q# z& T& Q" L; E
{% w7 y: Z, m3 h9 ~8 y
     uchar i;
1 _' N% N. a6 i, s             for(i=0;i<16;i++)1 `# Z) V& N# v( k% Z
                 {1 M5 L7 s7 S3 D7 f- w) \4 Z
                    dwxs=0x20;            //密码字符清零0 i4 I5 x$ r$ L* g( V
                 }
7 i( q5 k# r" I                 for(i=0;i<6;i++)
& F, t. s" f' E2 u                 {: u. X! G# c% D4 G/ `) o
                    tempword=0;         //密码缓存数组清零' h9 {0 d* j1 {
                 }6 G' c  M0 B% o. A' `7 m3 y0 G% {& v
                  upxs[11]=0x20;, L; T$ m+ ~8 d. M0 J
                  upxs[12]=0x20;   //SURE显示清零
* a) Z9 f  i" G; Z) |2 T9 \' k                        upxs[13]=0x20;+ \' _) ]( K% c0 D
                        upxs[14]=0x20;- W+ i+ Q! y4 B2 T
                        upxs[15]=0x20;4 F& ~! j. K$ A0 d4 J  q' f
                 now=0;                                       //伪指针复位$ n: b; i6 B: ^9 u
                 key=0;                                       //密钥清零9 C; c8 p7 X' f: R1 P6 {+ z
                 KeyValue=16;                     //键值缓存初始' T7 R" T, \# Z$ ]# e0 B
}
0 ]4 s7 t: _+ m/ q% n% k+ pvoid condition_delete(void) //条件清除# `/ W9 A! P9 ~* N9 c% P
{
5 ?9 L1 @+ n+ K6 _5 K9 g/ f5 m1 P     if(KeyValue==10)
/ G( T4 j8 G' E& n         {, ~9 i; f; e9 g- ~$ ?4 b, @  _
                delete();            //按下DELE键清除数据* b/ [9 G" y7 L$ X2 j. ~- l- V/ G
         }
- R  }( o3 ^( K# d% {: r         KeyValue=16;                             //键值缓存清零
1 F0 O" S3 A% O. H}
4 y5 a* ]6 r- v4 s7 X//*********************************************************************************************************************************. T& o3 U% J& ~4 M1 @! R6 `
/*模块名称:定时器模块*/) h# h! @0 x! l; Y0 ^) r% r! P
/*模块功能:定时器0用于产生门铃效果,定时器1用于各种倒计时*// Q1 [8 D+ b. O8 B
//*********************************************************************************************************************************
; a) P& Q  |' D4 E- z! \2 pvoid timer0() interrupt 1    //定时器0用于门铃
3 q; @' L/ V* x0 I: S* Z{# [5 J1 J/ o1 ]$ z/ D
    switch(moshi)
  l0 `6 J( ^  Q, u: O   {  s. c9 i) U, {& R3 [1 A# A
      case 1:{# F' _/ |  V, W& H
                DoorBell=~DoorBell;+ S  ~" _3 a6 B
            time++;5 _6 {+ y3 V, F5 F& C
             if(time<400)             //若需要拖长声音,可以调整 400 和 800+ a0 N. P9 h. ~2 z# T) j! ]* ]) ?
            {* S3 o. V8 f: M$ J+ M# s1 F' d/ l
               TH0=(8192-700)/32;     //700us 定时
7 }$ T; v! u0 M( A) J               TL0=(8192-700)%32;
. N' h- w# t3 n& I! G9 n8 Y0 |; H9 {            }+ n$ j5 x' c" `5 h
             else if(time<800)% t  c# l+ o) X! J* N! ~
            {
7 Z: s4 E# F% r               TH0=(8192-1000)/32;    //1ms 定时
* g! r: e1 r" _7 E: A- k; g" Q               TL0=(8192-1000)%32;
! }1 d/ v2 T" I  F: o8 d5 g            }, s! }8 L3 c6 {! _/ h
             else4 r. L/ b  r' @
            {9 @4 K0 S+ p% k) Z' G. \
               time=0;                                  //计数清零2 K4 a8 B. V7 h# ]6 u! t
               TR0=0;                                  //关闭定时器6 `- W- ?1 F% w# S0 n$ D
                           moshi=0;                                     //跳出模式1
/ z4 r# i6 D  T) R: @            }
5 \3 z- u8 v6 C( d                        break;
! @& K4 T+ e; Z" g          }
8 i$ T" b% z/ @0 I          case 2:{
. \5 J- B* O+ J1 F4 _) k                           beep=~beep;
: P8 Q8 ?; ]- q, h# ?/ Y% {                         time++;0 E# O% T: b( [
                         if(time<400)             //若需要拖长声音,调整 4001 a/ e5 P8 @% c
            {# y. g# y0 ^5 W& m+ ?
               TH0=(8192-700)/32;     //700us 定时8 R8 P9 t! K# ~7 d  e9 x$ p
               TL0=(8192-700)%32;9 a: J" w1 h+ m
            }2 v- K7 f4 ~' D7 Y
                        else  n  M5 U( n! o/ p0 _4 G
                        {3 l# a7 R: L# w5 ^; R
                           time=0;                                  //计数清零
* N# [- c2 L  `! d, `0 {1 }  o                        }
5 }# w  v9 l" R( j                        break;% w5 V% h1 p$ k6 x, B! D
          }& K, P/ ^$ z+ F- v& I, H
   }# m& ~9 T: I- g3 p+ F( U6 e
}, V6 F' F- K% I) S% e) s: N
void timer1() interrupt 3          //定时器1用于自动关门
% \3 z4 x; z; f- S* i- s{  
* |1 i8 ~, T  [) n5 W+ B+ x, D* i+ r* \    TH0=(65536-50000)/256;  ( \, J& s7 T1 m' U/ H5 h( @
    TL0=(65536-50000)%256;    h/ y# u/ ~) X3 Q* t
    time1++;   
! A, _$ h: A0 j( Z    if(time1==20)//一秒  6 Y9 J. _4 a' @# q' g
    {      4 m- f. ?; f! {5 |  q; r
      time2++;  j+ U9 ]* n  S+ ~
            time1=0;  
& T4 n3 U) T+ m$ u; e    } 4 h9 t& p0 @% g8 F* D  C( g
}
% F0 p, X' _/ k: k  m//**********************************************************************************************************************************
1 w/ |3 g- H9 t3 _% l) a% T3 n& v/*模块名称帜:掉电模块*/
6 G+ ]& |% H3 \. s7 m9 ]/ p/*模块功能:支持门锁掉电后密码可保存而不丢失*/
7 K9 \& S& y) s. G' }//**********************************************************************************************************************************
9 k8 L  j5 Y. o* v! N//延时5微秒(STC90C52RC@12M),此延时对于12M晶振- D1 I2 W) b9 q5 x1 K% T
void Delay5us(); v- l+ C: k8 |- x/ G
{6 V7 D0 g0 y; W+ c2 @1 T0 @+ v/ t% f5 l
    _nop_();8 k+ b" {, K, N0 X
    _nop_();
" |3 k9 N( ^5 R2 I: d% i}  O! U/ \4 [7 Q: T" Y$ a
//延时5毫秒(STC90C52RC@12M)' R& \8 n0 i1 W3 ]( B& b5 `  ~
void Delay5ms()! K/ f. n) c# @0 t
{2 _7 S( O5 `$ N9 _
    ushort n = 560;
1 I# w/ c2 P5 ?6 v: O' ?    while (n--);; r; g/ I, K6 I8 k0 ^5 P
}
  O$ y7 U  k0 W' p6 X- [& T//起始信号
" d  n1 N* y8 R( p0 _6 ]void AT24C04_Start()+ _6 U5 i1 w; b4 g! H1 h2 o
{
+ g$ p$ H8 k/ |; h# W, G" e    SDA = 1;                    //拉高数据线
) j0 R! f+ P& p( A    SCL = 1;                    //拉高时钟线
: O0 S1 \# e0 C: c9 [- m' u5 |$ s    Delay5us();                 //延时
, L5 S1 J- n, o8 Y; q    SDA = 0;                    //产生下降沿+ X' f) |; i+ w# R* N8 R0 o
    Delay5us();                 //延时) w4 \+ l4 e. g
    SCL = 0;                    //拉低时钟线
- K' t7 ~) z/ a% F" |+ R% {}
* c' T; Y5 q4 }* I) A3 C" e//停止信号
$ E+ j/ X* t  r# Ivoid AT24C04_Stop()
7 J) s3 K$ H5 z$ G3 F  C{' t( I/ E9 }" K
    SDA = 0;                    //拉低数据线
% x7 R- N" G2 n    SCL = 1;                    //拉高时钟线
) U- x% d: J. R5 }    Delay5us();                 //延时+ Y; N* n/ `/ O( H% |/ f
    SDA = 1;                    //产生上升沿
9 m( A" h% C3 R8 h0 E    Delay5us();                 //延时
( X; p* X5 b/ k3 O% n7 L: D: J! S}
) p/ d: V2 {& q5 \8 u3 G//发送应答信号
7 S$ i: u2 C+ X# Nvoid AT24C04_SendACK(bit ack)2 P+ D! [, T. [" k' D% v& y) N$ ?) w% h
{( v# C. u& k. i* a  U* j
    SDA = ack;                  //写应答信号
6 _3 r% I1 o3 C* {' g: ~8 Z    SCL = 1;                    //拉高时钟线$ T; L; l- U$ }
    Delay5us();                 //延时5 j  N0 x+ U/ h! n) R. e5 v
    SCL = 0;                    //拉低时钟线
4 m3 y* W! V) c( l* N7 L% E. M    Delay5us();                 //延时
  H0 R- F( j8 \1 z$ r}& I' `* G- v" K- o! f5 ?
//接收应答信号0 t& e* E( M3 J3 Z
bit AT24C04_RecvACK()
3 t  r  y+ t4 G% Q+ D{! ?6 _* ~, d1 I2 ]! I: c" B' |. A
    SCL = 1;                    //拉高时钟线" c) S4 T+ z5 R
    Delay5us();                 //延时
% o) n* r' w  T( `  f    CY = SDA;                   //读应答信号4 b* j0 u) Y9 ^$ Q
    SCL = 0;                    //拉低时钟线
$ b$ j- H' h" j7 h# F4 U- k+ J    Delay5us();                 //延时
, W! T( a) C& Q; T
. L# \  t  @- r2 n, u' P; [. D    return CY;
/ U" s+ d! {* z( ?# a}
. X; R+ ^1 Q3 I+ n" N//向IIC总线发送一个字节数据
  i5 v$ O+ }( |- x. ]void AT24C04_SendByte(uchar dat)
! X% B  h+ j* `5 E$ M; y{9 `* [$ {7 M3 ~7 w
    uchar i;% z/ V) h! g, ?3 s' M) D* o
9 D- @" _2 L% i( B
    for (i=0; i<8; i++)         //8位计数器( Y4 w+ z/ e, _  \
    {
5 a  G  n1 a; |2 L% {        dat <<= 1;              //移出数据的最高位
  j  N# b0 d/ p% b4 Q( V4 D$ q) m0 m* W        SDA = CY;               //送数据口
$ p* {+ {- U! T% D* B        SCL = 1;                //拉高时钟线! ^+ V! h9 o: o) Z2 v5 w3 c1 U
        Delay5us();             //延时
9 \* T8 Y- q9 n+ v        SCL = 0;                //拉低时钟线
+ x# {' l1 o- A  B& o" d9 v        Delay5us();             //延时
' p8 I0 ]! d$ U- q1 Z8 `  s4 Q$ n    }! I9 }" v4 V1 u5 y% X
    AT24C04_RecvACK();) O7 h+ P$ A! @" x
}
$ `1 ~# _9 D8 o  S7 b9 ]$ |2 n; m. m3 g//向AT24C04写1页(16字节)数据,将TESTDATA开始的16个测试数据写如设备的00~0F地址中
2 \" f' H5 A" d. ]3 |void AT24C04_WritePage(); p2 P( ~% u# D3 y  R2 N
{
/ _0 H) X' g" G% R- J7 A  m1 b% U2 g    uchar i;; @) G  S2 U! z8 k% [

; j- L: X+ f/ ?$ V3 p    AT24C04_Start();            //起始信号; F, Z7 i' K2 z: U" s
    AT24C04_SendByte(0xa0);     //发送设备地址+写信号
* N1 n1 \# V% D6 \3 L% |5 E  d    AT24C04_SendByte(0x00);     //发送存储单元地址$ n) i5 c6 n; y& y+ @
    for (i=0; i<16; i++)
4 ^  Q; F' |0 C# b$ n# P+ n    {
6 ]/ ]+ e  V1 f3 g' o" ?/ j% h        AT24C04_SendByte(TESTDATA);/ E$ ?8 t: ]) A1 @
    }) }5 s, N9 d" S/ k2 i2 C
    AT24C04_Stop();             //停止信号2 t2 R$ q$ D3 Y  z. u5 M
}1 k& ?- S3 K7 _- q/ a' t6 x
//从IIC总线接收一个字节数据
- f3 }. ^2 j4 s) U( O) ^# t. b/ {uchar AT24C04_RecvByte()3 E# h1 k4 s) ]6 Q7 C8 F/ h6 L
{- J1 u$ N! ^+ ?
    uchar i;
# O& n7 Z5 E, N" \6 ~    uchar dat = 0;
; P, T+ B; X8 P
; e; m+ D" j+ B7 e: ?# z    SDA = 1;                    //使能内部上拉,准备读取数据
$ i/ t2 I2 a7 k; w4 \) a+ Y* h8 C    for (i=0; i<8; i++)         //8位计数器
9 ~1 k0 B! T- ?+ _    {8 Q9 \. U( `3 q( n% R( P/ M
        dat <<= 1;
  e: T* Y: b7 v7 ^' k        SCL = 1;                //拉高时钟线
7 ~; I# w' L7 R. m        Delay5us();             //延时/ W; }+ ]/ {- r0 Z  T
        dat |= SDA;             //读数据
6 Q; }- y% E4 b; Z) d, `2 ^' }        SCL = 0;                //拉低时钟线
6 L4 g# s& ]$ k3 Z- s3 n3 a        Delay5us();             //延时
$ k& I" H8 x# x) z* J  x    }
& c5 J# c6 {/ S" H. s3 ?% r% J; q& o8 H  }/ [
    return dat;1 a- j4 o& Y0 F0 f3 p! D: z8 V2 d
}
' D  z" k& V9 X: M, f! a) R//从AT24C04读取1页(16字节)数据,将设备的00~0F地址中的数据读出存放在DATA区的BUF中
5 \9 Q. D" `4 W9 }4 _void AT24C04_ReadPage()
. ~6 r( n/ L- f/ g/ x{7 z. `& p& K! r
    uchar i;
, l# y) ]  W! @% u$ |* e4 b: c; _4 I% L) `2 u( Z8 M" A
    AT24C04_Start();            //起始信号) v& Z6 I9 ]; L3 t0 c; E2 D" i
    AT24C04_SendByte(0xa0);     //发送设备地址+写信号" q) Z6 ]2 B) ~7 @( r
    AT24C04_SendByte(0x00);     //发送存储单元地址: P% @+ T# c' J& a, W
    AT24C04_Start();            //起始信号
0 N, T) E1 z$ V# J" f    AT24C04_SendByte(0xa1);     //发送设备地址+读信号' j9 @; ]* P6 ]1 d- A" T& ]* ~( Y
    for (i=0; i<8; i++)
) ?6 n" c# D9 w: V/ b  v    {0 U7 H8 e. j0 k9 S6 ^7 }. c( K
        BUF = AT24C04_RecvByte();
+ X9 k( I  k( c% [  R        if (i == 7)( s4 R5 _2 L6 X: }4 H
        {8 ?" I6 U; x. {+ V9 n% w3 h5 E# x# o
            AT24C04_SendACK(1); //最后一个数据需要会NAK
& x: o3 I0 [0 Q+ V+ j. M/ j6 u% a        }- N5 i4 Y2 M7 |! q
        else
. @+ G3 V2 X' m# |/ o  Y3 d7 u        {- }  z- c% f, i- N
            AT24C04_SendACK(0); //回应ACK
- g& X% A, Q% B, Q; C        }. x7 `' e! e! |9 \) P
    }
% N8 A: G* b$ R6 o+ f% j    AT24C04_Stop();             //停止信号6 m2 W) D0 n8 V7 A1 ^4 O! Z8 U) o
}# J5 c; F1 b/ _0 D, m
//********************************************************************************************************************************( u, ~, Y8 K- O, b
/*模块名称:菜单模块*/' s) N5 p- m: n! v
/*模块功能:用于密码修改,先输入旧密码,密码正确两次输入新密码*/: H; }# A9 K" l
//********************************************************************************************************************************* q! {8 Y6 }+ A
void new_password(void)//密码修改函数4 I: J3 |/ l: X/ `0 Q, Z
{/ A, }% p- Y" C" }7 Q+ w# X* D9 z: \
     uchar i,j;
# \9 S4 I, Y9 f( P3 o& _           uchar tempxs1[]={"old mima   MENUi"};//提示:输入旧密码0 L4 v- n8 z' r" O! P
     uchar tempxs2[]={"new mima   FIRST"};//提示:输入新密码一次
7 B# s! {: I+ }( o7 i: |     uchar tempxs3[]={"new mima   AGAIN"};//提示:输入新密码二次
2 c+ F2 W. f1 m, ~7 }$ {. k     uchar tempxs4[]={"password:       "};//password显示8 e5 n; W6 X8 U! T/ k$ A" o( f- i
     uchar tempxs5[]={"success  change "};//修改成功显示' b2 p' p: l6 Y) h' `' W. f
     switch(menu)
& }/ O6 r  O) H$ r( L         {, a; b! F! t( z& X' R
          case 1:{
+ ~8 Y* j/ ^7 ^/ u0 H9 c# u' I' x                for(j=0;j<16;j++){
5 _% L$ i% D  _" g* X    upxs[j]=tempxs1[j];( M* x( \8 v# I! h
   }
" R3 m$ A0 Q+ Q3 Q/ h) g$ K                if(tempword[5]!=0)
/ X4 ^' p" W6 N- j8 G  a! W3 x                {3 S2 b; Y/ Q. ~- o
                  AT24C04_ReadPage();//读取密码( G$ e4 C: t3 z% A1 n( @3 a
                  for(i=0;i<8;i++)0 G2 \" @6 F$ O# m4 k$ n
                  {. m& C% Q) F8 F0 _! V
                         if(BUF!=0)//对比密码,判断是不是第一次使用
/ H1 K/ ^+ s$ _, h# S                        {
# o3 i4 {: v, o8 ?' j* \. E0 G: l                            key1++;
6 q3 C( @8 l) }                        }
3 M; A$ h3 U8 @6 A4 q1 q                  }) Q. B. V$ H4 G* Z* G
                  if(key1==0)//如果是第一次使用' s/ r+ f. ]" k: X, b$ [$ M
                  {2 z9 I, ?/ J6 a( @- M
                     for(i=0;i<6;i++)
# z0 U/ x- g' ~9 K                    {( Z' c* G8 W# Y# J+ |. s
                             if(password!=tempword)//对比初始密码
* W/ O; v& U% `                           {
8 a0 H4 r! ~# [3 X) B& j9 l/ |                            key++;
0 ]' E! L* _! _; `                           }. f' C3 J0 v9 P% d+ J: l+ {7 U9 M
                    }* _' f: j. N  E
                        if(key==0)//密码正确进入菜单二输入新密码# w3 T$ s; v0 d; T1 \
                    {
& H& O0 T- `8 k2 n0 u/ V4 ~5 v, F                       delete();0 N3 ^7 w9 m5 n( H
                           for(i=0;i<8;i++)
& L9 K$ h# B; \8 K* ?$ m                           {
5 O) f7 F7 r" F$ D# a4 _                                     tempword=0;//清空缓存数组7 c7 ?; }+ d1 U* g2 j
                           }+ J8 l* y% B/ v8 `
                           key=0;$ n* L( ~9 }% I( p$ `6 V8 Y
                           key1=0;1 y% w0 d5 g* Y0 v& t
                       menu=2;$ Y: g" I$ |: g/ _4 M4 ~
                    }5 P1 c  f. U+ i* B. x. ]
                  }, `( v' ]! L' A& v' P
                  if(key1!=0)//如果不是第一次使用+ u6 h! e, Q* O# y, b% Z( J9 e. w
                  {2 A% O; J8 C/ }& o9 G
                          for(i=0;i<8;i++)3 Z! M( ~: s' O$ |9 B
                    {0 @+ T* Y) H" |2 L/ t, U
                            password=BUF;
# k( }0 t2 @  z) E$ c3 }% Q                             if(password!=tempword)//对比密码" E: [+ D% O' ^1 c
                            {
7 j6 G; X8 ~7 N                               key++;" O, L8 l; q/ u2 v& a
                            }
* G  e: v" ^4 O$ X: B; V                    }
( x) E5 |4 h9 Y" V) }                        if(key==0)//密码正确进入菜单二输入新密码  n+ R& q3 L% h7 s+ T
                    {
: y% w9 }8 k: Z0 }6 }                       delete();
  ?/ U+ k/ s1 ~/ `- F" M  P+ c% |                           for(i=0;i<8;i++)
$ ^: H0 x5 [4 \1 Y; p' z0 }9 [                           {" {. W- `+ D3 [8 I( Z3 M6 }
                                     tempword=0;//清空缓存数组( ?# v5 y7 j) N# r$ h, i( u9 v
                           }
6 }# Q( M9 V7 y; H) l7 m                           key=0;
' z( `2 B" w( L2 ]                           key1=0;: |" u; e* U& n# C: m4 r9 P  M, {
                       menu=2;
" G( f- ^" S& o, N7 w: e6 O. b/ i                    }# t6 J% u- i8 r# \. Q' o
                  }* ~1 `* B* I: R- D
                }
1 {5 i6 m9 @" Y                break;0 x4 z8 }  V) Y! u* v- \" S4 T3 X. f
                }( @) h. c+ O' N; J0 n
          case 2:{
% h$ e9 [7 k' N# L' ?) P          for(j=0;j<16;j++){
9 n& q* N! s( ?* C# y2 s4 M- @$ g! N    upxs[j]=tempxs2[j];
4 {8 b# p7 Q1 D/ t- U! x, B   }
- ~% L- r0 c* Y5 h- L                if(tempword[5]!=0)
4 r9 \: o% U! g# a2 f$ r4 d                {
3 f. R% c' y8 `; l2 C2 m                   for(i=0;i<8;i++)
/ A' p' ]" K9 I  r2 z                   {
# k  e) G+ G6 Z; o" d, H7 k                       tempword1=tempword;
+ l5 n6 I+ R1 Q$ T1 |                   }
/ g0 ?& A* C( n+ D                   delete();4 r3 t4 p% ^/ Y; v. x% o7 z
                           for(i=0;i<8;i++)0 `8 j" H8 }1 w1 C
                           {2 c! ~+ M, o: B7 j
                                     tempword=0;//清空缓存数组
- p! v1 y% [; c. v6 u! q                           }
5 s/ G+ |4 ^2 s5 J# s                       menu=3;                        //进入菜单三再次输入新密码' V2 J. D/ C& n. ^
                }
3 z% p9 ]( `( C+ D  m                break;
- D  Z3 [+ A- @$ N9 I                }6 |' B! x( x" H# R' Z
          case 3:{
" t* z& X' c" y/ a) o! _          for(j=0;j<16;j++){
5 g) I; w- l0 u( L; s- z    upxs[j]=tempxs3[j];$ ?8 }& u% X. R5 h! u$ }  l: ^+ b
   }
, T% ?7 `' O+ n, l                if(tempword[5]!=0)2 a; [7 G# S3 E, M% ]* b7 i+ U; f
                {
8 C* q+ E" x) S  k                   for(i=0;i<8;i++)
. f1 M/ Q$ e4 |' S                   {9 h; a/ B; H9 A7 S
                      if(tempword1!=tempword)//对比密码; e: c8 G  y; ]1 _4 Q$ w$ |
                         {
  {" g4 c3 t. [8 o                             key++;
0 C  _" p, m% u8 U  o; R. T                         }; S! ?3 w  f! Q0 t$ E* B
                   }$ l+ `' ]9 T% T6 T% o, b: }
                   if(key==0)//如果第二次输入的密码与第一次相同* }, l5 |. e9 b7 |
                   {
8 {6 \% d# N9 B$ ?& j" Y                       AT24C04_WritePage();  //写入新密码
. \# N0 J1 t) y                           for(i=0;i<8;i++)5 ^" [1 U" Y! A  ~5 d
                           {
' O$ P  }! U8 w$ I7 s                                     tempword=0;//清空缓存数组* q, V4 m) u0 l0 H* m# V3 l
                                  tempword1=0;//清空缓存数组7 a5 \# `+ P" D
                           }+ C: M' R# W, X% q$ r- X
                          for(j=0;j<16;j++){+ E' c8 F. J' r: G3 R5 B8 B
    upxs[j]=tempxs4[j];% `- Q, E7 ]0 i; E1 |
                dwxs[j]=tempxs5[j];3 _9 @3 k3 e/ s' ^. w5 Y
   }0 ?- ?2 a' p7 k4 _- x
                        key=0;. O6 d4 y2 Z7 @6 f5 d
                        menu=0;      //跳出密码修改菜单% }( }; T1 x! O& N
                  TR1=1;. j7 b2 H0 y# |. T. E0 y
                        if(time2==2)                 //显示2秒! l$ f7 m% o" r  O$ h: C
                 {
5 X  v* g5 u) }3 X1 b% x6 U                         delete();0 \1 F9 Y0 x9 |) _
                   TR1=0;                    //关闭定时器1( q. Z" j/ N% v
                 }        6 n- G" ~& \7 `1 E3 i
                   }
7 o' ^2 M3 W9 b" n- J6 F9 {4 p                   if(key!=0)//如果第二次输入的密码与第一次不同
; P7 f/ B8 ]; F( J7 p                   {8 ]2 y- g( [" j5 H8 m
                              for(i=0;i<8;i++)
7 p, t6 e% h1 y                           {# M2 U+ l" ~; p/ N5 T7 X
                                     tempword=0;//清空缓存数组
+ ^. s# t: g5 h* q# a/ e2 @/ @                                  tempword1=0;//清空缓存数组* U- B  `  K, a1 r% [! i. m
                           }) p) A+ G. E5 |* q- c! N
                           dwxs[15]='n';3 J8 |% L& f4 W+ k$ u
                           dwxs[14]='i';
' Y! L7 l6 B/ b6 F, [; Q- M& U; M& \                              dwxs[13]='a';: x# X" c; d$ h/ e7 Z
                           dwxs[12]='g';4 P! a: B5 E% j1 y
                           dwxs[11]='a';. S3 @1 \' ^  L% ]0 r! Q3 b
                          key=0;
( ?- r- Q) `3 a                          menu=2;             //跳转到菜单22 F' d0 G  `& J
                   }
0 T: Z$ R# e+ @* S                }* p7 d( A4 B; g9 r& y0 d
                }$ T4 W. y0 P+ @: X) K% B
         }
( Z. z3 k5 L/ k, Q7 A0 R         KeyValue=16;             //键值初始: Q0 `" J7 T# Y/ g. @+ O6 W7 y
}7 v2 S) ]4 ]% x! X! o4 v
//********************************************************************************************************************************7 n4 a. q: d2 }0 W3 A8 V$ G6 d) d  M
/*模块名称:单函数区*/  p; l* e$ Q5 A- F" R
/*模块功能:一些单独功能的函数*/
3 J) {* X3 K) q8 Y//********************************************************************************************************************************
6 q0 W: X0 T) q- V  kvoid sure(void)//密码认证函数//
* }" Q* D- Y: @# p( D{$ t4 r, }) w' d2 b8 P3 O$ j
     uchar i;! \+ c+ t  z3 b; W$ B" C
    if(KeyValue==11)% C3 E' z  I  \% R9 ^' U' H
         {          0 z/ [9 x: X# T
         AT24C04_ReadPage();' k# h" V5 B, c
             for(i=0;i<6;i++)9 E: P, R4 s$ E
                 {        password=BUF;5 o- h# i7 i! }4 p
                         if(password!=tempword)//对比密码% t1 R" v6 m8 |# Z
                        {4 F1 w( H. l! e1 `1 g7 U
                            key++;
0 R1 t( d6 h- D  Z. Y4 [2 X                        }' L- |& r6 s. v
                 }                  
2 y3 b* a0 S/ S% G. a                 if(key==0)                //密码正确,输出OK
, r( F. K7 V6 A                           {
; l+ i; r3 t% Q2 I+ p; }6 o. e                                dwxs[13]='O';2 t8 c: H# h4 b4 _$ l5 G+ i; N
                                dwxs[14]='K';
( y$ t* l9 L2 |' A- H                          shuchu=1;                    //开门
* x- I8 D8 Z: _- K5 M& }# \) o                                TR1=1;            //定时器1打开,启动倒计时& s9 w! e  w6 ], F/ @
                                moshi=0;          //输入正确密码可关闭报警模式9 `, {/ |& w5 c& ~8 i) N
                                beep=0;           //蜂鸣器复位7 B4 S, s- {. {- v; |2 @$ c- z. V
                                TR0=0;                              //并且关闭定时器0
9 v: Q+ |- U% T& F. r/ n: z+ w                           }+ S6 X- ?+ v( Z6 T' _  f) ?# C
                 if(key!=0)           //密码错误,次数累加' g8 H: m' X' H/ R, s
                        {8 }9 j* g$ v' d: j7 H* O9 I* N, m7 P
                                dwxs[12]='E';
, U7 Y& ^( y; F; c9 \                                dwxs[13]='R';
. C. ^9 ^) l) b5 m1 J9 j                                dwxs[14]='O';0 b* j9 a1 S, `7 `* D
                                dwxs[15]='R';
9 G2 @) d) @# i3 O                                warn++;
# q2 u% c" i' K( r3 @9 h6 |                                if(warn==3)                    //输入错误3次,报警
  v8 ]' L* q3 O( p                                {8 ]% T  }. V- P
                                         keyboard=1;    //三次错误则键盘锁住
3 `9 y; R. z& ~9 _4 l% Q. X5 s6 V                                   TR0=1;                      //定时器0启动1 w/ \' [5 I& O
                             moshi=2;                    //模式2启动蜂鸣器报警$ r& `" Q+ F: s1 X. j
                                   warn=0;                    //累计清零
. f1 i% s/ D* M  i                                         TR1=1;                //启动键盘锁定倒计时
% c5 n% f& n9 r- A- c, z( i                                }. E& h8 }: F3 C! v) Y
                        }
1 g$ M* B; q+ Q( R- }+ A4 c         }5 u, i' R4 k7 r) L* J3 P& q, h
}
9 a9 r# ]# s1 Z. Y//************************************************************************************************************************************
5 {  m5 W5 p# e: Z2 Q/ ~; B//附功能函数//
( I0 x5 R1 k# ^9 a. L+ U7 _2 i; e& n//************************************************************************************************************************************
8 e# @) b* p2 }  Mvoid Add_Function(void)3 [: v  d' J, {* o7 n/ C% a3 r
{* q5 E5 `( r; N! z( ~
          switch(time2)
. w+ I5 @) q; d4 N        {
7 \- v! B+ o: N9 T    case 4:{                     //门锁打开后4秒关闭
$ ]$ t) j) u9 R) z- B                   shuchu=0;           //关闭门锁电源$ ?0 @7 U' |- S9 @7 x* U
                   delete();                       //自动清除
, B- a+ y+ Q! M+ L1 D                   if(keyboard==0)     //如果不是密码错误开启的定时器则关闭定时器1
* e2 A. u) g8 ^6 h5 o% s8 ~1 C9 Y                        {5 u$ A! H4 H  [
                                 time2 =0;         //time2复位" [5 \* e/ D; b% r4 |
                                 TR1=0;            //定时器1关闭
  n0 U9 u, d4 i- u7 Y% H      }9 K8 Q$ t$ W1 [2 x6 s
      break;                        0 }: A$ _% ?; m( o
                }
$ {4 c+ w) |" N. e4 l% ~8 ~8 E/ m    case 60:{                     //键盘锁定一分钟9 |9 n9 a1 C' C8 g. m1 K1 k) B9 t
                         keyboard=0;         //键盘解锁+ G5 w* ]3 h3 q# l$ a+ R
                         time2 =0;           //time2复位
6 \1 B2 r6 W) [                   TR1=0;                    //定时器1关闭# I, G$ T$ t4 I1 O" {8 M3 x" Y+ x
                        break;
6 O9 s, o& a9 F+ _4 t                }* |9 o, N# M0 y
        }
# L0 e$ v' k2 T! D}
' _0 m! f! J6 l/ P  D//************************************************************************************************************************************7 ~' V# x3 U8 N0 b/ Q
//系统初始化函数//; ^7 b6 \. f: k8 D, j# S9 F- P
//************************************************************************************************************************************
1 R( x8 L2 _; J; D+ J  X4 M2 J9 Lvoid System_init(void)
  g; V, X: ?& ?1 r" i{) y( U4 O, ^: z" ^) _+ f
    TMOD=0x10;                                       //0001 0000//定时器1方式1,定时器0方式0: h3 H/ {) @& L& I  P  L; z
          TH0=(8192-700)/32;                  //定时器0 700us 定时
6 s+ \" i7 X- k$ N$ c# V5 q- [0 F$ s' X    TL0=(8192-700)%32;$ k( s* k8 A$ l# [& _$ d! G
    TH1=(65536-50000)/256;  //定时器1 50ms% Y3 |) h, y0 E5 H3 G1 _' r* N
    TL1=(65536-50000)%256;  1 a6 j+ h- U+ r: v
    EA=1;  
0 t1 _+ n$ T, k$ [' C: Q    ET0=1;
& }& j' N0 L, D8 R3 S          ET1=1;
. e0 d2 ]) t% t8 I2 ]    shuchu=0;                                 //门锁初始化
! ?0 t3 L0 j7 c, k# }          beep=0;                                         //警报初始化
& k; D/ G3 ^( ]          DoorBell=0;                                     //门铃初始化# W4 ?$ W) o, a, H
    lcd_init();                               //液晶初始化0 c  R2 r5 \; J" ]( C
}
, l  L/ z4 d% o5 b5 g; h//************************************************************************************************************************************
) N: B( G3 v! D5 d/*模块名称:主函数*/9 c2 n5 }1 H" G: ^! h8 ~
/*模块功能:程序入口*/
! q) v  W$ a7 S//************************************************************************************************************************************
+ [. w- s9 e8 ]  h! Z" Mvoid main(void)//主函数
0 f. f  @6 S' z" |2 `* ^; R{; i7 @+ n" K: ?

. a# c0 h" D( F, x" O# \1 a        //AT24C04_WritePage();   //密码初始化(只需使用一次写入初始密码)# j/ S6 S# L9 f
        System_init();           //系统初始化
7 y2 t: u# x- E        while(1)
) ]+ v2 ^" ?9 o- x+ k2 @% t" z& o        {            
3 {+ o/ b, w7 P                if(keyboard==0)        //如果密码错误三次则锁定键盘7 K+ V4 C6 l) s; R8 r6 i4 J& g2 U
         {4 a# B8 i% c) @7 r6 |
                  KeyDown();                       //按键检测  f" A! d4 F5 o  ?0 q' `: p& T! e
         }
- A3 A" Z( o0 z' m' A0 g) v) b7 G                keysend();                         //数据传递' b( T4 m) S- D6 m; t
                lcdxianshi();                 //输入显示' a" K  V" }- p& J* H/ S2 D
                sure();                                   //密码认证; e$ T7 E, \8 ^- o. K2 k+ R+ Q! W8 I
                condition_delete();    //按键清除! }& a; |7 H, m/ T: h" F/ |' K7 V
                new_password();        //密码修改+ L  r9 U4 Z' G# b
    Add_Function();               //附功能函数0 I; T! s5 N8 y  ]# s
        }                                
2 G* y/ K" F! I0 w9 C1 e}  n- a' Z7 W5 F( W1 ?
//************************************************************************************************************************************! ]& E2 k7 A  ~# J" \! [: s$ o
//结束
9 v7 D. J6 h$ V5 E/ V//************************************************************************************************************************************+ t2 z! J: g5 \0 H2 N" c, `
6 w/ L# k  G( K+ J) E* e
下载:
3 m. y4 s! Y: a( S
游客,如果您要查看本帖隐藏内容请回复
+ O6 ]: H% X$ H
- U3 f" B  W  [3 F) h9 }  k

该用户从未签到

2#
发表于 2019-1-21 13:14 | 只看该作者
不错,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-21 23:10 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表