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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机数字密码锁(源代码)- g  o& K9 P( g/ ]

. l  }! ~5 d, o+ q' L
2 Y% ]7 x# J. Z0 a" R8 S
单片机数字密码锁:
4 J, c: z# o: ]4 p
" F1 T0 M4 O" @) q; s/ r
% ?8 g- V( T, K7 K% n) e程序源代码:
/ [9 J6 F& d/ u& x. \
//************************************************************************************************************************************
8 X3 `4 Q. W& ~; F& W//库调用.宏类型定义.位定义//
( E, n; W2 u+ g: q) |2 z' q//************************************************************************************************************************************) [  H6 M7 {' B9 \7 b
#include <reg52.h>                                    - {) z: {- f: m
#include <intrins.h>
/ I5 D' c  i& F/ T8 F$ N, F" D( ^#define uchar unsigned char
, X) s4 z/ }5 P$ T0 U7 ?#define uint unsigned int
  U# P# \; ?2 }- j#define ushort unsigned short9 y* |' t4 V& S" T  }
: M4 S& R: \# ?" I1 q; X. ^" j
#define GPIO_KEY P1                 //矩阵键盘烧扫描端口- J& N) o! {( B9 l) v
sbit RS = P2^2;                                       //液晶显示器控制端口  }; O) j, W/ u1 F
sbit RW = P2^3;
; h1 S* F4 [% `# M* Z; N/ B( usbit E = P3^7;
! J  z( `0 [3 E! V0 I. {3 E) L! H$ psbit shuchu=P2^0;                                      //继电器控制端口+ d' g) w0 V# Y  l" w2 Q, _! _
sbit beep=P2^1;                                              //报警器端口& T- [/ m* b! c, Z; A' O& o
sbit DoorBell=P3^6;                                    //门铃端口
( |  P- o* R. \) ~- bsbit SCL = P2^6;                    //AT24C04的时钟( |7 ~+ H9 S  k* d: G1 n1 b- Y3 K) t
sbit SDA = P2^7;                    //AT24C04的数据
" w) ^6 J( ^8 d' d9 K6 }) O
0 e; Y9 ?! i) _. Zuchar idata upxs[16]={"Password:"}; //上排存放数组
& d' F7 U6 q. `# u4 f; G8 a0 F2 Auchar idata dwxs[16]={""};          //下排存放数组0 t* G& _, c1 Y2 R; T& ]) f/ z
uint idata tempword[6]={0};                     //临时密码数组
5 u/ {1 v$ _( r  C5 O9 ?/ d# r1 suint idata password[6]={1,1,1,1,1,1};//初始密码
5 l1 D% t, e; [( guint idata now=0;                                                  //数组伪指针' x0 q$ g$ k4 M) w+ J
uint idata key=0;                   //密钥
7 H( s8 P1 B* auint idata keyboard=0;              //键盘锁定标志
6 T0 H; Y1 s4 I: Z0 Suint idata key1=0;                                          //用于密码修改
4 }0 O  Q; R) j0 E5 A! T: ^8 tuint idata KeyValue=16;             //用来存放读取到的键值
# h! ~8 F7 N# T3 `  A& c( m/ B! Uuint idata warn=0;                                          //错误累计. f. K$ f! \: ]9 C9 f' m$ L
uint idata time=0;                                          //用于定时5 e5 C& s3 \# m9 ^$ z* j: {
uint idata time1=0;                 //用于定时
  W7 E! T) g9 [# A: ]9 iuint idata time2=0;                 //用于定时7 N2 z2 f8 i  u1 f) ~
uint idata moshi=0;                                          //定时器内部模式1 b6 e& ^4 ^2 v
uchar idata BUF[8];                 //掉电数据缓存区, M8 @' T" Q) r3 d5 p
uchar idata TESTDATA[8]={0};        //掉电新密码存储: G$ K- ^" Y- H% X5 ~* O6 Q8 R5 V
uint idata menu=0;                                    //menu用于密码修改
: \3 k* w; x  Q9 s5 O( vuint idata tempword1[8]={0};        //用于密码修改8 s, J8 ~# C" A& \
//*********************************************************************************************************************************, Z! Q, g/ T5 O+ X
//函数声明//0 ]' p& t* b' U$ b; B4 \
//*********************************************************************************************************************************9 x: p  D& n) N$ P5 x
void delete(void);7 C* i# U/ [' F6 v7 {/ m5 H$ ?
//*********************************************************************************************************************************" s0 ~( ~: _+ S" \0 _2 }
/*模块名称:液晶驱动显示模块*/' s" f: x: ?8 [2 q0 R. n
/*模块功能:驱动LCD1602的显示,并时时显示按键值*/
  _* \6 V1 g. E2 F//*********************************************************************************************************************************
$ ~9 {1 f) K4 d: S; ^& Mvoid delay(uint dell)//毫秒延时//% i$ A! e. ~5 X/ K" a  N
{
7 I: O0 ~% m: ]) U4 l     uchar x;( G& P, @- e7 O0 D7 l
     for(dell;dell>0;dell--)) D, }3 U6 m0 q/ g  o
     for(x=110;x>0;x--);
( E0 b8 P, `+ @! U1 ]; d}
/ ^6 a" _2 s0 ?+ f4 |void wr_com(uchar temp)//写指令//
" Q. z# u. _" K! D1 w+ g{
4 g* Q; E8 K# ^5 \7 h8 {" I     RS=0;* w' S& L1 U. S* [5 X' t1 E3 J
     RW=0;5 q# H: z  v3 X7 @6 u
     P0=temp;
" H* s8 v5 A* ^' C     E=1;/ A7 g1 S5 Z. F: w0 m( y
     E=0;. W( h0 c6 J) t
}! [! Z) ~0 e! L
void wr_data(uchar num)//写数据//5 @' n( C% E4 p
{
8 U' E8 }/ Z' F  y1 ?; s     RS=1;
$ q& j" k1 y, @) {  s  q     RW=0;
! _2 n( \" y5 L1 @- T5 q     P0=num;# f6 F9 R$ @6 j8 X; `; K
     E=1;
' J( k6 E9 j+ s; K1 x     E=0;1 @& Q% e: N- T' R# {7 p
}
' H( R6 A. t( l4 S/ Gvoid disp_lcd(uchar addr,char *templ)//显示函数//: y( j) R: J0 I
{4 O/ p; c# e& o# R/ b! H( X$ S
     uchar i;
) f/ N9 ?0 _( y. C0 x9 L     wr_com(addr);, b. U0 q5 W0 R  m- Q5 J6 j
           delay(50);
/ l- j& J/ j+ v* x7 [4 \     for(i=0;i<16;i++)
2 k9 B! E+ s. I" K    {
0 ^7 U0 t. _% n4 t8 ^' K0 ]! u- k     wr_data(templ);2 R0 Y4 m2 T. d9 m# y7 V4 ^  A
           delay(50);
  ~% T4 J1 g; m: V1 x5 A    }           ^: e$ Z- A# K6 G
}/ R7 p5 L; y( U  |3 d) N
void lcd_init()//初始化液晶//  _3 Y' v4 z/ t9 ~, l6 ~
{( B+ s6 {9 F: V) H
     wr_com(0x30);" [: x0 Y7 q3 \$ Y
      delay(50);; ]8 A8 l+ ?3 g5 e8 }3 k- M
     wr_com(0x38);3 R" h5 c4 i3 n# D- G9 _9 ]; y
      delay(50);  w8 Y- E* O. f, j' J2 z
     wr_com(0x01);
1 P8 C9 H- Q4 |! N8 I/ u* g6 E" m      delay(50);
  s& x( u* Z1 c% x4 S     wr_com(0x06);
+ }8 i, g& ?$ v2 u9 q9 h/ e      delay(50);
: v( ^5 `, A4 ^. Q/ K% ~+ w     wr_com(0x0c);8 Q* g; Q# ?! H4 M" N" g
      delay(50);
) z+ f, L% G5 k; s}9 Y# t, ]! L. n; K4 A
void lcdxianshi(void)//液晶总显示//  }# A, X# |( x9 q0 u" t4 G+ k  c; E4 R
{
$ E" I" ^- T2 v2 l, c7 B     disp_lcd(0x80,upxs);, R5 W% G( q" N" j' F& n4 b
     disp_lcd(0xc0,dwxs);
: u9 a: N4 @* e4 R6 _2 D3 k* @}
( V' q( B9 \3 {* n: y//*********************************************************************************************************************************
- \4 T' M$ O+ o# d% c" S/*模块名称:矩阵键盘扫描模块*/
: \1 K1 }, X3 W3 f" f/*模块功能:时时扫描按键值*/
# Z) q) g/ |3 q( z: p# `//*********************************************************************************************************************************
" l0 }/ z  l* P5 D. }& _void Delay10ms(void)//延时函数//
" _& d! s. u! }: m# ^5 L" V{
7 D$ H4 ^( J- ~4 f! E3 v# R; A    unsigned char a,b,c;* m  l3 n2 C: i  \( @% y* m" ^
    for(c=1;c>0;c--)
; ^3 a5 i/ _; ?* M  y; x        for(b=38;b>0;b--)
2 y1 O8 s- g" t4 o1 j            for(a=130;a>0;a--);1 \! Z& Q4 Q. d7 T
}3 d& ]8 h% K. V# [& x
void KeyDown(void)//键盘检测函数//
: X# g. c# X, w! j* J$ r: E{
. t) u; Z& g; Y* A- P( C0 [( @( P' x        char a=0;, M: D! [( d# Z1 I1 _% I
        GPIO_KEY=0x0f;
; W' t+ J+ d' u; J        if(GPIO_KEY!=0x0f)     //读取按键是否按下. K4 U+ H+ j% x, k5 o5 V: Z2 F
        {
/ F. [7 T& U1 L: ]2 Y! ?                Delay10ms();         //延时10ms进行消抖- Q% `, c4 g1 a  Z
                if(GPIO_KEY!=0x0f)   //再次检测键盘是否按下
+ t" R5 H" \" T6 g6 ^8 l2 u                {
% X& B8 k% N% ~; G7 [
7 r" F7 q0 @" U& ]1 @- f                        //扫描列
2 a5 D5 n8 z9 [; `8 R                        GPIO_KEY=0X0F;" ^, |( Q3 F1 l, g. ?6 i, }
                        switch(GPIO_KEY)/ Q% E* T1 q, f$ F$ @8 s
                        {
3 S0 X7 ^1 K4 w9 y4 W% O, u8 M                                case(0X07):        KeyValue=0;break;' d9 j7 ?$ v% ]
                                case(0X0b):        KeyValue=1;break;( X7 i& p8 r9 K# L& b: @
                                case(0X0d): KeyValue=2;break;
/ I5 v4 m+ f% s3 y$ K                                case(0X0e):        KeyValue=3;break;5 d) _9 ]; ^% v2 e- ?2 l6 G' L5 C
                        }3 c. ~' |+ m2 ^% i" ^: _
                        //扫描行
' W! ~7 [# T% g5 H, t( ^                        GPIO_KEY=0XF0;
; B9 d, e' F; `4 o% T7 G# ^                        switch(GPIO_KEY)
- A# z) h5 o  U7 r) T                        {& D# L; r9 u& ~  \
                                case(0X70):        KeyValue=KeyValue;break;, j+ R8 ~2 K, e- ^1 y
                                case(0Xb0):        KeyValue=KeyValue+4;break;
2 R0 L$ m3 \, X' H; o                                case(0Xd0): KeyValue=KeyValue+8;break;
$ D% ~" H5 C  m5 L/ u                                case(0Xe0):        KeyValue=KeyValue+12;break;
2 O2 [5 _  M; k: F                        }, \+ |5 S+ [- J1 Q/ Z' Q+ u
                        while((a<10)&&(GPIO_KEY!=0xf0))//按键松手检测
7 s/ ?& i! J( \/ D1 I                        {
) d# P  U3 B+ \6 B                                Delay10ms();; `" N: Q* b- k7 i* Q3 U6 w8 |2 x
                                a++;% u; R5 S3 U0 {8 \1 _* ]
                        }4 f/ R  o& j! i. a4 W; V  a5 {
                }8 H% E  b6 d. x# w2 T" v. F! l
        }0 D( K/ p- E! M# M: u6 C
}4 R) p( u6 B2 P/ |9 Z
//*******************************************************************************************************************************  L2 `& Z: X/ Q: @& T; Y# c
/*模块名称:数据处理模块*/
: P  F1 s8 W, \' C) `8 R; C& N, R/*模块功能:(1)将按键值传递给各种缓存数祝(2)包含数据清除函数*/
' k* W: H6 ]7 P) Z& X9 G5 v7 S$ R//*******************************************************************************************************************************
( X; `+ I1 ~/ a/ hvoid keysend(void)//键值传递//4 g) o+ P  b( Z, q
{
/ H+ m1 t% t' @( h: V                 switch(KeyValue)% y6 e( P5 S% C
           {
  F$ _9 T2 u) Q3 `) f! j* o' f             case 0:{dwxs[now]='0';tempword[now]=0;TESTDATA[now]=0;now++;break;}
  U: m/ q4 t* M- @  r& A                   case 1:{dwxs[now]='1';tempword[now]=1;TESTDATA[now]=1;now++;break;}
; |# U2 ~/ o0 V' A0 a0 s                   case 2:{dwxs[now]='2';tempword[now]=2;TESTDATA[now]=2;now++;break;}9 T1 p1 j0 S- a) G# n$ F* a) X- X
                   case 3:{dwxs[now]='3';tempword[now]=3;TESTDATA[now]=3;now++;break;}: @# ]4 J7 X, M. g
                   case 4:{dwxs[now]='4';tempword[now]=4;TESTDATA[now]=4;now++;break;}: N. J* Q9 i1 [0 O) @, g+ g
                   case 5:{dwxs[now]='5';tempword[now]=5;TESTDATA[now]=5;now++;break;}  A6 i2 s+ B- U
                   case 6:{dwxs[now]='6';tempword[now]=6;TESTDATA[now]=6;now++;break;}. C' W1 u6 @: h* K. X
                   case 7:{dwxs[now]='7';tempword[now]=7;TESTDATA[now]=7;now++;break;}
/ [; c/ g6 M8 k                   case 8:{dwxs[now]='8';tempword[now]=8;TESTDATA[now]=8;now++;break;}: L% s$ ]8 A( c- a5 n8 l' [
                   case 9:{dwxs[now]='9';tempword[now]=9;TESTDATA[now]=9;now++;break;}
3 @" C! N0 Q! ?% h* u7 U! R* ?2 V                   case 11:{; n& m* t+ g, |7 R/ |+ G+ u& w
                                        upxs[12]='S';7 P4 v- [4 A5 P; r
                                       upxs[13]='U';
: z6 n7 d0 a8 u                                       upxs[14]='R';
; l* C% E' L" L; R' z" k* ^2 F                                       upxs[15]='E'; break;3 _! z, L7 }; x1 t; n) O: G5 G& J
                   }8 n* f6 m9 P2 k' `& H
                   case 14:{: ~) a7 n5 |. ^% A- _0 B) e
                           menu++;                         //密码修改模式启动模式一9 e/ o% n' V! z; F9 U
                                  if(menu>1)                     //再次按下跳出密码修改模式
" H8 V8 g: A! x                                  {
: X5 A1 H0 K1 ~2 w" A, E2 r5 p+ N                                           upxs[0]='P';           //显示“password”0 H0 ]. \$ w: y, o9 K% e
                             upxs[1]='a';3 v1 Z- ?5 a7 i' V' V9 |2 i9 b
                             upxs[2]='s';9 `- M. T  J/ k6 e
                             upxs[3]='s';. A. V8 {( z! t" o- `% p
                             upxs[4]='w';, W& s, G" H1 k" @' W, \
                             upxs[5]='o';
8 C) E* K) E8 S: i                             upxs[6]='r';6 a8 @# h: W3 O) L
                             upxs[7]='d';3 A% ?9 L( d: c7 a! E
                                 upxs[8]=':';7 S1 ^# w' \& g7 E! j/ |
                                         delete();
( n* z7 n( {4 U9 `                                         menu=0;" r' {: T) B5 o  g- q' k) r- w
                                  }
4 A, E8 G3 r+ N2 Q& k+ d                                  break;
' l  c8 J5 Z( J( c1 b2 s                   }' l( f) I' H+ H" d: {+ |* M
                   case 15:{
# W6 o& O+ n/ W  w3 K) o                          TR0=1;                     //定时器0打开( A! X5 v0 G3 P* x& I1 N. Z& A. e1 g
                                     moshi=1;                           //模式1为门铃模式
9 M5 o* J9 N' M                                  KeyValue=16; break;//键值缓存清零- N& ?) ]2 y8 G8 r
                   }
, N# J& l, F2 e, Q/ z                  }& c+ X$ Y, ?6 s  s
                  if(now==6) now=0;      //只存储8位,只显示八位7 }& Y( N% ?/ K0 Y/ B' z
}# V( n6 q* [7 S0 Z
void delete(void)//清除函数//$ P7 E1 N' c. A* t7 T( C4 w% w( S* J
{
$ R% I7 i' J- A8 s1 M/ }+ Y     uchar i;& _% f) ]& \! l* \
             for(i=0;i<16;i++)
+ Y. x2 T8 p" o                 {+ r0 B8 X1 Z" {3 H
                    dwxs=0x20;            //密码字符清零  ^. q6 Z" K+ c6 w5 E
                 }
. B" `2 S- o2 ^7 V                 for(i=0;i<6;i++)
) O. M; E0 W  A8 }1 l                 {) }8 f! Z6 ~/ u8 y5 e0 W
                    tempword=0;         //密码缓存数组清零
' z3 e  m( r5 h( K: V5 f1 ^                 }
5 o& y) h& J) a0 F/ b' [                  upxs[11]=0x20;
7 N1 T* J0 i7 B3 i7 }( K0 Q6 _                  upxs[12]=0x20;   //SURE显示清零1 w  n% U1 g0 J; A6 z
                        upxs[13]=0x20;/ J( R) B# A1 ^/ ]
                        upxs[14]=0x20;
4 ^0 H. D% V9 Z3 u0 T5 ]                        upxs[15]=0x20;+ L% r- ~# o( F
                 now=0;                                       //伪指针复位0 v0 A& |* I# [0 S
                 key=0;                                       //密钥清零
  J# S' N  v7 o/ L6 f) w$ H$ G                 KeyValue=16;                     //键值缓存初始% B, g: ]4 h6 G. X$ ^
}  g4 h: ~- r, v
void condition_delete(void) //条件清除; ~5 `( o! N5 \0 s3 c- Y
{
3 V: w, `7 f# S' G1 P6 K     if(KeyValue==10)! m9 j0 z2 I$ K' {) w0 r- U
         {
7 A6 \7 w* n! M) J, h. _/ P                delete();            //按下DELE键清除数据; m( \( ~4 d8 {$ S- c- s
         }
6 i# u" f; Y* v& K         KeyValue=16;                             //键值缓存清零
: i3 q4 ~4 a) [* h( h$ @}/ I5 a5 @- P/ h2 B5 L
//*********************************************************************************************************************************# G- a! b. `1 q. P2 O
/*模块名称:定时器模块*/# X! v& k$ x/ {
/*模块功能:定时器0用于产生门铃效果,定时器1用于各种倒计时*/' Z. k5 g) n2 y; \
//*********************************************************************************************************************************- G) ]# E4 k+ \
void timer0() interrupt 1    //定时器0用于门铃9 I  v$ I) H6 Y
{
- S4 E+ w+ w8 i7 t) v% E1 P' O6 p    switch(moshi)* a) Y( }) @6 v* Z% V7 |
   {
' i# T6 I2 r/ Q      case 1:{/ V5 M5 ^& i: k* d
                DoorBell=~DoorBell;5 X$ d5 Q  x; z) ~, r2 x3 ~1 Y% I8 V
            time++;5 Q" f7 Q: d9 M. D4 {
             if(time<400)             //若需要拖长声音,可以调整 400 和 800
* u* O" p2 b# A' K- L' t            {
7 x; |3 b" Q& P" E2 ]% h               TH0=(8192-700)/32;     //700us 定时7 f9 W' L/ `" m" H$ Q2 R  p
               TL0=(8192-700)%32;
) x5 B/ F; m* c* P            }
2 F4 _. `9 n0 ]0 i- \# l             else if(time<800)
& l7 |6 J! {4 b, ?2 p; [' O8 s* p            {' z3 h. O/ ]2 f; N6 D2 e
               TH0=(8192-1000)/32;    //1ms 定时
1 Z1 p: s( z  I               TL0=(8192-1000)%32;( x4 s1 e9 K% ]/ \" k. L' \
            }
! @& v+ W/ d9 J2 W& a             else2 ^( e/ Y% `- j7 Q. l
            {, }* F& f- R2 F- n
               time=0;                                  //计数清零
% b  d. D' H9 K               TR0=0;                                  //关闭定时器
5 N4 _2 Y7 H- D2 A4 m. s. d                           moshi=0;                                     //跳出模式1
/ ?# ^! j) L8 u! E" y# G( w- S" C            }
% ]  H9 X) w$ {0 j0 B                        break;
6 l: X1 Z" o/ l1 k3 c6 [5 A          }
* w% H5 K1 ^$ _          case 2:{
3 M8 q, {% M) T                           beep=~beep;8 Z3 O4 d2 G' ~" t. S0 B
                         time++;# a2 E8 L0 ?: M2 T) G) }, I, Y
                         if(time<400)             //若需要拖长声音,调整 400# Q/ J4 {" R; r4 m9 ~! A( l, B
            {/ @: e) F+ }! o4 I
               TH0=(8192-700)/32;     //700us 定时1 z2 `( q) r8 @" }2 `
               TL0=(8192-700)%32;
$ |& O# M. U: `5 I& W; B6 Y            }8 [$ O2 f6 L! i7 H. G8 A8 ^1 m
                        else
( Q1 S5 ]( h, o# J& x5 g                        {
5 G1 g' k0 R' {, p- h                           time=0;                                  //计数清零
5 R& D4 r. h. i4 L  c0 ?                        }# [. |1 y! |6 L! A
                        break;9 d4 A7 V( v8 \% d# z5 m, B7 b$ c
          }$ i( J- l4 C) w% Q) a0 B! h9 i& m  k
   }, _9 m8 ~  D3 `; z) O4 X
}1 c6 w. X( X6 d9 g2 A
void timer1() interrupt 3          //定时器1用于自动关门
# ?% D! ]. E0 {* T! r: g! }" y0 Y{  + H$ C; q' x* F6 a4 Z! ]1 x3 j
    TH0=(65536-50000)/256;  2 d+ k! A4 `7 @9 y
    TL0=(65536-50000)%256;  
0 k" I3 e) i, Z0 Q, X5 c% t    time1++;   ) w# y3 }. \6 }
    if(time1==20)//一秒  5 ^+ H. c8 l2 n. v$ Y' }
    {      
% z! R' W; p$ B      time2++;2 s, I: X; q! C; j$ Q3 v: `8 w( `
            time1=0;  & r/ Q  X) P3 c6 {3 B
    } * ?  P5 @, A7 h2 f' z( x
}0 y0 F. |4 ?# Y  u/ G9 H1 s1 M
//**********************************************************************************************************************************
7 [7 B* {  s/ n8 w" N4 H/*模块名称帜:掉电模块*/: t1 A' c# g2 H# n/ D8 \- `
/*模块功能:支持门锁掉电后密码可保存而不丢失*/
9 T. I( C$ D: I9 C//**********************************************************************************************************************************
+ ]. z0 T6 E4 [! b//延时5微秒(STC90C52RC@12M),此延时对于12M晶振
! x$ f% }. p3 K: I$ t6 S# Mvoid Delay5us()
' Q, T# E: S$ a# D9 D+ Q{
, z0 M& B, C4 R, E; t( l1 R$ o0 e    _nop_();
2 N" p- i% O; _9 e. Z3 |    _nop_();
7 ^" j( s- F. n$ `, l}* a+ _4 D) L& V& E
//延时5毫秒(STC90C52RC@12M). _2 ~) E  }# v" n' k
void Delay5ms()$ V6 ?& p" F& Z0 j
{' U- S# U5 ?6 {) K- a
    ushort n = 560;* j2 w9 q% c' O1 E
    while (n--);1 [% u* G3 U8 @  f
}
* r  ^) C8 V, E( c) X7 n1 R//起始信号
6 ?/ V# S+ k  K3 |0 s( L! Qvoid AT24C04_Start()* j4 i- w# G3 W3 p6 x6 Z
{: @" n$ I9 K: f' u9 V
    SDA = 1;                    //拉高数据线; `7 f( H8 k) O; m- e+ E3 n" k
    SCL = 1;                    //拉高时钟线! `) Z8 O; |8 }! |5 `! L: m
    Delay5us();                 //延时" [- ]" Q" W. w  \. Q( d/ M, R
    SDA = 0;                    //产生下降沿, q: v3 t/ ^2 @, S
    Delay5us();                 //延时
1 W$ p% z9 k( G/ @7 c, e# k    SCL = 0;                    //拉低时钟线
( T( J$ }3 k4 l$ {}- c$ \! J' o& p
//停止信号2 `! _8 u$ {( ~$ N. U( d
void AT24C04_Stop()6 U4 X( e! u9 U; w" O
{
& b$ n1 Q+ L) r9 Y) C# R    SDA = 0;                    //拉低数据线
- s9 E' D( s+ }* j4 F8 |9 P4 Y    SCL = 1;                    //拉高时钟线- Q: E+ O' I6 ?* L( r
    Delay5us();                 //延时  v8 G8 X% T9 r6 \+ w
    SDA = 1;                    //产生上升沿! w5 Q" `8 V4 ?3 K' [  @
    Delay5us();                 //延时" P! V% d( H0 t5 c2 t" v) w" A6 z/ G7 z
}
/ ?; v. u& u  J' @4 c//发送应答信号- k; c2 r7 t/ V/ U
void AT24C04_SendACK(bit ack)
; G8 F8 P8 }6 x+ z- F! S( _* P$ A* ]{4 Q4 o4 B0 U# F6 m# ]- y+ }
    SDA = ack;                  //写应答信号
4 x8 V( S/ P: H5 V. p  |    SCL = 1;                    //拉高时钟线  g/ D- @2 C/ ?8 `' g5 P0 J
    Delay5us();                 //延时+ C! T: D' ]- {1 v
    SCL = 0;                    //拉低时钟线
9 d9 }0 c' {/ Z% N$ a    Delay5us();                 //延时0 v7 R# H, z  _! t. D% {
}( Y* u0 _/ C: u& p# h+ R5 b1 p
//接收应答信号* K) q6 ~- M# V8 T; z3 O' C: v- e
bit AT24C04_RecvACK()
( y* r/ O8 `" z: q4 I{  q0 j+ a9 Y5 ~0 M' Z% `; f: I
    SCL = 1;                    //拉高时钟线( N% @" C! q7 F
    Delay5us();                 //延时
' ?/ a4 x# t6 i8 }% ^3 r    CY = SDA;                   //读应答信号
9 y" _1 ]6 R* I. V  @, r8 @    SCL = 0;                    //拉低时钟线
6 `) A. _# F! i7 P- Y  e  n- e    Delay5us();                 //延时
4 p8 ]5 `& v' \# L) {
7 s5 M: m1 n0 r1 q2 }' ~    return CY;' x+ b7 b: k/ E5 i9 x
}
# T2 U/ }  {( T5 E; E1 U//向IIC总线发送一个字节数据4 Z% u! n7 w$ C% p( I3 r4 r
void AT24C04_SendByte(uchar dat)
3 V+ v) x0 F3 r' X{! n5 j1 L  t$ a
    uchar i;
) o( ^4 _  E, @- b+ S! w- m2 r7 a8 R! W! N+ Z4 Y
    for (i=0; i<8; i++)         //8位计数器
4 f7 O2 u# r9 a    {
& A3 f" `! Z; G        dat <<= 1;              //移出数据的最高位
* G& x. w* J  A# L1 W, L$ j  Q        SDA = CY;               //送数据口
, R4 M7 }& e! t        SCL = 1;                //拉高时钟线' S  @; M4 ?$ e# D
        Delay5us();             //延时
9 I2 [' y, K( E        SCL = 0;                //拉低时钟线
1 w+ o0 S* z! C; l4 a" s        Delay5us();             //延时; v: U" U0 U% U
    }+ w2 ^8 K$ q8 ]+ u/ Y% H
    AT24C04_RecvACK();; R8 i9 p, s( U/ v/ N' [8 ]( U. a
}
. v( |! K9 t; J3 S* M% u//向AT24C04写1页(16字节)数据,将TESTDATA开始的16个测试数据写如设备的00~0F地址中+ ?2 l' X* S. m
void AT24C04_WritePage()
% i7 d0 e2 _1 n' _{. E+ |2 {. c; k8 E8 C
    uchar i;4 h7 J" H; t0 ]) A) U# Z' i% T

" u% O; l. S" w3 I# {    AT24C04_Start();            //起始信号
, U4 j8 d$ t# R' j  C/ D    AT24C04_SendByte(0xa0);     //发送设备地址+写信号
/ F+ R2 n. f" B4 ]) g    AT24C04_SendByte(0x00);     //发送存储单元地址
: M$ Q7 Z% \" O, b9 z7 a% w3 ]    for (i=0; i<16; i++)$ E2 L, `& l( i) C# R7 S; Y
    {2 J% T4 J# l' r# }: w0 K$ b
        AT24C04_SendByte(TESTDATA);
! r: R9 q. `! x/ I6 G3 T+ Q6 y' h    }; i/ c, E% _0 ~5 L! r
    AT24C04_Stop();             //停止信号$ I9 y! T+ i" y0 F/ s2 o
}
/ u8 \" f9 p: D, s- i5 Q( M" d//从IIC总线接收一个字节数据
' m2 X3 w% S( f. ?2 `uchar AT24C04_RecvByte()( x$ ]# F; P7 P4 X% e# g
{: L) \- n. Z2 Q: n) i' |
    uchar i;
8 D$ A1 Y6 J$ x( k    uchar dat = 0;3 F* f* S! b# Q# e

  g5 W! e, M+ b    SDA = 1;                    //使能内部上拉,准备读取数据
8 X0 Q! V- ]* v) d4 ^( \7 \    for (i=0; i<8; i++)         //8位计数器
. |, y: r) a, Z( m; f1 @5 B    {2 ^# n6 i0 y; E8 c; B( Q
        dat <<= 1;
; Y; J: ^6 D/ o- I5 n        SCL = 1;                //拉高时钟线1 r8 h  R0 u+ N
        Delay5us();             //延时. g% D8 r: D$ e
        dat |= SDA;             //读数据
: t9 [8 ~( H$ H# f! n+ X        SCL = 0;                //拉低时钟线5 A" i1 l6 f3 T& t
        Delay5us();             //延时
5 \* D2 q* N& [    }* a6 b+ A- o+ s2 [

2 M$ E& x2 |5 d3 Q& O    return dat;% N& k0 F( H* g7 `7 R1 \- X
}5 X# ?9 [. y! S0 X) b2 v# a9 e
//从AT24C04读取1页(16字节)数据,将设备的00~0F地址中的数据读出存放在DATA区的BUF中$ x+ V5 {3 f& c6 b1 j' B& k8 E* [
void AT24C04_ReadPage()
+ H8 Z: V# Y. S1 b3 b; G{
+ a2 n( j- R+ h/ e    uchar i;! z% I  b' J' c0 z% o

* _' i! o: ~$ J6 ^/ V6 F    AT24C04_Start();            //起始信号8 q* T, \7 k; K9 L9 W' H
    AT24C04_SendByte(0xa0);     //发送设备地址+写信号
+ I) e# P( |1 P- R+ E    AT24C04_SendByte(0x00);     //发送存储单元地址
1 Y4 ^* U' `2 @/ I1 i# L5 g    AT24C04_Start();            //起始信号1 q9 U+ a  i, u, R8 z. N
    AT24C04_SendByte(0xa1);     //发送设备地址+读信号; X! q* V$ o6 ^: o9 O
    for (i=0; i<8; i++)
3 U- m3 z7 V( F) }) k0 p# I    {
2 ?# R& y( m# \) f/ ~$ f4 Y        BUF = AT24C04_RecvByte();8 d! O' ]: s$ P$ X: e) c
        if (i == 7)
9 S3 f5 T! o# c  U1 q/ I        {0 t9 c% G2 k5 N  ~/ Y
            AT24C04_SendACK(1); //最后一个数据需要会NAK
" @  ]; }8 n, r8 ]        }
* H: H4 S4 J- `0 i; O        else0 e" g+ G# c- g& C3 K( |
        {. S: Q$ ?+ r' Z4 W* _
            AT24C04_SendACK(0); //回应ACK2 [/ L1 L' r9 `, m* h+ W- `! i
        }3 A' X' l6 n. H7 C7 ^0 h) D/ B0 I
    }
1 G( X+ y  Q. ]1 O7 E9 ~    AT24C04_Stop();             //停止信号4 t: \0 i- O0 A. N" a. v
}! v* E. C4 S! C: S. R
//********************************************************************************************************************************; `2 h2 R* @3 n: X% a, z% |$ D
/*模块名称:菜单模块*/
2 s, F$ f0 q0 B6 r1 J/*模块功能:用于密码修改,先输入旧密码,密码正确两次输入新密码*// i& H0 T: O7 c( T5 w7 ?6 y
//********************************************************************************************************************************, a( n( H+ D, @& _
void new_password(void)//密码修改函数
! x& g# f. e7 ^- N{
. W1 _% p$ N$ w$ ]     uchar i,j;9 z* f: f. v0 E
           uchar tempxs1[]={"old mima   MENUi"};//提示:输入旧密码% E* ?- |, @" n9 ~/ D0 _" _
     uchar tempxs2[]={"new mima   FIRST"};//提示:输入新密码一次
: T. Q/ Q! J" q8 c6 T5 b     uchar tempxs3[]={"new mima   AGAIN"};//提示:输入新密码二次: i* Y, b; ?) {+ I  }: Y2 G, r
     uchar tempxs4[]={"password:       "};//password显示+ S' g; o4 ]' q* h
     uchar tempxs5[]={"success  change "};//修改成功显示
5 ?  b* V, \7 _% ~     switch(menu)" [* r* b1 v; ]& F7 M3 K& d
         {
# c, x9 K) Y+ t* Z2 I          case 1:{
3 B& w' L# ~3 D7 U, E                for(j=0;j<16;j++){
. C) X4 E) s* P2 h; r  M9 f5 }! Y    upxs[j]=tempxs1[j];
$ m$ E1 c; \$ W- y   }4 [% `4 o3 H% E( y9 r% W2 J
                if(tempword[5]!=0)
7 v) U7 r! ~& ?7 H8 s6 T2 y                {
- X. B" |+ t, X; I2 t                  AT24C04_ReadPage();//读取密码! |3 b$ `* S. L6 k# F7 a6 o
                  for(i=0;i<8;i++)
/ m+ L) y& D  K  l) G" x% j                  {! \) [0 u& L* ~. A+ m6 U
                         if(BUF!=0)//对比密码,判断是不是第一次使用' r' }6 w+ x, l% E& f+ f
                        {
! k& u4 O: W: F- y4 i                            key1++;
% c2 L, }: u4 j0 d. @* p                        }
/ M5 d, u; K  }1 }% I. q+ a                  }
: x1 @) U' T( v9 K                  if(key1==0)//如果是第一次使用! i- E* L8 s7 w# ^1 v) ]( {
                  {0 W- @% I9 i! _, M
                     for(i=0;i<6;i++)
7 R, y6 N3 _7 k0 t& H. ]) c                    {2 T8 j. }+ s/ x8 Y
                             if(password!=tempword)//对比初始密码' O* }7 s8 X  v4 ~* v6 N1 ?* f
                           {
( j8 _+ Z& F  G                            key++;
% {- z* p$ ^- P                           }; H( {7 g( _- {. J
                    }
2 g/ I7 g( M2 w5 K                        if(key==0)//密码正确进入菜单二输入新密码. k3 n  j% H+ \* W3 t2 N
                    {
6 P2 A! x6 [# K& W7 K; S7 O                       delete();
; z7 P( a: Y) _$ m, W9 z* N. f6 G                           for(i=0;i<8;i++)9 S, p3 v3 E: ?* u7 g$ b
                           {3 q5 ~8 i/ B9 j, k% e& U
                                     tempword=0;//清空缓存数组2 Y) I- k) S7 {: P4 @3 ~) m% I) Q
                           }
: p+ \7 a4 W  V  L6 O                           key=0;
0 n; D5 L! O; [; a+ E/ c2 p                           key1=0;! L3 F! `- L3 B; j4 M
                       menu=2;
6 D, \% D  o. n" {! u8 A* W                    }
) j- k. h! U; r; }& `                  }1 N) t- w% f& b; V/ \5 O2 @. J
                  if(key1!=0)//如果不是第一次使用
! G% G- z7 F  @  V0 o                  {8 o! T9 J0 I0 a" n$ V0 q7 r, T' N
                          for(i=0;i<8;i++)
' d5 l3 M5 E6 f& h. @                    {  K: k9 Q/ h# p; T- X7 \
                            password=BUF;
  ]% N: d9 y- ]4 N                             if(password!=tempword)//对比密码
' ~. Y1 z7 e2 R! R) e                            {
1 e5 \( S/ J" {. w                               key++;; c0 U1 @+ q0 P/ T$ _$ f
                            }# t6 _1 ]$ w* o. ]: t$ S5 G
                    }. X& v( |% P4 I/ `
                        if(key==0)//密码正确进入菜单二输入新密码
- j0 G( E8 D, z9 ]( F0 I0 Q                    {
1 o4 I% R" c. L' G! ]. \0 B                       delete();
( }# f8 j( a; a+ E2 r2 e                           for(i=0;i<8;i++)0 J4 x; ]- ]; G) u$ f+ p: E
                           {
6 Z+ y. z" v# {                                     tempword=0;//清空缓存数组
2 Z% L" ?' W5 \                           }  S3 ?% w4 r% g
                           key=0;& [1 G% z, G9 L3 B
                           key1=0;- y3 q5 E) E% L( K9 G
                       menu=2;' i9 `& r6 q/ o7 i9 S0 l9 r" R
                    }
8 O0 {, z( {% |" l" R                  }3 ~* F3 R- U9 I5 i2 h
                }
4 u! i4 M% X! T3 d# p' ]0 Z                break;
$ a5 G3 t7 {, D% f( H4 O. K- b% \                }0 h7 i$ K* N  j$ p/ C- O1 A' t
          case 2:{1 \) q  m9 ]2 n1 t+ O- k
          for(j=0;j<16;j++){
$ I/ n& H/ g3 f" t- r* h    upxs[j]=tempxs2[j];
. c/ P( a# {9 m   }
6 y! w( ~" y. `! n( v+ l1 Y2 x. L                if(tempword[5]!=0)" R" h' {" c7 T7 C8 `7 X! q
                {
0 q5 h- T; s$ g                   for(i=0;i<8;i++)
+ @5 Q4 q7 P: R" M) }  w2 K                   {$ j9 F/ @2 S8 f
                       tempword1=tempword;
( b+ u2 `, [! \" @- s- {$ o' N) I                   }3 q% E: A( P( n8 o2 L
                   delete();2 n4 o0 ~# F3 A+ n, i! T
                           for(i=0;i<8;i++)
2 U  J$ p8 z: O9 y7 M4 L4 X                           {
! m3 @9 I1 N0 R5 Z/ K                                     tempword=0;//清空缓存数组  l% g6 |4 F/ `
                           }& n! f' j! o; h
                       menu=3;                        //进入菜单三再次输入新密码# c2 [& W2 Z' D, x+ \& T4 K
                }( T9 j7 ^: z; a
                break;5 z: y( D( F* `: Q+ U9 T* s0 {8 ^
                }! D1 [' r( l% O# q* w# B" L" ]+ O
          case 3:{5 [. z6 n* [2 X8 _( W
          for(j=0;j<16;j++){
" L% ]/ u4 |2 a0 B( [& C, S: M    upxs[j]=tempxs3[j];% ~/ K- s0 E: S4 m9 m
   }5 N, j. s4 ]6 S! z& j$ c
                if(tempword[5]!=0)2 O/ m) p0 L$ U5 p( t
                {% f4 ^' b3 m8 y9 V. B% s) Y& L; p
                   for(i=0;i<8;i++)
4 T) A: _3 v5 S4 ?6 s9 p                   {
7 f& f/ V% m1 G3 l; A# y                      if(tempword1!=tempword)//对比密码
. P, V+ {  E1 }                         {
7 N) a2 Z$ X; ^! E8 M                             key++;9 k8 s' A; F% O, v+ o
                         }
; {2 X5 Z7 t" ]( }7 H# e                   }3 o  d! H) F) q" Y, U2 |; b7 C* N
                   if(key==0)//如果第二次输入的密码与第一次相同
0 a! x0 f' Z6 {                   {" ^3 {) N" H- ^% s
                       AT24C04_WritePage();  //写入新密码' Q7 y: |, q; a
                           for(i=0;i<8;i++)
  y( E5 |* V  F3 q                           {
. m4 G, Y9 {6 @( i3 Q; _$ o  e                                     tempword=0;//清空缓存数组) _0 f9 l: c+ ~! m; Q9 g4 i3 m
                                  tempword1=0;//清空缓存数组% w7 n# K( Z3 h. u' l5 P
                           }
1 u- Y- {4 m. T. z6 s                          for(j=0;j<16;j++){# {1 ], Z+ N( q' s3 `! v5 h, @/ Y
    upxs[j]=tempxs4[j];: N+ T' s  c7 u7 ~, ^
                dwxs[j]=tempxs5[j];
3 V9 M( J  S) ^: T( Z- e   }* y. d# L$ M$ d9 G5 V
                        key=0;
. H+ a3 i, D. b# D# C" m                        menu=0;      //跳出密码修改菜单" d$ c/ F9 V  f3 \
                  TR1=1;0 C$ `1 U& k* _: W
                        if(time2==2)                 //显示2秒* c% M& s3 ^5 h& R
                 {, I6 w' `( c. b- I8 ~$ J
                         delete();+ Q/ c; \8 I0 g% Y; [# M! Z
                   TR1=0;                    //关闭定时器1
: Q: r2 R' p* [% N- G" n4 [& ~                 }        % u. j% m% O% Q; w/ `
                   }0 e$ X. v( x( R  m: t+ |$ M
                   if(key!=0)//如果第二次输入的密码与第一次不同
6 V  Z( ]( V* }  q. z. P, ]                   {
$ m8 R$ {: s- R8 `                              for(i=0;i<8;i++)
. {; y; g; ?! c                           {2 F+ m% c( a6 g+ L& s. K! r  q
                                     tempword=0;//清空缓存数组
2 v+ y- L- h3 j! J8 e! B* T4 X                                  tempword1=0;//清空缓存数组
0 r1 I7 t+ \6 ]8 Z% b                           }
2 m$ h$ t  F6 c/ f# C3 ?                           dwxs[15]='n';
* a, I2 @' t1 o0 B$ g" R                           dwxs[14]='i';( X- V, `; [6 x% d' R( J
                              dwxs[13]='a';
. g7 k3 k4 h, j8 y" v% S                           dwxs[12]='g';
  m/ m% \( c* w: P! n                           dwxs[11]='a';4 V+ b8 w  |4 H8 m9 D$ F6 Z
                          key=0;( V2 [; R, I# {
                          menu=2;             //跳转到菜单2
. b; f  D* A3 |8 U, Q1 c. Q' _                   }& l4 R$ a4 j6 n5 C8 l" Y# r# z" L$ t
                }
- N; j& ]( q7 N! j4 \                }
* _; ]6 n2 U" ?1 d8 }5 X& _         }4 W& K2 ?, |8 R5 o( f8 Z& {2 j
         KeyValue=16;             //键值初始  O2 R! m# C  G9 g. g8 r- _3 C
}) J$ w+ B; k  @1 S. g# R
//********************************************************************************************************************************! m4 n5 q' u2 E+ w4 b9 ?. _
/*模块名称:单函数区*/
. S5 a2 ?, T. p; B" C6 J3 t9 C/*模块功能:一些单独功能的函数*/  y. z+ ?. H0 W7 x& }4 E% c
//********************************************************************************************************************************
6 {: B. d0 v% `# f) rvoid sure(void)//密码认证函数//
3 o8 s9 R7 x: m{
# h* b, y) {; ?2 L     uchar i;; N! K& h$ T/ i% S0 z
    if(KeyValue==11)5 g2 L* Q  ?3 N$ [
         {         
5 I7 F, r# o: ~* v8 O         AT24C04_ReadPage();
& A; ?7 G6 }5 |9 _! S, j% y, \             for(i=0;i<6;i++)( G. D/ z, C& Q; A0 m3 @0 l
                 {        password=BUF;+ i, B/ n7 [. n& E6 g' p$ j2 k6 x+ p
                         if(password!=tempword)//对比密码/ h( I8 v) a. Y5 H3 H6 b$ P* a
                        {
2 o3 i9 K7 \/ I1 B  M# m; B                            key++;
- T/ B. z% H  A$ n. C                        }6 \3 Q! w+ V! i% e
                 }                   / j2 ^# E$ @* K7 E
                 if(key==0)                //密码正确,输出OK
6 }1 v) V- Z3 {. b6 y2 [- w5 w% H                           {
, F6 \8 N, R5 h1 ~6 w                                dwxs[13]='O';1 ]1 `1 i% h& o0 b. T
                                dwxs[14]='K';
; f$ w) y6 f2 C. H# @* W2 ?1 r                          shuchu=1;                    //开门
: G) i1 A) E* o' t( y0 C                                TR1=1;            //定时器1打开,启动倒计时
4 Y7 ~; _; n% V+ i% k" ^: I                                moshi=0;          //输入正确密码可关闭报警模式1 Y+ p0 {  d: A* ?2 a
                                beep=0;           //蜂鸣器复位& _* e+ W3 M5 Y' F2 k& \3 m) J
                                TR0=0;                              //并且关闭定时器00 ], g; x$ V* S( g8 V# u
                           }  ?" L4 U! l( p: t; `9 I
                 if(key!=0)           //密码错误,次数累加
2 ^0 S: g# a% z, c' Q                        {
0 D& k; I( w/ s! J# |6 l9 a                                dwxs[12]='E';
5 u; N6 ]( y( v& p! I6 ^                                dwxs[13]='R';* |8 H1 ~5 f) k0 x7 q+ o" {
                                dwxs[14]='O';
5 y3 P# ^* W( K, \                                dwxs[15]='R';
+ w* e3 {' t$ T5 E. d8 \9 E2 b7 r                                warn++;! ~0 M9 L3 Z# r( g# f# X8 N4 t8 P
                                if(warn==3)                    //输入错误3次,报警
( `0 Z6 `1 W8 K" W5 y# ^                                {
8 y' A, B4 q8 \( v7 G                                         keyboard=1;    //三次错误则键盘锁住
/ [( N' w# p/ m6 i                                   TR0=1;                      //定时器0启动' S( v  F6 V/ B/ B
                             moshi=2;                    //模式2启动蜂鸣器报警% J! Z% M. `/ c+ j- s
                                   warn=0;                    //累计清零
$ t) Q$ o6 _( g6 [8 Y3 j                                         TR1=1;                //启动键盘锁定倒计时& F$ i- q- W: B3 ^# J5 b8 M, V
                                }
( T" w& {% N7 E/ G( U+ y                        }
/ R' g0 g5 R/ W         }
5 l! c1 |; Z  r}; o; b4 O0 {3 e7 E
//************************************************************************************************************************************
+ `' m4 _* w" Y0 g( h$ j& I9 r) c# m) ?//附功能函数//) O) G/ A% a4 m- ^
//************************************************************************************************************************************% j: t, x) a! E; `
void Add_Function(void)- O7 D$ ]4 g/ d1 ~" u( R% W5 r
{3 q# d+ O$ |% c+ u" \. t3 W3 ]+ c
          switch(time2)  l* M$ ^0 G8 M1 Q! f
        {
; u6 }; x* [. }9 M- M    case 4:{                     //门锁打开后4秒关闭) `! Z/ J- }0 W2 Y: Y5 C
                   shuchu=0;           //关闭门锁电源& y5 ~- o/ ^5 a0 V! x4 C2 g
                   delete();                       //自动清除
. ^2 q2 R/ u" T* _( H                   if(keyboard==0)     //如果不是密码错误开启的定时器则关闭定时器1* _* O5 c$ s. k  H  s
                        {
6 ]' Q2 J, v- y- Z' ~( ]. `                                 time2 =0;         //time2复位  g( b" k! l1 d
                                 TR1=0;            //定时器1关闭
9 o# {% o9 k* I+ d      }4 n$ \) r/ u$ @) a. Y. l
      break;                        
, E' Y9 x5 Y& o+ h" \* P                }( t0 M! c: J. J# z4 g
    case 60:{                     //键盘锁定一分钟7 [* j4 w" w6 S1 R# _1 W
                         keyboard=0;         //键盘解锁
7 R7 p) b% E# Z1 G) r$ U) q$ ^# u                         time2 =0;           //time2复位
+ M1 O( z  D" y5 d                   TR1=0;                    //定时器1关闭5 p  ^8 j2 H# H. a7 }
                        break;4 M8 ~7 C% c# ]7 \8 S& W6 s
                }/ E* R, x; }" m
        }, R% v  G1 O8 x' k+ `7 I/ e& Y
}" }" g3 K. i0 `5 H3 I
//************************************************************************************************************************************- [$ Q7 }7 ]' C2 U
//系统初始化函数/// i$ Z9 i8 B4 `
//************************************************************************************************************************************" p1 v3 m8 K4 L* x
void System_init(void)* }; P/ g( k2 c2 ?" y! D0 b
{( G9 K  E! H; F
    TMOD=0x10;                                       //0001 0000//定时器1方式1,定时器0方式0
( B7 b9 j: |' o$ _% O9 p2 i5 S% _          TH0=(8192-700)/32;                  //定时器0 700us 定时
" O  k8 v2 j0 z! l& m; t7 i1 v    TL0=(8192-700)%32;- s% E0 x  A$ I
    TH1=(65536-50000)/256;  //定时器1 50ms
- u3 e: ]8 F. I+ G0 a" S! S    TL1=(65536-50000)%256;  
" A/ ]+ _% v' S' `; o7 i0 c    EA=1;  " k# o% n: [3 Y, W
    ET0=1;
0 ~0 ~' u. N! i, j) s+ a          ET1=1;" m& X; H0 y. Q
    shuchu=0;                                 //门锁初始化/ c7 x, B  P* w3 R& D' q( \4 r
          beep=0;                                         //警报初始化
; ~  @- M! M! e2 u$ m" {2 a0 G9 S          DoorBell=0;                                     //门铃初始化
1 J; J) Y7 [/ [$ j    lcd_init();                               //液晶初始化2 c  {5 M( }" ~3 R
}4 K! a; f4 Z4 V5 q4 m3 B& u
//************************************************************************************************************************************
: \4 J' w0 F; A" V/*模块名称:主函数*/
4 W( r& W3 W# R) d/*模块功能:程序入口*/% ~/ w! L5 G+ t1 F2 [* x) e! I
//************************************************************************************************************************************. j. e& y+ _7 `' S7 I
void main(void)//主函数# }* a& G7 |4 t% F2 W
{
- H$ H6 a' w: l8 Z* v% X, [7 F' T4 {; F6 [2 D$ G0 Y
        //AT24C04_WritePage();   //密码初始化(只需使用一次写入初始密码)+ Y) v" D& t+ {3 _- H$ D% q1 @
        System_init();           //系统初始化
% d- C$ a1 h, d& `) |        while(1)5 z% S" I- W& j) C' z" u
        {            
* f2 X, q! u2 S3 {) j  ]                if(keyboard==0)        //如果密码错误三次则锁定键盘  T' B! Q* Q& G7 {/ J5 K
         {3 L  M# T& W1 E/ V& b$ U
                  KeyDown();                       //按键检测+ Z9 L7 D3 |/ L* \; P9 P; o4 S4 m
         }
- \/ ?' X$ T$ M5 A, Q3 ^  Q" y                keysend();                         //数据传递
: s5 @4 b- n! ~                lcdxianshi();                 //输入显示
( L- a# ]8 a5 g5 w3 J+ W                sure();                                   //密码认证
& Q. k$ Y8 Z, ~( \/ h3 \                condition_delete();    //按键清除) Z9 Y5 f6 m# Z7 h* P' k$ t
                new_password();        //密码修改( z9 n) _8 M6 E) N+ E
    Add_Function();               //附功能函数  s3 z  ]# p& b( @
        }                                
$ c7 x% H. h- Y3 q+ q" {' n! v: n}
, B. ]% ~3 s& M% z//************************************************************************************************************************************
1 q! X3 V5 r6 N) ~. X5 E. J. L//结束! ~1 \: ]! m: J9 `, H; X, F# D
//************************************************************************************************************************************9 h8 H) ^4 L; s# a7 W( }8 x; I" p& g
1 v0 [2 R( b4 I% O
下载:
; t) o1 Y, @) S( T' U9 g+ W! ?
游客,如果您要查看本帖隐藏内容请回复
3 ~& X0 F/ t  R% N) M" `! y; G

, ^2 }# j5 S3 Z9 w

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-20 02:54 , Processed in 0.109375 second(s), 26 queries , Gzip On.

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

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

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