找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

我的單片機控制6188藍牙模塊程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:526841 發(fā)表于 2019-5-9 12:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我之前做的用STC89C516單片機芯片做的控制6188藍牙模塊的程序
都是自己原創(chuàng)的,還有很多不是很完善的地方(比如按鍵響應有點長了點)

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

  3. typedef unsigned int u16;          //對數(shù)據(jù)類型進行聲明定義
  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. //用來存放按鍵狀態(tài)
  35. unsigned char PuZh[]=" Pechin Science ";
  36. unsigned char dat[]="0123456789ABCDEF";
  37. void Delay10ms();   //延時50us
  38. void KeyDown();                 //檢測按鍵函數(shù)

  39. /*******************************************************************************
  40. * 函 數(shù) 名         : main
  41. * 函數(shù)功能                   : 主函數(shù)
  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;                        //設置計數(shù)器工作方式2
  51.         PCON=0X00;//0x80;                        //0x80是波特率加倍波特率變19200  
  52.         TH1=0XFD;//D;//3;                                //計數(shù)器初始值設置
  53.         TL1=0XFD;//D;//3;
  54.         ES=1;                                                //打開接收中斷
  55.         EA=1;                                                //打開總中斷
  56.         TR1=1;                                        //打開計數(shù)器

  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. * 函 數(shù) 名         : KeyDown
  142. * 函數(shù)功能                   : 檢測有按鍵按下并讀取鍵值
  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意思是把數(shù)碼管全滅掉。
  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;        //輸入寫入緩存后硬件自動發(fā)送
  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, 下載次數(shù): 14)


評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表