找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3301|回复: 11
收起左侧

单片机蓝牙通信问题,换上STC15W408AS后串口就不能通信了

[复制链接]
ID:143767 发表于 2021-4-11 19:14 | 显示全部楼层 |阅读模式
蓝牙遥控继电器,使用STC89C52RC一切正常,但换上STC15W408AS后串口就不能通信了,网上查说STC15W408AS没有定时器1,我把程序改到定时器2了,可依然无法通信,大家帮忙看看程序哪里有问题,谢谢!

/****蓝牙模块的TX和RX要交换对接才可以互相通信*****/
//主控:STC89C52RC
#include<reg52.h>
#include<string.h>

#define uchar unsigned char
#define uint unsigned int

sbit power1=P1^2;//继电器端口依次类推
sbit power2=P1^3;
sbit power3=P1^4;
sbit power4=P1^5;
uchar temp;
void UART_Send_Byte(uchar mydata)//发送一个字节
{
回复

使用道具 举报

ID:143767 发表于 2021-4-11 19:59 | 显示全部楼层
完整程序/****蓝牙模块的TX和RX要交换对接才可以互相通信*****/
//主控:STC89C52RC
#include<reg52.h>
#include<string.h>

#define uchar unsigned char
#define uint unsigned int

sbit power1=P1^2;//继电器端口依次类推
sbit power2=P1^3;
sbit power3=P1^4;
sbit power4=P1^5;
sbit power5=P2^4;
uchar temp;


void UART_Send_Byte(uchar mydata)//发送一个字节
{
        SBUF=mydata;
        while(!TI);
        TI=0;
}
void UART_Send_Str(char *s)//发送字符串
{
        while (*s)
        {
                UART_Send_Byte(*s);       
                s++;
        }
}
void main(void)
{
        SCON = 0X50;
        TMOD = 0X20;
        TH2 = 0xFD; //波特率9600
        TL2 = 0xFD;
        ES = 1;
        EA = 1;
        TR1 = 1;

        UART_Send_Str("AT+VERSION");//发送AT指令,测试模块是否正常
        while(1);
}
void serial_IT(void) interrupt 4
{
        if(RI==1)
        {
                RI=0;       
                temp = SBUF;//串口接收到的数据给temp
                UART_Send_Byte(temp);//单片机接收到数据后发给电脑串口助手
                if(temp==0x02) power1=0; //如果接收到的数据是0x02小灯亮
                else if(temp==0x01) power1=1;//否则如果接收到是0x01,则熄灭
                if(temp==0x08) power2=0; //
                else if(temp==0x04) power2=1;//
                if(temp==0x07) power3=0; //
                else if(temp==0x09) power3=1;//
                if(temp==0x10) power4=0; //
                else if(temp==0x20) power4=1;//
                if(temp==0x40) power5=0; //
                else if(temp==0x50) power5=1;//
        }

}

回复

使用道具 举报

ID:220661 发表于 2021-4-11 20:07 | 显示全部楼层
至少TR1=1是错误的。
回复

使用道具 举报

ID:220661 发表于 2021-4-11 20:10 | 显示全部楼层
    SCON = 0x50;                //8位可变波特率
    T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    T2H = (65536 - (FOSC/4/BAUD))>>8;
    AUXR = 0x14;                //T2为1T模式, 并启动定时器2
    AUXR |= 0x01;               //选择定时器2为串口1的波特率发生器
    ES = 1;                     //使能串口1中断
    EA = 1;
回复

使用道具 举报

ID:65956 发表于 2021-4-12 08:34 | 显示全部楼层
STC15W408AS是没有定时器1的,看来是手册没有看清哦
回复

使用道具 举报

ID:390416 发表于 2021-4-12 10:47 | 显示全部楼层
你可以参考我这两个串口程序 兼容性很好的
串口1打印程序 可以打印3个十六位的变量 波特率9600 http://www.51hei.com/bbs/dpj-201660-1.html

串口发送 不需要while死等 串口接收执行软件复位 http://www.51hei.com/bbs/dpj-200927-1.html
回复

使用道具 举报

ID:143767 发表于 2021-4-13 11:12 | 显示全部楼层
gongnn 发表于 2021-4-11 20:10
SCON = 0x50;                //8位可变波特率
    T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重 ...

根据你的提示修改了程序,但编译时报错如下:
Build target 'Target 1'
compiling BLUETOOTH.C...
BLUETOOTH.C(46): error C202: 'T2L': undefined identifier
BLUETOOTH.C(47): error C202: 'T2H': undefined identifier
BLUETOOTH.C(48): error C202: 'AUXR': undefined identifier
BLUETOOTH.C(49): error C202: 'AUXR': undefined identifier
Target not created
回复

使用道具 举报

ID:143767 发表于 2021-4-13 15:38 | 显示全部楼层
经过修改程序可以通过了,但运行时只有P1.2口的继电器动作,其它的都不动作,不知是何原因
回复

使用道具 举报

ID:143767 发表于 2021-4-13 19:53 | 显示全部楼层
有知道的吗,麻烦给指导一下
回复

使用道具 举报

ID:143767 发表于 2021-4-14 12:03 | 显示全部楼层
这贴眼看沉了,可问题还是没解决
回复

使用道具 举报

ID:213173 发表于 2021-4-14 13:36 | 显示全部楼层
dj3365191 发表于 2021-4-14 12:03
这贴眼看沉了,可问题还是没解决

字符和数字最好不要混用,容易出错。改这样试试。
  1. #include<reg52.h>
  2. #include<string.h>
  3. sfr AUXR = 0x8E;
  4. sfr T2H  = 0xD6;
  5. sfr T2L  = 0xD7;
  6. #define uchar unsigned char
  7. #define uint unsigned int

  8. sbit power1=P1^2;//继电器端口依次类推
  9. sbit power2=P1^3;
  10. sbit power3=P1^4;
  11. sbit power4=P1^5;
  12. sbit power5=P2^4;
  13. uchar temp;
  14. bit flag;

  15. void UART_Send_Byte(uchar mydata)//发送一个字节
  16. {
  17.         SBUF=mydata;
  18.         while(!TI);
  19.         TI=0;
  20. }

  21. void UART_Send_Str(uchar *s)//发送字符串
  22. {
  23.         while (*s)
  24.         {
  25.                 UART_Send_Byte(*s++);
  26.         }
  27. }

  28. void UartInit(void)                //9600bps@11.0592MHz
  29. {
  30.         SCON = 0x50;                //8位数据,可变波特率
  31.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  32.         AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
  33.         T2L = 0xE0;                //设定定时初值
  34.         T2H = 0xFE;                //设定定时初值
  35.         AUXR |= 0x10;                //启动定时器2
  36.         EA = 1;
  37.         ES = 1;
  38. }
  39. void main(void)
  40. {
  41.         UartInit();
  42.         UART_Send_Str("AT+VERSION");//发送AT指令,测试模块是否正常
  43.         while(1)
  44.         {
  45.                 if(flag)
  46.                 {
  47.                         flag=0;
  48.                         if(temp=='2') power1=0; //如果接收到的数据是0x02小灯亮
  49.                         else if(temp=='1') power1=1;//否则如果接收到是0x01,则熄灭

  50.                         if(temp=='8') power2=0; //
  51.                         else if(temp=='4') power2=1;//

  52.                         if(temp=='7') power3=0; //
  53.                         else if(temp=='9') power3=1;//

  54.                         if(temp=='b') power4=0; //
  55.                         else if(temp=='a') power4=1;//

  56.                         if(temp=='d') power5=0; //
  57.                         else if(temp=='c') power5=1;//
  58.                 }
  59.         }
  60. }

  61. void serial_IT(void) interrupt 4
  62. {
  63.         RI=0;        
  64.         temp = SBUF;//串口接收到的数据给temp
  65.         UART_Send_Byte(temp);//单片机接收到数据后发给电脑串口助手
  66.         flag=1;
  67. }
复制代码
回复

使用道具 举报

ID:143767 发表于 2021-4-14 20:34 | 显示全部楼层
wulin 发表于 2021-4-14 13:36
字符和数字最好不要混用,容易出错。改这样试试。

谢谢您,一次性成功,不仅得到启发而且也学到东西,再次感谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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