找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3184|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)聲控彩燈仿真程序 音頻放大器仿真

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:331717 發(fā)表于 2020-12-18 14:23 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
該仿真設(shè)計通過音頻放大器,根據(jù)聲音的大小來點亮不同小燈個數(shù)

仿真圖:




運行圖:




程序:


單片機(jī)源程序如下:
  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. // 毫秒級的延時函數(shù),time是要延時的毫秒數(shù)
  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轉(zhuǎn)換結(jié)果
  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_();                                                // 結(jié)束此次傳輸
  68.         ADC_DAT = 1;
  69.         ADC_CLK = 1;
  70.         ADC_CS  = 1;   

  71.         if(dat1==dat2)                        // 返回采集結(jié)果
  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. // 主函數(shù)
  102. /*********************************************************/
  103. void main()
  104. {
  105.         uchar ret;
  106.        
  107.         while(1)
  108.         {               
  109.                                 ret=Get_ADC0832();                // 獲取AD采集結(jié)果
  110.                                 AutoControl(ret);                        // 進(jìn)行自動控制       
  111.                                 DelayMs(200);
  112.         }
  113. }
復(fù)制代碼

所有資料51hei提供下載:
仿真.rar (70.52 KB, 下載次數(shù): 38)
程序.rar (45.1 KB, 下載次數(shù): 24)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表