找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32红外遥控密码锁源码

[复制链接]
跳转到指定楼层
楼主
ID:315926 发表于 2018-5-3 09:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在网上搜罗出来,已编译,可以在Ministm32上实现用红外遥控器输入密码解锁。初始密码为123456.

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "usart.h"
  5. #include "lcd.h"
  6. #include "remote.h"   
  7. #include "string.h"       

  8. u8 *in_pwd1=0;
  9. u8 *in_pwd2=0;
  10. u8 *in_pwd3=0;
  11. u8 *in_pwd4=0;
  12. u8 *in_pwd5=0;
  13. u8 *in_pwd6=0;
  14. u8 *str=0;        
  15. int fall_time=0;

  16. u8 open_pwd[6]="123456";//初始密码
  17. u8 root_pwd[6]="666666";//管理员密码
  18. int in_time=0;
  19. int mykey=0;//控制in_time每按一个按键只加一次的坎儿

  20. void re_in(void);//重置/重新输入

  21. void root_h(void);//管理员函数

  22. int main(void)
  23. {
  24.         u8 key;
  25.         u8 t=0;       
  26.         delay_init();                     //延时函数初始?
  27.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2          
  28.         uart_init(9600);                 //串口初始化为9600
  29.         LED_Init();                                  //初始化与LED连接的硬件接口
  30.         LCD_Init();
  31.         Remote_Init();                        //红外接收初始化         
  32.         POINT_COLOR=BLACK;//设置字体为红色
  33.         LCD_ShowString(30,50,200,16,16,"---ordinary mode---");       
  34.         LCD_ShowString(30,70,200,16,16,"Please enter 6 password");       
  35.         //LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
  36.         //LCD_ShowString(60,110,200,16,16,"2014/3/12");

  37.    //        LCD_ShowString(60,130,200,16,16,"KEYVAL:");       
  38.    //        LCD_ShowString(60,150,200,16,16,"KEYCNT:");       
  39.    //        LCD_ShowString(60,170,200,16,16,"SYMBOL:");         
  40.                 LCD_ShowString(60,200,200,16,16,"PASSWD:");
  41.                 //LCD_ShowxNum(116,220,0,6,16,1);
  42.                
  43.         while(1)
  44.         {
  45.                 key=Remote_Scan();       
  46.                 if(key)
  47.                 {         
  48.                        
  49.                 //        LCD_ShowNum(116,130,key,3,16);                //显示键值
  50.                 //        LCD_ShowNum(116,150,RmtCnt,3,16);        //显示按键次数                  
  51.                         switch(key)
  52.                         {
  53.                                 case 0:str="ERROR";break;                          
  54.                                 case 162:str="POWER";re_in();break;            
  55.                                 case 98:str="UP";break;            
  56.                                 case 2:str="PLAY";break;                 
  57.                                 case 226:str="ALIENTEK";break;                  
  58.                                 case 194:str="RIGHT";break;          
  59.                                 case 34:str="LEFT";break;                  
  60.                                 case 224:str="VOL-";break;                  
  61.                                 case 168:str="DOWN";break;                  
  62.                                 case 144:str="VOL+";break;                    
  63.                                 case 104:str="1";break;                  
  64.                                 case 152:str="2";break;          
  65.                                 case 176:str="3";break;            
  66.                                 case 48:str="4";break;                    
  67.                                 case 24:str="5";break;                    
  68.                                 case 122:str="6";break;                  
  69.                                 case 16:str="7";break;                                                                  
  70.                                 case 56:str="8";break;         
  71.                                 case 90:str="9";break;
  72.                                 case 66:str="0";break;
  73.                                 case 82:str="DELETE";break;                 
  74.                         }
  75.                 //        LCD_Fill(116,170,116+8*8,170+16,WHITE);        //清楚之前的显示
  76.                 //        LCD_ShowString(116,170,200,16,16,str);        //显示SYMBOL
  77.                         if(RmtCnt==1&&mykey==0)
  78.                         {
  79.                                 in_time++;
  80.                                 //LCD_Fill(116,220,116+8*8,220+16,WHITE);//清除显示输入了多少位
  81.                                 //LCD_ShowxNum(116,220,in_time,6,16,1);//显示输入了多少位
  82.                                
  83.                                 if(in_time==1)
  84.                                 {
  85.                                         LCD_Fill(116,130,240,200+16,WHITE);//清除之前输入的密码以及open the door
  86.                                        
  87.                                 }
  88.                                 if(str=="0"||//限制:只有数字才能作为密码输入
  89.                                          str=="1"||
  90.                                    str=="2"||
  91.                                    str=="3"||
  92.                                    str=="4"||
  93.                                    str=="5"||
  94.                                    str=="6"||
  95.                                    str=="7"||
  96.                                    str=="8"||
  97.                                    str=="9")
  98.                                 {
  99.                                         switch(in_time)
  100.                                         {
  101.                                                 case 1:in_pwd1=str;LCD_ShowString(116,200,200,16,16,in_pwd1);delay_ms(200);LCD_ShowString(116,200,200,16,16,"*");break;
  102.                                                 case 2:in_pwd2=str;LCD_ShowString(116+8,200,200,16,16,in_pwd2);delay_ms(200);LCD_ShowString(116+8,200,200,16,16,"*");break;
  103.                                                 case 3:in_pwd3=str;LCD_ShowString(116+16,200,200,16,16,in_pwd3);delay_ms(200);LCD_ShowString(116+16,200,200,16,16,"*");break;
  104.                                                 case 4:in_pwd4=str;LCD_ShowString(116+24,200,200,16,16,in_pwd4);delay_ms(200);LCD_ShowString(116+24,200,200,16,16,"*");break;
  105.                                                 case 5:in_pwd5=str;LCD_ShowString(116+32,200,200,16,16,in_pwd5);delay_ms(200);LCD_ShowString(116+32,200,200,16,16,"*");break;
  106.                                                 case 6:in_pwd6=str;LCD_ShowString(116+40,200,200,16,16,in_pwd6);delay_ms(200);LCD_ShowString(116+40,200,200,16,16,"*");break;

  107.                                         }
  108.                                 }
  109.                                
  110.                                 mykey=1;//设置为1防止再次进入
  111.                         }


  112.                         if(in_time==6)
  113.                         {
  114.                                 if(*in_pwd1==open_pwd[0]&&//普通用户配对成功
  115.                                          *in_pwd2==open_pwd[1]&&
  116.                                          *in_pwd3==open_pwd[2]&&
  117.                                    *in_pwd4==open_pwd[3]&&
  118.                                    *in_pwd5==open_pwd[4]&&
  119.                              *in_pwd6==open_pwd[5])
  120.                                 {
  121.                                         LED1=0;
  122.                                         fall_time=0;
  123.                                         LCD_Fill(116,200,116+64,200+16,WHITE);//清除之前输入的密码
  124.                                         LCD_ShowString(116,200,200,16,16,"Welcome");         
  125.                                         LCD_ShowString(116,130,200,16,16,"open the door!");
  126.                                 }
  127.                                 else if(*in_pwd1==root_pwd[0]&&//管理员用户配对成功
  128.                                                                 *in_pwd2==root_pwd[1]&&
  129.                                                                 *in_pwd3==root_pwd[2]&&
  130.                                                                 *in_pwd4==root_pwd[3]&&
  131.                                                                 *in_pwd5==root_pwd[4]&&
  132.                                                                 *in_pwd6==root_pwd[5])
  133.                                 {
  134.                                          root_h();                 
  135.                                 }
  136.                                 else//配对失败
  137.                                 {
  138.                                         LED1=1;
  139.                                         LCD_Fill(116,200,240,200+16,WHITE);//清除之前输入的密码
  140.                                         LCD_ShowString(116,200,200,16,16,"wrong password");
  141.                                         fall_time++;
  142.                                         LED0=!LED0;//红灯闪烁提示
  143.                                         delay_ms(300);
  144.                                         LED0=!LED0;
  145.                                         delay_ms(300);
  146.                                         LED0=!LED0;
  147.                                         delay_ms(300);
  148.                                         LED0=!LED0;
  149.                                         LCD_Fill(116,200,240,200+16,WHITE);//清除wrong password
  150.                                         LED0=1;
  151.                                 }
  152.                                 in_time=0;
  153.                         }
  154.                 if(fall_time==5)
  155.                 {
  156.                         fall_time=0;
  157.                         LCD_Fill(116,200,240,200+16,WHITE);//清除准备显示锁定
  158.                         LCD_ShowString(60,200,200,16,16,"Has been locked please wait 1 min");       
  159.                         fall_for_1min();
  160.                         LED0=1;
  161.                         LCD_Fill(116,200,240,200+16,WHITE);//清除Has been locked please wait 1 minute
  162.                         LCD_ShowString(60,200,200,16,16,"PASSWD:");
  163.                 }
  164.                        
  165.                 }else
  166.                 {
  167.                         delay_ms(10);          
  168.                         mykey=0;//放手时,归零以便下次重新计数
  169.                 }
  170.                         t++;
  171.                 if(t==20)
  172.                 {
  173.                         t=0;
  174.                         //LED0=!LED0;
  175.                 }
  176.         }
  177. }





  178. void re_in(void)//重置/重新输入
  179. {
  180.         LCD_Fill(116,200,116+64,200+16,WHITE);//清除之前输入的密码
  181.         //LCD_Fill(116,220,116+8*8,220+16,WHITE);
  182.         LCD_ShowString(116,130,200,16,16,"close the door!");//提示关门
  183.         delay_ms(800);
  184.         LCD_Fill(116,130,240,200+16,WHITE);//清除之前输入的密码
  185.         in_time=0;
  186.         LED1=0;
  187.         delay_ms(200);
  188.         LED1=1;
  189. }

  190. void root_h(void)//管理员用户函数
  191. {

  192.         u8 key;
  193.         in_time=0;
  194.         mykey=0;
  195.         in_pwd1="0";
  196.         in_pwd2="0";
  197.         in_pwd3="0";
  198.         in_pwd4="0";
  199.         in_pwd5="0";
  200.         in_pwd6="0";
  201.        
  202.         LED1=!LED1;//绿灯闪烁提示
  203.         delay_ms(100);
  204.         LED1=!LED1;
  205.         delay_ms(100);
  206.         LED1=!LED1;
  207.         delay_ms(100);
  208.         LED1=!LED1;

  209.         LCD_Fill(30,50,240,110,WHITE);//                清除普通用户界面提示
  210.         LCD_ShowString(60,50,200,16,16,"---root mode---");       
  211.         LCD_ShowString(60,70,200,16,16,"you can change");
  212.         LCD_ShowString(60,90,200,16,16,"password here");
  213.         LCD_Fill(0,200,240,200+16,WHITE);//清除输入密码提示以及密码
  214.         LCD_ShowString(60,200,200,16,16,"NEWPWD:");//提示输入新密码
  215.         do
  216.         {
  217.                 //LCD_ShowString(60,70,200,16,16,"REMOTE TEST");       
  218.                 //LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
  219.                 //LCD_ShowString(60,110,200,16,16,"2014/3/12");
  220.                 key=Remote_Scan();       
  221.                 if(key)
  222.                 {         
  223.                         //LCD_ShowNum(116,130,key,3,16);                //显示键值
  224.                         //LCD_ShowNum(116,150,RmtCnt,3,16);        //显示按键次数                  
  225.                         switch(key)
  226.                         {
  227.                                 case 0:str="ERROR";break;                          
  228.                                 case 162:str="POWER";re_in();break;            
  229.                                 case 98:str="UP";break;            
  230.                                 case 2:str="PLAY";break;                 
  231.                                 case 226:str="ALIENTEK";break;                  
  232.                                 case 194:str="RIGHT";break;          
  233.                                 case 34:str="LEFT";break;                  
  234.                                 case 224:str="VOL-";break;                  
  235.                                 case 168:str="DOWN";break;                  
  236.                                 case 144:str="VOL+";break;                    
  237.                                 case 104:str="1";break;                  
  238.                                 case 152:str="2";break;          
  239.                                 case 176:str="3";break;            
  240.                                 case 48:str="4";break;                    
  241.                                 case 24:str="5";break;                    
  242.                                 case 122:str="6";break;                  
  243.                                 case 16:str="7";break;                                                                  
  244.                                 case 56:str="8";break;         
  245.                                 case 90:str="9";break;
  246.                                 case 66:str="0";break;
  247.                                 case 82:str="DELETE";break;                 
  248.                         }
  249.                         //LCD_Fill(116,170,116+8*8,170+16,WHITE);        //清楚之前的显示
  250.                         //LCD_ShowString(116,170,200,16,16,str);        //显示SYMBOL

  251.                         if(RmtCnt==1&&mykey==0)
  252.                         {
  253.                                 in_time++;
  254.                                 //LCD_Fill(116,220,116+8*8,220+16,WHITE);//清除显示输入了多少位
  255.                                 //LCD_ShowxNum(116,220,in_time,6,16,1);//显示输入了多少位
  256.                                
  257.                                 if(in_time==1)
  258.                                 {
  259.                                         LCD_Fill(116,200,116+64,200+16,WHITE);//清除之前输入的密码
  260.                                 }
  261.                                 if(str=="0"||//限制:只有数字才能作为密码输入
  262.                                          str=="1"||
  263.                                    str=="2"||
  264.                                    str=="3"||
  265.                                    str=="4"||
  266.                                    str=="5"||
  267.                                    str=="6"||
  268.                                    str=="7"||
  269.                                    str=="8"||
  270.                                    str=="9")
  271.                                 {
  272.                                         switch(in_time)
  273.                                         {
  274.                                                 case 1:in_pwd1=str;open_pwd[0]=*str;LCD_ShowString(116,200,200,16,16,in_pwd1);delay_ms(200);LCD_ShowString(116,200,200,16,16,"*");break;//第一次输入
  275.                                                 case 2:in_pwd2=str;open_pwd[1]=*str;LCD_ShowString(116+8,200,200,16,16,in_pwd2);delay_ms(200);LCD_ShowString(116+8,200,200,16,16,"*");break;//第二次输入
  276.                                                 case 3:in_pwd3=str;open_pwd[2]=*str;LCD_ShowString(116+16,200,200,16,16,in_pwd3);delay_ms(200);LCD_ShowString(116+16,200,200,16,16,"*");break;//第三次输入
  277.                                                 case 4:in_pwd4=str;open_pwd[3]=*str;LCD_ShowString(116+24,200,200,16,16,in_pwd4);delay_ms(200);LCD_ShowString(116+24,200,200,16,16,"*");break;//第四次输入
  278.                                                 case 5:in_pwd5=str;open_pwd[4]=*str;LCD_ShowString(116+32,200,200,16,16,in_pwd5);delay_ms(200);LCD_ShowString(116+32,200,200,16,16,"*");break;//第五次输入
  279.                                                 case 6:in_pwd6=str;open_pwd[5]=*str;LCD_ShowString(116+40,200,200,16,16,in_pwd6);delay_ms(200);LCD_ShowString(116+40,200,200,16,16,"*");break;//第六次输入
  280.                                         }
  281.                                 }
  282.                                
  283.                                 if(in_pwd1=="6"&&in_pwd2=="6"&&in_pwd3=="6"&&in_pwd4=="6"&&in_pwd5=="6"&&in_pwd6=="6")
  284.                                 {
  285.                                         LCD_Fill(0,200,240,200+16,WHITE);//清除输入新密码提示以及新密码
  286.                                         LCD_ShowString(60,200,200,16,16,"coudle not same as root");
  287.                                         LCD_ShowString(60,220,200,16,16,"password has been back to ");
  288.                                         LCD_ShowString(60,240,200,16,16,"123456");
  289.                                         open_pwd[0]=*"1";
  290.                                         open_pwd[1]=*"2";
  291.                                         open_pwd[2]=*"3";
  292.                                         open_pwd[3]=*"4";
  293.                                         open_pwd[4]=*"5";
  294.                                         open_pwd[5]=*"6";
  295.                                         delay_ms(1500);
  296.                                         LCD_Fill(0,200,240,260,WHITE);
  297.                                 }
  298.                                
  299.                                 mykey=1;//设置为1防止再次进入
  300.                         }
  301.                        
  302.                         if(in_time==6)
  303.                         {
  304.                                 in_time=0;
  305.                                 LCD_Fill(0,200,240,200+16,WHITE);//清除输入新密码提示以及新密码
  306.                                 LCD_ShowString(60,200,200,16,16,"reset complete");
  307.                                 delay_ms(700);
  308.                                 LCD_Fill(60,50,240,110,WHITE);//                清除管理员用户界面提示
  309.                                 LCD_ShowString(60,50,200,16,16,"---ordinary mode---");       
  310.                                 LCD_Fill(0,200,240,200+16,WHITE);//清除Password reset complete
  311.                                 LCD_ShowString(60,200,200,16,16,"PASSWD:");
  312.                                 key=82;

  313.                         }
  314.                                

  315.                 }
  316.                 else
  317.                 {
  318.                         delay_ms(10);          
  319.                         mykey=0;//放手时,归零以便下次重新计数
  320.                 }
  321.         }while(key!=82);
  322.         LCD_Fill(60,50,240,110,WHITE);//                清除管理员用户界面提示
  323.         LCD_ShowString(60,50,200,16,16,"---ordinary mode---");       
  324.         LCD_Fill(0,200,240,200+16,WHITE);//清除Password reset complete
  325.         LCD_ShowString(60,200,200,16,16,"PASSWD:");


  326. }

复制代码

所有资料51hei提供下载:
red line wxs.rar (370.94 KB, 下载次数: 43)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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