找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我的单片机控制6188蓝牙模块程序

[复制链接]
跳转到指定楼层
楼主
ID:526841 发表于 2019-5-9 12:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是我之前做的用STC89C516单片机芯片做的控制6188蓝牙模块的程序
都是自己原创的,还有很多不是很完善的地方(比如按键响应有点长了点)

单片机源程序如下:
  1. #include<reg51.h>        
  2. #include"lcd.h"

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

  5. #define GPIO_KEY P1

  6. #define U8 u8
  7. #define U16 u16


  8. #define K_PLAY        0x01//F
  9. #define K_PREV        0x02//B
  10. #define K_NEXT        0x03//7
  11. #define                Bt_PlayPause_Cmd                "MA"    //音乐播放\暂停  AT+MA\r\n
  12. #define                Bt_Stop_Cmd                                "MC"    //音乐停止  AT+MC\r\n
  13. #define                Bt_Next_Cmd                                "MD"    //下一曲  AT+MD\r\n
  14. #define                Bt_Previous_Cmd                        "ME"    //上一曲  AT+ME\r\n

  15. #define                TxLEN_MAX                16
  16. #define                RxLEN_MAX                36
  17. #define                MAX_INFO_NUM                0x0A
  18. #define MAX_INFO_LEN 5         

  19. bit btlink = 0;

  20. xdata U8 UartRxBuf[RxLEN_MAX];
  21. xdata U8 UartRxIdx;
  22. xdata U8 UartTimeout;

  23. xdata U8 UartTxBuf[TxLEN_MAX+1];
  24. xdata U8 UartTxIdx;
  25. xdata U8 UartTxLen;

  26. #define UARTRI                0X01
  27. #define UARTTI                0X02
  28. #define UART_RI                0X01
  29. #define UART_TI                0X02


  30. unsigned char KeyValue;
  31. unsigned char dg_ram1=0,dg_ram2 = 0;
  32. //用来存放读取到的键值
  33. unsigned char KeyState;
  34. //用来存放按键状态
  35. unsigned char PuZh[]=" Pechin Science ";
  36. unsigned char dat[]="0123456789ABCDEF";
  37. void Delay10ms();   //延时50us
  38. void KeyDown();                 //检测按键函数

  39. /*******************************************************************************
  40. * 函 数 名         : main
  41. * 函数功能                   : 主函数
  42. * 输    入         : 无
  43. * 输    出         : 无
  44. *******************************************************************************/
  45. void scan_key(void);
  46. void uart_cmd(U8 *cmd);
  47. void UsartInit()
  48. {
  49.         SCON=0X50;                        //设置为工作方式1
  50.         TMOD=0X20;                        //设置计数器工作方式2
  51.         PCON=0X00;//0x80;                        //0x80是波特率加倍波特率变19200  
  52.         TH1=0XFD;//D;//3;                                //计数器初始值设置
  53.         TL1=0XFD;//D;//3;
  54.         ES=1;                                                //打开接收中断
  55.         EA=1;                                                //打开总中断
  56.         TR1=1;                                        //打开计数器

  57. }


  58. code  U8 _bt_info[MAX_INFO_NUM][2] = {         {'I', 'I'},   // A connect A2DP
  59.                                                                                 {'M', 'A'},        // music pause
  60.                                                                                 {'M', 'B'}, // music play
  61.                                                                                 {'C', '1'},
  62.                                                                                 {'C', '0'},
  63.                                                                                 {'I', 'A'},
  64.                                                                                 };// 通话中

  65. void uart_dat(void)
  66. {
  67.                         if(UartTimeout)
  68.                         {
  69.                                 if(UartTimeout>2)
  70.                                 {
  71.                                         UartTimeout=0x80;
  72.                                 }
  73.                                 else
  74.                                 {
  75.                                         UartTimeout++;
  76.                                 }
  77.                         }
  78.                         
  79.                         if(UartRxIdx>=0x80)
  80.                         {
  81.                                 U8 j;

  82.                                 for(j=0; j<MAX_INFO_NUM; j++)
  83.                                 {
  84.                                         dg_ram1++;
  85.                                         if(dg_ram1>0x0f)
  86.                                         dg_ram1 = 0;
  87.                                         if ((_bt_info[j][0] == UartRxBuf[0])||(_bt_info[j][1] == UartRxBuf[1])||(0x0d == UartRxBuf[2]))
  88.                                         {
  89.                                    dg_ram2 = j;
  90.                                         break;
  91.                                         }
  92.                                 }
  93.                                 if(j < 4)
  94.                                 {
  95.                                         btlink = 1;
  96.                                 }
  97.                                 else if(j < MAX_INFO_NUM)
  98.                                 {
  99.                                         btlink = 0;
  100.                                 }
  101.                                 UartRxIdx = 0;
  102.                         }
  103.                         if(UartTimeout>=0x80)
  104.                         {
  105.                                 UartTimeout = 0;
  106.                                 UartRxIdx = 0x00;
  107.                         }

  108.                                    if(dg_ram2>0x0f)
  109.                                    dg_ram2 = 0;
  110. }

  111. void main(void)
  112. {
  113.         unsigned char i;
  114.         LcdInit();
  115.         UsartInit();
  116.         UartTxIdx = 0;
  117.         UartTxLen = 0;
  118.         UartRxIdx = 0;
  119.         UartTimeout = 0;

  120.         KeyState=0;
  121.         for(i=0;i<16;i++)
  122.         {
  123.                 LcdWriteData(PuZh[i]);        
  124.         }
  125.         while(1)
  126.         {
  127. //        UsartInit();
  128.         uart_dat();
  129.                 KeyDown();
  130.                 scan_key();

  131.                 if(KeyState)
  132.                 {
  133.                         KeyState=0;

  134.                         LcdWriteCom(0x80+0x40);
  135.                         LcdWriteData(dat[KeyValue]);

  136.                                                 

  137.                 }
  138.         }                                
  139. }
  140. /*******************************************************************************
  141. * 函 数 名         : KeyDown
  142. * 函数功能                   : 检测有按键按下并读取键值
  143. * 输    入         : 无
  144. * 输    出         : 无
  145. *******************************************************************************/
  146. void KeyDown(void)
  147. {
  148.         char a;
  149.         GPIO_KEY=0x0f;
  150.         if(GPIO_KEY!=0x0f)
  151.         {
  152.                 Delay10ms();
  153.                 if(GPIO_KEY!=0x0f)
  154.                 {
  155.                         KeyState=1;
  156.                         //测试列
  157.                         GPIO_KEY=0X0F;
  158. //                         Delay10ms();
  159.                         switch(GPIO_KEY)
  160.                         {
  161.                                 case(0X07):        KeyValue=0;break;
  162.                                 case(0X0b):        KeyValue=1;break;
  163.                                 case(0X0d): KeyValue=2;break;
  164.                                 case(0X0e):        KeyValue=3;break;
  165. //                                default:        KeyValue=17;        //检测出错回复17意思是把数码管全灭掉。
  166.                         }
  167.                         //测试行
  168.                         GPIO_KEY=0XF0;
  169.                         Delay10ms();
  170.                         switch(GPIO_KEY)
  171.                         {
  172.                                 case(0X70):        KeyValue=KeyValue;break;
  173.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  174.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  175.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  176. //                                default:        KeyValue=17;
  177.                         }
  178.                         while((a<100)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
  179.                         {
  180.                                 Delay10ms();
  181.                                 a++;
  182.                         }
  183.                         a=0;
  184.                 }
  185.         }
  186. }
  187. //-----------------------------------------------------------------------------
  188. //-----------------------------------------------------------------------------
  189. U8 Uart1TxData(U8 *dat, U8 len)
  190. {
  191.         U8 i;
  192.         if(UartTxIdx == UartTxLen)
  193.         {
  194.                 for(i=0; i<len; i++)
  195.                 {
  196.                         UartTxBuf[i] = *(dat+i);
  197.                 }
  198.                 UartTxIdx = 0x0;
  199.                 UartTxLen = len;

  200.                 SCON &= ~UARTTI;        //清TI
  201.                 SBUF = *dat;        //输入写入缓存后硬件自动发送
  202.                 return 1;
  203.         }
  204.         else
  205.                 return 0;
  206. }

  207. //-----------------------------------------------------------------------------

  208. void uart_cmd(U8 *cmd)
  209. {
  210.         U8 cmdbuf[7];
  211.         cmdbuf[0] = 'A';
  212.     cmdbuf[1] = 'T';
  213.     cmdbuf[2] = '+';
  214.     cmdbuf[3] = cmd[0];
  215.     cmdbuf[4] = cmd[1];
  216.     cmdbuf[5] = 0x0d;
  217.     cmdbuf[6] = 0x0a;
  218.         Uart1TxData(cmdbuf, 7);
  219. }

  220. //-----------------------------------------------------------------------------
  221. void scan_key(void)
  222. {

  223.         if(KeyState)
  224.         {
  225.                    switch(KeyValue)
  226.                 {
  227.             case K_PREV:
  228.                                 if(1)
  229.                                 {        
  230.                                         uart_cmd(Bt_Previous_Cmd);
  231.                                 }
  232.                 break;
  233. ////////////////////////////下一曲/////////////////////////////////////////
  234.             case K_NEXT:
  235.                                 if(1)
  236.                                 {         

  237.                                         uart_cmd(Bt_Next_Cmd);
  238.                                 }
  239.                 break;
  240. ////////////////////////////播放暂停////////////////////////////////////////
  241.                         case K_PLAY:               
  242.                                 if(1)
  243.                                 {         
  244.                                         uart_cmd(Bt_PlayPause_Cmd);
  245.                                 }
  246.                                 break;

  247.                         default:
  248.                                 break;

  249.                 }
  250.         }
  251. }



  252. void Usart() interrupt 4
  253. {
  254.         u8        cchr;
  255.         if(RI==1)//接收的中断
  256.         {
  257.                         cchr = SBUF;
  258.                         UartTimeout = 1;
  259.                         if(UartRxIdx<MAX_INFO_LEN)
  260.                         {
  261.                                 UartRxBuf[UartRxIdx++] = cchr;
  262.                                 if(cchr == 0x0A)
  263.                                 {
  264. ……………………

  265. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
6199蓝牙模块ok的 - 副本.rar (1002.5 KB, 下载次数: 14)


评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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