找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1538|回复: 1
打印 上一主题 下一主题
收起左侧

单片机音乐喷泉源程序

[复制链接]
跳转到指定楼层
楼主
ID:495574 发表于 2020-7-23 16:18 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit out=P3^7;
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
sbit led5=P0^4;
sbit led6=P0^5;
sbit led7=P0^6;
sbit led8=P0^7;
sbit SCL=P1^2;                //SCL定义为P1口的第3位脚,连接ADC0832SCL脚
sbit DO=P1^3;                //DO定义为P1口的第4位脚,连接ADC0832DO脚
sbit CS=P1^0;                //CS定义为P1口的第4位脚,连接ADC0832CS脚
uchar scale;
uchar m;
uchar h1,date;
unsigned char adval;
void delay(uint z)
{
   uint y;
   for(;z>0;z--)
   for(y=5;y>0;y--);
}

/***********读数模转换数据********************************************************/        
//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
                                                //  1  1  0 通道
                                                //  1  1  1 通道
unsigned char ad0832read(bit SGL,bit ODD)
{
        unsigned char i=0,value=0,value1=0;               
                SCL=0;
                DO=1;
                CS=0;                //开始
                SCL=1;                //第一个上升沿        
                SCL=0;
                DO=SGL;
                SCL=1;          //第二个上升沿
                SCL=0;
                DO=ODD;
                SCL=1;           //第三个上升沿
                SCL=0;           //第三个下降沿
                DO=1;
                for(i=0;i<8;i++)
                {
                        SCL=1;
                        SCL=0; //开始从第四个下降沿接收数据
                        value<<=1;
                        if(DO)
                                value=value|0x01;                                                
                }
                for(i=0;i<8;i++)
                {                        //接收校验数据
                        value1=value1>>1;
                        if(DO)
                                value1=value1|0x80;
                        SCL=1;
                        SCL=0;
                }
                CS=1;
                SCL=1;
                DO=1;        
                if(value==value1)                                //与校验数据比较,正确就返回数据,否则返回0        
                        return value;
                return 0;
}

void penquan()          //PWM调压
{
        date=ad0832read(1,0);
        if(date>130&&date<=200)
        {
                scale=(date-100)/10+2;
                if(scale>10)
                scale=10;
        }
        
        else if(date>200)
        scale=10;
        else if(date<=130)
        scale=0;
        if(date>=0&&date<130) P0=0xfe;
        else if(date>=130&&date<140) P0=0xfc;         
        else if(date>=140&&date<150) P0=0xf8;
        else if(date>=150&&date<160) P0=0xe0;
        else if(date>=160&&date<170) P0=0xe0;
        else if(date>=170&&date<180) P0=0xc0;
        else if(date>=180&&date<200) P0=0x80;
        else if(date>=200) P0=0x00;
//        if(date>120) led1=0; else led1=1;
//        if(date>130) led2=0; else led2=1;
//        if(date>140) led3=0; else led3=1;
//        if(date>150) led4=0; else led4=1;
//        if(date>160) led5=0; else led5=1;
//        if(date>170) led6=0; else led6=1;
//        if(date>180) led7=0; else led7=1;
//        if(date>200) led8=0; else led8=1;
        delay(300);
}

void init()
{
        TMOD=0x01;
        TH0=0xfc;
        TL0=0x18;
        ET0=1;
        TR0=1;
        EA=1;
}
void main()
{
   init();
   while(1)
   {        
                penquan();                   //给定个延时次数         
   }
}

void T0_time() interrupt 1
{
        TH0=0xfc;
        TL0=0x18;
        m++;
        if(m<scale)
        {
                out=0;
        }
        else
        {
                out=1;
        }
        if(m>10)
        {
                m=0;
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2020-7-23 22:49 | 只看该作者
能分享下原理图吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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