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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机数字密码锁(源代码)' O0 G  }2 Q9 x

: r1 `2 W0 |1 I3 d) J
# V, T1 Q4 K) S# _% `- E6 f0 {$ j
单片机数字密码锁:- i* `' H. n' L2 X0 [" x
6 ?9 Z% K9 Q# E
9 \* A$ Y6 k, {# `; N7 z2 E# L
程序源代码:

! N# p& \; z( x4 ^/ C' _5 N4 \5 y$ @7 C( q//************************************************************************************************************************************
$ N% F* m; D& W% B//库调用.宏类型定义.位定义//% q; _$ D* M6 E% H% k! ]
//************************************************************************************************************************************+ V1 Y% c" q- S7 M
#include <reg52.h>                                    4 }9 d9 z+ ~8 ?0 u
#include <intrins.h>5 T9 n; N  h3 p1 g
#define uchar unsigned char
9 \( I" Z7 E3 w+ {#define uint unsigned int
4 m3 ~$ q8 G; D5 z( S7 R6 r1 d#define ushort unsigned short1 O6 U+ r# D/ }9 T
+ a' F8 h9 P! _0 [1 S
#define GPIO_KEY P1                 //矩阵键盘烧扫描端口
: H: ~/ q0 [/ g/ N8 psbit RS = P2^2;                                       //液晶显示器控制端口
- [; |/ t5 k0 O0 l0 U2 H3 rsbit RW = P2^3;
+ I) F$ e3 z. m+ b! P% ]3 msbit E = P3^7;4 ]5 H8 K4 m/ f5 q
sbit shuchu=P2^0;                                      //继电器控制端口) u) S+ n5 r) ]9 u! s" D3 S
sbit beep=P2^1;                                              //报警器端口
: p7 Y4 A. o% u) o8 osbit DoorBell=P3^6;                                    //门铃端口4 y6 f* G' {# ?2 R+ l0 D
sbit SCL = P2^6;                    //AT24C04的时钟
! Q* \  E/ g( h1 Tsbit SDA = P2^7;                    //AT24C04的数据8 m9 K' q/ ?* D4 Z

: E: ~9 V- o) P" g% u& o/ T" Kuchar idata upxs[16]={"Password:"}; //上排存放数组) \0 V/ f* y. }- i
uchar idata dwxs[16]={""};          //下排存放数组
0 c! A) A6 k$ n9 X! Y& A/ Duint idata tempword[6]={0};                     //临时密码数组; C; n: o0 e  z; E
uint idata password[6]={1,1,1,1,1,1};//初始密码
# z& B  K. _! z2 k3 Auint idata now=0;                                                  //数组伪指针  ]* p, C9 |/ D
uint idata key=0;                   //密钥
9 W+ @+ v$ ~# [7 y$ tuint idata keyboard=0;              //键盘锁定标志) ^4 m9 M/ L! _% p& Y
uint idata key1=0;                                          //用于密码修改
3 y% V  D1 q2 x( ^# Auint idata KeyValue=16;             //用来存放读取到的键值
( c. a8 P2 Q7 ^( }uint idata warn=0;                                          //错误累计8 D1 n% N# j" o# l9 p
uint idata time=0;                                          //用于定时. _. g" l, b, {' t
uint idata time1=0;                 //用于定时
6 P0 m3 x  \: o2 `uint idata time2=0;                 //用于定时
2 _2 @& X1 S( o1 Wuint idata moshi=0;                                          //定时器内部模式: A7 i' v- H) Y3 E' a
uchar idata BUF[8];                 //掉电数据缓存区/ V3 d/ e9 X% s
uchar idata TESTDATA[8]={0};        //掉电新密码存储6 [7 I* p1 ~3 O: @4 ]
uint idata menu=0;                                    //menu用于密码修改
4 x; R3 f1 L7 |3 Xuint idata tempword1[8]={0};        //用于密码修改
3 M9 \" E  v( F//*********************************************************************************************************************************
4 M1 Y- Z0 U* Z/ s0 p, L  Q//函数声明//- i3 Y- L$ j8 n; z8 k
//*********************************************************************************************************************************$ ?  T- j$ \6 L! |' S
void delete(void);
( `& p' A$ }& s: |//*********************************************************************************************************************************' O3 y. a8 B% m  f" b- G! l
/*模块名称:液晶驱动显示模块*/  k: C* H# x/ a! L' H3 \- }
/*模块功能:驱动LCD1602的显示,并时时显示按键值*/
" w# u. u7 ^9 T1 x//*********************************************************************************************************************************
5 d$ w! D2 d% jvoid delay(uint dell)//毫秒延时//8 D; a) x. R1 x) V" |3 C: H0 Q
{+ [+ t" ~( u) J- a
     uchar x;
  m, C: `0 h: u' T& n8 x  E     for(dell;dell>0;dell--)1 O1 c8 d3 g" h% ~/ X' b
     for(x=110;x>0;x--);) _* L1 z" {4 t
}. h+ o$ k( P! d* b  w6 {6 w
void wr_com(uchar temp)//写指令//! O! u7 P( Z# Y: b. `
{! U3 P- b3 u  }# `
     RS=0;
" K+ n* e! Q6 ]* e     RW=0;
/ V7 v' C7 t! N     P0=temp;
! q6 Y. ?9 E$ I7 r7 F$ f     E=1;4 J- U8 w  D  S1 I) E) q5 S
     E=0;
" p3 w% N. }: B( t" o" r}
  a9 \- ?4 X) U+ A4 C6 zvoid wr_data(uchar num)//写数据//
' W: v3 k0 U$ A2 `- q" |{
8 j( w% o) ~. n3 a0 L, Q) P" M     RS=1;* R% N( B; k& g1 C0 `3 F, |. G
     RW=0;: ?2 G0 L& r$ W; x6 m  F
     P0=num;
& u+ Y8 G5 v2 v5 t     E=1;* J3 k6 P8 n# K# C. r: B7 u
     E=0;
