找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1937|回复: 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 单片机教程网

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