找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9923|回复: 19
打印 上一主题 下一主题
收起左侧

用STC15w404AS制作功放机无信号自动关机

  [复制链接]
跳转到指定楼层
楼主
ID:350962 发表于 2018-6-13 13:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己制作了一个蓝牙5.0的功放机,为了节能,需要在有信号时自动开机,无信号等待5分钟后自动关机。手头正好有STC15w404AS,于是用STC15w404AS制作了无信号自动关机的电路。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

来自 2#
ID:350962 发表于 2018-6-13 21:27 | 只看该作者
本帖最后由 ac9979 于 2018-6-14 09:22 编辑

    原计划用LM339 四电压比较器 加 成品延时电路搞定,发现成品延时电路用的就是STC15w404AS, 觉得应该可以把两芯片集成到一起,更简洁,毕竟功放机的空间不够多。稍微一研究发现STC15w404AS独自就能实现,我还是许多年前读书的时候接触过单片机,已经全部还给老师了,零基础开始设计。
     今天学习了本站的基础教程《4课:第一个单片机小程序》、《Keil教程(1)》,已经编了我的第一个STC程序,将STC15w404AS第1脚接一个发光二极管,串一个1K的电阻接到地,第7、8脚接VCC,10脚接地,第11、12接PC的串口+MX232变成TTL电平与电脑通讯,目的就是把发光二极管搞亮,抄《4课:第一个单片机小程序》:
void main() //程序从这里开始执行
{
while(1) //这句的作用就是反复的执行下面这个{}中包含的4句
    {
     P1_2=1;  //(1)熄灭灯
     DELAY(); //(2)延时一段时间
     P1_2=0;  //(3)点亮灯
     DELAY(); //(4)延时一段时间
    }
}
结果此处 P1_2=1;  编译不过,提示未定义,百度一下,第1脚叫P1.2,P1=00000100,应该就把P1.2置成高电平灯就亮了,所以P1=0XFF 就OK了。P1=0X00,灯就应该灭。

20180613_213023.jpg (932.09 KB, 下载次数: 81)

20180613_213023.jpg

评分

参与人数 1黑币 +100 收起 理由
admin + 100 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:350962 发表于 2018-6-13 13:24 | 只看该作者
设计思路,蓝牙芯片收到蓝牙信号后,IIS总线的DATA电压会达到1.2V左右,每5秒钟检测此信号电压,如果电压超过1V,此时软件延时器清零,如果低于1V,则开始调用软件延时器开始延时300秒。
回复

使用道具 举报

地板
ID:1 发表于 2018-6-13 18:00 | 只看该作者
好思路,能分享源码与图纸吗?
回复

使用道具 举报

5#
ID:162136 发表于 2018-6-13 19:10 | 只看该作者
手上有时基电路估计更方便。
回复

使用道具 举报

6#
ID:350962 发表于 2018-6-13 21:28 | 只看该作者
本帖最后由 ac9979 于 2018-6-14 00:01 编辑

   用stc-isp-15xx-v6.86.exe软件将生成的HEX文件写入404AS,老是提示"正在检测目标单片机 ... ",百度一下,原来是上电时才能写入。发现LED灯几乎不闪,估计是延时时间太短,用STC自动生成的软件延时计算器替换《4课:第一个单片机小程序》的延时程序,提示_nop_()未定义,百度一下,需要#include "intrins.h",编译OK,源代码如下:
#include <at89x52.h>
#include "intrins.h"
void DELAY()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 43;
        j = 6;
        k = 203;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}




void main() //程序从这里开始执行
{
while(1) //这句的作用就是反复的执行下面这个{}中包含的4句
    {
      P1=0XFF;  //(1)熄灭灯
     DELAY(); //(2)延时一段时间
      P1=0X00  //(3)点亮灯
     DELAY(); //(4)延时一段时间
    }
}
LED就每秒闪一下。证明我的第一个STC程序已经运行正常,然后准备照着stc-isp-15xx-v6.86.exe软件里的示范程序《STC15F4K60S4 系列 通过BandGap电压精确测量外部输入电压值举例》编写7脚电压检测。

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:74784 发表于 2018-6-13 23:27 | 只看该作者
一片  555就可以搞定

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:303383 发表于 2018-6-14 07:54 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