/ U0 F: s$ @. U/ T}$ F4 N2 S7 P6 K6 S1 q: v
void disp_lcd(uchar addr,char *templ)//显示函数//: q4 [/ i$ h( {2 K- T1 {' Z
{4 y# m- x4 p4 P) z: B# x" I8 I
     uchar i;
+ ^3 m0 L, |) b  F. L6 L! q( r. A     wr_com(addr);
( F: d* J! P  @           delay(50);* t# l4 ], ^/ g( v6 A, a( _
     for(i=0;i<16;i++)
: V9 T5 n' `7 a. T/ N& |2 o    {
/ O/ T1 [& G. V/ u3 A3 Y     wr_data(templ);
. V1 M7 d2 O3 u& {  @7 s, Y           delay(50);, n; e* |3 W  s: u4 Q0 a
    }         3 n3 q' z, P2 n1 T$ X" q" Y
}
8 [9 ?' z" e. K! g! R( H- S) u6 Z$ S/ J* tvoid lcd_init()//初始化液晶//
% ]: _9 _1 L) A{) N- M( G/ ~( }/ ]/ I# t# S
     wr_com(0x30);
0 n# Y6 A# w3 L/ d7 A      delay(50);/ l; E% Q7 h$ k
     wr_com(0x38);9 H; }* f! l) w5 _- H: m! B
      delay(50);, x/ X0 _1 l9 r! A6 F- ~
     wr_com(0x01);( \) S3 @; T9 O. O) f- t0 w9 N$ y
      delay(50);! w/ Y; N6 t  h' ?# H
     wr_com(0x06);( ~- C2 R' ?# r9 W  Q1 p
      delay(50);
1 `& X3 a5 ?7 M/ {1 U1 T     wr_com(0x0c);
/ m% M( h" T. ?2 x! A      delay(50);  V8 p* q4 [& s8 C, `5 G3 s! \1 n
}1 F/ z* @) M7 M- V1 j- V6 n1 r
void lcdxianshi(void)//液晶总显示//0 \, H" K. A: D
{. [* c4 q* x% a" N' Q1 t+ F3 o
     disp_lcd(0x80,upxs);; Q6 t. P# o2 T% r
     disp_lcd(0xc0,dwxs);
$ Z7 k1 e  @7 b: `1 F}) i- _1 z) @( D2 o7 o- h0 D2 x
//*********************************************************************************************************************************0 o2 O0 D2 x7 e9 g
/*模块名称:矩阵键盘扫描模块*/
0 e' ]; Q: Y" Y) R' t% @+ f( r5 J/*模块功能:时时扫描按键值*/7 b1 n6 G3 y3 ?
//*********************************************************************************************************************************! w$ `  X+ U' U4 E
void Delay10ms(void)//延时函数//
3 _$ G7 J, z. L3 M- B, l3 f{/ [# R- p1 v9 \. {1 m% X9 ]
    unsigned char a,b,c;
  ?# D4 N7 a7 n. L* b    for(c=1;c>0;c--)
$ H2 z( v6 C" i6 }8 k5 y- `        for(b=38;b>0;b--)
. T( W% i8 L# R. d4 K            for(a=130;a>0;a--);9 Z4 j$ B' j  |$ s, x
}
* z% T8 m0 O- x6 lvoid KeyDown(void)//键盘检测函数//
3 Y0 v5 A4 g. }4 O. B{
/ p2 ^- i0 [& p        char a=0;$ l6 P' I, |% F( M2 @0 @7 b  A
        GPIO_KEY=0x0f;
4 ~. j, J: ?4 t( O. A        if(GPIO_KEY!=0x0f)     //读取按键是否按下  B! I) E$ D+ O, a
        {- a: W% }; M5 j8 u9 r! o+ `
                Delay10ms();         //延时10ms进行消抖7 S0 K. k) F: m' u# @
                if(GPIO_KEY!=0x0f)   //再次检测键盘是否按下
5 ^: Z# p& p2 W                {! t/ F! l% O! z$ o$ ?$ F) ?8 o

- A, ]4 _2 t) ]                        //扫描列+ R+ d0 ~5 ?% @7 Q
                        GPIO_KEY=0X0F;
# N: x" R: v* v0 w: w                        switch(GPIO_KEY)+ Z& @7 k3 }4 Y8 L9 g5 s! J$ Q
                        {) a9 ?5 K  N* b( ~3 z  a
                                case(0X07):        KeyValue=0;break;" V4 H  M4 }$ @' z9 m2 h
                                case(0X0b):        KeyValue=1;break;
9 V, F) q- F  ?# p+ n" G                                case(0X0d): KeyValue=2;break;! V2 _1 j# s0 W7 q9 W7 v+ }  |2 ~/ N
                                case(0X0e):        KeyValue=3;break;
9 b/ D  O+ a" ~5 K+ b                        }
7 k) x7 D9 }( z; Q                        //扫描行
7 K8 c' A/ ?& h/ o4 F& d2 `                        GPIO_KEY=0XF0;% _# \. @: O0 u0 ?
                        switch(GPIO_KEY)6 H9 G- x3 W3 U* P
                        {
+ g4 _5 k* a; Z, ?: r- N, A1 y                                case(0X70):        KeyValue=KeyValue;break;" @& R) r4 `$ y
                                case(0Xb0):        KeyValue=KeyValue+4;break;
6 r2 k' x4 ]: }* r9 m                                case(0Xd0): KeyValue=KeyValue+8;break;
( {3 q$ I, k3 [2 J! [* U1 c$ G# \                                case(0Xe0):        KeyValue=KeyValue+12;break;4 s: m! z, {% j) A" ~, g$ x
                        }- _: i' y6 s1 x
                        while((a<10)&&(GPIO_KEY!=0xf0))//按键松手检测
* L7 T' {- O  Q. w                        {+ |$ J+ }) ~' q, F4 l& Q
                                Delay10ms();
, x# q/ W$ j( Y                                a++;# @! Y2 O4 Y  N
                        }2 v0 B6 ~7 c. I- M
                }
1 Q& M: Q" o7 q5 Z' C        }
5 W4 \' ?# i8 G9 ?/ {# j, R}
9 Y. y+ _1 g7 N//*******************************************************************************************************************************" P4 ?& g8 d  N6 a1 F% R' c
/*模块名称:数据处理模块*/
3 J) U/ D' Z8 U& e- m. V6 v. d/*模块功能:(1)将按键值传递给各种缓存数祝(2)包含数据清除函数*/* ^. ^/ E: v7 S. ~2 f+ Z
//*******************************************************************************************************************************
$ {0 \8 G4 @6 `* F  jvoid keysend(void)//键值传递//* N( ?: c  H6 _, P9 p( x
{
0 f) A6 N" y: ^: H. w5 w8 e1 `$ T                 switch(KeyValue)
$ E4 M; D! V* n6 _2 E$ c           {
; t: u2 y  P/ T9 ~, w             case 0:{dwxs[now]='0';tempword[now]=0;TESTDATA[now]=0;now++;break;}
( i) L6 H& R5 h; i7 |% |* e, x                   case 1:{dwxs[now]='1';tempword[now]=1;TESTDATA[now]=1;now++;break;}
/ r0 D# O/ L) X$ F6 E3 Q                   case 2:{dwxs[now]='2';tempword[now]=2;TESTDATA[now]=2;now++;break;}$ G3 Y; W6 x9 p% E
                   case 3:{dwxs[now]='3';tempword[now]=3;TESTDATA[now]=3;now++;break;}- g9 u; Y: Q) P9 s
                   case 4:{dwxs[now]='4';tempword[now]=4;TESTDATA[now]=4;now++;break;}
0 l% U6 V9 z/ Z: S! B, p- K                   case 5:{dwxs[now]='5';tempword[now]=5;TESTDATA[now]=5;now++;break;}$ z- f% t. U' p# G$ g0 w
                   case 6:{dwxs[now]='6';tempword[now]=6;TESTDATA[now]=6;now++;break;}
3 u2 w! {3 m8 U( N- G% E                   case 7:{dwxs[now]='7';tempword[now]=7;TESTDATA[now]=7;now++;break;}
& P: f- C$ K1 i: j! @4 p  ~                   case 8:{dwxs[now]='8';tempword[now]=8;TESTDATA[now]=8;now++;break;}
* Y; n; o5 q+ e                   case 9:{dwxs[now]='9';tempword[now]=9;TESTDATA[now]=9;now++;break;}
% _7 h- `+ \( ?  y% y- N                   case 11:{9 {7 H# u! ]  Y2 u6 O
                                        upxs[12]='S';9 Y* k) g! s3 i
                                       upxs[13]='U';- c7 Q5 q8 q* H1 [% z
                                       upxs[14]='R';
* U* Y0 Y5 B- h! m7 W, W% |& Y                                       upxs[15]='E'; break;. {1 x! D$ I/ D5 w4 o& M0 s( b
                   }3 e% l0 r* T: y; C+ d( j
                   case 14:{
3 S- o4 U1 U1 [0 x+ G) W                           menu++;                         //密码修改模式启动模式一5 W7 h! ^' K0 m  w0 [+ ^
                                  if(menu>1)                     //再次按下跳出密码修改模式) b9 t) `% [6 I; d3 K
                                  {
9 D( h, }2 N, d: p' Y  F                                           upxs[0]='P';           //显示“password”
7 h+ ?# W  {0 S0 L0 H4 D9 u                             upxs[1]='a';
. `* b6 D" Q1 o                             upxs[2]='s';
! V9 |9 B& s3 S( {9 y. q* A! ]$ p0 ]                             upxs[3]='s';
( a  C7 V% X( k! [0 M0 }0 T5 Q                             upxs[4]='w';
. C$ }0 w7 o# Q/ \) Y5 P                             upxs[5]='o';1 Q# t. Y9 y# ]+ Y* |4 B! I( t
                             upxs[6]='r';  \* \( F8 Y% e! Y1 \/ M
                             upxs[7]='d';* g2 p$ m% ]& D3 u
                                 upxs[8]=':';
9 F5 ^$ ~7 W& i' e+ l                                         delete();
8 m! L7 c# C0 g* _6 t% R4 M9 K                                         menu=0;
; O9 h9 y) Q. U! b- {7 ?& C6 o                                  }  j3 Q' B: f5 [
                                  break;
6 a/ O9 C4 w9 R" K6 y) T                   }
4 P0 c0 F  M$ B0 k! |                   case 15:{
% p- F" V4 D. Y+ _" K                          TR0=1;                     //定时器0打开
) |4 M) ], r& l$ w                                     moshi=1;                           //模式1为门铃模式
( ^* [- a. t3 S4 ~2 f; q                                  KeyValue=16; break;//键值缓存清零3 ?% A: @! \/ H5 v( y
                   }2 \4 v$ V( m9 q2 [8 F( h' P! b
                  }% s; ~8 ?; U6 }/ b+ d5 Q
                  if(now==6) now=0;      //只存储8位,只显示八位
1 X& S6 N2 x% _. D}3 M( h9 U8 z" p
void delete(void)//清除函数//
* I  o# B( B: }# y{" w; L1 i0 C7 y  Y+ |* K
     uchar i;
$ P4 b. t& I6 G- k6 g             for(i=0;i<16;i++), B5 }( q7 k. h6 c' K$ X
                 {8 k1 n+ z/ A& J3 z' O
                    dwxs=0x20;            //密码字符清零6 N+ D" B9 }& r3 P
                 }8 o5 R0 e( D. z. ~( S/ E
                 for(i=0;i<6;i++)
- h  Q* \$ n/ y" t' k$ y7 S                 {  t9 k& `$ W% K/ M
                    tempword=0;         //密码缓存数组清零" `! r. b3 M; l% w! \1 ]( n& X
                 }: p1 k* j: Y5 g0 [' k4 d! S
                  upxs[11]=0x20;
- J# x1 {: Z4 V" b, r                  upxs[12]=0x20;   //SURE显示清零
' R" \% p/ {8 T, y3 i* v                        upxs[13]=0x20;9 N3 _- |: t% e2 m" @# D9 ?8 \
                        upxs[14]=0x20;
4 B! G( _  p5 T/ I                        upxs[15]=0x20;' ]) N8 m5 ~% W7 H# E4 h7 }) y, O0 o' z
                 now=0;                                       //伪指针复位
  Y  ?! H2 z" C/ _. c                 key=0;                                       //密钥清零
# b8 @1 q: E" j! q, A* ~                 KeyValue=16;                     //键值缓存初始
8 {5 D3 f/ Q8 N6 I0 t}- c7 A, {" \, y* D9 I9 s2 W" Q
void condition_delete(void) //条件清除
0 Z- ^4 ^. y/ U$ }% |{4 K; l5 M1 N3 u! H
     if(KeyValue==10)
2 a# [  P, [& Y1 w% U6 |         {' D- Q( U# Z+ E6 T. m* J
                delete();            //按下DELE键清除数据% C9 z  t5 `: a+ q3 d9 X# g
         }4 F: |; x; ^! |1 L6 t
         KeyValue=16;                             //键值缓存清零) ~# [# R8 H+ q, p
}" J2 d* \; [% O
//*********************************************************************************************************************************
* H( m: e$ f" J6 s6 u; P* E: w/*模块名称:定时器模块*/
1 K! j" ]" ^& z- o/ w  h5 D/*模块功能:定时器0用于产生门铃效果,定时器1用于各种倒计时*/! g6 L8 G: w. k! G! d. ^
//*********************************************************************************************************************************
6 v1 _  @9 Q3 b! ?/ V2 u5 R3 Cvoid timer0() interrupt 1    //定时器0用于门铃
/ v- F* i$ ~$ |& v% z3 O( K{
3 G/ V9 @0 x9 z, E    switch(moshi)9 o0 u3 K7 M3 v: Y
   {' K% A1 o8 j5 S  n. a6 o
      case 1:{7 N( L. R9 ], y
                DoorBell=~DoorBell;# ], X+ K% z8 [0 _% y
            time++;3 \: B8 J4 W/ I3 k
             if(time<400)             //若需要拖长声音,可以调整 400 和 800
; v! B6 X: T  ]8 }            {
/ X8 L* D7 X7 N               TH0=(8192-700)/32;     //700us 定时( l) l  i' e9 Q; e$ W$ C$ X
               TL0=(8192-700)%32;0 a0 h8 h& P/ R6 m
            }
* ?0 Y. G! D3 {             else if(time<800); M, ]3 f3 c0 G$ F
            {3 O# J7 W) F  \% d' T
               TH0=(8192-1000)/32;    //1ms 定时, Y" ^2 r: [/ s; N( W: p6 M
               TL0=(8192-1000)%32;% J( h" A5 I- ?6 W# i8 r; }
            }
. X& U) s' M0 ~, h             else; H; O5 I) u+ l2 J; E) R
            {
3 e; k; }. k( q- N% o               time=0;                                  //计数清零& i" w! A( n" @8 K, @$ r
               TR0=0;                                  //关闭定时器
1 [4 f7 R2 H! q3 T                           moshi=0;                                     //跳出模式1" J$ d: j" k9 U, S. S7 P( W
            }  W, o2 o! b1 a, Q" `/ \
                        break;* p. f+ ~! F+ q6 u( W7 V
          }( @5 Q; H+ _6 D6 ~5 F
          case 2:{2 V$ m7 M) u9 c5 h- J3 J
                           beep=~beep;
" |. O, [4 G  t4 F: }                         time++;
, t; [# s6 t. {% X6 E                         if(time<400)             //若需要拖长声音,调整 400
- I4 O- P0 U5 o            {
" g( I) G9 [. c% T$ S6 [               TH0=(8192-700)/32;     //700us 定时
9 @: n+ v0 L" K' i9 X6 m               TL0=(8192-700)%32;
" `; C0 |: W4 f9 r            }8 B8 X; b, i5 a% O
                        else6 F4 H+ S' j- b1 p( ?
                        {! I) M4 \* f% Z
                           time=0;                                  //计数清零
$ ]0 T6 B) D2 a! p! j( v- w- N: d3 q                        }% r+ U& c! A+ q( c+ ]' f
                        break;- Y# _  }9 b- o. r! r
          }
( ]/ H: }0 m6 c/ a7 X4 ?   }
6 Y% ^( t8 M6 h0 K' h& Y* f}
! C" t& G+ F1 F* F& zvoid timer1() interrupt 3          //定时器1用于自动关门  y" L" g. I0 R! L8 Y
{  1 c* r( x5 w# Z" I. _
    TH0=(65536-50000)/256;  
7 ?" v7 F* |4 X9 r* l    TL0=(65536-50000)%256;  
4 k$ p! \. C* @  s5 }- y, R& e    time1++;   
7 y6 M0 p, V, D' q" o" `0 M  ]  _& d+ O7 x! x    if(time1==20)//一秒  
1 n& h: T/ j7 d9 ?2 |& w9 i% p    {      " ]3 c7 A7 k; P2 X2 D, l
      time2++;
: @# S: u+ h9 F, k1 ?) d. ]! l            time1=0;  $ W" W7 c+ v! H' `. p: `& g6 ?2 q
    } 7 I& ^9 \% x* ^9 G# B- D$ V
}
) J; b) t2 r/ X% `7 g//**********************************************************************************************************************************# R8 p8 D* b& D+ c- a
/*模块名称帜:掉电模块*/
; I8 m9 k4 h2 `# Z/ L: Y/*模块功能:支持门锁掉电后密码可保存而不丢失*/
+ J. B  r' G. e$ g" s4 j8 D//**********************************************************************************************************************************" m' B) ?& `0 f& p1 J( L. u
//延时5微秒(STC90C52RC@12M),此延时对于12M晶振7 Q( P+ z' p9 }2 p. L: W
void Delay5us()
4 @! A8 l/ J0 q4 m; m2 C{1 B$ m( L+ p# t8 x
    _nop_();
, n) M, F! ?: ^; I    _nop_();
8 T( |" Q5 }' ^( N}+ S' o& ?1 F: V; L
//延时5毫秒(STC90C52RC@12M)
9 i% L/ l# g  S4 Hvoid Delay5ms()7 n: S3 d0 _* i, J6 ]/ a
{
( C& U; t( K- K( v3 k    ushort n = 560;
+ I& ^( [" B5 g0 M9 L6 H  K8 M    while (n--);7 P2 i+ T" j  l, D9 y! C& w" J/ x7 ~
}( m" E2 U' [" A+ U1 d- S+ S
//起始信号
3 z2 z; k7 d$ s# |6 f, v8 ]9 p8 Q4 Bvoid AT24C04_Start(); y% C: F  i5 {$ {2 I, w
{) ]0 q: v  S; b  c4 r3 F' H
    SDA = 1;                    //拉高数据线
5 @; E  q1 m1 U8 Y* L- [* o# z: n    SCL = 1;                    //拉高时钟线
3 `& u) M1 i+ d0 l+ L. s$ c    Delay5us();                 //延时8 j# E8 D  k6 Q# R& v) W
    SDA = 0;                    //产生下降沿
- k; E7 l9 G% d& ?    Delay5us();                 //延时
; A; z% @6 I  S9 R' T    SCL = 0;                    //拉低时钟线9 I4 D$ J& o( I" C
}. @0 `  Q1 k% J1 e+ r5 ^4 q" }8 q2 D
//停止信号3 E( _  K8 f; s/ N
void AT24C04_Stop()
' t5 P: a( |4 T6 F2 v, [" `) d& w' |8 q{
' a8 |3 ^4 f5 `) m+ t, _' p4 t    SDA = 0;                    //拉低数据线1 k) b- H- L$ a8 g
    SCL = 1;                    //拉高时钟线' k! ?# l0 b- J; l3 V8 E% T9 g& D
    Delay5us();                 //延时% `* M$ f6 K$ e8 E  J8 F% O
    SDA = 1;                    //产生上升沿
; s5 M! u$ R' J" ?) b9 J% a    Delay5us();                 //延时
: Y* U  X. W" N6 S: q- n}# f) Z' L  Q, h* w
//发送应答信号( ^: E8 W* I' I1 E/ [* J8 q
void AT24C04_SendACK(bit ack)
9 @2 ~; q+ }5 P0 P) ?, C0 [{  |2 `9 f' \5 r' _7 m8 h: I
    SDA = ack;                  //写应答信号
" R6 K# y( B9 `% d    SCL = 1;                    //拉高时钟线
& ~: H* Q3 Y! s8 |    Delay5us();                 //延时8 c8 i6 c( m; l" Z+ H) d: v
    SCL = 0;                    //拉低时钟线
1 _* ?6 Y" C* ^; B7 F$ x- \    Delay5us();                 //延时
: m+ B* @* h! P/ B}
' ^$ [  q" W' m2 _* j, |- U) ?2 W6 ~//接收应答信号
+ p3 R) C5 i$ ]$ ?1 ebit AT24C04_RecvACK()
* _3 a) u. L, D  S2 L3 F! S8 Y7 h3 A3 h{1 m0 l# ^$ W4 `% v7 l9 c* p% s
    SCL = 1;                    //拉高时钟线
& F' }+ z+ A" J% N' _    Delay5us();                 //延时
& U$ x1 A& g# P" l    CY = SDA;                   //读应答信号
: F. H5 S! a$ b, J1 \/ i    SCL = 0;                    //拉低时钟线0 @1 E/ j3 G( C- q% }
    Delay5us();                 //延时
0 b8 U5 b4 w- o+ z! J# |* e2 n5 l2 i7 C& e( P; ]% a8 n5 F
    return CY;/ |  k5 _; j' l4 J+ [0 Y! {
}$ j1 ^  C) ~4 E9 a& n9 A# K" I
//向IIC总线发送一个字节数据8 h" b) {: Q; S3 F
void AT24C04_SendByte(uchar dat)
6 ?- ]' O  ~2 q{6 U2 u: N/ }: x% |% v$ e8 M
    uchar i;
# s9 Q! E/ e& S; j% i8 f* K* ?
+ V$ C0 E. `8 h- h3 F5 ]1 W    for (i=0; i<8; i++)         //8位计数器) G1 S& X. F+ d
    {
& Q0 ~0 t& P/ }9 H! p        dat <<= 1;              //移出数据的最高位+ R5 N7 z) k) k0 _: I* u. ?
        SDA = CY;               //送数据口
" Z; U5 z: ?. Q        SCL = 1;                //拉高时钟线5 V+ D* R$ a* j, b
        Delay5us();             //延时
* r, y$ ~& w% c- S        SCL = 0;                //拉低时钟线
( B) E5 a! [% C% f& z6 N        Delay5us();             //延时
3 ^/ K& O/ o& e$ h. j9 P    }
0 Z' S" j, k8 B2 [    AT24C04_RecvACK();
8 L" w) d. O% _# h6 V}/ z6 K+ h2 A* `, v! q3 l3 I
//向AT24C04写1页(16字节)数据,将TESTDATA开始的16个测试数据写如设备的00~0F地址中
! s  b! @* c. Y8 W( Wvoid AT24C04_WritePage()
, U( K4 m8 E! h$ y6 c{) h  |$ C# M* P/ L
    uchar i;+ k; L1 i  p  f3 X2 Y
$ V2 k4 Z6 _$ k4 P- G  k) S
    AT24C04_Start();            //起始信号6 G8 F' r6 c& h/ H
    AT24C04_SendByte(0xa0);     //发送设备地址+写信号: U3 Y" F* I( e* T
    AT24C04_SendByte(0x00);     //发送存储单元地址8 ?  u# j/ D! b7 G7 G7 }0 _
    for (i=0; i<16; i++)
5 C/ {2 _6 t, D    {) r, }# u7 q; \' d: g7 a+ z  e7 _
        AT24C04_SendByte(TESTDATA);
- n3 u1 ?- \& d3 v' S    }
* T' c2 H3 |7 A' L; X; a+ G3 Z    AT24C04_Stop();             //停止信号1 b# l% s& L1 L* L. Y  v% V% N
}
2 I. v! B6 {6 ]; F//从IIC总线接收一个字节数据
5 k# t+ H8 E2 K5 K( X7 euchar AT24C04_RecvByte()
  h7 }: i4 T0 |! z' e2 g{
- h0 w% B- d+ h  v' Q    uchar i;
7 _# R6 o+ e* U: I    uchar dat = 0;
' D7 D2 J* u6 c* D8 s' H- o4 N4 t! W$ t" x6 h, a
    SDA = 1;                    //使能内部上拉,准备读取数据5 n- u" k+ }' b% Y4 P0 g5 w
    for (i=0; i<8; i++)         //8位计数器
( H0 z5 e3 C4 ?9 k+ ^    {# d  B& l1 N. i) P0 }
        dat <<= 1;- C9 K" d2 X1 S+ O, m* B  v) |
        SCL = 1;                //拉高时钟线: e- y) z. d) O& S7 @8 E
        Delay5us();             //延时
8 t( @5 @- d) G5 ?7 n: @, O        dat |= SDA;             //读数据6 Z; h/ ~, A% c% N3 s
        SCL = 0;                //拉低时钟线
4 p% ?4 D; h! t* V1 F! ~1 t/ u+ h        Delay5us();             //延时! N* C' G! j1 ]' W6 @6 r0 s! S7 r
    }
: R9 }) u: M4 F6 d6 P
. X! x3 n' b$ S" _8 {9 a    return dat;
# a/ f3 U, h3 b4 o}% h: j# ^6 F8 D4 ^
//从AT24C04读取1页(16字节)数据,将设备的00~0F地址中的数据读出存放在DATA区的BUF中% g4 z" Z! z7 O  c4 R8 B- P
void AT24C04_ReadPage()
* Z4 F/ L8 i5 |- N( {6 T: d{
4 ~, w' R1 t* l/ u$ J" i    uchar i;
6 J! Z8 a+ b: q7 i) u9 [! b$ H
( g6 G8 C/ ]  j- G3 U0 f% @    AT24C04_Start();            //起始信号) r8 c; _+ ?' ^  X5 r5 C( A
    AT24C04_SendByte(0xa0);     //发送设备地址+写信号
  p% M) c" i0 @* E    AT24C04_SendByte(0x00);     //发送存储单元地址& D  t5 Q# d- e! [$ i3 K
    AT24C04_Start();            //起始信号' @+ U4 G2 E1 `) |/ g# h
    AT24C04_SendByte(0xa1);     //发送设备地址+读信号  j4 p! i3 G1 \/ P' w
    for (i=0; i<8; i++)
  t& f3 L$ k$ Y- h# H1 e    {" E( A& a8 a' t6 C
        BUF = AT24C04_RecvByte();7 v* b: s7 }7 M0 F5 o  h
        if (i == 7)3 Y3 ]5 p- {" [
        {
2 |1 }! f" W0 e" u3 b$ H9 Y            AT24C04_SendACK(1); //最后一个数据需要会NAK
  N& \9 F& f& q4 `" ~! s2 I        }
8 \4 Z) Q+ G- `" s        else
* s- @, h9 U  E( p0 _, m* E1 |, L1 q        {& F9 `8 w8 t1 N
            AT24C04_SendACK(0); //回应ACK# I' ]# A. w) d) v: g
        }1 D; q( k; Z, d: F! V( O0 X( _
    }
, e: w- P: F  n    AT24C04_Stop();             //停止信号! v" {0 J" e% t1 _' z& k* j% [
}
# w; P3 `4 i) i* u3 s+ [* v( m//********************************************************************************************************************************7 R6 ]' t+ Z) ]3 _: p
/*模块名称:菜单模块*/
; R+ p$ K" l1 F, I' v) C4 r* y; W' W- ?/*模块功能:用于密码修改,先输入旧密码,密码正确两次输入新密码*/2 J' X! W5 C$ ~- I
//********************************************************************************************************************************
5 H8 l% V9 e$ E) u1 x/ Ovoid new_password(void)//密码修改函数2 V2 X( n: E$ Q, ~/ J$ H
{
6 q. ^3 }3 |+ ?+ T     uchar i,j;
; h3 h9 Q/ R& E) |7 [           uchar tempxs1[]={"old mima   MENUi"};//提示:输入旧密码  Q% F( j0 `* V" D+ ?
     uchar tempxs2[]={"new mima   FIRST"};//提示:输入新密码一次
$ y3 M. s% H) L! k, @3 B& F     uchar tempxs3[]={"new mima   AGAIN"};//提示:输入新密码二次: R5 ]! X2 F. ^- v
     uchar tempxs4[]={"password:       "};//password显示: ~+ N  V1 a) V! [7 y
     uchar tempxs5[]={"success  change "};//修改成功显示: E6 T. P/ I# H* Q( B  j0 k) t/ T) h
     switch(menu)$ z/ q- w7 ~7 e# Y9 `
         {) z: G5 f* F) A* \
          case 1:{
! w3 v% w  i7 I% c1 u                for(j=0;j<16;j++){
7 @% u: [, O* ^' `    upxs[j]=tempxs1[j];
' q! p  y) H) S; r( t0 O) J2 {   }8 X5 p8 P- V* u7 R( x
                if(tempword[5]!=0)
( m) o; y! k1 m* v( T0 ^! Q  K                {
9 b6 }/ n4 V1 x. J9 D- z" L# K                  AT24C04_ReadPage();//读取密码
) A6 N' y8 O- `* O                  for(i=0;i<8;i++)
, u$ |2 Y( p5 ?% d  n9 u8 N                  {( L  b0 c2 Q+ @  x2 ]7 F" Z* a1 ?, I
                         if(BUF!=0)//对比密码,判断是不是第一次使用
9 q6 w/ m+ }$ `& B* P6 G8 U  x' @% n                        {9 e: }; Z" j/ \' Y( B
                            key1++;
. |# w* K* y9 x2 S/ E                        }# f# F, y7 n( `, A) z/ p# R
                  }: J/ ^4 d6 b6 g4 a9 Q# ~
                  if(key1==0)//如果是第一次使用
: o3 x' E# x7 |4 F& p" k                  {
; c. s/ T/ G7 b. L                     for(i=0;i<6;i++)
% F9 X4 d% L8 C8 o/ B3 Z                    {. _1 }) t" _- \8 `& t, X
                             if(password!=tempword)//对比初始密码; G9 A$ q  f; |3 \' R% z
                           {1 m( v6 i# v( l$ H  W$ l
                            key++;
, _, z% \8 H# C, K/ N) ?9 z                           }
7 |  ^. m  C. w6 D+ h  \                    }8 v5 R- n# a; w! ?; a) I; q! H6 G
                        if(key==0)//密码正确进入菜单二输入新密码
% k5 n: v! _" V- A3 x                    {5 b0 F* A* O* Y. C/ J; a8 M
                       delete();
" a+ O( a4 G. a: k" l                           for(i=0;i<8;i++)9 _1 A/ b5 \% ?3 `
                           {" s0 Z- U5 ~9 B- x4 Q; e. z
                                     tempword=0;//清空缓存数组5 G) {$ i* W( z' X7 C; v
                           }$ r$ |$ D* {' |9 Q6 G
                           key=0;" ~1 `. R6 ?' {7 |7 n9 P
                           key1=0;
. E" C  h8 m2 X$ T/ E, K                       menu=2;4 K9 I8 B) G4 {
                    }
7 A; |8 E& I3 I                  }; m4 v# }, r4 M/ l. z, U% ]
                  if(key1!=0)//如果不是第一次使用- k) g2 }9 C& Y* |, v
                  {5 J  w+ Q7 F* ?
                          for(i=0;i<8;i++)2 s) I+ f1 i! K: a+ G
                    {% J6 L* X1 x  C9 N
                            password=BUF;6 }: ]/ x( X/ s1 A" h. A, p) c
                             if(password!=tempword)//对比密码' ?3 x  I$ I1 f: G
                            {
/ G5 i  q( f2 ~+ ^                               key++;- B' G7 h# J' ?0 o& \& {+ O
                            }
3 ^8 P; \$ j" g$ z; c                    }4 b# v) g  ^4 p
                        if(key==0)//密码正确进入菜单二输入新密码
( d6 t. ^+ t/ q7 q                    {
8 c/ K! s* Q" g                       delete();
  @7 Y& v- n. w8 }- V" A                           for(i=0;i<8;i++)
$ j0 A( n* W8 K4 L- U+ R8 b" O                           {8 L5 w- i# h* Q. n9 G! T
                                     tempword=0;//清空缓存数组
8 d2 T# Z1 E: m, q* ^. O3 P                           }
: Z! Z+ r  M, {" {7 z                           key=0;8 y1 {% R& q- y3 i) \, h
                           key1=0;
, \2 E& o) Y4 o& ]5 i* S- ]8 y% j                       menu=2;  N- b9 R/ L+ w, h) p, H
                    }4 G) T+ B9 S8 ^
                  }+ G" x& P: K9 R  }! [9 c/ P
                }
