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

標(biāo)題: 51單片機(jī)密碼鎖連接藍(lán)牙 [打印本頁]

作者: a1034    時間: 2018-6-17 10:15
標(biāo)題: 51單片機(jī)密碼鎖連接藍(lán)牙
弄了個密碼鎖,通過矩陣鍵盤輸入密碼,然后想用手機(jī)輸入密碼,要在原來的程序中加什么代碼才可以實現(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;                                        // 密碼位計數(shù)
  5. uchar pw[4];                                        // 初始密碼存儲區(qū)
  6. uchar pwbuf[4];                                        // 輸入密碼存儲區(qū)
  7. uchar selfdefinebuf[4];                        //自定義密碼存儲區(qū)
  8. uchar error_cnt;                                //錯誤次數(shù)計數(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ù) */
  21. void delay(void)
  22. {
  23.         uint i;
  24.         for (i=8000;i>0;i--);
  25. }

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


  33. // 蜂鳴器短叫 報警
  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)  //按鍵抬起檢測
  69.                         {
  70.                                 temp=P1;
  71.                                 temp=temp&0xf0;
  72.                         }        
  73.                 }
  74.                                       else return 0;//無鍵按下返回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++;                //錯誤次數(shù)加1
  171.                 }
  172.         }
  173.         return(flag);
  174. }

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

  179.         count = 0;                                                // 初始沒有輸入密碼,計數(shù)器設(shè)為0
  180.         error_cnt=0;                                        //錯誤次數(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. //長閃紅燈,表示可輸入自定義密碼
  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)                                        //錯誤次數(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個密碼后按確認(rèn)鍵才作密碼比較
  285.             {
  286.                delay( );
  287.                                 pwflag = pwcmp();
  288.              }
  289.                         else
  290.                         {                                                
  291.                                 pwflag = 0;                                // 否則直接pmflag賦0
  292.                                 error_cnt++;                        //錯誤次數(shù)加一
  293.                         }
  294.                         last_pwflag=pwflag;                                //前一次密碼輸入正確與否標(biāo)志
  295.                         enterflag = 0;                                         // 標(biāo)志位置回0
  296.                         count = 0;                                                // 密碼位計數(shù)器清零
  297.                                 delay( );
  298.                         if (pwflag==1)                        
  299.                                 {open = 0; close=1;red=1;beep=1;}   //密碼正確時,綠燈亮,其它燈滅                                       
  300.                         else                                                        
  301.                                 {open=1;close=0;red=1;baojing(); }   //密碼錯誤時,黃燈亮并短報警                                       
  302.                         }

  303.                 else if(key==12)                                        // 取消鍵按下
  304.                         {        
  305.                         count = 0;                                                // 密碼計數(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];                        //修改密碼存儲數(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;                                                // 密碼計數(shù)清零
  346.                                                         
  347.                                                         
  348.                                                         
  349.                                                 }
  350.                                         }
  351.                                 }
  352.                         }
  353.                 }
  354.         }
  355.                 else
  356.                         {
  357.                                 
  358.                                 while(1)                                //錯誤次數(shù)超過三次,停止工作蜂鳴器一直叫
  359.                                    beep=0;
  360.                         }               
  361.         }
  362. }
復(fù)制代碼




作者: 小貓貓愛吃魚    時間: 2018-6-17 12:12
你好!要實現(xiàn)這個功能,程序改動會很大;
1、單片機(jī)選擇合適的晶振
2、單片機(jī)增加串口電路,接入藍(lán)牙
3、編寫單片機(jī)串口部分的程序,和藍(lán)牙通訊
4、設(shè)計手機(jī) APP ,看你會什么語言
5、APP 增加藍(lán)牙控件, 實現(xiàn)和單片機(jī)藍(lán)牙配對
6、如果還是不明白,看我頭像,代做設(shè)計




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美日韩精品综合 | 超级碰在线 | 成年人精品视频 | 免费精品久久久久久中文字幕 | 亚洲国产电影 | 夜夜爽99久久国产综合精品女不卡 | 亚洲黄色在线免费观看 | 日本欧美在线视频 | 日韩一区在线视频 | 国产精品视频在 | 精品国产伦一区二区三区观看说明 | 欧美αv | 久久精品小视频 | 国产精品国产a级 | 另类 综合 日韩 欧美 亚洲 | 亚洲一区二区三区免费观看 | 欧美一区中文字幕 | 一区二区亚洲 | www操操 | 久久黄网 | 成人在线免费视频 | 亚洲综合久久久 | 亚洲午夜精品 | 亚洲图片一区二区三区 | 狠狠的操 | 超碰免费在线 | 天天干天天想 | 欧美精品在线免费观看 | 逼逼视频 | avav在线看| 91高清免费观看 | 免费观看www7722午夜电影 | 国产成人精品久久二区二区91 | 国产精品久久久久久久久久三级 | 毛片免费观看视频 | 久久tv在线观看 | 91麻豆精品国产91久久久更新资源速度超快 | 亚洲成人播放器 | 中文字幕免费在线观看 | 日日骚av| 亚洲精品一 |