找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4473|回复: 0
打印 上一主题 下一主题
收起左侧

STC12单片机门禁系统源码

[复制链接]
跳转到指定楼层
楼主
主控芯片为STC12



源程序:
  1. #include "common.h"

  2. #include "delay.h"
  3. #include "keyscan.h"
  4. #include "at24c02.h"
  5. #include "lcd1602.h"
  6. #include "buzzer_relay.h"
  7. #include "timer.h"
  8. #include "ds1302.h"

  9. #define STATE_INPUT                 1
  10. #define STATE_CHECK                 2
  11. #define STATE_OPEN                 3
  12. #define STATE_SET              4
  13. #define STATE_ERROR            5
  14. #define STATE_CHECK_OLD        6
  15. #define STATE_INPUT_NEW        7
  16. #define STATE_INPUT_NEW_AGAIN  8
  17. #define STATE_CHECK_NEW        9

  18. #define STATE_AUTO             1
  19. #define STATE_MANUAL           2

  20. sbit hongwai = P1^0;


  21. void init_all();

  22. void auto_sys();
  23. void pro();

  24. void state_input();
  25. void state_check();
  26. void state_open();
  27. void state_set();  
  28. void state_error();
  29. void state_check_old();
  30. void state_input_new();
  31. void state_input_new_again();               
  32. void state_check_new();

  33. uint8 password[6];
  34. uint8 password_dis[] = "------";
  35. uint8 data_buf[] = "123456";
  36. uint8 time_dis_buf[] = "18:59:50";
  37. uint8 error_count = 0;
  38. uint8 sec_flag = 0;
  39. uint8 relay_count = 0;
  40. bit close_flag = 0;

  41. uint8 state_pointer = 0;
  42. uint8 all_pointer = 0;


  43. void main()
  44. {
  45.         init_all();

  46.         while(1)
  47.         {
  48.                 DS1302BurstRead(time_buf);
  49.                 time_dis_buf[0] = time_buf[2]/10+'0';
  50.                 time_dis_buf[1] = time_buf[2]%10+'0';
  51.                 time_dis_buf[3] = time_buf[1]/10+'0';
  52.                 time_dis_buf[4] = time_buf[1]%10+'0';
  53.                 time_dis_buf[6] = time_buf[0]/10+'0';
  54.                 time_dis_buf[7] = time_buf[0]%10+'0';
  55.                   
  56.                 switch(all_pointer)               
  57.                 {
  58.                         case STATE_AUTO   :        auto_sys();
  59.                                                                 break;
  60.                         case STATE_MANUAL :        pro();      
  61.                                                                 break;
  62.                         default: break;
  63.                 }
  64.         }
  65. }

  66. void init_all()
  67. {
  68.         buzzer_off();                                       
  69.         relay_off();
  70.         Timer0Init();
  71.         LCD1602_init();
  72.         DS1302_Init();
  73.         DS1302BurstRead(time_buf);
  74.         DS1302BurstRead(time_buf);
  75.        
  76. //        at24c02_write(0x00,password[0]);
  77. //        at24c02_write(0x01,password[1]);
  78. //        at24c02_write(0x02,password[2]);
  79. //        at24c02_write(0x03,password[3]);
  80. //        at24c02_write(0x04,password[4]);
  81. //        at24c02_write(0x05,password[5]);

  82.         password[0] = at24c02_read(0x00);
  83.         password[1] = at24c02_read(0x01);
  84.         password[2] = at24c02_read(0x02);
  85.         password[3] = at24c02_read(0x03);
  86.         password[4] = at24c02_read(0x04);
  87.         password[5] = at24c02_read(0x05);
  88.                                  
  89.     delay_ms(5000);
  90.         LCD1602_write(0x01, 0);    //清除显示

  91.         all_pointer = STATE_AUTO;
  92.         state_pointer = STATE_INPUT;
  93. }

  94. void auto_sys()
  95. {
  96.         if(hongwai == 1)
  97.         {
  98.                 relay_on();       
  99.                 LCD1602_WriteString(0x80+0x40+5,"Please");
  100.                 LCD1602_WriteString(0x84,time_dis_buf);
  101.         }
  102.         if(hongwai == 0)
  103.         {
  104.                 relay_off();
  105.                 LCD1602_WriteString(0x84,time_dis_buf);       
  106.         }
  107.         if(( (time_buf[2] >= 0)&&(time_buf[2] < 7) )        ||( (time_buf[2] >= 19)&&(time_buf[2] <= 23) )  )
  108.         {
  109.                 relay_off();
  110.                 LCD1602_write(0x01, 0);    //清除显示
  111.                 LCD1602_WriteString(0x80,"Please input:");
  112.                 all_pointer = STATE_MANUAL;
  113.         }
  114.        
  115. }

  116. void pro()
  117. {
  118.         key_read();
  119.         switch(state_pointer)
  120.         {
  121.                 case STATE_INPUT:                       state_input();                         break;
  122.                 case STATE_CHECK:                       state_check();                        break;
  123.                 case STATE_OPEN:                        state_open();                          break;
  124.                 case STATE_SET:                         state_set();                           break;
  125.                 case STATE_ERROR:                       state_error();                  break;
  126.                 case STATE_CHECK_OLD:                   state_check_old(        );      break;
  127.                 case STATE_INPUT_NEW:                   state_input_new(        );      break;
  128.                 case STATE_INPUT_NEW_AGAIN:          state_input_new_again();  break;
  129.                 case STATE_CHECK_NEW:             state_check_new();        break;
  130.                 default:break;
  131.         }
  132.        
  133.         if( (time_buf[2] >= 7)&&(time_buf[2] < 19) )
  134.         {
  135.                 LCD1602_write(0x01, 0);    //清除显示
  136.                 all_pointer = STATE_AUTO;
  137.         }       
  138. }

  139. void state_input()
  140. {
  141.         LCD1602_WriteString(0x80+0x40,password_dis);
  142.         if(key_use < 10)
  143.         {
  144.                 if(key_count > 7)
  145.                 {
  146.                         key_count = 0;
  147.                         state_pointer = STATE_CHECK;
  148.                 }
  149.                 switch(key_count)
  150.                 {
  151.                         case 1: password_dis[0] = key_use+'0';
  152.                                         break;
  153.                         case 2: password_dis[1] = key_use+'0';
  154.                                         break;
  155.                         case 3: password_dis[2] = key_use+'0';                
  156.                                         break;
  157.                         case 4: password_dis[3] = key_use+'0';       
  158.                                         break;
  159.                         case 5: password_dis[4] = key_use+'0';
  160.                                         break;
  161.                         case 6: password_dis[5] = key_use+'0';
  162.                                         state_pointer = STATE_CHECK;
  163.                                         break;
  164.                         default:break;
  165.                 }
  166.         }
  167.         if(Exit_flag == 1)
  168.         {
  169.                 Exit_flag = 0;
  170.                 password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  171.                 password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  172.                 key_count = 0;
  173.         }
  174.         if(key_use == 11)        //复位
  175.         {
  176.                 password[0] = '1'; password[1] = '2'; password[2] = '3';
  177.                 password[3] = '4'; password[4] = '5'; password[5] = '6';
  178.                 password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  179.                 password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';

  180.                 at24c02_write(0x00,password[0]);
  181.                 at24c02_write(0x01,password[1]);
  182.                 at24c02_write(0x02,password[2]);
  183.                 at24c02_write(0x03,password[3]);
  184.                 at24c02_write(0x04,password[4]);
  185.                 at24c02_write(0x05,password[5]);

  186.                 key_count = 0;
  187.                 state_pointer = STATE_INPUT;
  188.         }
  189.         if( (key_use == 13) && (key_count == 0) ) //设置
  190.         {
  191.                 key_use = 55;
  192.                 state_pointer = STATE_SET;
  193.                 LCD1602_write(0x01, 0);    //清除显示
  194.                 LCD1602_WriteString(0x80,"Please input old");
  195.         }
  196. }

  197. void state_check()
  198. {
  199.         key_count = 0;
  200.         if(Exit_flag == 1)
  201.         {
  202.                 Exit_flag = 0;
  203.                 password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  204.                 password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  205.                 key_count = 0;
  206.                 state_pointer = STATE_INPUT;
  207.         }
  208.         LCD1602_WriteString(0x80+0x40,password_dis);
  209.         if(key_use == 10)                //OK
  210.         {
  211.                 key_use = 55;
  212.                 if( (password_dis[0] == password[0])&&(password_dis[1] == password[1])&&(password_dis[2] == password[2])&&
  213.                         (password_dis[3] == password[3])&&(password_dis[4] == password[4])&&(password_dis[5] == password[5]) )
  214.                 {
  215.                         LCD1602_write(0x01, 0);    //清除显示
  216.                         state_pointer = STATE_OPEN;
  217.                         sec_flag = 0;
  218.                 }
  219.                 else if( (password_dis[0] != password[0])||(password_dis[1] != password[1])||(password_dis[2] != password[2])||
  220.                              (password_dis[3] != password[3])||(password_dis[4] != password[4])||(password_dis[5] != password[5]) )
  221.                 {
  222.                         password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  223.                         password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  224.                        
  225.                         error_count++;

  226.                         if(error_count <= 2)
  227.                         {
  228.                                 state_pointer = STATE_INPUT;
  229.                         }
  230.                         if(error_count >= 3)
  231.                         {
  232.                                 error_count = 0;
  233.                                 LCD1602_write(0x01, 0);    //清除显示
  234.                                 state_pointer = STATE_ERROR;
  235.                         }       
  236.                 }
  237.         }
  238. }

  239. void state_open()
  240. {
  241.         key_count = 0;
  242.         Exit_flag = 0;
  243.         if(close_flag == 1)
  244.         {
  245.                 close_flag = 0;
  246.                 relay_off();
  247.                 password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  248.                 password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  249.                 LCD1602_write(0x01, 0);    //清除显示
  250.                 LCD1602_WriteString(0x80,"Please input:");
  251.                 key_count = 0;
  252.                 state_pointer = STATE_INPUT;
  253.         }
  254.         else if(close_flag == 0)
  255.         {
  256.                 relay_on();
  257.                 LCD1602_WriteString(0x84,"Welcome!");
  258.                 LCD1602_WriteString(0x81+0x40+4,"Please");
  259.         }
  260. }

  261. void state_set()
  262. {                       
  263.         if(key_use < 10)
  264.         {
  265.                 if(key_count > 7)
  266.                 {
  267.                         key_count = 0;
  268.                         state_pointer = STATE_CHECK_OLD;
  269.                 }
  270.                 switch(key_count)
  271.                 {
  272. //                                case 0: password_dis[0] = key_use+'0'; break;
  273.                         case 1: password_dis[0] = key_use+'0'; break;
  274.                         case 2: password_dis[1] = key_use+'0'; break;
  275.                         case 3: password_dis[2] = key_use+'0'; break;
  276.                         case 4: password_dis[3] = key_use+'0'; break;
  277.                         case 5: password_dis[4] = key_use+'0'; break;
  278.                         case 6: password_dis[5] = key_use+'0';
  279.                                         key_count = 0;
  280.                                         state_pointer = STATE_CHECK_OLD;
  281.                                         break;
  282.                         default:break;
  283.                 }
  284.         }
  285.         if(Exit_flag == 1)
  286.         {
  287.                 Exit_flag = 0;
  288.                 password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  289.                 password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  290.                 key_count = 0;
  291.         }
  292.         LCD1602_WriteString(0x80+0x40,password_dis);
  293. }
  294.   
  295. void state_error()
  296. {
  297.         Exit_flag = 0;
  298.         if(close_flag == 1)
  299.         {
  300.                 close_flag = 0;
  301.                 buzzer_off();
  302.                 password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  303.                 password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  304.                 LCD1602_write(0x01, 0);    //清除显示
  305.                 LCD1602_WriteString(0x80,"Please input:");
  306.                 state_pointer = STATE_INPUT;
  307.         }
  308.         else if(close_flag == 0)
  309.         {
  310.                 buzzer_on();
  311.                 LCD1602_WriteString(0x85,"Error!");
  312.         }
  313. }

  314. void state_check_old()
  315. {
  316.         key_count = 0;
  317.         if(Exit_flag == 1)
  318.         {
  319.                 Exit_flag = 0;
  320.                 password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  321.                 password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  322.                 key_count = 0;
  323.                 state_pointer = STATE_SET;
  324.         }
  325.         if(key_use == 10)                //OK
  326.         {
  327.                 key_use = 55;
  328.                 if( (password_dis[0] == password[0])&&(password_dis[1] == password[1])&&(password_dis[2] == password[2])&&
  329.                         (password_dis[3] == password[3])&&(password_dis[4] == password[4])&&(password_dis[5] == password[5]) )
  330.                 {
  331.                         password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  332.                         password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  333.                         LCD1602_write(0x01, 0);    //清除显示
  334.                         LCD1602_WriteString(0x80,"Please input new");
  335.                         state_pointer = STATE_INPUT_NEW;
  336.                 }
  337.                 else if( (password_dis[0] != password[0])||(password_dis[1] != password[1])||(password_dis[2] != password[2])||
  338.                              (password_dis[3] != password[3])||(password_dis[4] != password[4])||(password_dis[5] != password[5]) )
  339.                 {
  340.                         password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  341.                         password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  342.                        
  343.                         state_pointer = STATE_SET;       
  344.                 }
  345.         }
  346. }

  347. void state_input_new()
  348. {       
  349.         LCD1602_WriteString(0x80+0x40,password_dis);
  350.         if(key_use < 10)
  351.         {
  352.                 switch(key_count)
  353.                 {
  354. //                                case 0: password_dis[0] = key_use+'0'; break;
  355.                         case 1: password_dis[0] = key_use+'0'; break;
  356.                         case 2: password_dis[1] = key_use+'0'; break;
  357.                         case 3: password_dis[2] = key_use+'0'; break;
  358.                         case 4: password_dis[3] = key_use+'0'; break;
  359.                         case 5: password_dis[4] = key_use+'0'; break;
  360.                         case 6: password_dis[5] = key_use+'0';
  361.                                         key_count = 0;
  362.                                         data_buf[0] = password_dis[0]; data_buf[1] = password_dis[1]; data_buf[2] = password_dis[2];
  363.                                         data_buf[3] = password_dis[3]; data_buf[4] = password_dis[4]; data_buf[5] = password_dis[5];
  364.                                         password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  365.                                         password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  366.                                         LCD1602_write(0x01, 0);    //清除显示
  367.                                         LCD1602_WriteString(0x80,"Pleaset again:");
  368.                                         state_pointer = STATE_INPUT_NEW_AGAIN;
  369.                                         break;
  370.                         default:break;
  371.                 }
  372.         }
  373.         if(Exit_flag == 1)
  374.         {
  375.                 Exit_flag = 0;
  376.                 password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  377.                 password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  378.                 key_count = 0;
  379.         }
  380. }

  381. void state_input_new_again()
  382. {       
  383.         LCD1602_WriteString(0x80+0x40,password_dis);
  384.         if(key_use < 10)
  385.         {
  386.                 switch(key_count)
  387.                 {
  388.                         case 1: password_dis[0] = key_use+'0'; break;
  389.                         case 2: password_dis[1] = key_use+'0'; break;
  390.                         case 3: password_dis[2] = key_use+'0'; break;
  391.                         case 4: password_dis[3] = key_use+'0'; break;
  392.                         case 5: password_dis[4] = key_use+'0'; break;
  393.                         case 6: password_dis[5] = key_use+'0';
  394.                                         key_count = 0;
  395.                                         state_pointer = STATE_CHECK_NEW;
  396.                                         break;
  397.                         default:break;
  398.                 }
  399.         }
  400.         if(Exit_flag == 1)
  401.         {
  402.                 Exit_flag = 0;
  403.                 password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  404.                 password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  405.                 key_count = 0;
  406.         }
  407. }

  408. void state_check_new()
  409. {
  410.         Exit_flag = 0;
  411.         if( (password_dis[0] == data_buf[0])&&(password_dis[1] == data_buf[1])&&(password_dis[2] == data_buf[2])&&
  412.                 (password_dis[3] == data_buf[3])&&(password_dis[4] == data_buf[4])&&(password_dis[5] == data_buf[5]) )
  413.         {
  414.                 password[0] = password_dis[0]; password[1] = password_dis[1]; password[2] = password_dis[2];
  415.                 password[3] = password_dis[3]; password[4] = password_dis[4]; password[5] = password_dis[5];          
  416.                 password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  417.                 password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';

  418.                 at24c02_write(0x00,password[0]);
  419.                 at24c02_write(0x01,password[1]);
  420.                 at24c02_write(0x02,password[2]);
  421.                 at24c02_write(0x03,password[3]);
  422.                 at24c02_write(0x04,password[4]);
  423.                 at24c02_write(0x05,password[5]);

  424.                 LCD1602_write(0x01, 0);    //清除显示
  425.                 LCD1602_WriteString(0x80,"Please input:");
  426.                 state_pointer = STATE_INPUT;  // 设置完成
  427.         }
  428.         else if( (password_dis[0] != password[0])||(password_dis[1] != password[1])||(password_dis[2] != password[2])||
  429.                      (password_dis[3] != password[3])||(password_dis[4] != password[4])||(password_dis[5] != password[5]) )
  430.         {
  431.                 password_dis[0] = '-'; password_dis[1] = '-'; password_dis[2] = '-';
  432.                 password_dis[3] = '-'; password_dis[4] = '-'; password_dis[5] = '-';
  433.                
  434.                 LCD1602_write(0x01, 0);    //清除显示
  435.                 LCD1602_WriteString(0x80,"Please input:");
  436.                 state_pointer = STATE_SET;       
  437.         }
  438. }

  439. void timer0() interrupt 1
  440. {
  441.         TL0 = 0xE0;                //设置定时初值
  442.         TH0 = 0xB1;                //设置定时初值
  443.         if( (state_pointer == STATE_OPEN)||(state_pointer == STATE_ERROR) )
  444.         {
  445.                 sec_flag++;
  446.                 if(sec_flag >= 50)
  447.                 {
  448.                         sec_flag = 0;
  449.                         relay_count++;
  450.                         if(relay_count >=3)
  451.                         {
  452.                                 relay_count = 0;
  453.                                 close_flag = 1;
  454.                         }
  455.                 }
  456.         }       
  457. }

复制代码


完整代码下载:
程序.zip (122.62 KB, 下载次数: 26)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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