找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3163|回复: 0
收起左侧

基于51单片机声控彩灯仿真程序 音频放大器仿真

[复制链接]
ID:331717 发表于 2020-12-18 14:23 | 显示全部楼层 |阅读模式
该仿真设计通过音频放大器,根据声音的大小来点亮不同小灯个数

仿真图:
125.png



运行图:
333.png



程序:
222.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char                // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int                // 以后unsigned int 就可以用uint 代替


  5. sbit ADC_CS  = P1^7;                                         // ADC0832的CS引脚
  6. sbit ADC_CLK = P1^6;                                         // ADC0832的CLK引脚
  7. sbit ADC_DAT = P1^5;                                         // ADC0832的DI/DO引脚


  8. /*********************************************************/
  9. // 毫秒级的延时函数,time是要延时的毫秒数
  10. /*********************************************************/
  11. void DelayMs(uint time)
  12. {
  13.         uint i,j;
  14.         for(i=0;i<time;i++)
  15.                 for(j=0;j<112;j++);
  16. }



  17. /*********************************************************/
  18. // ADC0832的时钟脉冲
  19. /*********************************************************/
  20. void WavePlus()
  21. {
  22.         _nop_();
  23.         ADC_CLK = 1;
  24.         _nop_();
  25.         ADC_CLK = 0;
  26. }



  27. /*********************************************************/
  28. // 获取指定通道的A/D转换结果
  29. /*********************************************************/
  30. uchar Get_ADC0832()
  31. {
  32.         uchar i;
  33.         uchar dat1=0;
  34.         uchar dat2=0;
  35.        
  36.         ADC_CLK = 0;                                // 电平初始化
  37.         ADC_DAT = 1;
  38.         _nop_();
  39.         ADC_CS = 0;
  40.         WavePlus();                                        // 起始信号
  41.         ADC_DAT = 1;
  42.         WavePlus();                                        // 通道选择的第一位
  43.         ADC_DAT = 0;      
  44.         WavePlus();                                        // 通道选择的第二位
  45.         ADC_DAT = 1;
  46.        
  47.         for(i=0;i<8;i++)                // 第一次读取
  48.         {
  49.                 dat1<<=1;
  50.                 WavePlus();
  51.                 if(ADC_DAT)
  52.                         dat1=dat1|0x01;
  53.                 else
  54.                         dat1=dat1|0x00;
  55.         }
  56.        
  57.         for(i=0;i<8;i++)                // 第二次读取
  58.         {
  59.                 dat2>>= 1;
  60.                 if(ADC_DAT)
  61.                         dat2=dat2|0x80;
  62.                 else
  63.                         dat2=dat2|0x00;
  64.                 WavePlus();
  65.         }
  66.        
  67.         _nop_();                                                // 结束此次传输
  68.         ADC_DAT = 1;
  69.         ADC_CLK = 1;
  70.         ADC_CS  = 1;   

  71.         if(dat1==dat2)                        // 返回采集结果
  72.                 return dat1;
  73.         else
  74.                 return 0;
  75. }


  76. /*********************************************************/
  77. // 自动控制
  78. /*********************************************************/
  79. void AutoControl(uchar num)
  80. {
  81.         if(num<1)                                                                                                               
  82.                 P2=0xff;
  83.         else if((num>1)&&(num<10))                                       
  84.                 P2=0x7f;
  85.         else if((num>10)&&(num<20))                               
  86.                 P2=0x3f;
  87.         else if((num>20)&&(num<30))
  88.                 P2=0x1f;
  89.         else if((num>30)&&(num<50))
  90.                 P2=0x0f;
  91.         else if((num>50)&&(num<70))
  92.                 P2=0x07;
  93.         else if((num>70)&&(num<100))
  94.                 P2=0x03;
  95.         else if((num>100)&&(num<140))
  96.                 P2=0x01;
  97.         else if(num>150)
  98.                 P2=0x00;
  99. }



  100. /*********************************************************/
  101. // 主函数
  102. /*********************************************************/
  103. void main()
  104. {
  105.         uchar ret;
  106.        
  107.         while(1)
  108.         {               
  109.                                 ret=Get_ADC0832();                // 获取AD采集结果
  110.                                 AutoControl(ret);                        // 进行自动控制       
  111.                                 DelayMs(200);
  112.         }
  113. }
复制代码

所有资料51hei提供下载:
仿真.rar (70.52 KB, 下载次数: 38)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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