9 `- j" I. {' R' \                break;
1 {1 g& r, x; a                }
8 D0 \( d6 ^& R          case 2:{" U$ H( L1 N" X' d
          for(j=0;j<16;j++){8 p( U4 o8 W0 R# |9 D! o3 q9 L
    upxs[j]=tempxs2[j];
% L6 h0 m! b# \! g9 y( ^, y   }" W( k: a7 |& T% x# S" g
                if(tempword[5]!=0)
1 j0 J1 Y! J  o                {
1 H2 _! t, m0 q                   for(i=0;i<8;i++)
) n% _$ M5 @2 _+ F                   {
% V7 p4 z8 L* y- Q3 s8 I: Z: m                       tempword1=tempword;8 J" u9 k, B" ]8 ~& j; g: k
                   }$ B7 c- Q/ C% o
                   delete();
* H+ u& m. Y/ y                           for(i=0;i<8;i++)
+ w! w* `; [3 P                           {* b. x0 V# L( C. `
                                     tempword=0;//清空缓存数组
2 T) F& k( \: \# m4 N                           }
: c0 D$ ^0 \$ U0 [: e                       menu=3;                        //进入菜单三再次输入新密码
2 z$ ?: {( J8 G2 a- \  V                }
7 z+ W& t) @; n5 a. a4 s                break;8 \  ?4 }8 _6 w' _9 M) G/ R
                }
/ f8 G( l: f+ ~7 |5 C' k' d          case 3:{
3 E7 a4 K$ X1 ~7 K7 D1 \          for(j=0;j<16;j++){
, \* M! E3 c/ [( a    upxs[j]=tempxs3[j];
$ ]/ H0 k% ]. m6 |% v" m$ F. q- F   }
: q3 P) v( J" ^& R                if(tempword[5]!=0)' y' Q8 N0 E% h* r# f8 H1 r
                {/ P! ]' {8 a+ C7 y$ X3 e: q4 j& R
                   for(i=0;i<8;i++)+ `2 r% z! C9 O- Z. s3 F( E8 e
                   {
7 X1 e% q& Y$ e- k+ S                      if(tempword1!=tempword)//对比密码
) K& A! ^  d1 |# L/ V                         {+ |# f1 g- E4 N" y, y- y
                             key++;
% `6 A3 f  y! j( O: g1 \                         }
3 L& g% O8 O; A. L% n! h8 ~                   }
) `7 l' @$ g# v: k' i4 i: Q3 @                   if(key==0)//如果第二次输入的密码与第一次相同" v6 P& L. Z# m8 a/ t: D& l; \
                   {2 v8 ?4 ~0 w  Q% x+ F
                       AT24C04_WritePage();  //写入新密码
) o; @1 x2 x% S" E- g4 e                           for(i=0;i<8;i++)' c  c3 @( k6 `$ v2 u
                           {0 r# n9 g: e% p/ J/ w9 n
                                     tempword=0;//清空缓存数组. }1 l: Y  h. l: A  O
                                  tempword1=0;//清空缓存数组
0 G5 }2 ]) Q3 k# X6 ]                           }7 T. j, b/ c$ E. m* y3 g+ A  z
                          for(j=0;j<16;j++){
9 w( ~9 k7 A! J) P* H6 `    upxs[j]=tempxs4[j];
- c+ o$ K- O* |1 s  K; i5 p                dwxs[j]=tempxs5[j];6 C9 M2 q1 C8 ]4 z  c4 L& Y
   }
% r* L$ E. b' H/ n3 Z                        key=0;
7 |" {7 M" o  z                        menu=0;      //跳出密码修改菜单
' f. O' `8 J( c/ J) T- e                  TR1=1;' N3 r: A, f! G3 W+ y6 c
                        if(time2==2)                 //显示2秒
# O" b+ Q  H6 U9 v- k/ N                 {
% s2 c% z7 W8 V# @0 \5 v                         delete();9 `0 }. t0 @. \; {- S
                   TR1=0;                    //关闭定时器1
. E2 k* C$ h  m$ I                 }        8 u, t: Y+ \( X4 F- k
                   }; u4 v, v0 R4 N0 B7 |
                   if(key!=0)//如果第二次输入的密码与第一次不同
