找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2022|回复: 13
收起左侧

关于51单片机蓝牙风扇的程序问题,求指教!

  [复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:906254 发表于 2021-8-4 18:17 | 显示全部楼层 |阅读模式
本帖最后由 sunmebaby 于 2021-8-4 21:55 编辑

要实现的功能是通过按键和蓝牙两种方式实现对风扇的调速,按键部分的程序调试过没有问题,但是蓝牙部分的程序不管怎么调试都没有反应,串口助手上也可以接收到数据,但是数码管和风扇都没有反应,实在找不出来是什么问题,希望大神指点
51hei图片20210804181512.png
单片机源程序如下:
#include<reg52.h>
#define uint  unsigned int
#define uchar unsigned char

uchar time; //计时
char Data;
char count = 0;           //占空比     
uchar code smgduan[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                                    0x7f,0x6f};// 0-9段码
sbit PWM = P1^0;   //PWM通道
sbit key_speed_up = P3^1; //按键加档
sbit key_speed_down =P3^0;//按键减档
sbit smgwei1 = P2^2;
sbit smgwei2 = P2^3;
sbit smgwei3 = P2^4;
/*                                                   
void Motor_speed();//函数声明
void timer0_init();
void UsarInit
void delay_ms();
void Motor_up();
void Motor_down();
void display();
*/

void delay_ms(uint z)//延时函数
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=10;y>0;y--);
}

void display()             //显示当前占空比
{
    P0=smgduan[count/100];smgwei1=1; smgwei2=1;smgwei3=1;delay_ms(1);P0=0X00;   
    P0=smgduan[count/10%10];smgwei1=0; smgwei2=1;smgwei3=1;delay_ms(1);P0=0X00;        
    P0=smgduan[count%10];smgwei1=1; smgwei2=0;smgwei3=1;delay_ms(1);P0=0X00;
}


void Motor_up()                //加档函数
{
    if(key_speed_up==0)
    {
        delay_ms(2);
        if(key_speed_up==0)
        {
            count += 25;
            if(count > 100)
            {
                count = 0;
            }
        }
        while(!key_speed_up);
    }
}

void Motor_down()            //减档函数
{
    if(key_speed_down==0)
    {
        delay_ms(2);
        if(key_speed_down==0)
        {
            count -= 25;
            if(count <0)
            {
                count = 0;
            }
        }
        while(!key_speed_down);
    }
}

void timer0_init()        //定时器0初始化
{
    TMOD = 0x01;
    TH0 = 0xff;
    TL0 = 0xf7;
    TR0 = 1;
    ET0 = 1;
    EA  = 1;
}

void UsarInit()                //串口初始化
{
    TMOD = 0x20;            //设置计数器工作方式2
    SM0  = 0;                    //设置串口工作方式1
    SM1  = 1;
    REN  = 1;                    //允许串口接收
    TH1  = 0xfd;            //设置波特率9600
    TL1  = 0xfd;
    TR1  = 1;                    //启动定时器1
    ES     = 1;                    //开串口中断
    EA   = 1;                    //开总中断
}

void timer0_int() interrupt 1 //定时器0中断处理函数
{
    TR0 = 0;
    TH0 = 0xff;
    TL0 = 0xf7;
    TR0 = 1;
    PWM = 0;
    time++;
    if(time<=count) PWM = 1;
    else                     PWM = 0;
    if(time>100)  time = 0;
}

void Usart() interrupt 4    //串口通信中断处理函数
{
    Data = SBUF;   
    RI = 0;
    while(1)
    {
        switch(Data)
        {case 'a':count = 0; break;
         case 'b':count = 25;break;
         case 'c':count = 50;break;
         case 'd':count = 75;break;
         case 'e':count =100;break;}
     }
    //while(!TI);
    //TI = 0;
}


void main()                    //主函数
{
    timer0_init();
    UsarInit();
    while(1)
    {
        display();        
        Motor_up();
        Motor_down();
    }
}



回复

使用道具 举报

ID:272269 发表于 2021-8-5 10:23 | 显示全部楼层
老哥
你上面的图片是蓝牙 加ttl 之后和电脑相连的 数据吗
如果是 那就检查一下你的晶振频率 看看是不是那种通信晶振
简单的方法 单片机 和  电脑通信 在串口助手那里 直接下发 蓝牙指令看看有否工作
或者直接  你发什么数据 就让单片机返回什么数据上电脑 这样调试一目了然
回复

使用道具 举报

