登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看12759|回12|收藏
楼主 ID:306990 只看他
2018-12-17 13:33
这是我之前做的一个基于51单片机的音乐喷泉
附有原理图
0.png

单片机源程序如下:

代码:

  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit out=P3^7;
  5. sbit led1=P0^0;
  6. sbit led2=P0^1;
  7. sbit led3=P0^2;
  8. sbit led4=P0^3;
  9. sbit led5=P0^4;
  10. sbit led6=P0^5;
  11. sbit led7=P0^6;
  12. sbit led8=P0^7;
  13. sbit SCL=P1^2;                //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
  14. sbit DO=P1^3;                //DO定义为P1口的第4位脚,连接ADC0832DO脚
  15. sbit CS=P1^0;                //CS定义为P1口的第4位脚,连接ADC0832CS脚
  16. uchar scale;
  17. uchar m;
  18. uchar h1,date;
  19. unsigned char adval;
  20. void delay(uint z)
  21. {
  22.    uint y;
  23.    for(;z>0;z--)
  24.    for(y=5;y>0;y--);
  25. }

  26. /***********读数模转换数据********************************************************/       
  27. //请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
  28.                                                 //  1  1  0 通道
  29.                                                 //  1  1  1 通道
  30. unsigned char ad0832read(bit SGL,bit ODD)
  31. {
  32.         unsigned char i=0,value=0,value1=0;               
  33.                 SCL=0;
  34.                 DO=1;
  35.                 CS=0;                //开始
  36.                 SCL=1;                //第一个上升沿       
  37.                 SCL=0;
  38.                 DO=SGL;
  39.                 SCL=1;          //第二个上升沿
  40.                 SCL=0;
  41.                 DO=ODD;
  42.                 SCL=1;           //第三个上升沿
  43.                 SCL=0;           //第三个下降沿
  44.                 DO=1;
  45.                 for(i=0;i<8;i++)
  46.                 {
  47.                         SCL=1;
  48.                         SCL=0; //开始从第四个下降沿接收数据
  49.                         value<<=1;
  50.                         if(DO)
  51.                                 value=value|0x01;                                               
  52.                 }
  53.                 for(i=0;i<8;i++)
  54.                 {                        //接收校验数据
  55.                         value1=value1>>1;
  56.                         if(DO)
  57.                                 value1=value1|0x80;
  58.                         SCL=1;
  59.                         SCL=0;
  60.                 }
  61.                 CS=1;
  62.                 SCL=1;
  63.                 DO=1;       
  64.                 if(value==value1)                                //与校验数据比较,正确就返回数据,否则返回0       
  65.                         return value;
  66.                 return 0;
  67. }

  68. void penquan()          //PWM调压
  69. {
  70.         date=ad0832read(1,0);
  71.         if(date>130&&date<=200)
  72.         {
  73.                 scale=(date-100)/10+2;
  74.                 if(scale>10)
  75.                 scale=10;
  76.         }
  77.        
  78.         else if(date>200)
  79.         scale=10;
  80.         else if(date<=130)
  81.         scale=0;
  82.         if(date>=0&&date<130) P0=0xfe;
  83.         else if(date>=130&&date<140) P0=0xfc;         
  84.         else if(date>=140&&date<150) P0=0xf8;
  85.         else if(date>=150&&date<160) P0=0xe0;
  86.         else if(date>=160&&date<170) P0=0xe0;
  87.         else if(date>=170&&date<180) P0=0xc0;
  88.         else if(date>=180&&date<200) P0=0x80;
  89.         else if(date>=200) P0=0x00;
  90. //        if(date>120) led1=0; else led1=1;
  91. //        if(date>130) led2=0; else led2=1;
  92. //        if(date>140) led3=0; else led3=1;
  93. //        if(date>150) led4=0; else led4=1;
  94. //        if(date>160) led5=0; else led5=1;
  95. //        if(date>170) led6=0; else led6=1;
  96. //        if(date>180) led7=0; else led7=1;
  97. //        if(date>200) led8=0; else led8=1;
  98.         delay(300);
  99. }

  100. void init()
  101. {
  102.         TMOD=0x01;
  103.         TH0=0xfc;
  104.         TL0=0x18;
  105.         ET0=1;
  106.         TR0=1;
  107.         EA=1;
  108. }
  109. void main()
  110. {
  111.    init();
  112.    while(1)
  113.    {       
  114.                 penquan();                   //给定个延时次数        
  115.    }
  116. }

  117. void T0_time() interrupt 1
  118. {
  119.         TH0=0xfc;
  120.         TL0=0x18;
  121.         m++;
  122.         if(m<scale)
  123.         {
  124.                 out=0;
  125.         }
  126.         else
  127.         {
  128.                 out=1;
  129.         }
  130.         if(m>10)
  131.         {
  132.                 m=0;
  133.         }
  134. }

所有资料51hei提供下载:
1-程序V1.0.rar (21.04 KB)
(下载次数: 188, 2018-12-17 13:31 上传)

下载积分: 黑币 -5


原理图.pdf (60.16 KB)
(下载次数: 138, 2018-12-17 13:33 上传)

下载积分: 黑币 -5




沙发 ID:726982 只看他
2020-4-11 16:39
这原理图,可以直接在protues打开用吗
板凳 ID:726982 只看他
2020-4-11 17:23
楼主,这protues仿真有没
地板 ID:762095 只看他
2020-7-22 11:41

引用:

景帝刘启 发表于 2020-4-11 16:39
这原理图,可以直接在protues打开用吗

proteus.不能打开PDF格式文件,所以打不开的,这个原理图简单,自己画也是很快就画好的
5# ID:559084 只看他
2020-11-29 21:30
一年后才看见,不知道楼主还在没
6# ID:846386 只看他
2020-12-2 00:01
技术知识不错,学习了
7# ID:399179 只看他
2020-12-20 20:32
正想做一个,谢谢楼主无私奉献!
8# ID:898721 只看他
2021-3-30 20:05

引用:

快乐眼泪 发表于 2020-12-20 20:32
正想做一个,谢谢楼主无私奉献!

终于找到了,感谢楼主分享
9# ID:810127 只看他
2021-4-12 21:18
这个是用AD绘制的图吗,有没有proteus绘制的图啊
10# ID:908878 只看他
2021-5-8 08:28
我想问一下,你这代码实现的彩灯变化是什么形式的啊?
11# ID:995475 只看他
2021-12-21 23:40
楼主,还在吗?能不能分享你的Proteus图
12# ID:1025314 只看他
2022-5-10 11:44
为啥程序中的中断程序没有用到呢?
13# ID:1025314 只看他
2022-5-10 11:45
楼主,为啥程序中的中断程序没有被调用,能解释一下吗?

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版