9#
ID:350962 发表于 2018-6-15 15:06 | 只看该作者
进过学习和消化,将红色LED转接到P3.6口,将P1口空出来,p1.2作为信号检测端,终于将程序改了出来(具体工作见范例STC15.PDF第923页)

  1. #include "reg51.h"
  2. #include "intrins.h"

  3. typedef unsigned char BYTE;
  4. typedef unsigned int WORD;

  5. WORD idata Vbg_RAM _at_ 0xef;               //对于只有256字节RAM的MCU存放地址为0EFH

  6. //注意:需要在下载代码时选择"在ID号前添加重要测试参数"选项,才可在程序中获取此参数
  7. WORD code Vbg_ROM _at_ 0x0ff7;            //4K程序空间的MCU

  8. sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  9. sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
  10. sfr P0M1 = 0x93;
  11. sfr P0M0 = 0x94;
  12. sfr P2M1 = 0x95;
  13. sfr P2M0 = 0x96;
  14. sfr P3M1 = 0xB1;
  15. sfr P3M0 = 0xB2;
  16. sfr P4M1 = 0xB3;
  17. sfr P4M0 = 0xB4;
  18. sfr P5M1 = 0xC9;
  19. sfr P5M0 = 0xCA;
  20. sfr P6M1 = 0xCB;
  21. sfr P6M0 = 0xCC;
  22. sfr P7M1 = 0xE1;
  23. sfr P7M0 = 0xE2;


  24. sfr ADC_CONTR   =   0xBC;                   //ADC控制寄存器
  25. sfr ADC_RES     =   0xBD;                   //ADC高8位结果
  26. sfr ADC_LOW2    =   0xBE;                   //ADC低2位结果
  27. sfr P1ASF       =   0x9D;                   //P1口第2功能控制寄存器

  28. #define ADC_POWER   0x80                    //ADC电源控制位
  29. #define ADC_FLAG    0x10                    //ADC完成标志
  30. #define ADC_START   0x08                    //ADC起始控制位
  31. #define ADC_SPEEDLL 0x00                    //540个时钟
  32. #define ADC_SPEEDL  0x20                    //360个时钟
  33. #define ADC_SPEEDH  0x40                    //180个时钟
  34. #define ADC_SPEEDHH 0x60                    //90个时钟

  35. /*----------------------------
  36. 软件延时
  37. ----------------------------*/
  38. void Delay(WORD n)           //@11.0592MHz 延迟1ms
  39. {
  40.     unsigned char i, j;

  41.     while (n--)
  42.     {
  43.                                 _nop_();
  44.                                 _nop_();
  45.                                 _nop_();
  46.                                 i = 11;
  47.                                 j = 190;
  48.                                 do
  49.                                 {
  50.                                         while (--j);
  51.                                 } while (--i);
  52.     }
  53. }



  54. BYTE GetADC(BYTE ch)
  55. {
  56.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  57.     Delay(2);                               //ADC上电并延时
  58.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  59.     _nop_();                                //等待4个NOP
  60.     _nop_();
  61.     _nop_();
  62.     _nop_();
  63.     while (!(ADC_CONTR & ADC_FLAG));        //等待ADC转换完成
  64.     ADC_CONTR &= ~ADC_FLAG;                 //清除ADC标志

  65.     return ADC_RES;
  66. }





  67. void main()
  68. {
  69.     BYTE ADCbg;
  70.     BYTE ADCp0, ADCp1, ADCp2, ADCp3, ADCp4, ADCp5, ADCp6, ADCp7;            
  71.     WORD V0, V1, V2, V3, V4, V5, V6, V7;
  72.         P3M0 = 0xC0;      //led接在p3.6上,设为强推挽模式,参数说明见STC15.PDF第401页
  73.     P3M1 = 0X00;


  74.         while (1)
  75.     {
  76.            
  77.                                 P1M0 = 0x00;
  78.                                 P1M1 = 0xFF;           //设为高阻模式
  79.                                 
  80.                 //第一步:通过ADC的第9通道测试Bandgap电压的ADC测量值
  81.                                 ADC_RES = 0;                            //清除结果寄存器
  82.                                 P1ASF = 0x00;                           //不设置P1ASF,即可从ADC的第9通道读取内部Bandgap电压的ADC测量值
  83.                                 GetADC(0);
  84.                                 GetADC(0);
  85.                                 ADCbg = GetADC(0);
  86.                         
  87.                 //第二步:通过ADC的第2通道测试外部输入电压的ADC测量值    说明见STC15.PDF第926页
  88.                                   ADC_RES = 0;                            //清除结果寄存器
  89.                                 P1ASF = 0x01;                           //设置P1.0口为模拟通道
  90.                                 GetADC(0);
  91.                                 GetADC(0);
  92.                                 ADCp0 = GetADC(0);

  93.                                   ADC_RES = 0;                            //清除结果寄存器
  94.                                 P1ASF = 0x02;                           //设置P1.1口为模拟通道
  95.                                 GetADC(1);
  96.                                 GetADC(1);
  97.                                 ADCp1 = GetADC(1);

  98.                                   ADC_RES = 0;                            //清除结果寄存器
  99.                                 P1ASF = 0x04;                           //设置P1.2口为模拟通道
  100.                                 GetADC(2);
  101.                                 GetADC(2);
  102.                                 ADCp2 = GetADC(2);

  103.                                   ADC_RES = 0;                            //清除结果寄存器
  104.                                 P1ASF = 0x08;                           //设置P1.3口为模拟通道
  105.                                 GetADC(3);
  106.                                 GetADC(3);
  107.                                 ADCp3 = GetADC(3);

  108.                                    ADC_RES = 0;                            //清除结果寄存器
  109.                                 P1ASF = 0x10;                           //设置P1.4口为模拟通道
  110.                                 GetADC(4);
  111.                                 GetADC(4);
  112.                                 ADCp4 = GetADC(4);

  113.                                   ADC_RES = 0;                            //清除结果寄存器
  114.                                 P1ASF = 0x20;                           //设置P1.5口为模拟通道
  115.                                 GetADC(5);
  116.                                 GetADC(5);
  117.                                 ADCp5 = GetADC(5);

  118.                                   ADC_RES = 0;                            //清除结果寄存器
  119.                                 P1ASF = 0x40;                           //设置P1.6口为模拟通道
  120.                                 GetADC(6);
  121.                                 GetADC(6);
  122.                                 ADCp6 = GetADC(6);

  123.                                   ADC_RES = 0;                            //清除结果寄存器
  124.                                 P1ASF = 0x80;                           //设置P1.7口为模拟通道
  125.                                 GetADC(7);
  126.                                 GetADC(7);
  127.                                 ADCp7 = GetADC(7);

  128.                

  129.                 //第三步:通过公式计算外部输入的实际电压值
  130.                                 //Vx = Vbg_RAM * ADCx / ADCbg;            //使用RAM中的Bandgap电压参数进行计算
  131.                                 V2 = Vbg_ROM * ADCp2 / ADCbg;          //使用ROM中的Bandgap电压参数进行计算
  132.         
  133.                          if( V2 > 50 )
  134.                           P3 = 0X40;  //灯亮
  135.                    else
  136.                           P3=  0X00        ;  //灯灭
  137.                
  138.                
  139.                          Delay(1000);                        
  140.         }
  141. }
