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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6843|回復: 1
打印 上一主題 下一主題
收起左側

用STM32做的紅外遙控器密碼鎖源程序

[復制鏈接]
跳轉到指定樓層
樓主

   
實驗目的:
    學習紅外遙控器的使用.
   
硬件資源:
    1,DS0(連接在PA8)
    2,串口1(波特率:9600,PA9/PA10連接在板載USB轉串口芯片CH340上面)
    3,ALIENTEK 2.8/3.5/4.3/7寸TFTLCD模塊(通過GPIO驅動,連接關系見lcd.h)
    4,定時器5(TIM5),使用TIM5_CH2(PA1)的輸入捕獲,來解碼紅外信號.
    5,ALIENTEK紅外遙控器
        
實驗現象:
    本實驗開機在LCD上顯示一些信息之后,即進入等待紅外觸發,如過接收到正確的紅外信號,則解碼,并在LCD上顯示
    鍵值和所代表的意義,以及按鍵次數等信息。同樣我們也是用DS0來指示程序正在運行。

注意事項:  
    1,4.3寸和7寸屏需要比較大電流,USB供電可能不足,請用外部電源供電(5V電源,接VOUT2即可).
    2,本例程在LCD_Init函數里面(在ILI93xx.c),用到了printf,如果不初始化串口1,將導致液晶無法顯示!!
    3,LCD模塊在開發板的LCD接口上面,必須靠右插
    4,紅外遙控器尾部默認帶了一個小塑料片擋住電池供電,正常使用之前,請抽出這個塑料墊片.

單片機源程序如下:
  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. //ALIENTEK Mini STM32開發板范例代碼22
  9. //紅外遙控實驗  
  10. u8 *in_pwd1=0;
  11. u8 *in_pwd2=0;
  12. u8 *in_pwd3=0;
  13. u8 *in_pwd4=0;
  14. u8 *in_pwd5=0;
  15. u8 *in_pwd6=0;
  16. u8 *str=0;         
  17. int fall_time=0;

  18. u8 open_pwd[6]="123456";//初始密碼
  19. u8 root_pwd[6]="666666";//管理員密碼
  20. int in_time=0;
  21. int mykey=0;//控制in_time每按一個按鍵只加一次的坎兒

  22. void re_in(void);//重置/重新輸入

  23. void root_h(void);//管理員函數

  24. int main(void)
  25. {
  26.         u8 key;
  27.         u8 t=0;        
  28.         delay_init();                     //延時函數初始?
  29.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 設置中斷優先級分組2         
  30.         uart_init(9600);                 //串口初始化為9600
  31.         LED_Init();                                  //初始化與LED連接的硬件接口
  32.          LCD_Init();
  33.         Remote_Init();                        //紅外接收初始化         
  34.          POINT_COLOR=BLACK;//設置字體為紅色
  35.         LCD_ShowString(30,50,200,16,16,"---ordinary mode---");        
  36.         LCD_ShowString(30,70,200,16,16,"Please enter 6 password");        
  37.         //LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
  38.         //LCD_ShowString(60,110,200,16,16,"2014/3/12");

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

  109.                                         }
  110.                                 }
  111.                                 
  112.                                 mykey=1;//設置為1防止再次進入
  113.                         }


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





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

  192. void root_h(void)//管理員用戶函數
  193. {

  194.         u8 key;
  195.         in_time=0;
  196.         mykey=0;
  197.         in_pwd1="0";
  198.         in_pwd2="0";
  199.         in_pwd3="0";
  200.         in_pwd4="0";
  201.         in_pwd5="0";
  202.         in_pwd6="0";
  203.         
  204.         LED1=!LED1;//綠燈閃爍提示
  205.         delay_ms(100);
  206.         LED1=!LED1;
  207.         delay_ms(100);
  208.         LED1=!LED1;
  209.         delay_ms(100);
  210.         LED1=!LED1;

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

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

  315.                         }
  316.                                 

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


  328. }

復制代碼

所有資料51hei提供下載:
紅外遙控器密碼鎖.rar (378.81 KB, 下載次數: 65)



評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:607490 發表于 2019-10-30 09:39 | 只看該作者
這個寫法很像學校要交的實驗報告,就差手畫簡單原理圖了
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 最新国产在线 | 国产精品自在线 | 欧美日韩在线观看一区二区三区 | 色爱综合网 | 国产激情视频在线 | 国产69久久精品成人看动漫 | 亚洲美女在线一区 | 91中文在线观看 | 99精品国自产在线 | 国产成人福利在线 | 亚洲成人精品国产 | 亚洲精品亚洲人成人网 | 久久久久国产精品一区 | 超碰成人在线观看 | 日韩精品一区二区三区免费视频 | 日韩一区二区在线视频 | cao视频| 一区二区三区四区不卡视频 | 日韩一区二区三区在线播放 | 99看片网| 久久久久久免费毛片精品 | 国产精品亚洲成在人线 | 欧美日韩三级 | 久久久高清 | 国产高清视频 | 久久久久国产精品一区二区 | 成人视屏在线观看 | 一二三区在线 | 91午夜在线 | 99精品视频在线 | 亚洲在线 | 波多野结衣电影一区 | 久久国产精品免费一区二区三区 | 国产欧美在线观看 | 羞羞色影院 | 午夜天堂精品久久久久 | 国产成人精品一区二区 | 亚州一区二区三区 | 成人中文字幕av | 亚洲日韩中文字幕一区 | 欧美区日韩区 |