標(biāo)題: 基于51單片機(jī)聲控彩燈仿真程序 音頻放大器仿真 [打印本頁]

作者: 電子哎嗨    時間: 2020-12-18 14:23
標(biāo)題: 基于51單片機(jī)聲控彩燈仿真程序 音頻放大器仿真
該仿真設(shè)計(jì)通過音頻放大器,根據(jù)聲音的大小來點(diǎn)亮不同小燈個數(shù)

仿真圖:




運(yùn)行圖:




程序:


單片機(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)





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1