ID:906254 发表于 2021-8-5 12:31 | 显示全部楼层
jizi 发表于 2021-8-5 10:23
老哥
你上面的图片是蓝牙 加ttl 之后和电脑相连的 数据吗
如果是 那就检查一下你的晶振频率 看看是不是那 ...

晶振是11.0592MHz,之前用AT指令调试过了,是可以正常工作的
回复

使用道具 举报

ID:554500 发表于 2021-8-5 12:56 | 显示全部楼层
串口中断函数里有个while(1)死循环
回复

使用道具 举报

ID:906254 发表于 2021-8-5 12:58 | 显示全部楼层
18701931930 发表于 2021-8-5 12:56
串口中断函数里有个while(1)死循环

while(1)去掉也还是不行。。。
回复

使用道具 举报

ID:130231 发表于 2021-8-5 20:50 | 显示全部楼层
sunmebaby 发表于 2021-8-5 12:58
while(1)去掉也还是不行。。。

不是去了,而是结合到一块,放到主函数里。
回复

使用道具 举报

ID:906254 发表于 2021-8-5 22:29 | 显示全部楼层
zqy181818 发表于 2021-8-5 20:50
不是去了,而是结合到一块,放到主函数里。

void main()                                        //主函数
{
        timer0_init();
        UsarInit();
        while(1)
        {
                display();               
                Motor_up();
                Motor_down();
                switch(Data)
                {case 'a':count = 0; break;
                 case 'b':count = 25;break;
                 case 'c':count = 50;break;
                 case 'd':count = 75;break;
        }
}

是改成这样吗。。。之前这样试过,也还是没有反应。。。
回复

使用道具 举报

ID:81365 发表于 2021-8-5 22:59 | 显示全部楼层
看看是否进入了中断,还有按键和指令码的作用结合写,或者干脆暂时屏蔽按键
回复

使用道具 举报

ID:161164 发表于 2021-8-5 23:41 | 显示全部楼层
本帖最后由 lkc8210 于 2021-8-5 23:55 编辑
sunmebaby 发表于 2021-8-5 12:58
while(1)去掉也还是不行。。。

12T 8051的指令执行速度比较慢(一句1us)
你代码中的定时器中断时间只有1us
而中断的指令有那么多句
于是单片机进入中断时被中断中断了去进入中断。。。
尝试把TL0=0xF7;改为TL0=0xC7;
而且你的串口初始化和定时器0初始化的写法会互相覆盖TMOD的设定
void UsarInit()                //串口初始化
{
    TMOD = 0x20;            //设置计数器工作方式2
改为TMOD |= 0x20;
void timer0_init()        //定时器0初始化
{
    TMOD = 0x01;
改为TMOD |= 0x01;
回复

使用道具 举报

ID:81196 发表于 2021-8-6 10:27 | 显示全部楼层
起码保证串口连接没问题,再确定波特率等参数配置无误,然后调试能否进入中断,
回复

使用道具 举报

ID:906254 发表于 2021-8-6 12:30 | 显示全部楼层
本帖最后由 sunmebaby 于 2021-8-6 12:55 编辑
lkc8210 发表于 2021-8-5 23:41
12T 8051的指令执行速度比较慢(一句1us)
你代码中的定时器中断时间只有1us
而中断的指令有那么多句

谢谢大佬,发现自己接线时候有错误,把RXD和TXD接反了,然后按照大佬的写法改了之后可以了...还有个问题...我在串口中断函数里加了句LED =~LED想观察现象,发现按减档键LED会亮灭,但是我用这是按键触发中断了吗...?
回复

使用道具 举报

ID:161164 发表于 2021-8-6 13:58 | 显示全部楼层
sunmebaby 发表于 2021-8-6 12:30
谢谢大佬,发现自己接线时候有错误,把RXD和TXD接反了,然后按照大佬的写法改了之后可以了...还有个问题. ...

你的减档键接了RXD脚
单片机以为有串口信号就入了中断
如果不是没脚用,尽量不要用RXD(P30)/TXD(P31)脚
以免影响串口通讯
回复

使用道具 举报

ID:906254 发表于 2021-8-7 20:37 | 显示全部楼层
lkc8210 发表于 2021-8-6 13:58
你的减档键接了RXD脚
单片机以为有串口信号就入了中断
如果不是没脚用,尽量不要用RXD(P30)/TXD(P31)脚 ...

懂了,谢谢!
回复

使用道具 举报

ID:149162 发表于 2021-8-8 11:59 | 显示全部楼层
P30和IO口复用了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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