找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1881|回复: 3
收起左侧

stc12单片机制作的随着音乐声音大小变化节奏的喷泉程序

[复制链接]
ID:702185 发表于 2020-3-4 11:08 | 显示全部楼层 |阅读模式
利用stc12制作的随着音乐声音大小变化节奏的喷泉

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

仿真图

仿真图

单片机源程序如下:
  1. #include"reg51.h"
  2. #include"intrins.h"
  3. #define FOSC 18432000L
  4. #define BAUD 9600
  5. typedef unsigned char uchar;
  6. typedef unsigned int  uint;

  7. /* ****************************   
  8. 声明与ADC有关的寄存器

  9. ADC 控制寄存器   ADC_CONTR
  10. AD转换结果寄存器 ADC_RES,
  11. P1口模拟功能控制寄存器 P1ASF

  12. *****************************/

  13. sfr ADC_CONTR =0xBC;        //1010 1011   P1.3作为AD输入
  14. sfr ADC_RES          =0xBD;         //ADC高8位寄存器
  15. sfr ADC_LOW2  =0xBE;  //ADC低2位寄存器
  16. sfr        P1ASF     =0x9D;  //1001 1101
  17. sbit MUTE=P3^0;
  18. sbit PWM=P0^0;



  19. /*定义ADC控制的ADC操作常数*/
  20. #define ADC_POWER   0x80         //ADC电源控制位B7 1:打开电源 0:关闭电源
  21. #define ADC_FLAG    0x10        //ADC转换结束标志位B4,AD转换完成=1,要用软件清0
  22. #define ADC_START   0x08  //ADC启动控制位B3,1:开始转换 转换结束为0
  23. #define ADC_SPEEDLL   0x00
  24. #define ADC_SPEEDL   0x20
  25. #define ADC_SPEEDH   0x40
  26. #define ADC_SPEEDHH   0x60

  27. void InitUart();
  28. void InitADC();
  29. void SendData(uchar dat);
  30. uchar GetADCResult(uchar ch);
  31. void Delay(uint n);
  32. void ShowResult(uchar ch);

  33. /****************
  34.   AD转换
  35. ****************/
  36. uchar GetADCResult(uchar ch)   
  37. {
  38.    ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;  //启动转换
  39.    _nop_();        
  40.    _nop_();
  41.    _nop_();         //等待转换完成
  42.    _nop_();
  43.    while(!(ADC_CONTR&ADC_FLAG)); //等待转换完成
  44.    ADC_CONTR&=~ADC_FLAG;        //关闭ADC
  45.    return ADC_RES;          //返回AD转换结果
  46. }

  47. /***************
  48.   串口初始化
  49. ***************/
  50. void InitUart()
  51. {
  52.    SCON=0X5a;                        //设置为工作方式1
  53.         TMOD=0X20;                        //设置计数器工作方式2,8位自动重装                        
  54.         TH1=TL1=-(FOSC/12/32/BAUD);         //计数器初始值设置,注意波特率是9600的
  55.         TR1=1;                                        //打开计数器
  56. }

  57. /***************
  58.    ADC初始化
  59. ****************/
  60. void InitADC()
  61. {
  62.    P1ASF=0xff;           //开启8路ADC
  63.    ADC_RES=0;           //清除以前的结果
  64.    ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
  65.    Delay(2);     //开启ADC电源和延时
  66. }


  67. /**********************
  68. 发送一个字节到电脑
  69. ***********************/
  70. void SendData(uchar dat)
  71. {
  72.    while(!TI);  //等待数据发送完成
  73.    TI=0;   //清除标志
  74.    SBUF= dat ;        //发送数据
  75. }

  76. /**************
  77.   软件延时=
  78. ***********----------------------------------------------------------------****/
  79. void Delay(uint n)         
  80. {
  81.    uint x;
  82.    while(n--)
  83.    {                        
  84.       x=5000;
  85.       while(x--);
  86.    }
  87. }

  88. void delay_50(uint n)         
  89. {
  90.    uint x;
  91.    while(n--)
  92.    {                        
  93.       x=50;
  94.       while(x--);
  95.    }
  96. }        

  97. void main()
  98. {
  99.    uint date,h1;
  100.    InitUart();    //串口初始化
  101.    InitADC();     //ADC初始化
  102.    ADC_CONTR |=0x80;  //开启ADC电源

  103.    while(1)
  104.    {     
  105.           if(MUTE)
  106.           {
  107.             P2=0x00;
  108.                   P0=0x00;               
  109.                   continue;
  110.           }         
  111.       //SendData(3);          //发送转换通道
  112.     // SendData( GetADCResult(3));        //发送ADC高8位结果到串口        
  113.          if(GetADCResult(3)>0x12&&GetADCResult(3)<0x14)
  114.             P2=11*GetADCResult(3) ;           
  115.           else                                      
  116.                   P2=GetADCResult(3);
  117.                 date=GetADCResult(3)+40;ev
  118.           h1=0xff-date;
  119.           PWM=0;
  120.                 delay_50(date);
  121.           PWM=1;
  122.                 delay_50(h1);  
  123.         }         
  124. }         
复制代码

所有资料51hei提供下载:
proteus仿真.zip (83.94 KB, 下载次数: 25)

评分

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

查看全部评分

回复

使用道具 举报

ID:1 发表于 2020-3-6 13:36 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:702057 发表于 2020-3-7 13:40 | 显示全部楼层
看着像那么回事啊,像样的,希望能哦哟哟!
回复

使用道具 举报

ID:702185 发表于 2020-3-10 12:26 | 显示全部楼层
admin 发表于 2020-3-6 13:36
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)

您好,请问编辑按钮在哪儿呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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