找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7893|回复: 2
收起左侧

单片机声控音乐彩灯Proteus仿真程序PCB

  [复制链接]
ID:591866 发表于 2020-1-17 18:57 | 显示全部楼层 |阅读模式
包含C语言的代码,AD的原理图及PCB板图,proteus的仿真图,由声音控制的音乐彩灯。可放心下载
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
51hei.png

单片机源程序如下:
  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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:888600 发表于 2021-3-5 10:45 | 显示全部楼层
大师技术宅
回复

使用道具 举报

ID:1017547 发表于 2022-4-11 16:34 | 显示全部楼层
大师技术宅
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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