久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7668|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)的智能樓宇門禁系統(tǒng)源程序+視頻資料

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
   基于單片機(jī)的門禁系統(tǒng),大家分享。

功能
(60%)    可輸入密碼進(jìn)行解鎖。        
    可以對(duì)IC卡進(jìn)行注冊(cè)或注銷。         
    可用已注冊(cè)的IC卡解鎖。         
    可實(shí)現(xiàn)液晶顯示當(dāng)前時(shí)間。      
    密碼連續(xù)輸錯(cuò)三次時(shí)能強(qiáng)制退出并報(bào)警。         
    具有指示燈溫和蜂鳴器提示功能,開鎖時(shí)亮綠燈。         
參數(shù)(20%)    開鎖后自動(dòng)恢復(fù)閉鎖時(shí)間≤15s         
    實(shí)現(xiàn)開鎖的反應(yīng)時(shí)間≤2s   

視頻演示:

  

單片機(jī)源程序如下:
  1. //包含頭文件
  2. #include <REG52.h>
  3. #include<intrins.h>
  4. #include "main.h"
  5. #include<rc522.c>
  6. #include<eeprom52.h>
  7. //宏定義
  8. #define LCM_Data  P0                  //將P0口定義為LCM_Data
  9. #define uchar unsigned char
  10. #define uint  unsigned int

  11. #define WRITE_SECOND    0x80    //DS1302內(nèi)部的相關(guān)地址
  12. #define WRITE_MINUTE    0x82
  13. #define WRITE_HOUR      0x84
  14. #define WRITE_DATE      0x86
  15. #define WRITE_MONTH     0x88
  16. #define WRITE_WEEK                0x8a
  17. #define WRITE_YEAR      0x8c

  18. #define READ_SECOND     0x81
  19. #define READ_MINUTE     0x83
  20. #define READ_HOUR       0x85
  21. #define READ_DATE       0x87
  22. #define READ_MONTH      0x89
  23. #define READ_WEEK                0x8b
  24. #define READ_YEAR       0x8d
  25. uchar second1;
  26. uchar minute1;
  27. uchar hour1;
  28. uchar week1;
  29. uchar day1;
  30. uchar month1;
  31. uchar year1;

  32. struct time
  33. {
  34.    uchar second;
  35.    uchar minute;
  36.    uchar hour;
  37.    uchar week;
  38.    uchar day;
  39.    uchar month;
  40.    uchar year;
  41. }
  42. current_time;
  43. #define ctime current_time

  44. sbit RST=P3^0;
  45. sbit SCLK=P3^1;
  46. sbit SDA=P2^6;

  47. //1602的控制腳
  48. sbit lcd1602_rs=P2^7;
  49. sbit lcd1602_en=P2^5;

  50. sbit Scl=P3^4;                        //24C02串行時(shí)鐘
  51. sbit Sda=P3^5;                        //24C02串行數(shù)據(jù)

  52. sbit ALAM = P2^1;                //報(bào)警        
  53. sbit KEY = P3^6;                //開鎖

  54. bit  operation=0;                //操作標(biāo)志位
  55. bit  pass=0;                        //密碼正確標(biāo)志
  56. bit  ReInputEn=0;                //重置輸入充許標(biāo)志        
  57. bit  s3_keydown=0;                //3秒按鍵標(biāo)志位
  58. bit  key_disable=0;                //鎖定鍵盤標(biāo)志
  59. bit  chushihua=0;       //可以注冊(cè)卡標(biāo)志位

  60. unsigned char countt0,second,s1num,flag;        //t0中斷計(jì)數(shù)器,秒計(jì)數(shù)器

  61. void Delay5Ms(void);                //聲明延時(shí)函數(shù)
  62. unsigned char xdata CardRevBuf[16] = { 0 };

  63. unsigned char code a[]={0xFE,0xFD,0xFB,0xF7};                                 //控盤掃描控制表
  64. //液晶顯示數(shù)據(jù)數(shù)組
  65. unsigned char code start_line[]        = {"password:       "};
  66. unsigned char code name[]                  = {"===Coded Lock==="};        //顯示名稱
  67. unsigned char code Correct[]         = {"     correct    "};                //輸入正確
  68. unsigned char code Error1[]           = {"      error     "};          //輸入錯(cuò)誤
  69. unsigned char code codepass[]        = {"      pass      "};
  70. unsigned char code LockOpen[]        = {"      open      "};                //OPEN
  71. unsigned char code SetNew[]         = {"SetNewWordEnable"};
  72. unsigned char code Input[]           = {"input:          "};                //INPUT
  73. unsigned char code ResetOK[]         = {"ResetPasswordOK "};
  74. unsigned char code initword[]        = {"Init password..."};
  75. unsigned char code Er_try[]                = {"error,try again!"};
  76. unsigned char code again[]                = {"input again     "};
  77. unsigned char code table[]="      :  :     ";

  78. unsigned char InputData[6];                                                                        //輸入密碼暫存區(qū)
  79. unsigned char CurrentPassword[6]={0,0,0,0,0,0};                         //讀取EEPROM密碼暫存數(shù)組
  80. unsigned char TempPassword[6];
  81. unsigned char N=0;                                //密碼輸入位數(shù)記數(shù)
  82. unsigned char ErrorCont;                        //錯(cuò)誤次數(shù)計(jì)數(shù)
  83. unsigned char CorrectCont;                        //正確輸入計(jì)數(shù)
  84. unsigned char ReInputCont;                         //重新輸入計(jì)數(shù)
  85. unsigned char code initpassword[6]={0,0,0,0,0,0};                        //輸入管理員密碼后將密碼初始為000000
  86. unsigned char code adminpassword[6]={1,3,1,4,2,0};                        //輸入管理員密碼后將密碼初始為000000
  87. unsigned char code adminpassword1[6]={1,3,1,4,2,1};
  88. unsigned char current_id;
  89. char xdata DisplayBuf[10];  //當(dāng)前讀出卡的ID
  90. char xdata DisplayBuf_c[10];  //當(dāng)前單片機(jī)里存的卡ID

  91. void write_eeprom_j(unsigned char j)                  //將對(duì)應(yīng)的ID寫入到單片機(jī)
  92. {
  93.    
  94.         SectorErase(0x2200+j*0x0200);                   //清空
  95.          byte_write(0x2200+j*0x0200,DisplayBuf[0]);               
  96.          byte_write(0x2201+j*0x0200,DisplayBuf[1]);
  97.         byte_write(0x2202+j*0x0200,DisplayBuf[2]);
  98.         byte_write(0x2203+j*0x0200,DisplayBuf[3]);
  99.         byte_write(0x2204+j*0x0200,DisplayBuf[4]);
  100.         byte_write(0x2205+j*0x0200,DisplayBuf[5]);
  101.         byte_write(0x2206+j*0x0200,DisplayBuf[6]);
  102.         byte_write(0x2207+j*0x0200,DisplayBuf[7]);
  103. }
  104. void write_eeprom_jj(unsigned char j)         //將對(duì)應(yīng)的ID清空
  105. {
  106.    
  107.         SectorErase(0x2200+j*0x0200);                   //清空
  108.          byte_write(0x2200+j*0x0200,' ');               
  109.          byte_write(0x2201+j*0x0200,' ');
  110.         byte_write(0x2202+j*0x0200,' ');
  111.         byte_write(0x2203+j*0x0200,' ');
  112.         byte_write(0x2204+j*0x0210,' ');
  113.         byte_write(0x2205+j*0x0200,' ');
  114.         byte_write(0x2206+j*0x0200,' ');
  115.         byte_write(0x2207+j*0x0200,' ');
  116. }
  117. void read_eeprom_j(uchar j)
  118. {
  119.   DisplayBuf_c[0]= byte_read(0x2200+j*0x0200);
  120.   DisplayBuf_c[1]= byte_read(0x2201+j*0x0200);
  121.   DisplayBuf_c[2]= byte_read(0x2202+j*0x0210);
  122.   DisplayBuf_c[3]= byte_read(0x2203+j*0x0200);
  123.   DisplayBuf_c[4]= byte_read(0x2204+j*0x0200);
  124.   DisplayBuf_c[5]= byte_read(0x2205+j*0x0200);
  125.   DisplayBuf_c[6]= byte_read(0x2206+j*0x0200);
  126.   DisplayBuf_c[7]= byte_read(0x2207+j*0x0200);   

  127. }
  128. //=====================5ms延時(shí)==============================
  129. void Delay5Ms(void)
  130. {
  131.         unsigned int TempCyc = 5552;
  132.         while(TempCyc--);
  133. }

  134. //===================400ms延時(shí)==============================
  135. void Delay400Ms(void)
  136. {
  137. unsigned char TempCycA = 5;
  138. unsigned int TempCycB;
  139. while(TempCycA--)
  140. {
  141.   TempCycB=7269;
  142.   while(TempCycB--);
  143. }
  144. }

  145. //=============================================================================================
  146. //================================24C02========================================================
  147. //=============================================================================================

  148. void mDelay(uint t) //延時(shí)
  149. {
  150.         uchar i;
  151.            while(t--)
  152.            {
  153.                    for(i=0;i<125;i++)
  154.                    {;}
  155.            }
  156. }
  157.    

  158. void Nop(void)                  //空操作
  159. {
  160.          _nop_();                  //僅作延時(shí)用一條語句大約1us
  161.          _nop_();
  162.          _nop_();
  163.          _nop_();
  164. }

  165. /*****24c02程序參照24c02時(shí)序圖*****/
  166. /*起始條件*/

  167. void Start(void)
  168. {
  169.          Sda=1;
  170.          Scl=1;
  171.          Nop();
  172.          Sda=0;
  173.          Nop();
  174. }


  175. /*停止條件*/
  176. void Stop(void)
  177. {
  178.          Sda=0;
  179.          Scl=1;
  180.          Nop();
  181.          Sda=1;
  182.          Nop();
  183. }

  184. /*應(yīng)答位*/
  185. void Ack(void)
  186. {
  187.         Sda=0;
  188.         Nop();
  189.         Scl=1;
  190.         Nop();
  191.         Scl=0;
  192. }

  193. /*反向應(yīng)答位*/
  194. void NoAck(void)
  195. {
  196.          Sda=1;
  197.          Nop();
  198.          Scl=1;
  199.          Nop();
  200.          Scl=0;
  201. }

  202. /*發(fā)送數(shù)據(jù)子程序,Data為要求發(fā)送的數(shù)據(jù)*/
  203. void Send(uchar Data)
  204. {
  205.            uchar BitCounter=8;
  206.            uchar temp;
  207.            do
  208.            {
  209.                    temp=Data;                                           //將待發(fā)送數(shù)據(jù)暫存temp
  210.                    Scl=0;
  211.                    Nop();
  212.                    if((temp&0x80)==0x80)                   //將讀到的數(shù)據(jù)&0x80
  213.                    Sda=1;
  214.                    else
  215.                    Sda=0;
  216.                    Scl=1;
  217.                    temp=Data<<1;                                   //數(shù)據(jù)左移
  218.                    Data=temp;                                           //數(shù)據(jù)左移后重新賦值Data
  219.                    BitCounter--;                                   //該變量減到0時(shí),數(shù)據(jù)也就傳送完成了
  220.            }
  221.            while(BitCounter);                                   //判斷是否傳送完成
  222.            Scl=0;
  223. }

  224. /*讀一字節(jié)的數(shù)據(jù),并返回該字節(jié)值*/
  225. uchar Read(void)
  226. {
  227.     uchar temp=0;
  228.         uchar temp1=0;
  229.         uchar BitCounter=8;
  230.         Sda=1;
  231.         do
  232.         {
  233.                 Scl=0;
  234.                 Nop();
  235.                 Scl=1;
  236.                 Nop();
  237.                 if(Sda)                                   //數(shù)據(jù)位是否為1
  238.                         temp=temp|0x01;           //為1 temp的最低位為1(|0x01,就是將最低位變?yōu)?)
  239.                 else                                   //如果為0
  240.                         temp=temp&0xfe;           //temp最低位為0(&0xfe(11111110)最低位就是0)
  241.                 if(BitCounter-1)           //BitCounter減1后是否為真
  242.                 {
  243.                         temp1=temp<<1;           //temp左移
  244.                         temp=temp1;
  245.                 }
  246.                 BitCounter--;                   //BitCounter減到0時(shí),數(shù)據(jù)就接收完了
  247.         }
  248.         while(BitCounter);                   //判斷是否接收完成
  249.         return(temp);
  250. }

  251. void WrToROM(uchar Data[],uchar Address,uchar Num)
  252. {
  253.   uchar i;
  254.   uchar *PData;
  255.   PData=Data;
  256.   for(i=0;i<Num;i++)
  257.   {
  258.   Start();
  259.   Send(0xa0);
  260.   Ack();
  261.   Send(Address+i);
  262.   Ack();
  263.   Send(*(PData+i));
  264.   Ack();
  265.   Stop();
  266.   mDelay(20);
  267.   }
  268. }

  269. void RdFromROM(uchar Data[],uchar Address,uchar Num)
  270. {
  271.   uchar i;
  272.   uchar *PData;
  273.   PData=Data;
  274.   for(i=0;i<Num;i++)
  275.   {
  276.   Start();
  277.   Send(0xa0);
  278.   Ack();
  279.   Send(Address+i);
  280.   Ack();
  281.   Start();
  282.   Send(0xa1);
  283.   Ack();
  284.   *(PData+i)=Read();
  285.   Scl=0;
  286.   NoAck();
  287.   Stop();
  288.   }
  289. }
  290. //===================2us延時(shí)==============================
  291. void delayus()         //延時(shí)2us
  292. {
  293.   _nop_();
  294.   _nop_();
  295. }


  296. //===================DS1302=================================//
  297. //==========================================================//
  298. /************************************************
  299. *名稱:DS1302WriteByte
  300. *說明:無
  301. *功能:寫入8bit數(shù)據(jù)
  302. *調(diào)用:delayus()
  303. *輸入:dat:要寫入的數(shù)據(jù)
  304. *輸出:無
  305. *************************************************/
  306. void DS1302WriteByte(uchar dat)
  307. {
  308.     uchar i;
  309.     SCLK=0;//初始時(shí)鐘線置為0
  310.     delayus();
  311.     for(i=0;i<8;i++)//開始傳輸8個(gè)字節(jié)的數(shù)據(jù)
  312.       {
  313.          SDA=dat&0x01;//取最低位,注意DS1302的數(shù)據(jù)和地址都是從最低位開始傳輸?shù)?br />
  314.          delayus();
  315.          SCLK=1;//時(shí)鐘線拉高,制造上升沿,SDA的數(shù)據(jù)被傳輸
  316.          delayus();
  317.          SCLK=0;//時(shí)鐘線拉低,為下一個(gè)上升沿做準(zhǔn)備
  318.          dat>>=1;//數(shù)據(jù)右移一位,準(zhǔn)備傳輸下一位數(shù)據(jù)
  319.       }
  320. }

  321. /************************************************
  322. *名稱:DS1302ReadByte()
  323. *說明:無
  324. *功能:讀取8bit的數(shù)據(jù)
  325. *調(diào)用:delayus()
  326. *輸入:無
  327. *輸出:dat:讀取的數(shù)據(jù)
  328. *************************************************/
  329. uchar DS1302ReadByte()
  330. {
  331.    uchar i,dat;
  332.    delayus();
  333.    for(i=0;i<8;i++)
  334.     {
  335.        dat>>=1;//要返回的數(shù)據(jù)右移一位
  336.        if(SDA==1)//當(dāng)數(shù)據(jù)線為高時(shí),證明該位數(shù)據(jù)為1
  337.          dat|=0x80;//要傳輸數(shù)據(jù)的當(dāng)前值置為1,若不是,則為0
  338.        SCLK=1;//拉高時(shí)鐘線
  339.        delayus();
  340.        SCLK=0;//制造下降沿
  341.        delayus();
  342.      }
  343.        SDA=0;
  344.            return dat;//返回讀取出的數(shù)據(jù)

  345. }

  346. /************************************************
  347. *名稱:ucharDS1302Read()
  348. *說明:先寫地址,后讀數(shù)據(jù)
  349. *功能:從cmd相應(yīng)地址中讀取一個(gè)字節(jié)的數(shù)據(jù)
  350. *調(diào)用:DS1302WriteByte(),DS1302ReadByte()
  351. *輸入:cmd:要寫入的控制字節(jié)
  352. *輸出:dat:讀取的數(shù)據(jù)
  353. *************************************************/
  354. uchar DS1302Read(uchar cmd)
  355. {

  356.    uchar dat;
  357.    RST=0;//初始CE線置為0
  358.    SCLK=0;//初始時(shí)鐘線置為0
  359.    RST=1;//初始CE置為1,傳輸開始
  360.    DS1302WriteByte(cmd);//傳輸命令字,要讀取的時(shí)間/日歷地址   
  361.    dat=DS1302ReadByte();//讀取要得到的時(shí)間/日期
  362.    SCLK=1;//時(shí)鐘線拉高
  363.    RST=0;//讀取結(jié)束,CE置為0,結(jié)束數(shù)據(jù)的傳輸
  364.    return dat;//返回得到的時(shí)間/日期
  365. }

  366. /************************************************
  367. *名稱:DS1302Write
  368. *說明:先寫地址,后寫數(shù)據(jù)
  369. *功能:向cmd相應(yīng)地址中寫一個(gè)字節(jié)的數(shù)據(jù)
  370. *調(diào)用:DS1302WriteByte()
  371. *輸入:cmd:要寫入的控制字,dat:要寫入的數(shù)據(jù)
  372. *輸出:無

  373. *************************************************/
  374. void DS1302Write(uchar cmd,uchar dat)
  375. {
  376.    RST=0;//初始CE線置為0
  377.    SCLK=0;//初始時(shí)鐘線置為0
  378.    RST=1;//初始CE置為1,傳輸開始
  379.    DS1302WriteByte(cmd);//傳輸命令字,要寫入的時(shí)間/日歷地址
  380.    DS1302WriteByte(dat);//寫入要修改的時(shí)間/日期
  381.    SCLK=1;//時(shí)鐘線拉高
  382.    RST=0;//讀取結(jié)束,CE置為0,結(jié)束數(shù)據(jù)的傳輸
  383. }


  384. void Init_DS1302()
  385. {
  386.   DS1302Write(0x8e,0x00);
  387.   /* DS1302Write(WRITE_SECOND,0x00);
  388.   DS1302Write(WRITE_MINUTE,0x33);
  389.   DS1302Write(WRITE_HOUR,0x07);
  390.   DS1302Write(WRITE_DATE,0x07);
  391.   DS1302Write(WRITE_MONTH,0x12);   //         首次下載定時(shí) 2016.12.07  7:33:00 星期三
  392.   DS1302Write(WRITE_WEEK,0x03);
  393.   DS1302Write(WRITE_YEAR,0x16);*/
  394.   DS1302Write(0x90,0x01);
  395.   DS1302Write(0x8e,0x80);
  396. }



  397. //==================================================================================================
  398. //=======================================LCD1602====================================================
  399. //==================================================================================================

  400. #define yi 0x80 //LCD第一行的初始位置,因?yàn)長CD1602字符地址首位D7恒定為1(100000000=80)
  401. #define er 0x80+0x40 //LCD第二行初始位置(因?yàn)榈诙械谝粋(gè)字符位置地址是0x40)


  402. //----------------延時(shí)函數(shù),后面經(jīng)常調(diào)用----------------------
  403. void delay(uint xms)//延時(shí)函數(shù),有參函數(shù)
  404. {
  405.         uint x,y;
  406.         for(x=xms;x>0;x--)
  407.          for(y=110;y>0;y--);
  408. }

  409. //--------------------------寫指令---------------------------
  410. void write_1602com(uchar com)//****液晶寫入指令函數(shù)****
  411. {
  412.         lcd1602_rs=0;//數(shù)據(jù)/指令選擇置為指令
  413.         P0=com;//送入數(shù)據(jù)
  414.         delay(1);
  415.         lcd1602_en=1;//拉高使能端,為制造有效的下降沿做準(zhǔn)備
  416.         delay(1);
  417.         lcd1602_en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
  418. }

  419. //-------------------------寫數(shù)據(jù)-----------------------------
  420. void write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****
  421. {
  422.         lcd1602_rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
  423.         P0=dat;//送入數(shù)據(jù)
  424.         delay(1);
  425.         lcd1602_en=1; //en置高電平,為制造下降沿做準(zhǔn)備
  426.         delay(1);
  427.         lcd1602_en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
  428. }
  429. //-------------------------寫時(shí)分秒-----------------------------
  430. void write_sfm(uchar add,char date)        //寫時(shí)分秒函數(shù)
  431. {
  432.    char shi,ge;
  433.    shi=date/16;
  434.    ge=date%16;
  435.    
  436.    write_1602com(0x80+add);
  437.    write_1602dat(0x30+shi);
  438.    write_1602dat(0x30+ge);
  439. }
  440. //-------------------------初始化-------------------------
  441. void lcd_init(void)
  442. {

  443.         write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
  444.         write_1602com(0x0c);//開顯示不顯示光標(biāo)
  445.         write_1602com(0x06);//整屏不移動(dòng),光標(biāo)自動(dòng)右移
  446.         write_1602com(0x01);//清顯示

  447. }


  448. //========================================================================================
  449. //=========================================================================================
  450. //==============將按鍵值編碼為數(shù)值=========================
  451. unsigned char coding(unsigned char m)         
  452. {
  453.         unsigned char k;
  454.         switch(m)
  455.         {
  456.                 case (0x11): k=1;break;
  457.                 case (0x21): k=2;break;
  458.                 case (0x41): k=3;break;
  459.                 case (0x81): k='A';break;
  460.                 case (0x12): k=4;break;
  461.                 case (0x22): k=5;break;
  462.                 case (0x42): k=6;break;
  463.                 case (0x82): k='B';break;
  464.                 case (0x14): k=7;break;
  465.                 case (0x24): k=8;break;
  466.                 case (0x44): k=9;break;
  467.                 case (0x84): k='C';break;
  468.                 case (0x18): k='*';break;
  469.                 case (0x28): k=0;break;
  470.                 case (0x48): k='#';break;
  471.                 case (0x88): k='D';break;
  472.         }
  473.         return(k);
  474. }
  475. //=====================按鍵檢測(cè)并返回按鍵值===============================
  476. unsigned char keynum(void)
  477. {
  478.          unsigned char row,col,i;
  479.          P1=0xf0;
  480.          if((P1&0xf0)!=0xf0)
  481.          {
  482.                    Delay5Ms();
  483.         Delay5Ms();
  484.                    if((P1&0xf0)!=0xf0)
  485.                 {
  486.                     row=P1^0xf0;          //確定行線
  487.                         i=0;
  488.                         P1=a[i];                  //精確定位
  489.                         while(i<4)
  490.                         {
  491.                                  if((P1&0xf0)!=0xf0)
  492.                                   {
  493.                                            col=~(P1&0xff);          //確定列線
  494.                                            break;            //已定位后提前退出   
  495.                                   }
  496.                                 else
  497.                                   {
  498.                                            i++;
  499.                                            P1=a[i];
  500.                                   }
  501.                         }
  502.                 }
  503.                 else
  504.                 {
  505.                         return 0;
  506.                 }
  507.                 while((P1&0xf0)!=0xf0);
  508.                 return (row|col);                         //行線與列線組合后返回
  509.          }
  510.          else return 0;                                 //無鍵按下時(shí)返回0
  511. }
  512. //=======================一聲提示音,表示有效輸入========================
  513. void OneAlam(void)
  514. {
  515.         ALAM=0;
  516.         Delay5Ms();
  517.     ALAM=1;
  518. }
  519. //========================二聲提示音,表示操作成功========================
  520. void TwoAlam(void)
  521. {
  522.         ALAM=0;
  523.         Delay5Ms();
  524.     ALAM=1;
  525.     Delay5Ms();
  526.         ALAM=0;
  527.         Delay5Ms();
  528.     ALAM=1;
  529. }
  530. //========================三聲提示音,表示錯(cuò)誤========================
  531. void ThreeAlam(void)
  532. {
  533.         ALAM=0;
  534.         Delay5Ms();
  535.     ALAM=1;
  536.     Delay5Ms();
  537.         ALAM=0;
  538.         Delay5Ms();
  539.     ALAM=1;
  540.     Delay5Ms();
  541.         ALAM=0;
  542.         Delay5Ms();
  543.     ALAM=1;
  544. }
  545. //=======================顯示提示輸入=========================
  546. void DisplayChar(void)
  547. {
  548.         unsigned char i;
  549.         if(pass==1)
  550.         {

  551.                 write_1602com(er);                                   //在二行開始顯示
  552.                 for(i=0;i<16;i++)
  553.                 {
  554.                         write_1602dat(LockOpen[i]);           //顯示open 開鎖成功
  555.                 }
  556.         }
  557.         else
  558.         {
  559.                 if(N==0)
  560.                 {

  561.                         write_1602com(er);
  562.                         for(i=0;i<16;i++)
  563.                         {
  564.                                 write_1602dat(Error1[i]);        //顯示錯(cuò)誤
  565.                         }
  566.                 }
  567.                 else
  568.                 {

  569.                         write_1602com(er);
  570.                         for(i=0;i<16;i++)
  571.                         {
  572.                                 write_1602dat(start_line[i]);//顯示開始輸入        
  573.                         }
  574.                 }
  575.         }
  576. }

  577. //========================重置密碼==================================================
  578. //==================================================================================
  579. void ResetPassword(void)
  580. {
  581.         unsigned char i;        
  582.         unsigned char j;
  583.         if(pass==0)
  584.         {
  585.                 pass=0;                           
  586.                 DisplayChar();           //顯示錯(cuò)誤
  587.                 ThreeAlam();           //沒開鎖時(shí)按下重置密碼報(bào)警3聲
  588.         }
  589.         else                                   //開鎖狀態(tài)下才能進(jìn)行密碼重置程序
  590.         {
  591.             if(ReInputEn==1)   //開鎖狀態(tài)下,ReInputEn置1,重置密碼允許
  592.                 {
  593.                         if(N==6)           //輸入6位密碼
  594.                         {
  595.                                 ReInputCont++;                        //密碼次數(shù)計(jì)數(shù)        
  596.                                 if(ReInputCont==2)                //輸入兩次密碼
  597.                                 {
  598.                                         for(i=0;i<6;)
  599.                                         {
  600.                                                 if(TempPassword[i]==InputData[i])        //將兩次輸入的新密碼作對(duì)比
  601.                                                         i++;
  602.                                                 else                                                                //如果兩次的密碼不同
  603.                                                 {

  604.                                                         write_1602com(er);
  605.                                                         for(j=0;j<16;j++)
  606.                                                         {
  607.                                                                 write_1602dat(Error1[j]);        //顯示錯(cuò)誤Error
  608.                                                         }
  609.                                                         ThreeAlam();                        //錯(cuò)誤提示        
  610.                                                         pass=0;                                        //關(guān)鎖
  611.                                                         ReInputEn=0;                        //關(guān)閉重置功能,
  612.                                                         ReInputCont=0;
  613.                                                         DisplayChar();
  614.                                                         break;
  615.                                                 }
  616.                                         }
  617.                                         if(i==6)
  618.                                         {

  619.                                                 write_1602com(er);
  620.                                                 for(j=0;j<16;j++)
  621.                                                 {
  622.                                                         write_1602dat(ResetOK[j]);          //密碼修改成功,顯示
  623.                                                 }

  624.                                                 TwoAlam();                                //操作成功提示
  625.                                                  WrToROM(TempPassword,0,6);                //將新密碼寫入24C02存儲(chǔ)
  626.                                                 ReInputEn=0;
  627.                                         }
  628.                                         ReInputCont=0;
  629.                                         CorrectCont=0;
  630.                                 }
  631.                                 else                                          //輸入一次密碼時(shí)
  632.                                 {
  633.                                         OneAlam();

  634.                                         write_1602com(er);
  635.                                         for(j=0;j<16;j++)
  636.                                         {
  637.                                                 write_1602dat(again[j]);                        //顯示再輸入一次
  638.                                         }                                       
  639.                                         for(i=0;i<6;i++)
  640.                                         {
  641.                                                 TempPassword[i]=InputData[i];                //將第一次輸入的數(shù)據(jù)暫存起來                                                
  642.                                         }
  643.                                 }

  644.                         N=0;                                                //輸入數(shù)據(jù)位數(shù)計(jì)數(shù)器清零
  645.                    }
  646.             }
  647.         }
  648. }
  649. //=======================輸入密碼錯(cuò)誤超過三過,報(bào)警并鎖死鍵盤======================
  650. void Alam_KeyUnable(void)
  651. {
  652.         P1=0x00;
  653.         {
  654.                 ALAM=~ALAM;                                 //蜂鳴器一直閃爍鳴響
  655.                 Delay5Ms();
  656.         }
  657. }
  658. //=======================取消所有操作============================================
  659. void Cancel(void)
  660. {        
  661.         unsigned char i;
  662.         unsigned char j;
  663.         //DisplayListChar(0, 1, start_line);
  664.         write_1602com(er);
  665.         for(j=0;j<16;j++)
  666.         {
  667.                 write_1602dat(start_line[j]);          //顯示開機(jī)輸入密碼界面
  668.         }
  669.         TwoAlam();                                //提示音
  670.         for(i=0;i<6;i++)
  671.         {
  672.                 InputData[i]=0;                //將輸入密碼清零
  673.         }
  674.         KEY=1;                                        //關(guān)閉鎖
  675.         ALAM=1;                                        //報(bào)警關(guān)
  676.         pass=0;                                        //密碼正確標(biāo)志清零
  677.         ReInputEn=0;                        //重置輸入充許標(biāo)志清零
  678.         ErrorCont=0;                        //密碼錯(cuò)誤輸入次數(shù)清零
  679.         CorrectCont=0;                        //密碼正確輸入次數(shù)清零
  680.         ReInputCont=0;                        //重置密碼輸入次數(shù)清零
  681.         s3_keydown=0;
  682.         key_disable=0;                        //鎖定鍵盤標(biāo)志清零
  683.         N=0;                                        //輸入位數(shù)計(jì)數(shù)器清零
  684. }

  685. //==========================確認(rèn)鍵,并通過相應(yīng)標(biāo)志位執(zhí)行相應(yīng)功能===============================
  686. void Ensure(void)
  687. {        
  688.         unsigned char i,j;
  689.         RdFromROM(CurrentPassword,0,6);                                         //從24C02里讀出存儲(chǔ)密碼
  690.     if(N==6)
  691.         {
  692.             if(ReInputEn==0)                                                        //重置密碼功能未開啟
  693.                 {
  694.                                        
  695.                if((InputData[0]==adminpassword[0])&&(InputData[1]==adminpassword[1])&&(InputData[2]==adminpassword[2])&&(InputData[3]==adminpassword[3])&&(InputData[4]==adminpassword[4])&&(InputData[5]==adminpassword[5]))
  696.                                    {
  697.                                         WrToROM(initpassword,0,6);                                 //強(qiáng)制將初始密碼寫入24C02存儲(chǔ)
  698.                                         write_1602com(er);
  699.                                         for(j=0;j<16;j++)
  700.                                         {
  701.                                                 write_1602dat(initword[j]);                                //顯示初始化密碼
  702.                                         }
  703.                                         TwoAlam();                                                                        //成功提示音
  704.                                         Delay400Ms();                                                                //延時(shí)400ms
  705.                                         TwoAlam();                                                                        //成功提示音
  706.                                         N=0;                                                                                //輸入位數(shù)計(jì)數(shù)器清零
  707.                                         //TR0=1;                                                                                
  708.                                 }

  709.                         else if((InputData[0]==adminpassword1[0])&&(InputData[1]==adminpassword1[1])&&(InputData[2]==adminpassword1[2])&&(InputData[3]==adminpassword1[3])&&(InputData[4]==adminpassword1[4])&&(InputData[5]==adminpassword1[5]))
  710.                                    {

  711.                                         TwoAlam();                                                                        //成功提示音
  712.                                         Delay400Ms();                                                                //延時(shí)400ms
  713.                                         TwoAlam();                                                                        //成功提示音
  714.                                         N=0;                                                                                //輸入位數(shù)計(jì)數(shù)器清零
  715.                                         chushihua=1;                                                                                
  716.                                 }


  717.                         else if((CurrentPassword[0]==InputData[0])&&(CurrentPassword[1]==InputData[1])&&(CurrentPassword[2]==InputData[2])&&(CurrentPassword[3]==InputData[3])&&(CurrentPassword[4]==InputData[4])&&(CurrentPassword[5]==InputData[5]))        //判斷輸入密碼和24c02中的密碼是否相同
  718.                                 {
  719.                                         CorrectCont++;        
  720.                                         if(CorrectCont==1)                                //正確輸入計(jì)數(shù),當(dāng)只有一次正確輸入時(shí),開鎖
  721.                                         {
  722.                                                 //DisplayListChar(0,1,LockOpen);
  723.                                                 write_1602com(er);
  724.                                                 for(j=0;j<16;j++)
  725.                                                 {
  726.                                                         write_1602dat(LockOpen[j]);                  //顯示open開鎖畫面
  727.                                                 }
  728.                                                 TwoAlam();                        //操作成功提示音
  729.                                                 KEY=0;                                                                                        //開鎖
  730.                                                 pass=1;                                                                                        //置正確標(biāo)志位
  731.                                                 TR0=1;                                                                                        //開啟定時(shí)
  732.                                                 for(j=0;j<6;j++)                                                                //將輸入清除
  733.                                                 {
  734.                                                         InputData[i]=0;                                                                //開鎖后將輸入位清零
  735.                                                 }
  736.                                         }        
  737.                                         else if(CorrectCont==2)                                                                                                //當(dāng)兩次正確輸入時(shí),開啟重置密碼功能
  738.                                         {
  739.                                                 write_1602com(er);
  740.                                                 for(j=0;j<16;j++)
  741.                                                 {
  742.                                                         write_1602dat(SetNew[j]);                                        //顯示重置密碼界面
  743.                                                 }
  744.                                                 TR0=0;
  745.                                                 TwoAlam();                                                                            //操作成功提示
  746.                                                 ReInputEn=1;                                                                        //允許重置密碼輸入
  747.                                                 CorrectCont=0;                                                                        //正確計(jì)數(shù)器清零
  748.                                         }                                                                                                //相同一位 i就+1
  749.                                 }
  750.                                 else                                                                         //如果有密碼不同
  751.                                 {                                                                                
  752.                                         write_1602com(er);
  753.                                         for(i=0;i<16;i++)
  754.                                         {
  755.                                                 write_1602dat(Error1[i]);        
  756.                                         }
  757.                                         ThreeAlam();
  758.                                         ErrorCont++;                                                //錯(cuò)誤次數(shù)++
  759.                                         if(ErrorCont==3)                        //錯(cuò)誤輸入計(jì)數(shù)達(dá)三次時(shí),報(bào)警并鎖定鍵盤
  760.                                         {
  761.                                                 write_1602com(er);
  762.                                                 for(i=0;i<16;i++)
  763.                                                 {
  764.                                                         write_1602dat(Error1[i]);        
  765.                                                 }
  766.                                                 TR0=1;                                //開啟定時(shí)
  767.                                                 key_disable=1;                        //鎖定鍵盤
  768.                                                 pass=0;                                        //pass位清零
  769.                                                 Alam_KeyUnable();
  770.                
  771.                                         }

  772.                                 }

  773.         
  774.         


  775.                 }

  776.                 else                                                                                        //當(dāng)已經(jīng)開啟重置密碼功能時(shí),而按下開鎖鍵,
  777.                 {

  778.                         write_1602com(er);
  779.                         for(j=0;j<16;j++)
  780.                         {
  781.                                 write_1602dat(Er_try[j]);                          //錯(cuò)誤,請(qǐng)重新輸入
  782.                         }
  783.                         ThreeAlam();                                                          //錯(cuò)誤提示音
  784.                 }
  785.         }

  786.         else                                   //密碼沒有輸入到6位時(shí),按下確認(rèn)鍵時(shí)
  787.         {
  788.                
  789.                 write_1602com(er);
  790.                 for(j=0;j<16;j++)
  791.                 {
  792.                         write_1602dat(Error1[j]);                 //顯示錯(cuò)誤
  793.                 }

  794.                  ThreeAlam();                                                                                //錯(cuò)誤提示音
  795.                 pass=0;        
  796.         }
  797.         
  798.         N=0;                                                                                                        //將輸入數(shù)據(jù)計(jì)數(shù)器清零,為下一次輸入作準(zhǔn)備
  799. operation=1;
  800. }
  801. void display_id( unsigned char xdata * SrcBuf )
  802. {

  803.         char xdata *pDisplayChar;
  804.         unsigned char xdata Tmp, i;

  805.         pDisplayChar = DisplayBuf;

  806.         for( i = 0; i < 4; i++ )
  807.         {
  808.                 Tmp = ( ( *SrcBuf ) << 4 ) & 0x0F;        
  809.                 if( ( Tmp >=0 ) && ( Tmp <= 9 )        )
  810.                 {
  811.                         *pDisplayChar ++ = '0' + Tmp;        
  812.                 }
  813.                 else
  814.                 {
  815.                         *pDisplayChar ++ = 'A' + Tmp - 10;
  816.                 }

  817.                 Tmp = ( *SrcBuf ) & 0x0F;        
  818.                 if( ( Tmp >=0 ) && ( Tmp <= 9 )        )
  819.                 {
  820.                         *pDisplayChar ++ = '0' + Tmp;        
  821.                 }
  822.                 else
  823.                 {
  824.                         *pDisplayChar ++ = 'A' + Tmp - 10;
  825.                 }

  826.                 SrcBuf ++;
  827.         }
  828.         *pDisplayChar ++ = '\0';

  829. //        DisplayListChar( 0, 4, DisplayBuf );   
  830.         if(chushihua==1)
  831.         {
  832.     write_1602com(0xc0);
  833.         write_1602dat('I');
  834.         write_1602dat('D');
  835.         write_1602dat(current_id+0x30);
  836.         write_1602dat(':');
  837.         write_1602dat(DisplayBuf[0]);
  838.         write_1602dat(DisplayBuf[1]);
  839.         write_1602dat(DisplayBuf[2]);
  840.         write_1602dat(DisplayBuf[3]);
  841.         write_1602dat(DisplayBuf[4]);
  842.         write_1602dat(DisplayBuf[5]);
  843.         write_1602dat(DisplayBuf[6]);
  844.         write_1602dat(DisplayBuf[7]);
  845.         write_1602dat(' ');
  846.         write_1602dat(' ');write_1602dat(' ');write_1602dat(' ');write_1602dat(' ');
  847.         }
  848. }
  849. void display_no_id()
  850. {

  851.   write_1602com(0xc0);
  852.           write_1602dat('I');
  853.         write_1602dat('D');
  854.         write_1602dat(current_id+0x30);
  855.         write_1602dat(':');
  856.          write_1602dat(DisplayBuf_c[0]);
  857.         write_1602dat(DisplayBuf_c[1]);
  858.         write_1602dat(DisplayBuf_c[2]);
  859.         write_1602dat(DisplayBuf_c[3]);
  860.         write_1602dat(DisplayBuf_c[4]);
  861.         write_1602dat(DisplayBuf_c[5]);
  862.         write_1602dat(DisplayBuf_c[6]);
  863.         write_1602dat(DisplayBuf_c[7]);
  864.                 write_1602dat(' ');
  865.         write_1602dat(' ');write_1602dat(' ');write_1602dat(' ');write_1602dat(' ');
  866. }
  867. void ctrl( void )
  868. {
  869.     uchar j,i;
  870.         if( PcdRequest( PICC_REQIDL, &CardRevBuf[0] ) != MI_OK )//尋天線區(qū)內(nèi)未進(jìn)入休眠狀態(tài)的卡,返回卡片類型 2字節(jié)        
  871.         {
  872.                 if( PcdRequest( PICC_REQIDL, &CardRevBuf[0] ) != MI_OK )//尋天線區(qū)內(nèi)未進(jìn)入休眠狀態(tài)的卡,返回卡片類型 2字節(jié)        
  873.                 {
  874.                  if(chushihua==1)
  875.                  {
  876.                  read_eeprom_j(current_id);
  877.                   display_no_id();
  878.                  }
  879.                         return;
  880.                 }        
  881.         }

  882.         if( PcdAnticoll( &CardRevBuf[2] ) != MI_OK ) //防沖撞,返回卡的序列號(hào) 4字節(jié)
  883.         {
  884.         if(chushihua==1)
  885.         {
  886.         read_eeprom_j(current_id);
  887.          display_no_id();
  888.         }
  889.                 return;        
  890.         }

  891.         if( PcdSelect( &CardRevBuf[2] ) != MI_OK )//選卡
  892.         {
  893.         if(chushihua==1)
  894.         {
  895.          read_eeprom_j(current_id);
  896.            display_no_id();
  897.          }
  898.                 return;
  899.         }

  900.         display_id( &CardRevBuf[2] );
  901.         if(CorrectCont==0&&pass==0)
  902.         {
  903.           for(j=0;j<6;j++)
  904.           {
  905.           read_eeprom_j(j);
  906.            if(DisplayBuf[0]==DisplayBuf_c[0]&&DisplayBuf[1]==DisplayBuf_c[1]&&DisplayBuf[2]==DisplayBuf_c[2]&&DisplayBuf[3]==DisplayBuf_c[3]&&DisplayBuf[4]==DisplayBuf_c[4]&&DisplayBuf[5]==DisplayBuf_c[5])
  907.            {
  908.          
  909.                   CorrectCont=1;
  910.                   write_1602com(er);
  911.                         for(j=0;j<16;j++)
  912.                         {
  913.                                 write_1602dat(LockOpen[j]);        
  914.                         }
  915.                         TwoAlam();                        //操作成功提示音
  916.                         ErrorCont=0;
  917.                         KEY=0;                                                                                        //開鎖
  918.                         pass=1;                                                                                        //置正確標(biāo)志位
  919.                         TR0=1;                                                                                        //開啟定時(shí)
  920.                         for(j=0;j<6;j++)                                                                //將輸入清除
  921.                         {
  922.                                 InputData[i]=0;
  923.                         }
  924.                 return;
  925.            }
  926.           }
  927.         }
  928. }

  929. //==============================主函數(shù)===============================
  930. void main(void)
  931. {
  932.          unsigned char KEY,NUM;
  933.         unsigned char i,j;
  934.          P1=0xFF;                                    //P1口復(fù)位
  935.         TMOD=0x11;                                   //定義工作方式
  936.          TL0=0xB0;
  937.          TH0=0x3C;                                   //定時(shí)器賦初值
  938.          EA=1;                                           //打開中斷總開關(guān)
  939.          ET0=1;                                           //打開中斷允許開關(guān)
  940.          TR0=0;                                           //打開定時(shí)器開關(guān)
  941.          Delay400Ms();         //啟動(dòng)等待,等LCM講入工作狀態(tài)
  942.          lcd_init();         //LCD初始化
  943.         Init_DS1302();
  944.         init_rc522();
  945.         write_1602com(yi);//日歷顯示固定符號(hào)從第一行第0個(gè)位置之后開始顯示
  946.         for(i=0;i<15;i++)
  947.         {
  948.                 write_1602dat(table[i]);//向液晶屏寫開機(jī)畫面
  949.         }
  950.         write_1602com(er);
  951.         for(i=0;i<16;i++)
  952.         {
  953.                 write_1602dat(start_line[i]);//寫輸入密碼等待界面
  954.         }
  955.         write_1602com(er+9);        //設(shè)置光標(biāo)位置
  956. //        write_1602com(0x0f);        //設(shè)置光標(biāo)為閃爍
  957.          Delay5Ms(); //延時(shí)片刻(可不要)

  958.          N=0;                                                                                                                //初始化數(shù)據(jù)輸入位數(shù)
  959.          while(1)                 //進(jìn)入循環(huán)
  960.          {
  961. //     keyscan();
  962.          if(flag==0)
  963.          {
  964.             ctime.second=DS1302Read(READ_SECOND);
  965.               ctime.minute=DS1302Read(READ_MINUTE);
  966.               ctime.hour=DS1302Read(READ_HOUR);
  967.             write_sfm(10,ctime.second);  //送液晶顯示
  968.             write_sfm(7,ctime.minute);
  969.             write_sfm(4,ctime.hour);
  970.          }
  971.                 ctrl();
  972.                 if(key_disable==1)                                                //鎖定鍵盤標(biāo)志為1時(shí)
  973.                         Alam_KeyUnable();                                        //報(bào)警鍵盤鎖
  974.                 else
  975.                         ALAM=1;                                                                //關(guān)報(bào)警

  976.                 KEY=keynum();                                                        //讀按鍵的位置碼
  977.                 if(KEY!=0)                                                                //當(dāng)有按鍵按下時(shí)
  978.                 {        
  979.                         if(key_disable==1)                                        //鎖定鍵盤標(biāo)志為1時(shí)
  980.                         {
  981.                                 second=0;                                                //秒清零
  982.                         }
  983.                         else                                                                //沒有鎖定鍵盤時(shí)
  984.                         {
  985.                                 NUM=coding(KEY);                                //根據(jù)按鍵的位置將其編碼,編碼值賦值給NUM
  986.                                 {
  987.                                         switch(NUM)                                        //判斷按鍵值
  988.                                         {
  989.                                                 case ('A'):if(chushihua==1)
  990.                                                             {
  991.                                                              current_id++;
  992.                                                                 if(current_id>5)
  993.                                                                               current_id=0;
  994.                                                                          }
  995.                                                                          else
  996.                                                                          {
  997.                                                                                    s1num++;
  998.                                               flag=1;
  999.                                                                                     switch(s1num)
  1000.                                                                                           {
  1001.                                                                                              case 1:
  1002.                                                                                                        TR1=0;
  1003.                                                                                                            write_1602com(yi+11);
  1004.                                                                                                            write_1602com(0x0f);
  1005.                                                                                                            DS1302Write(0x8e,0x00);
  1006.                                                                                                            DS1302Write(WRITE_SECOND,0x80);
  1007.                                                                                                            DS1302Write(0x8e,0x80);
  1008.                                                                                                            break;
  1009.                                                                                                  case 2:
  1010.                                                                                                        write_1602com(0x80+8);
  1011.                                                                                                            break;
  1012.                                                                                                  case 3:
  1013.                                                                                                        write_1602com(0x80+5);
  1014.                                                                                                            break;
  1015.                                                                                                  case 4:
  1016.                                                                                                        s1num=0;
  1017.                                                                                                              write_1602com(0x0c);
  1018.                                                                                                            flag=0;
  1019.                                                                                                            DS1302Write(0x8e,0x00);
  1020.                                                                                                            DS1302Write(WRITE_SECOND,0x00);
  1021.                                                                                                            DS1302Write(0x8e,0x80);
  1022.                                                                                                            break;
  1023.                                                                                           
  1024.                                                                                           }
  1025.                                                                          }
  1026.                                                                                                          break;
  1027.                                                 case ('B'):                if(chushihua==1)   
  1028.                                                                   write_eeprom_jj(current_id);
  1029.                                                                                 else if(s1num!=0)
  1030.                                                                                                 {
  1031.                                                                                                                    switch(s1num)
  1032.                                                                                                                          {
  1033.                                                                                                                            case 1:
  1034.                                                                                                                                   second1=ctime.second/16*10+ctime.second%16;
  1035.                                                                                                                                           second1++;
  1036.                                                                                                                                           if(second1==60)
  1037.                                                                                                                                              second1=0;
  1038.                                                                                                                                           ctime.second=second1/10*16+second1%10;
  1039.                                                                                                                                           DS1302Write(0x8e,0x00);
  1040.                                                                                                                                           DS1302Write(WRITE_SECOND,ctime.second);
  1041.                                                                                                                                           DS1302Write(0x8e,0x80);
  1042.                                                                                                                                           write_sfm(10,ctime.second);
  1043.                                                                                                                                           write_1602com(0x80+10);
  1044.                                                                                                                                           break;
  1045.                                                                                                                            case 2:
  1046.                                                                                                                                   minute1=ctime.minute/16*10+ctime.minute%16;
  1047.                                                                                                                                           minute1++;
  1048.                                                                                                                                           if(minute1==60)
  1049.                                                                                                                                              minute1=0;
  1050.                                                                                                                                           ctime.minute=minute1/10*16+minute1%10;
  1051.                                                                                                                                           DS1302Write(0x8e,0x00);
  1052.                                                                                                                                           DS1302Write(WRITE_MINUTE,ctime.minute);
  1053.                                                                                                                                           DS1302Write(0x8e,0x80);
  1054.                                                                                                                                           write_sfm(7,ctime.minute);
  1055.                                                                                                                                           write_1602com(0x80+7);
  1056.                                                                                                                                           break;
  1057.                                                                                                                            case 3:
  1058.                                                                                                                                   hour1=ctime.hour/16*10+ctime.hour%16;
  1059.                                                                                                                                           hour1++;
  1060.                                                                                                                                           if(hour1==24)
  1061.                                                                                                                                              hour1=0;
  1062.                                                                                                                                           ctime.hour=hour1/10*16+hour1%10;
  1063.                                                                                                                                           DS1302Write(0x8e,0x00);
  1064.                                                                                                                                           DS1302Write(WRITE_HOUR,ctime.hour);
  1065.                                                                                                                                           DS1302Write(0x8e,0x80);
  1066.                                                                                                                                           write_sfm(4,ctime.hour);
  1067.                                                                                                                                           write_1602com(0x80+4);
  1068.                                                                                                                                           break;
  1069.                                                                                                                         
  1070.                                                                                                                          }
  1071.                                                                                                 }  
  1072.                                                                                                                                break;
  1073.                                                 case ('C'):if(chushihua==1)
  1074.                                                               write_eeprom_j(current_id);
  1075.                                                                    else if(s1num!=0)
  1076.                                                                    {
  1077.                                                                                     switch(s1num)
  1078.                                                                                          {
  1079.                                                                                            case 1:
  1080.                                                                                                   second1=ctime.second/16*10+ctime.second%16;
  1081.                                                                                                           second1--;
  1082.                                                                                                           if(second1==-1)
  1083.                                                                                                              second1=59;
  1084.                                                                                                           ctime.second=second1/10*16+second1%10;
  1085.                                                                                                           DS1302Write(0x8e,0x00);
  1086.                                                                                                           DS1302Write(WRITE_SECOND,ctime.second);
  1087.                                                                                                           DS1302Write(0x8e,0x80);
  1088.                                                                                                           write_sfm(10,ctime.second);
  1089.                                                                                                           write_1602com(0x80+10);
  1090.                                                                                                           break;
  1091.                                                                                            case 2:
  1092.                                                                                                   minute1=ctime.minute/16*10+ctime.minute%16;
  1093.                                                                                                           minute1--;
  1094.                                                                                                           if(minute1==-1)
  1095.                                                                                                              minute1=59;
  1096.                                                                                                           ctime.minute=minute1/10*16+minute1%10;
  1097.                                                                                                           DS1302Write(0x8e,0x00);
  1098.                                                                                                           DS1302Write(WRITE_MINUTE,ctime.minute);
  1099.                                                                                                           DS1302Write(0x8e,0x80);
  1100.                                                                                                           write_sfm(7,ctime.minute);
  1101.                                                                                                           write_1602com(0x80+7);
  1102.                                                                                                           break;
  1103.                                                                                            case 3:
  1104.                                                                                                   hour1=ctime.hour/16*10+ctime.hour%16;
  1105.                                                                                                           hour1--;
  1106.                                                                                                           if(hour1==-1)
  1107.                                                                                                              hour1=23;
  1108.                                                                                                           ctime.hour=hour1/10*16+hour1%10;
  1109.                                                                                                           DS1302Write(0x8e,0x00);
  1110. ……………………

  1111. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
代碼與視頻演示.7z (7.06 MB, 下載次數(shù): 200)


評(píng)分

參與人數(shù) 2黑幣 +62 收起 理由
anorec + 12 很給力!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:434146 發(fā)表于 2019-11-24 18:37 | 只看該作者
你好 沒有對(duì)應(yīng)的電路圖文件啊,能分享一下嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:632402 發(fā)表于 2019-12-10 21:47 | 只看該作者
感謝樓主的分享!
回復(fù)

使用道具 舉報(bào)

地板
ID:764690 發(fā)表于 2020-5-29 23:02 | 只看該作者
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

5#
ID:782249 發(fā)表于 2020-6-17 22:31 | 只看該作者
感謝樓主的分享!
回復(fù)

使用道具 舉報(bào)

6#
ID:92810 發(fā)表于 2020-6-28 11:40 | 只看該作者

你好 有沒有對(duì)應(yīng)的電路圖文件
回復(fù)

使用道具 舉報(bào)

7#
ID:880891 發(fā)表于 2021-2-1 15:00 | 只看該作者
里面不包含工程文件嗎?怎么沒有看到?
回復(fù)

使用道具 舉報(bào)

8#
ID:328014 發(fā)表于 2021-2-1 15:11 | 只看該作者
蘇念 發(fā)表于 2021-2-1 15:00
里面不包含工程文件嗎?怎么沒有看到?

樓主可能不小心把工程文件給刪除了,但是下載后我們會(huì)發(fā)現(xiàn),里面有工程備份文件,可以把這個(gè)備份文件改為工程文件,就順利打開了整個(gè)代碼工程了,如圖:

51hei.png (12.27 KB, 下載次數(shù): 33)

51hei.png

51hei.png (39.36 KB, 下載次數(shù): 40)

51hei.png

51hei.png (6.98 KB, 下載次數(shù): 39)

51hei.png
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人综合视频在线观看 | 日本超碰 | 天色综合网 | 91精品国产综合久久精品 | 羞羞网站免费观看 | 美女一级毛片 | 欧美一区二 | 国产中文字幕网 | 国产日韩精品视频 | 国产精品美女久久久久久免费 | 日韩欧美三级在线 | 国产精品久久久久久婷婷天堂 | 国产美女h视频 | 亚洲国产一区二区在线 | 精品久久久久久久久久 | 日韩亚洲视频 | com.色.www在线观看 | 国产精品久久久久久久久久久久 | 亚洲国产福利视频 | 国产精品亚洲成在人线 | 一色一黄视频 | 看a网站| 免费久久久 | 粉嫩一区二区三区国产精品 | 国产精品一区二区三区四区 | 国产精品美女www爽爽爽视频 | 国产视频二区 | 国产电影一区二区三区爱妃记 | 91免费观看国产 | 自拍第一页| 久久久精品在线 | 亚洲国产高清高潮精品美女 | 国产在线观看不卡一区二区三区 | 亚洲精品久久久一区二区三区 | 一级一级一级毛片 | 国产精品91视频 | 亚洲综合日韩精品欧美综合区 | 波多野结衣在线观看一区二区三区 | 日韩中文字幕在线播放 | 亚州春色 | 粉嫩在线|