" v) x3 q  m! b4 x# Y; P                   {
# f9 P' t8 c4 ]( s0 l4 p9 u                              for(i=0;i<8;i++)* U' V; U5 P, z  h+ }" ?
                           {
8 v3 I% Y  _' ^! |  r8 n# M( X                                     tempword=0;//清空缓存数组; K- N9 b0 _$ X% Z) B
                                  tempword1=0;//清空缓存数组* P5 R  R3 n6 R3 ^$ E+ q; E
                           }
0 |5 ~- k( T" [  I" U$ n. z                           dwxs[15]='n';- g9 f( f2 g5 D0 l
                           dwxs[14]='i';
6 }8 Y) Z5 g3 E3 [                              dwxs[13]='a';' j) C1 V3 f! w
                           dwxs[12]='g';, z9 O0 H: j3 R# Z4 f
                           dwxs[11]='a';
% ]1 q0 s2 _: W$ C                          key=0;
% ]7 L* `3 x1 @: s                          menu=2;             //跳转到菜单2
" S- Y1 @- d+ ?                   }
3 P* b" H. L# _+ w' N& j                }' f# V& m% `5 g4 E# m- U; Z1 c- i+ ?) e
                }
# M& C7 R4 w& R! S- }) d9 |         }
1 m4 P8 h! p4 t8 g9 X6 U         KeyValue=16;             //键值初始3 Z8 p; }* r3 i. y3 d( F
}+ \6 y# N6 F# J9 _: p
//********************************************************************************************************************************6 N0 X' O5 X' T* h
/*模块名称:单函数区*/
6 r% K4 d3 I, E( P  m4 f/*模块功能:一些单独功能的函数*/
" W2 |4 D  g: _( b- e4 g//********************************************************************************************************************************% a% t2 a# r5 G8 C
void sure(void)//密码认证函数//
$ A+ f' @/ l3 Q6 t  ^4 ~: E{
7 ?5 N+ ^# V1 l+ Q# J     uchar i;
3 k. D) E' U- m4 e    if(KeyValue==11)
( X1 F" r! @( h% p( H! ^         {         
2 `3 M2 g8 t- x, _         AT24C04_ReadPage();
: [: g0 L2 R  f8 O. T: p             for(i=0;i<6;i++)8 t; o: x  S4 i1 B; k' g3 ^
                 {        password=BUF;5 \4 q' P% u3 Q( F: _
                         if(password!=tempword)//对比密码4 C) d+ P- f# d3 g7 e
                        {
% w5 Y1 c0 s: B% q. |4 I                            key++;! r7 A7 z# j0 K1 V3 J
                        }
% h& k! |- R& [. n0 M- `& f, _                 }                   7 w# p% Q) m0 V9 A
                 if(key==0)                //密码正确,输出OK : ^& \8 H0 s/ }9 {
                           {  e* e8 x; `- {% X- C) f2 g  A+ k
                                dwxs[13]='O';) [: E: U" g# U- f7 r
                                dwxs[14]='K';
) [- u% P% x& I                          shuchu=1;                    //开门
: l5 s- |0 W; J; e# ?                                TR1=1;            //定时器1打开,启动倒计时
6 n8 k1 D* ?" p+ k                                moshi=0;          //输入正确密码可关闭报警模式
0 {; P. b  u7 l  P* f( ]4 Z                                beep=0;           //蜂鸣器复位" H9 t% \% P+ y' ?* a
                                TR0=0;                              //并且关闭定时器0( d5 |: S5 K8 o# J) L  t" R
                           }
* X2 v& y9 x/ c$ |' n+ H! G                 if(key!=0)           //密码错误,次数累加
/ \- f! J: E: d* d6 B2 Q2 l! b; I: [                        {. m# a1 y7 t, v/ d: T9 b& Y$ c
                                dwxs[12]='E';- |7 q# I- h* O
                                dwxs[13]='R';! X# G. X. L$ e$ E
                                dwxs[14]='O';
9 D) o1 |4 b9 R" l7 N2 @! y8 C                                dwxs[15]='R';
/ _- X6 U. W3 `" H7 h3 k                                warn++;! L+ S; D5 c7 ~* ~4 |; I
                                if(warn==3)                    //输入错误3次,报警
- ^8 q2 d: k$ C/ \                                {. V5 t  t" ], [+ U( @3 V0 j
                                         keyboard=1;    //三次错误则键盘锁住# K; `1 }/ x# O
                                   TR0=1;                      //定时器0启动% c; A% y9 X  A  }/ `8 h! w
                             moshi=2;                    //模式2启动蜂鸣器报警9 ?+ X1 Z8 u0 ^7 o! s9 w
                                   warn=0;                    //累计清零
5 D( E: F* a, Y7 G8 i% f) t' D% f- F                                         TR1=1;                //启动键盘锁定倒计时' E: H7 ?* [/ u
                                }
; H; P2 M% ^1 \7 S# ~                        }
( C2 t8 T8 r& U* B         }
0 c* M8 B% `. s# \2 G  M}
8 x. e5 y* f2 [# o//************************************************************************************************************************************* n9 F) }8 f( C2 k  D+ v4 X/ O4 f
//附功能函数//( l$ ~. M& ~; M' c% y
//************************************************************************************************************************************
% D! r& m% ?. h0 L+ R. w8 Qvoid Add_Function(void)
0 M  i3 }/ A. h6 U7 ~7 p* F0 I{
3 Y' M# m( i! T) s$ s! h          switch(time2)
! e9 \, ^- h+ Q- ?: o. p        {% Z4 y3 E2 o1 ^( {) r, P4 {
    case 4:{                     //门锁打开后4秒关闭
* j3 L! F6 T* v3 w  V                   shuchu=0;           //关闭门锁电源
$ }7 S2 }% c( {                   delete();                       //自动清除
" f2 n$ F) g: z/ \0 M- v                   if(keyboard==0)     //如果不是密码错误开启的定时器则关闭定时器1
- U1 ^- C  u0 V7 k                        {
$ {* V4 [/ ^0 V, W                                 time2 =0;         //time2复位' u$ o" t9 `5 a$ `/ t! c) Q& Z
                                 TR1=0;            //定时器1关闭
! b- e& \; V% Z      }
: X- ^! l! o8 N* ~( f0 B8 H      break;                        ! N# X7 m8 P7 O' ^
                }
! {3 z3 M4 c. w4 w    case 60:{                     //键盘锁定一分钟9 H; t8 z2 T6 o# }( Y  b
                         keyboard=0;         //键盘解锁: s( ]/ ]9 |. N" |. s' t4 P+ O: B4 ]( O
                         time2 =0;           //time2复位9 t% \; T$ C8 Z. g. w. d) x
                   TR1=0;                    //定时器1关闭$ m8 k5 S& C4 d9 Z3 O0 m2 ]
                        break;
0 j+ H1 ?1 z9 a! ^5 R% K) F                }
0 l) B* L- C$ z; W: F+ w8 I        }3 S$ M6 D& W) w2 S* [; G
}! ^& S# e- O5 S6 }0 v! i
//************************************************************************************************************************************
; G1 H6 j; |5 Q2 e) h; d) {% {//系统初始化函数//9 Z3 X: @' k9 u  a  Q7 o
//************************************************************************************************************************************( ~2 P( z3 |8 e$ B" P
void System_init(void)4 y) i* K6 e9 M% T6 S1 ^7 s
{4 Z* q# `2 t7 u. o3 [
    TMOD=0x10;                                       //0001 0000//定时器1方式1,定时器0方式0% U. H! ^! Y5 k1 |
          TH0=(8192-700)/32;                  //定时器0 700us 定时
! j/ |9 [& @4 M3 R: F* Y9 i6 [& p+ C    TL0=(8192-700)%32;$ s! [8 H: x. n  X
    TH1=(65536-50000)/256;  //定时器1 50ms
( m2 Z; z; x/ ]+ `* c    TL1=(65536-50000)%256;  / m7 a2 A/ ^+ Y# V/ Z6 F
    EA=1;  
/ T1 Q$ J3 W, P2 `: o# Y    ET0=1;
9 W' f; E5 f- Z2 W$ q2 Y          ET1=1;+ h' {* b) h2 O, X' h4 ]
    shuchu=0;                                 //门锁初始化6 L4 M5 ]( S' b) L/ A, t
          beep=0;                                         //警报初始化
! [- c) Z( R! l          DoorBell=0;                                     //门铃初始化
+ V% i( i' v% G& \    lcd_init();                               //液晶初始化5 @) P% w- m* H( U* Z
}
: o& m- }* g3 }! E6 H//************************************************************************************************************************************
0 m/ E% ^! A2 b3 s6 F4 I/*模块名称:主函数*/' `# t6 C0 k+ ~5 k' e  u
/*模块功能:程序入口*/5 M" d4 m* ~- f
//************************************************************************************************************************************
& o3 m( [& u* \: d8 hvoid main(void)//主函数+ y. _6 L5 t! L
{
1 g2 n0 q0 O: m2 }- `! p( ^+ f+ Q
        //AT24C04_WritePage();   //密码初始化(只需使用一次写入初始密码)
$ @+ y% {  z6 a! J' l4 m        System_init();           //系统初始化4 g* T7 B. j7 [4 ?
        while(1)( S8 w4 x+ E6 _4 B  a% R
        {            
# C8 n8 I7 {0 H: C- Q                if(keyboard==0)        //如果密码错误三次则锁定键盘
8 R% g# V* i* K/ R         {
0 d8 R( Y1 ^! t! C; j3 z7 e" d                  KeyDown();                       //按键检测
' O& B: `; I- q! N0 u         }
, Z& c0 H- |& i. ~- A2 {/ u                keysend();                         //数据传递
4 F2 m1 C& {" N& L7 e                lcdxianshi();                 //输入显示
' ?& S  ~1 Z$ [1 u8 z5 e" ?                sure();                                   //密码认证
6 g  }' b0 P) Q- i                condition_delete();    //按键清除
' g, U0 Z  R' f                new_password();        //密码修改
3 p2 w0 |# w+ T5 f6 l    Add_Function();               //附功能函数$ d' e2 j: y% E/ [
        }                                
. K% K* x/ Q( ?9 C5 {+ |  g}& T$ g9 J$ V7 R' c6 ~% L: s
//************************************************************************************************************************************4 s8 O: \* A; z" ?. }
//结束
* S$ `, j- U3 m//************************************************************************************************************************************+ ]- x1 g3 S3 f/ J/ H4 t, W, D

) n( G1 `1 f1 g下载:! ]$ T+ ^! m5 N& ^0 x0 z- L4 h
游客,如果您要查看本帖隐藏内容请回复

% A5 }: z! K# q# ~) ^. @5 X

; [2 ~( Y& t$ i* D, O$ d

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-18 03:01 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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