找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机连接蓝牙后怎么用啊

[复制链接]
跳转到指定楼层
楼主
ID:338299 发表于 2018-5-25 19:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
弄了个密码锁,通过矩阵键盘输入密码,然后想用手机输入密码,但连了蓝牙后不知道该怎么办,是要在原来的程序中添加什么代码还是要怎样啊,下了个蓝牙串口助手也不知该怎么弄,那位知道的可否指点一下迷津。

代码如下:
  1. #include <reg51.h>


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


  4. uchar count;                                        // 密码位计数
  5. uchar pw[4];                                        // 初始密码存储区
  6. uchar pwbuf[4];                                        // 输入密码存储区
  7. uchar selfdefinebuf[4];                        //自定义密码存储区
  8. uchar error_cnt;                                //错误次数计数器
  9. bit enterflag;                                        // 确认键按下与否标志
  10. bit pwflag;                                                // 密码正确与否标志

  11. bit last_pwflag;                                //前一次密码输入正确与否标志
  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;                                //蓝灯,按键有效指示。低电平亮
  17. void flashred_L(void);                //闪红灯,表示可输入自定义密码
  18. void flashred_S(void);                //快闪红灯,重新输入自定义密码
  19. void flashall(void);                        //三盏灯全亮,不能继续输入







  20. /* 键消抖延时函数 */
  21. void delay(void)
  22. {
  23.         uint i;
  24.         for (i=8000;i>0;i--);
  25. }

  26. //蓝灯亮一下,再灭,用来表示按键按下有效
  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. /* 键扫描函数 */
  45. uchar keyscan()                //键盘扫描函数
  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();  //按键有效指示灯亮,即蓝灯亮
  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;//重设密码键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;//数字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. /* 密码比较函数 */
  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++;                //错误次数加1
  171.                 }
  172.         }
  173.         return(flag);
  174. }

  175. //初始化设置函数
  176. void init_main()
  177. {
  178.         

  179.         count = 0;                                                // 初始没有输入密码,计数器设为0
  180.         error_cnt=0;                                        //错误次数归0
  181.         enterflag = 0;                                        // 没有按下确认键
  182.         pwflag = 0;                                                // 密码标志先置为0
  183.         last_pwflag=0;
  184.                  close=0;                                                                            //锁合灯亮,其它灯灭
  185.                  open = 1;                                                
  186.         beep = 1;                                                
  187.         red=1;
  188.         
  189.         /* 假设内定密码为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)                                        //错误次数小于3
  267.                 {
  268.                 key = keyscan();                                        // 调用键盘扫描函数
  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)                                                // 确认键按下
  282.                         {
  283.                         enterflag = 1;                                // 确认键按下
  284.                         if (count==4)                                 // 只有输入4个密码后按确认键才作密码比较
  285.             {
  286.                delay( );
  287.                                 pwflag = pwcmp();
  288.              }
  289.                         else
  290.                         {                                                
  291.                                 pwflag = 0;                                // 否则直接pmflag赋0
  292.                                 error_cnt++;                        //错误次数加一
  293.                         }
  294.                         last_pwflag=pwflag;                                //前一次密码输入正确与否标志
  295.                         enterflag = 0;                                         // 标志位置回0
  296.                         count = 0;                                                // 密码位计数器清零
  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;                                                // 密码计数清零
  306.                         
  307.                         }
  308.                 else if(key==13)                                           //重设密码键按下
  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)                                //确认键按下
  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];                        //修改密码存储数组
  336.                                                 
  337.                                                 last_pwflag=0;
  338.                                                 enterflag=0;
  339.                                        
  340.                                                 count=0;

  341.                                                 }

  342.                                                 else                        //如果输入数据不足四位或大于四位,输入作废,重新输入
  343.                                                 {
  344.                                                         flashred_S();                                 //快闪红灯,重新输入自定义密码
  345.                                                         count = 0;                                                // 密码计数清零
  346.                                                         
  347.                                                         
  348.                                                         
  349.                                                 }
  350.                                         }
  351.                                 }
  352.                         }
  353.                 }
  354.         }
  355.                 else
  356.                         {
  357.                                 
  358.                                 while(1)                                //错误次数超过三次,停止工作蜂鸣器一直叫
  359.                                    beep=0;
  360.                         }               
  361.         }
  362. }
复制代码



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

使用道具 举报

沙发
ID:34643 发表于 2018-5-25 23:21 | 只看该作者
需要在你的单片机代码中加入串口通信程序。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:317135 发表于 2018-5-28 15:24 | 只看该作者
/**************************************************************************************
*                              串口通信实验                                                                                                  *
实现现象:下载程序后打开串口调试助手,将波特率设置为4800,选择发送的数据就可以显示
                        在串口助手上。具体操作参考操作视频
注意事项:无。                                                                                                                                                                  
***************************************************************************************/

#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;

sbit IN1=P2^0;//控制左电机IN1=0、IN2=0制动,IN1=0、IN2=1正转,IN1=1、IN2=0反转,IN1=1、IN2=1制动.
sbit IN2=P2^1;//控制左电机
sbit IN3=P2^2;//控制右电机
sbit IN4=P2^3;//控制右电机

/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能                   :设置串口
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void UsartInit()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能                 : 主函数
* 输    入       : 无
* 输    出             : 无
*******************************************************************************/
void main()
{       
        while(1)
        {
        UsartInit();  //        串口初始化       
        }       
}

/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能                  : 串口通信中断函数
* 输入           : 无
* 输出                  : 无
*******************************************************************************/
void Usart() interrupt 4
{
        u8 receiveData;

        receiveData=SBUF;//出去接收到的数据
        if(SBUF==0x00)
         {IN1=1;IN2=1;IN3=1;IN4=1;}
         else if(SBUF==0x01)
         {IN1=0;IN2=1;IN3=0;IN4=0;}
         else if(SBUF==0x02)
         {IN1=0;IN2=1;IN3=0;IN4=0;}
     else if(SBUF==0x03)
         {IN1=0;IN2=1;IN3=0;IN4=0;}
         else if(SBUF==0x04)
         {IN1=0;IN2=0;IN3=0;IN4=1;}
         else if(SBUF==0x05)
         {IN1=0;IN2=0;IN3=0;IN4=1;}
         else if(SBUF==0x06)
         {IN1=0;IN2=0;IN3=0;IN4=1;}
         else if(SBUF==0x07)
         {IN1=0;IN2=1;IN3=0;IN4=1;}
         else
         {IN1=0;IN2=0;IN3=0;IN4=0;}
        RI = 0;//清除接收中断标志位
        SBUF=receiveData;//将接收到的数据放入到发送寄存器
        while(!TI);                         //等待发送数据完成
        TI=0;                                                 //清除发送完成标志位
}
回复

使用道具 举报

地板
ID:97941 发表于 2018-5-28 16:57 | 只看该作者
蓝牙只是作为一个无线传输的媒介,取代USB串口线的一种方式。建议按照以下步骤:
1.先用有线串口模块连接单片机和电脑,调试串口程序,先实现通过串口调试助手发送密码可以解锁
2.配置蓝牙(包括波特率、配对密码设置)
3.把蓝牙模块替换有线串口模块,在安卓手机端安装串口调试助手进行测试
回复

使用道具 举报

5#
ID:338299 发表于 2018-5-28 22:01 | 只看该作者
断水流93 发表于 2018-5-28 16:57
蓝牙只是作为一个无线传输的媒介,取代USB串口线的一种方式。建议按照以下步骤:
1.先用有线串口模块连接 ...

电脑是不是只要用USB连接单片机,然后下个串口调试助手就可以呀?我下了之后发送消息没有反应,是还少弄了什么吗?
回复

使用道具 举报

6#
ID:341207 发表于 2018-5-30 10:48 | 只看该作者
loading88 发表于 2018-5-28 15:24
/**************************************************************************************
*                         ...

请问一下这个程序是下载到单片机吗,然后用手机串口助手调试?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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