复制代码
将耳机线插入手机,播放音乐,LED灯将闪烁,证明检测到了信号,停止放音乐,LED灯灭,证明工作正常。P1.2口设为高阻状态,并用220K欧的电阻接地,否则会受到杂波干扰,记住隔直电容,把手机烧了就问题大了。
   手头正好有某宝上买的成品延时电路,用的就是404AS芯片(记住是3按键的那种,4按键的用的新唐的单片机),把数码管拆了,就可以利用此电路做为一个8信号检测,无信号自动关机的成品了。

20180615_144508.jpg (627.6 KB, 下载次数: 88)

20180615_144508.jpg

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

10#
ID:350962 发表于 2018-6-16 14:50 | 只看该作者
最后把成品晒一下。

20180616_141107_001.jpg (369.59 KB, 下载次数: 85)

成品

成品

20180615_232101.jpg (746.36 KB, 下载次数: 80)

扩展电路板

扩展电路板

电路图.jpg (92.65 KB, 下载次数: 82)

电路图

电路图
回复

使用道具 举报

11#
ID:350962 发表于 2018-6-19 16:51 | 只看该作者
本帖最后由 ac9979 于 2018-6-20 10:43 编辑

经过几天的试用,将心得分享一下:
1、电源用的开关电源,要做好屏蔽工作,否则干扰太大,电路无法工作。我先加电感滤波,效果不明显,加0.1uF电容,也不明显,后来 我用铜箔将开关电源裹紧,接地,工作正常。试验时用电脑的USB电源则工作正常。
2、实际使用过程中发现有干扰信号导致无效开机,因此使用持续信号开机,每30秒清一次干扰。30秒内有7个信号即可开机,本程序每250ms检测一次信号,开机需2秒。
3、实际使用中,功放机关机有冲击噪音,20000uf电容放电时间很长,超过10秒以上,因此关机指令执行后,暂停30秒,躲避关机冲击噪音,防止频繁开关机。



