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

QQ登錄

只需一步,快速開始

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

51單片機(jī)密碼鎖連接藍(lán)牙

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:338299 發(fā)表于 2018-6-17 10:15 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
40黑幣
弄了個(gè)密碼鎖,通過(guò)矩陣鍵盤輸入密碼,然后想用手機(jī)輸入密碼,要在原來(lái)的程序中加什么代碼才可以實(shí)現(xiàn)藍(lán)牙控制啊,還有手機(jī)藍(lán)牙串口助手應(yīng)該怎么設(shè)置那些按鍵,求大神幫幫忙
  1. #include <reg51.h>


  2. #define uchar unsigned char
  3. #define uint unsigned int


  4. uchar count;                                        // 密碼位計(jì)數(shù)
  5. uchar pw[4];                                        // 初始密碼存儲(chǔ)區(qū)
  6. uchar pwbuf[4];                                        // 輸入密碼存儲(chǔ)區(qū)
  7. uchar selfdefinebuf[4];                        //自定義密碼存儲(chǔ)區(qū)
  8. uchar error_cnt;                                //錯(cuò)誤次數(shù)計(jì)數(shù)器
  9. bit enterflag;                                        // 確認(rèn)鍵按下與否標(biāo)志
  10. bit pwflag;                                                // 密碼正確與否標(biāo)志

  11. bit last_pwflag;                                //前一次密碼輸入正確與否標(biāo)志
  12. sbit open=P2^5;                                                        //鎖開指示燈,綠燈。低電平亮
  13. sbit beep=P2^0;                                //蜂鳴器,低電平叫
  14. sbit red=P2^1;                                //紅燈,低電平亮
  15. sbit close=P2^7;                                //鎖合指示燈,黃色。低電平亮
  16. sbit youxiao=P2^3;                                //藍(lán)燈,按鍵有效指示。低電平亮
  17. void flashred_L(void);                //閃紅燈,表示可輸入自定義密碼
  18. void flashred_S(void);                //快閃紅燈,重新輸入自定義密碼
  19. void flashall(void);                        //三盞燈全亮,不能繼續(xù)輸入







  20. /* 鍵消抖延時(shí)函數(shù) */
  21. void delay(void)
  22. {
  23.         uint i;
  24.         for (i=8000;i>0;i--);
  25. }

  26. //藍(lán)燈亮一下,再滅,用來(lái)表示按鍵按下有效
  27. void youxiaoled()
  28. {
  29.         youxiao=0;
  30.         delay();
  31.         youxiao=1;
  32. }


  33. // 蜂鳴器短叫 報(bào)警
  34. void baojing()
  35. {
  36.    beep=0;
  37.    delay();
  38.    beep=1;
  39.    delay();
  40.    beep=0;
  41.    delay();
  42.    beep=1;
  43. }


  44. /* 鍵掃描函數(shù) */
  45. uchar keyscan()                //鍵盤掃描函數(shù)
  46. {                  uchar temp;
  47.         P1=0xfe;
  48.         temp=P1;
  49.         temp=temp&0xf0;
  50.         if(temp!=0xf0)
  51.         {
  52.                 delay();        //鍵盤去抖,
  53.                 temp=P1;
  54.                 temp=temp&0xf0;
  55.                 if(temp!=0xf0)
  56.                 {      youxiaoled();  //按鍵有效指示燈亮,即藍(lán)燈亮
  57.                         
  58.                         temp=P1;
  59.                         switch(temp)
  60.                         {
  61.                                 case 0xee: return 1;break;
  62.                                 case 0xde: return 2;break;
  63.                                 
  64.                                 case 0xbe:return 3;break;
  65.                                 case 0x7e:return  11;break; //確定鍵 11                                
  66.                                 
  67.                         }
  68.                         while(temp!=0xf0)  //按鍵抬起檢測(cè)
  69.                         {
  70.                                 temp=P1;
  71.                                 temp=temp&0xf0;
  72.                         }        
  73.                 }
  74.                                       else return 0;//無(wú)鍵按下返回0
  75.         }
  76.         P1=0xfd;
  77.         temp=P1;
  78.         temp=temp&0xf0;
  79.         if(temp!=0xf0)
  80.         {
  81.                 delay();
  82.                 temp=P1;
  83.                 temp=temp&0xf0;
  84.                 if(temp!=0xf0)
  85.                 {      youxiaoled();
  86.                         
  87.                         temp=P1;
  88.                         switch(temp)
  89.                         {
  90.                                 case 0xed: return 4;break;
  91.                                 case 0xdd: return 5;break;
  92.                                 case 0xbd:return 6;break;
  93.                 case 0x7d:return 12;break;//取消鍵12
  94.                         }
  95.                         while(temp!=0xf0)
  96.                         {
  97.                                 temp=P1;
  98.                                 temp=temp&0xf0;
  99.                         }
  100.                 }
  101.                                       else return 0;
  102.         }
  103.         P1=0xfb;
  104.         temp=P1;
  105.         temp=temp&0xf0;
  106.         if(temp!=0xf0)
  107.         {
  108.                 delay();
  109.                 temp=P1;
  110.                 temp=temp&0xf0;
  111.                 if(temp!=0xf0)
  112.                 {        youxiaoled();
  113.                         
  114.                         temp=P1;
  115.                         switch(temp)
  116.                         {
  117.                                 case 0xeb:return 7;break;
  118.                                 case 0xdb: return 8;break;
  119.                                 case 0xbb:return 9;break;
  120.                case 0x7b:return 13;break;//重設(shè)密碼鍵13
  121.                         }
  122.                         while(temp!=0xf0)
  123.                         {
  124.                                 temp=P1;
  125.                                 temp=temp&0xf0;
  126.                         }
  127.                 }
  128.                                        else return 0;
  129.         }
  130.         P1=0xf7;
  131.         temp=P1;
  132.         temp=temp&0xf0;
  133.         if(temp!=0xf0)
  134.         {
  135.                 delay();
  136.                 temp=P1;
  137.                 temp=temp&0xf0;
  138.                 if(temp!=0xf0)
  139.                 {      youxiaoled();
  140.                
  141.                         temp=P1;
  142.                         switch(temp)
  143.                         {
  144.                                 case 0xe7:return 10;break;//數(shù)字0
  145.                default :break;
  146.                         }
  147.                         while(temp!=0xf0)
  148.                         {
  149.                                 temp=P1;
  150.                                 temp=temp&0xf0;
  151.                         }
  152.                 }
  153.                                    else return 0;
  154.         }
  155.         
  156. }




  157. /* 密碼比較函數(shù) */
  158. bit pwcmp(void)
  159. {
  160.         bit flag;
  161.         uchar i;
  162.         for (i=0;i<4;i++)
  163.         {
  164.                 if (pw[i]==pwbuf[i])
  165.                         flag = 1;
  166.                 else
  167.                 {
  168.                         flag = 0;
  169.                         i = 4;
  170.                         error_cnt++;                //錯(cuò)誤次數(shù)加1
  171.                 }
  172.         }
  173.         return(flag);
  174. }

  175. //初始化設(shè)置函數(shù)
  176. void init_main()
  177. {
  178.         

  179.         count = 0;                                                // 初始沒有輸入密碼,計(jì)數(shù)器設(shè)為0
  180.         error_cnt=0;                                        //錯(cuò)誤次數(shù)歸0
  181.         enterflag = 0;                                        // 沒有按下確認(rèn)鍵
  182.         pwflag = 0;                                                // 密碼標(biāo)志先置為0
  183.         last_pwflag=0;
  184.                  close=0;                                                                            //鎖合燈亮,其它燈滅
  185.                  open = 1;                                                
  186.         beep = 1;                                                
  187.         red=1;
  188.         
  189.         /* 假設(shè)內(nèi)定密碼為1234, 修改初始密碼可在這里改*/
  190.         pw[0] = 1;
  191.         pw[1] = 2;
  192.         pw[2] = 3;
  193.         pw[3] = 4;
  194.         
  195. }
  196. //長(zhǎng)閃紅燈,表示可輸入自定義密碼
  197. void flashred_L(void)
  198. {
  199.         red=0;
  200.         delay();
  201.         delay();
  202.         delay();
  203.         delay();
  204.         red=1;
  205.         delay();
  206.         delay();
  207.         delay();
  208.         delay();
  209.         red=0;
  210.         delay();
  211.         delay();
  212.         delay();
  213.         delay();
  214.         red=1;
  215.         delay();
  216.         delay();
  217.         delay();
  218.         delay();
  219.         red=0;
  220.         delay();
  221.         delay();
  222.         delay();
  223.         delay();
  224.         red=1;
  225. }
  226. //快閃紅燈,重新輸入自定義密碼
  227. void flashred_S(void)
  228. {
  229.         red=0;
  230.         delay();
  231.         delay();
  232.         red=1;
  233.         delay();
  234.         delay();
  235.         red=0;
  236.         delay();
  237.         delay();
  238.         red=1;
  239.         delay();
  240.         delay();
  241.         red=0;
  242.         delay();
  243.         delay();
  244.         red=1;
  245. }
  246. void flashall(void)
  247. {
  248.         beep=0;
  249.         open=0;
  250.         red=0;
  251.         delay();
  252.         delay();
  253.         beep=1;
  254.         open=1;
  255.         red=1;
  256. }
  257. /* 主程序 */
  258. void main()
  259. {
  260.         uchar j, key;
  261.         uchar tempkey;

  262.         init_main();
  263.         

  264.           while(1)
  265.     {
  266.                 if(error_cnt<3)                                        //錯(cuò)誤次數(shù)小于3
  267.                 {
  268.                 key = keyscan();                                        // 調(diào)用鍵盤掃描函數(shù)
  269.                
  270.                 if(key>0&&key<=10)                                //用戶輸入密碼
  271.                         {
  272.                         if(key==10)
  273.                                 key=0;
  274.                            if (count<4)
  275.                         {
  276.                                 pwbuf[count] = key;
  277.                                 count++;
  278.                         }
  279.                         }
  280.         
  281.                 else if(key==11)                                                // 確認(rèn)鍵按下
  282.                         {
  283.                         enterflag = 1;                                // 確認(rèn)鍵按下
  284.                         if (count==4)                                 // 只有輸入4個(gè)密碼后按確認(rèn)鍵才作密碼比較
  285.             {
  286.                delay( );
  287.                                 pwflag = pwcmp();
  288.              }
  289.                         else
  290.                         {                                                
  291.                                 pwflag = 0;                                // 否則直接pmflag賦0
  292.                                 error_cnt++;                        //錯(cuò)誤次數(shù)加一
  293.                         }
  294.                         last_pwflag=pwflag;                                //前一次密碼輸入正確與否標(biāo)志
  295.                         enterflag = 0;                                         // 標(biāo)志位置回0
  296.                         count = 0;                                                // 密碼位計(jì)數(shù)器清零
  297.                                 delay( );
  298.                         if (pwflag==1)                        
  299.                                 {open = 0; close=1;red=1;beep=1;}   //密碼正確時(shí),綠燈亮,其它燈滅                                       
  300.                         else                                                        
  301.                                 {open=1;close=0;red=1;baojing(); }   //密碼錯(cuò)誤時(shí),黃燈亮并短報(bào)警                                       
  302.                         }

  303.                 else if(key==12)                                        // 取消鍵按下
  304.                         {        
  305.                         count = 0;                                                // 密碼計(jì)數(shù)清零
  306.                         
  307.                         }
  308.                 else if(key==13)                                           //重設(shè)密碼鍵按下
  309.                 {                  open=1;
  310.                         if(last_pwflag==1)                                //判斷上次用戶輸入密碼正確與否
  311.                         {
  312.                                 
  313.                                 flashred_L();                                //閃紅燈表示可輸入自定義密碼
  314.                                 while(last_pwflag)
  315.                                 {
  316.                                         tempkey=keyscan();
  317.                
  318.                                         if(tempkey>0&&tempkey<=10)                                //用戶輸入密碼
  319.                                         {
  320.                                                 if(tempkey==10)
  321.                                                         tempkey=0;
  322.                                            if (count<4)
  323.                                                 {
  324.                                                 selfdefinebuf[count] = tempkey;                        //保存用戶自定義密碼
  325.                                                 count++;
  326.                                                 }
  327.                                         }
  328.                                        
  329.                                         else if(tempkey==11)                                //確認(rèn)鍵按下
  330.                                         {        
  331.                                                 enterflag=1;
  332.                                                 if(count==4)
  333.                                                 {close=0;open=1;beep=1;
  334.                                                 for(j=0;j<4;j++)
  335.                                                         pw[j]=selfdefinebuf[j];                        //修改密碼存儲(chǔ)數(shù)組
  336.                                                 
  337.                                                 last_pwflag=0;
  338.                                                 enterflag=0;
  339.                                        
  340.                                                 count=0;

  341.                                                 }

  342.                                                 else                        //如果輸入數(shù)據(jù)不足四位或大于四位,輸入作廢,重新輸入
  343.                                                 {
  344.                                                         flashred_S();                                 //快閃紅燈,重新輸入自定義密碼
  345.                                                         count = 0;                                                // 密碼計(jì)數(shù)清零
  346.                                                         
  347.                                                         
  348.                                                         
  349.                                                 }
  350.                                         }
  351.                                 }
  352.                         }
  353.                 }
  354.         }
  355.                 else
  356.                         {
  357.                                 
  358.                                 while(1)                                //錯(cuò)誤次數(shù)超過(guò)三次,停止工作蜂鳴器一直叫
  359.                                    beep=0;
  360.                         }               
  361.         }
  362. }
復(fù)制代碼



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

使用道具 舉報(bào)

沙發(fā)
ID:303383 發(fā)表于 2018-6-17 12:12 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表