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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

關于用stc89c52單片機藍牙遙控器

[復制鏈接]
跳轉到指定樓層
樓主
ID:892737 發表于 2021-8-11 16:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問一下大家,我這個51遙控器程序有什么問題嗎?實物的連接時P1和P3上接著按鍵,按鍵另一邊全部共地但是按按鍵時接收端沒有反應,手機可以正常控制接收端。
key.h
  1. #include "delay.h"
  2. #define key1 P1     //1111 1111
  3. #define key2 P3                //1111 11   P30:RXD   P31:TXD


  4. //extern u8 fx;
  5. /*-----------------------------------------------
  6.        按鍵掃描函數,返回掃描鍵值
  7. ------------------------------------------------*/
  8. unsigned char KeyScan(void)
  9. {
  10.            
  11.          if(key1!=0xff)
  12.                 {
  13.                         
  14.                          switch(key1)           //1111 1111
  15.                                 {
  16.                                  case 0xfe:return 0x31;break;                //left
  17.                                  case 0xfd:return 0x32;break;                //right
  18.                                  case 0xfb:return 0x33;break;                //left
  19.                                  case 0xf7:return 0x34;break;                //right
  20.                                        
  21.                                  case 0xef:return 0x35;break;                //duoji 1
  22.                                  case 0xdf:return 0x36;break;
  23.                                  case 0xbf:return 0x37;break;                //duoji 2
  24.                                  case 0x7f:return 0x38;break;
  25.                                 }
  26.                                 while(key1!=0xff);
  27.                 }
  28.                  if(key2!=0xff)
  29.                 {
  30.                                 switch(key2)           //0011 1111
  31.                                 {
  32.                                  case 0xfb:return 0x39;break;    //duoji 3
  33.                                  case 0xf7:return 0x40;break;        
  34.                                  case 0xef:return 0x41;break;                //duoji 4  (夾球)
  35.                                  case 0xdf:return 0x42;break;     //         (放球)
  36.                                 }
  37.                                 while(key2!=0xff);
  38.                 }

  39.    return 0;
復制代碼

main.c
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. #include "key.h"
  4. unsigned int receive;
  5. void UART_Init(void)
  6. {
  7.           PCON &= 0x7F;                //波特率不倍速
  8.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  9.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重裝
  10.     TH1   = 0xFD;               // TH1:  重裝值 9600 波特率 晶振 11.0592MHz  
  11.                 TL1   = 0xFD;   
  12.                 TR1   = 1;                  // TR1:  timer 1 打開                        
  13.                 SM0=0;
  14.                 SM1=1;
  15.                 REN=1;                  //打開總中斷
  16.                 ES= 1;                  //打開串口中斷
  17.           TI=1;                                                //正常的話應該是TI        =        1;但是為了控制接收先置‘0’;
  18. }
  19. unsigned char num ;

  20. void com_UART0() interrupt 4
  21. {
  22.         EA=0;
  23.                 if(RI==1)
  24.     {
  25.     }
  26.         
  27.     if (TI)
  28.     {
  29.                   
  30.     }
  31.                    EA    = 1;
  32. }

  33. unsigned int qwe=0x00;
  34. void main()
  35. {
  36.         UART_Init();
  37.         while(1)
  38.         {
  39.                 num=KeyScan();
  40.                 if(num!=qwe)
  41.                 {
  42.                         qwe=num;
  43.                         if(TI==1)
  44.                         {
  45.                                 SBUF = num;
  46.                                 TI=0;
  47.                         }
  48.                 }
  49.         }
  50. }
復制代碼
謝謝!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:161164 發表于 2021-8-11 17:13 | 只看該作者
TI是當SBUF有數據放入,并傳輸完成后才由單片機置1
TI初始值是0,所以if(TI==1)SBUF = num;永不成立
而SBUF沒有數據放入,TI永不為1
永遠傳不了數據出去
應改為:
  1. void com_UART0() interrupt 4
  2. {
  3.         EA=0;
  4.                 if(RI==1)
  5.     {
  6.     }
  7.         
  8.     if (TI)
  9.     {
  10.               TI=0;//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<   
  11.     }
  12.                    EA    = 1;
  13. }

  14. unsigned int qwe=0x00;
  15. void main()
  16. {
  17.         UART_Init();
  18.         while(1)
  19.         {
  20.                 num=KeyScan();
  21.                 if(num!=qwe)
  22.                 {
  23.                         if(TI==0)//<<<<<<<<<<<<<<<<<<<<<<<
  24.                         {
  25.                                 SBUF = num;
  26.                                 qwe=num;//<<<<<<<<<<<<<<<<<<<<<<<
  27.                         }
  28.                 }
  29.         }
  30. }
復制代碼
回復

使用道具 舉報

板凳
ID:892737 發表于 2021-8-11 17:56 | 只看該作者
lkc8210 發表于 2021-8-11 17:13
TI是當SBUF有數據放入,并傳輸完成后才由單片機置1
TI初始值是0,所以if(TI==1)SBUF = num;永不成立
而SB ...

按這樣改了,還是不行
回復

使用道具 舉報

地板
ID:161164 發表于 2021-8-11 23:04 | 只看該作者
1196383236 發表于 2021-8-11 17:56
按這樣改了,還是不行

單片機接電腦串口
電腦收到數據嗎?
回復

使用道具 舉報

5#
ID:161164 發表于 2021-8-12 00:52 | 只看該作者
1196383236 發表于 2021-8-11 17:56
按這樣改了,還是不行

看漏了你在UART_Init(void)中的TI=1;

經過一大輪仿真試驗
得知按鍵掃描的while(key!=0xff)被 串口腳干擾了
把#define key2 P3 改為#define key2 P2就正常了
回復

使用道具 舉報

6#
ID:892737 發表于 2021-8-12 11:08 | 只看該作者
lkc8210 發表于 2021-8-11 23:04
單片機接電腦串口
電腦收到數據嗎?

電腦收不到數據
回復

使用道具 舉報

7#
ID:892737 發表于 2021-8-12 11:49 | 只看該作者
lkc8210 發表于 2021-8-12 00:52
看漏了你在UART_Init(void)中的TI=1;

經過一大輪仿真試驗

我把51單片機上本該接藍牙的P3.0和P3.1接到了usb轉ttl上連接電腦,按按鍵它也沒有數據
回復

使用道具 舉報

8#
ID:161164 發表于 2021-8-12 14:25 | 只看該作者
1196383236 發表于 2021-8-12 11:49
我把51單片機上本該接藍牙的P3.0和P3.1接到了usb轉ttl上連接電腦,按按鍵它也沒有數據

有試過RxD和TxD交換嗎?

那就用范例代碼試一下
  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ---------------------------------------------*/
  3. /* --- STC89-90xx Series MCU UART (8-bit/9-bit)Demo ----------------*/
  4. /* If you want to use the program or the program referenced in the  */
  5. /* article, please specify in which data and procedures from STC    */
  6. /*------------------------------------------------------------------*/

  7. #include "reg51.h"
  8. #include "intrins.h"

  9. typedef unsigned char BYTE;
  10. typedef unsigned int WORD;

  11. #define FOSC 11059200L      //System frequency
  12. #define BAUD 9600           //UART baudrate

  13. /*Define UART parity mode*/
  14. #define NONE_PARITY     0   //None parity
  15. #define ODD_PARITY      1   //Odd parity
  16. #define EVEN_PARITY     2   //Even parity
  17. #define MARK_PARITY     3   //Mark parity
  18. #define SPACE_PARITY    4   //Space parity

  19. #define PARITYBIT NONE_PARITY   //Testing even parity

  20. sbit bit9 = P2^2;           //P2.2 show UART data bit9
  21. bit busy;

  22. void SendData(BYTE dat);
  23. void SendString(char *s);

  24. void main()
  25. {
  26. #if (PARITYBIT == NONE_PARITY)
  27.     SCON = 0x50;            //8-bit variable UART
  28. #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
  29.     SCON = 0xda;            //9-bit variable UART, parity bit initial to 1
  30. #elif (PARITYBIT == SPACE_PARITY)
  31.     SCON = 0xd2;            //9-bit variable UART, parity bit initial to 0
  32. #endif

  33.     TMOD = 0x20;            //Set Timer1 as 8-bit auto reload mode
  34.     TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
  35.     TR1 = 1;                //Timer1 start run
  36.     ES = 1;                 //Enable UART interrupt
  37.     EA = 1;                 //Open master interrupt switch

  38.     SendString("STC89-90xx\r\nUart Test !\r\n");
  39.     while(1);
  40. }

  41. /*----------------------------
  42. UART interrupt service routine
  43. ----------------------------*/
  44. void Uart_Isr() interrupt 4
  45. {
  46.     if (RI)
  47.     {
  48.         RI = 0;             //Clear receive interrupt flag
  49.         P0 = SBUF;          //P0 show UART data
  50.         bit9 = RB8;         //P2.2 show parity bit
  51.     }
  52.     if (TI)
  53.     {
  54.         TI = 0;             //Clear transmit interrupt flag
  55.         busy = 0;           //Clear transmit busy flag
  56.     }
  57. }

  58. /*----------------------------
  59. Send a byte data to UART
  60. Input: dat (data to be sent)
  61. Output:None
  62. ----------------------------*/
  63. void SendData(BYTE dat)
  64. {
  65.     while (busy);           //Wait for the completion of the previous data is sent
  66.     ACC = dat;              //Calculate the even parity bit P (PSW.0)
  67.     if (P)                  //Set the parity bit according to P
  68.     {
  69. #if (PARITYBIT == ODD_PARITY)
  70.         TB8 = 0;            //Set parity bit to 0
  71. #elif (PARITYBIT == EVEN_PARITY)
  72.         TB8 = 1;            //Set parity bit to 1
  73. #endif
  74.     }
  75.     else
  76.     {
  77. #if (PARITYBIT == ODD_PARITY)
  78.         TB8 = 1;            //Set parity bit to 1
  79. #elif (PARITYBIT == EVEN_PARITY)
  80.         TB8 = 0;            //Set parity bit to 0
  81. #endif
  82.     }
  83.     busy = 1;
  84.     SBUF = ACC;             //Send data to UART buffer
  85. }

  86. /*----------------------------
  87. Send a string to UART
  88. Input: s (address of string)
  89. Output:None
  90. ----------------------------*/
  91. void SendString(char *s)
  92. {
  93.     while (*s)              //Check the end of the string
  94.     {
  95.         SendData(*s++);     //Send current char and increment string ptr
  96.     }
  97. }
復制代碼
回復

使用道具 舉報

9#
ID:892737 發表于 2021-8-14 09:15 | 只看該作者
lkc8210 發表于 2021-8-12 14:25
有試過RxD和TxD交換嗎?

那就用范例代碼試一下

謝謝,解決了,但是有時候它檢測不到松開的指令
回復

使用道具 舉報

10#
ID:83626 發表于 2021-9-18 20:58 | 只看該作者
藍牙開關能被小度在家控制嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91在线视频国产 | 亚洲天堂免费 | 午夜日韩视频 | 国产精品美女在线观看 | 午夜精品一区二区三区免费视频 | 国产成人精品一区二区三区视频 | 日韩成人在线视频 | 日韩在线免费视频 | 欧美日韩视频网站 | 国产精品久久久久久久粉嫩 | 成人动漫视频网站 | 色网在线观看 | 欧美成人精品在线观看 | 亚洲精品视频一区 | 在线视频h | 天天干天天干 | 欧美精品免费观看二区 | 欧美日韩精品中文字幕 | 久久亚洲经典 | 一区二区三区视频在线观看 | 日韩精品在线播放 | 免费视频一区二区 | 欧美亚洲高清 | 久久国产婷婷国产香蕉 | 久久免费精品 | 中文字幕在线免费 | 欧美亚洲国产成人 | 欧美日韩中文字幕在线播放 | 日韩一区二区在线播放 | 欧美成人自拍视频 | 亚洲一区 | 一区二区三区国产精品 | 精品国产欧美 | 国产在线拍偷自揄拍视频 | 亚洲精品中文字幕在线观看 | 国产亚洲欧美在线 | 亚洲五码久久 | 日韩在线观看网站 | 亚洲狠狠 | 欧美日韩一区二区在线观看 | 97免费在线视频 |