无信号自动关机.zip

118.03 KB, 下载次数: 58, 下载积分: 黑币 -5

回复

使用道具 举报

12#
ID:350962 发表于 2018-6-19 16:59 | 只看该作者

20180619_134817.jpg (795.4 KB, 下载次数: 62)

20180619_134817.jpg
回复

使用道具 举报

13#
ID:60263 发表于 2019-5-10 18:00 | 只看该作者
不错,也要做一个
回复

使用道具 举报

14#
ID:548116 发表于 2019-5-29 15:55 | 只看该作者
ac9979 发表于 2018-6-13 21:27
原计划用LM339 四电压比较器 加 成品延时电路搞定,发现成品延时电路用的就是STC15w404AS, 觉得应该可 ...

用  STC15w 的头文件    P12  不是P1_2   你没有学习到位啊   
回复

使用道具 举报

15#
ID:169354 发表于 2019-5-31 10:59 | 只看该作者
555定时器搞定
回复

使用道具 举报

16#
ID:350962 发表于 2019-11-5 22:28 | 只看该作者

555是搞不定的,蓝牙会收到各种杂波信号,会误触发。当无信号自动关机时,会有冲击噪音,又会误触发,导致继续开机。
回复

使用道具 举报

17#
ID:725317 发表于 2020-4-9 09:43 来自手机 | 只看该作者
挺不错的
回复

使用道具 举报

18#
ID:704585 发表于 2020-4-10 11:43 | 只看该作者
多谢楼主分享
回复

使用道具 举报

19#
ID:1011885 发表于 2022-3-21 10:26 | 只看该作者
真不错,大神厉害
回复

使用道具 举报

20#
ID:1017092 发表于 2022-4-9 21:26 来自手机 | 只看该作者
Lan582 发表于 2022-3-21 10:26
真不错,大神厉害

很有用,我也想做个
回复

使用道具 举报

21#
ID:824664 发表于 2023-3-14 22:08 | 只看该作者
创新思路,有使用价值,好好学习、
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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