欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8773|回復: 2
打印 上一主題 下一主題
收起左側

單片機聲控音樂彩燈Proteus仿真程序PCB

  [復制鏈接]
跳轉到指定樓層
樓主
包含C語言的代碼,AD的原理圖及PCB板圖,proteus的仿真圖,由聲音控制的音樂彩燈。可放心下載
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>      //頭文件
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define delay4us() {_nop_();_nop_();_nop_();_nop_();}   //延時4us
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. sbit beep = P1^5;
  9. uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
  10. 212,212,106,126,159,169,190,119,119,126,159,142,159,0};

  11. uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
  12. 9,3,12,12,12,12,12,9,3,12,12,12,24,0};
  13. unsigned char dat = 0x00;
  14. unsigned char count = 0x00;
  15. unsigned char CH;
  16. unsigned char dis[] = {0x00, 0x00, 0x00};
  17. unsigned int displaynum;
  18. sbit RS = P2^0;                //數據|命令選擇指示端
  19. sbit RW = P2^1;                //讀/寫選擇端
  20. sbit E= P2^2;                  //使能
  21. sbit led1= P2^3;                 //led1燈使能
  22. sbit led2= P2^4;         //led2燈使能

  23. sbit CS = P3^5;                  //片選
  24. sbit Clk = P3^4;          //ad時鐘輸入
  25. sbit DATI = P3^3;          //數據信號輸入/輸出
  26. sbit DATO = P3^3;


  27. void Disp_temper_range(uchar add,uint T);
  28. void Display();

  29. uchar code table1[]="GZ:";
  30. uchar code table2[]="SY:";
  31. uchar code table5[]="SPEED:";
  32. uchar code table3[]={0x07,0x05,0x07,0x00,0x00,0x00,0x00,0x00,
  33. 0x00,0x00,0x00,0x06,0x09,0x10,0x00,0x00,
  34. 0x00,0x00,0x00,0x00,0x01,0x12,0x0C,0x00,};
  35. uchar code table4[]={14,12,7,5,0};
  36. uchar code table6[]="1";
  37. uchar code table7[]="2";
  38. uchar code table8[]="3";
  39. uchar code table9[]="0";
  40. uchar d,a,temp,*p,aa,s,m,i=0;
  41. unsigned int num=0;
  42. unsigned char gz;
  43. unsigned char sy;
  44. unsigned char openflag=0;
  45. void DelayMS(uint x)
  46. {
  47.         uchar t;
  48.         while(x--) for(t=0;t<120;t++);
  49. }

  50. void PlayMusic()
  51. {
  52.         uint i=0,j,k;
  53.         while(SONG_LONG[i]!=0||SONG_TONE[i]!=0)
  54.         { //播放各個音符,SONG_LONG 為拍子長度
  55.             for(j=0;j<SONG_LONG[i]*20;j++)
  56.         {
  57.             beep=~beep;
  58.                 led1=~led1;
  59.                 led2=~led1;
  60.         //SONG_TONE 延時表決定了每個音符的頻率
  61.             for(k=0;k<SONG_TONE[i]/3;k++);
  62.         }
  63.             DelayMS(10);
  64.             i++;
  65. }
  66. }
  67. void delay(uint z)                   //延時函數
  68. {
  69.         uint i,j;
  70.         for(i=z;i>0;i--)
  71.         for(j=110;j>0;j--);
  72. }
  73. void delay_(uint i)
  74. {
  75.         while(i--);
  76. }
  77. bit LCD_Busy_Check()   //LCD判忙
  78. {
  79.         bit result;
  80.         RS = 0;
  81.         RW = 1;
  82.         
  83.         E= 1;
  84.         delay4us();
  85.         result = (bit)(P0&0x80);                        //        1000 0000
  86.         E= 0;
  87.         return result;
  88. }

  89. void LCD_Write_Command(uchar cmd)   //LCD寫命令
  90. {
  91.         while(LCD_Busy_Check());
  92.         RS = 0;
  93.         RW = 0;
  94.         E = 0;
  95.         _nop_();
  96.         _nop_();
  97.         P0 = cmd;
  98.         delay4us();
  99.         E = 1;
  100.         delay4us();
  101.         E = 0;
  102. }

  103. void LCD_Write_Data(uchar dat)                        //LCD寫數據
  104. {
  105.         while(LCD_Busy_Check( ));
  106.         RS = 1;
  107.         RW = 0;
  108.         E = 0;
  109.         P0 = dat;
  110.         delay4us();
  111.         
  112.         E = 1;
  113.         delay4us();
  114.         E = 0;
  115. }

  116. void set_XY(uchar X,uchar Y)   //????????
  117. {
  118.         if(Y==0)
  119.         X+=0x80;
  120.         else
  121.         X|=0xC0;
  122.         LCD_Write_Command(X);
  123. }


  124. void DispOneChar(uchar X,uchar Y,uchar Data)         //??????
  125. {
  126.         set_XY(X,Y);
  127.         LCD_Write_Data(Data);
  128. }

  129. void LCD_Initialise()             //LCD初始化
  130. {
  131.         LCD_Write_Command(0x38); DelayMS(1);
  132.         LCD_Write_Command(0x38); DelayMS(1);
  133.         LCD_Write_Command(0x38); DelayMS(1);
  134.         LCD_Write_Command(0x38); DelayMS(1);
  135.         LCD_Write_Command(0x0c); DelayMS(1);
  136.         LCD_Write_Command(0x06);
  137.         LCD_Write_Command(0x01);
  138.         delay4us();
  139.         delay4us();delay4us();delay4us();
  140. }

  141. void Display_fre(uchar f)           //        
  142. {
  143.         uchar a1,a2,a3;
  144.         a1=f/100;
  145.         a2=f/10%10;
  146.         a3=f%10;
  147.         DispOneChar(4,0,0x30+a1);
  148.         DispOneChar(5,0,0x30+a2);
  149.         DispOneChar(6,0,0x30+a3);
  150. }

  151. void Display_fre1(uchar s)        
  152. {
  153.         uchar b1,b2,b3;
  154.         b1=s/100;
  155.         b2=s/10%10;
  156.         b3=s%10;
  157.         
  158.         DispOneChar(13,0,0x30+b1);
  159.         DispOneChar(14,0,0x30+b2);
  160.         DispOneChar(15,0,0x30+b3);
  161. }

  162. void Display_fre2(uint ss)        
  163. {
  164.         uint c1,c2,c3,c4;
  165.         c1=ss/1000;
  166.         c2=ss/100%10;
  167.         c3=ss/10%10;
  168.         c4=ss%10;
  169.         
  170.         DispOneChar(7,1,0x30+c1);
  171.         DispOneChar(8,1,0x30+c2);
  172.         DispOneChar(9,1,0x30+c3);
  173.         DispOneChar(10,1,0x30+c4);
  174. }


  175. void DispChars(uchar X,uchar Y,uchar *p,uchar count) //?????
  176. {
  177.         uchar i;
  178.         for(i=0;i<count;i++)
  179.         {
  180.                 set_XY(X,Y);
  181.                 LCD_Write_Data(*p);
  182.                 X++;
  183.                 p++;
  184.         }
  185. }

  186. /*****CH=0X00,對CH1進行轉換,TGS260******/
  187. unsigned char adc0832(unsigned char CH) //模數轉化
  188. {
  189.         unsigned char i,test,adval;
  190.         adval = 0x00;
  191.         test = 0x00;
  192.         Clk = 0;
  193.         DATI = 1;
  194.         _nop_();
  195.         CS = 0;
  196.         
  197.         _nop_();
  198.         Clk = 1;
  199.         _nop_();
  200.         
  201.         if ( CH == 0x00 )           //CH=0X00,對CH1進行轉換,TGS260
  202.         {
  203.                 Clk = 0;
  204.                 DATI = 1; //
  205.                 _nop_();
  206.                 Clk = 1;
  207.                 _nop_();
  208.                 Clk = 0;
  209.                 DATI = 1;
  210.                 _nop_();
  211.                 Clk = 1;
  212.                 _nop_();
  213.         }
  214.         else
  215.         {
  216.                 Clk = 0;
  217.                 DATI = 1;
  218.                 _nop_();
  219.                 Clk = 1;
  220.                 _nop_();
  221.                 Clk = 0;
  222.                 DATI = 0;
  223.                 _nop_();
  224.                 Clk = 1;
  225.                 _nop_();
  226.         }
  227.         
  228.         Clk = 0;
  229.         DATI = 1;
  230.         
  231.         for( i = 0;i < 8;i++ ) //
  232.         {
  233.                 _nop_();
  234.                 adval <<= 1;
  235.                 Clk = 1;
  236.                 _nop_();
  237.                 Clk = 0;
  238.                 if (DATO)
  239.                         adval |= 0x01;
  240.                 else
  241.                         adval |= 0x00;
  242.         }
  243.         
  244.         
  245.         for (i = 0; i < 8; i++)
  246.         {
  247.                 test >>= 1;
  248.                 if (DATO)
  249.                 test |= 0x80;
  250.                 else
  251.                 test |= 0x00;
  252.                 _nop_();
  253.                 Clk = 1;
  254.                 _nop_();
  255.                 Clk = 0;
  256.         }
  257.         
  258.         if (adval == test)
  259.                 dat = test;
  260.                 _nop_();
  261.                 CS = 1;//ADC0832
  262.                 DATO = 1;
  263.                 Clk = 1;
  264.                
  265.         return dat;
  266. }

  267. void main(){
  268.         
  269.         led1= 0;

  270.         led2= 0;
  271.         LCD_Initialise();   //LED初始化
  272. //        DelayMS(5);
  273.           DispChars(0,0,p=table1,4);        //??“tgs”
  274. //          DelayMS(5);
  275.           DispChars(8,0,p=table2,4);        //??“mq2”
  276.         while (1){
  277.         
  278.                 gz=100-100*adc0832(0x00)/255;
  279.                         Display_fre(gz);
  280.                 sy=        100*adc0832(0x11)/255;
  281.                 Display_fre1(sy);
  282.                 if (gz<50){
  283.                         openflag = 0;
  284.                 }
  285.                 if ((50<=gz)&&(sy>40)){
  286.                         openflag = 1;
  287.                 }
  288.                 else {
  289.                         openflag = 0;
  290.                 }
  291.                 if (openflag==1)
  292.                 {
  293.                         beep=0;
  294.                         
  295.                         while(1)
  296.                         {        
  297.                                 PlayMusic(); //播放生日快樂
  298.                                 DelayMS(500);
  299.                                 break; //播放完后暫停一段時間
  300.                         }
  301.                           beep=1;
  302.                         led1=0;
  303.                         led2=0;
  304.                         num++;
  305.                         delay(200);
  306.                 }
  307.                 else{
  308.                          if (num!=0)
  309.                          {
  310.                                 num++;
  311.                                 delay(200);
  312.                                 if (num>180)
  313.                                 {
  314.                                         num=0;
  315.                                         led1=1;
  316.                                         led2=1;
  317.                                         openflag = 0;
  318.                                 }
  319.                         }
  320.                                                 
  321.                 }
  322.         }
  323. }
復制代碼

所有資料51hei提供下載:
設計.7z (2.21 MB, 下載次數: 95)

評分

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

查看全部評分

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

使用道具 舉報

無效樓層,該帖已經被刪除
板凳
ID:888600 發表于 2021-3-5 10:45 | 只看該作者
大師技術宅
回復

使用道具 舉報

無效樓層,該帖已經被刪除
5#
ID:1017547 發表于 2022-4-11 16:34 | 只看該作者
大師技術宅
回復

使用道具 舉報

6#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表