找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机智能门锁程序与Proteus仿真图(智能门卫系统)

  [复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg51.h>        
  2. #include"lcd.h"
  3. #include<intrins.h>                        
  4. #define GPIO_KEY P1
  5. unsigned char i,u;
  6. unsigned char KeyValue;
  7. //用来存放读取到的键值
  8. unsigned char KeyState;
  9. //用来存放按键状态
  10. unsigned char error;
  11. unsigned char  PuZh[]=   "            sun ";
  12. unsigned char code w[]=          "      wrong     ";
  13. unsigned char code s[]=         "      ok        ";
  14. unsigned char code clear[]= " please in code ";
  15. unsigned char code dat[]=    "0123456789ABCDEF";
  16. unsigned char mima[]={1,2,3,4,5,6};
  17. unsigned char guanli[]={1,1,1,1,1,1};
  18. sbit men=P3^3;
  19. sbit in=P3^4;
  20. sbit out=P3^5;
  21. sbit model=P3^6;
  22. sbit sp=P3^7;
  23. void Delay10ms();   //延时50us
  24. void delay2s(void);
  25. void KeyDown();                 //检测按键函数
  26. void InitUART(void);
  27. void SendOneByte(char c);

  28. void delay_ms(char p)
  29. {
  30.          char m;
  31.                   for(m=0;m<p;m++)
  32.         {
  33.           void Delay10ms();  
  34.         }
  35. }

  36. /*******************************************************************************
  37. * 函 数 名         : main
  38. * 函数功能                   : 主函数
  39. * 输    入         : 无
  40. * 输    出         : 无
  41. *******************************************************************************/
  42. void main(void)
  43. {
  44.         unsigned char i;
  45.         LcdInit();
  46.         InitUART();
  47.         sp=0;
  48.         KeyState=0;
  49.         for(i=0;i<16;i++)
  50.         {
  51.    //   LcdWriteCom(0x80);
  52.           LcdWriteData(PuZh[i]);
  53.         }
  54.          LcdWriteCom(0x80+0X40);
  55.                  for(i=0;i<16;i++)
  56.         {
  57.    //   LcdWriteCom(0x80);
  58.           LcdWriteData(clear[i]);
  59.         }
  60.         while(1)
  61.         {
  62.     KeyDown();        
  63.         if(in==0)
  64.           {
  65.          Delay10ms();         
  66.           if(in==0)
  67.             u++;
  68.           while(!in);
  69.           PuZh[0]=(int)dat[(u/10000)];
  70.           PuZh[1]=(int)dat[(u/1000)];
  71.           PuZh[2]=(int)dat[(u/100)];
  72.           PuZh[3]=(int)dat[(u/10%10)];
  73.           PuZh[4]=(int)dat[(u%10)];
  74.           LcdWriteCom(0x80);
  75.           for(i=0;i<16;i++)
  76.         {
  77.           LcdWriteData(PuZh[i]);
  78.         }
  79.          for(i=0;i<5;i++)
  80.         {
  81.          SendOneByte(PuZh[i]);
  82.         }
  83.         SendOneByte('\r');
  84.     SendOneByte('\n');        
  85.         }

  86.         if(model==0)
  87.           {
  88.           Delay10ms();
  89.           if(model==0){
  90.           PuZh[9]=dat[10];
  91.           Delay10ms();
  92.           LcdWriteCom(0x80);
  93.           for(i=0;i<16;i++)
  94.         {
  95.           LcdWriteData(PuZh[i]);
  96.         }
  97.          if(men==0)
  98.             Delay10ms();
  99.                 if(men==0)
  100.                 {
  101.                  sp=1;
  102.                  SendOneByte('w');
  103.                  SendOneByte('a');
  104.                  SendOneByte('r');
  105.                  SendOneByte('i');
  106.                  SendOneByte('n');
  107.                  SendOneByte('g');
  108.                  SendOneByte('\r');
  109.                  SendOneByte('\n');               
  110.                 }
  111.            Delay10ms();
  112.           }
  113.          }
  114.          
  115.                  
  116.         if(model==1)
  117.         {PuZh[9]=dat[11];
  118.          sp=0;
  119.           LcdWriteCom(0x80);
  120.           for(i=0;i<16;i++)
  121.         {
  122.           LcdWriteData(PuZh[i]);
  123.         }         
  124.                  }
  125.                                          
  126.                                 
  127. }
  128. }
  129.      





  130. /*******************************************************************************
  131. * 函 数 名         : KeyDown
  132. * 函数功能                   : 检测有按键按下并读取键值
  133. * 输    入         : 无
  134. * 输    出         : 无
  135. *******************************************************************************/
  136. void KeyDown(void)
  137. {
  138.         char a,k,l,error;
  139.         
  140.         GPIO_KEY=0x0f;
  141.         if(GPIO_KEY!=0x0f)
  142.         {
  143.                 Delay10ms();
  144.                 if(GPIO_KEY!=0x0f)
  145.                 {        
  146.                   k++;
  147.                         KeyState=1;
  148.                         //测试列
  149.                         GPIO_KEY=0X0F;
  150. //                         Delay10ms();
  151.                         switch(GPIO_KEY)
  152.                         {
  153.                                 case(0X07):        KeyValue=0;break;
  154.                                 case(0X0b):        KeyValue=1;break;
  155.                                 case(0X0d): KeyValue=2;break;
  156.                                 case(0X0e):        KeyValue=3;break;
  157. //                                default:        KeyValue=17;        //检测出错回复17意思是把数码管全灭掉。
  158.                         }
  159.                         //测试行
  160.                         GPIO_KEY=0XF0;
  161.                         Delay10ms();
  162.                         switch(GPIO_KEY)
  163.                         {
  164.                                 case(0X70):        KeyValue=KeyValue;break;
  165.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  166.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  167.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  168. //                                default:        KeyValue=17;
  169.                         }
  170.                         while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
  171.                         {
  172.                                 Delay10ms();
  173.                                 a++;
  174.                         }
  175.    
  176.         a=0;
  177. if(k==6){
  178.          LcdWriteCom(0x80+0X40);
  179.          k=0;
  180.         for(l=0;l<6;l++)
  181.         {
  182. if(mima[l]==guanli[l])        error=1;
  183. else {error=0; break;}
  184.    }

  185. if(error==1) {
  186.         for(i=0;i<16;i++)
  187.         {
  188.         LcdWriteData(s[i]);        
  189.         }
  190.    delay2s();; }

  191. else
  192.         {
  193.           for(i=0;i<16;i++)
  194.         {  
  195.         LcdWriteData(w[i]);        
  196.         }
  197.     delay2s();
  198.           }
  199.    LcdWriteCom(0x80+0X40);
  200.    for(i=0;i<16;i++)
  201.         {  
  202.         LcdWriteData(clear[i]);        
  203.         }
  204.                 }
  205.                 }
  206.         }
  207. }
  208. /*******************************************************************************
  209. * 函 数 名         : Delay10ms
  210. * 函数功能                   : 延时函数,延时10ms
  211. * 输    入         : 无
  212. * 输    出         : 无
  213. *******************************************************************************/
  214. void Delay10ms(void)   //误差 0us
  215. {
  216.     unsigned char a,b,c;
  217.     for(c=1;c>0;c--)
  218.         for(b=38;b>0;b--)
  219.             for(a=130;a>0;a--);
  220. }
  221. void delay2s(void)   //误差 0us
  222. {
  223.     unsigned char a,b,c;
  224.     for(c=127;c>0;c--)
  225.         for(b=235;b>0;b--)
  226.             for(a=32;a>0;a--);
  227.     _nop_();  //if Keil,require use intrins.h
  228. }
  229.   void InitUART(void)
  230. {
  231.      TMOD = 0x20;
  232.     SCON = 0x50;
  233.     TH1 = 0xFD;
  234.     TL1 = TH1;
  235.     PCON = 0x00;
  236.     EA = 1;
  237.     ES = 1;
  238.     TR1 = 1;
  239. }
  240. void SendOneByte(char c)
  241. {
  242.     SBUF = c;
  243.     while(!TI);
  244.     TI = 0;
  245. }
  246. void UARTInterrupt(void) interrupt 4
  247. {
  248.     if(RI)
  249.     {
  250.         RI = 0;
  251.          
  252.     }

  253. }
复制代码

仿真代码51hei附件下载:
仿真程序.7z (251.29 KB, 下载次数: 101)

评分

参与人数 1黑币 +20 收起 理由
admin + 20 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1002881 发表于 2022-2-14 06:03 | 只看该作者
楼主,仿真密码是什么了,
回复

使用道具 举报

板凳
ID:474195 发表于 2022-3-21 22:09 | 只看该作者
gonglijun 发表于 2022-2-14 06:03
楼主,仿真密码是什么了,

程序中有的
回复

使用道具 举报

地板
ID:1017480 发表于 2022-4-11 14:37 | 只看该作者
我想问下就是那个最下面那个显示屏是什么
回复

使用道具 举报

5#
ID:474195 发表于 2022-4-19 16:08 | 只看该作者
YUANQIQI 发表于 2022-4-11 14:37
我想问下就是那个最下面那个显示屏是什么

串口信息显示
回复

使用道具 举报

6#
ID:63541 发表于 2022-6-29 00:56 | 只看该作者
密码打不开的。
回复

使用道具 举报

7#
ID:1037655 发表于 2022-6-29 21:50 来自手机 | 只看该作者
感恩有你!
回复

使用道具 举报

8#
ID:474195 发表于 2022-8-5 00:07 | 只看该作者

试下改变sw1的状态
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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