微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 哪位帮我解答下代码功能,谢谢

哪位帮我解答下代码功能,谢谢

时间:10-02 整理:3721RD 点击:

#include<reg52.h>

#include<intrins.h>

#include<iic.h>


#define uchar unsigned char

#define uint unsigned int



sbit K1 = P2^6;                     //声音检测

sbit K3 = P3^2;                        //模式选择按键



sbit LED  = P3^4;          //LED管脚


char Set_Sel = 0;

/*---------------------------------------------------

                         延时函数

-----------------------------------------------------*/

void delaym(uint q)

{

        uint i,j;

        for(i=0;i<q;i++)

                for(j=0;j<120;j++);

}

//adc0832驱动程序

sbit ADC0832_CS =P2^2;       //将CS位定义为P3.4引脚

sbit ADC0832_CLK=P2^3;       //将CLK位定义为P3.3引脚

sbit ADC0832_DIO=P2^0;       //将DIO位定义为P3.5引脚


unsigned char Read_ADC0832(unsigned char Ch)

{

        unsigned char i,dat; //定义变量

        ADC0832_CS=1;   //一个转换周期开始

        ADC0832_CLK=0;  //为第一个脉冲作准备

        ADC0832_CS=0;  //CS置0,片选有效


        ADC0832_DIO=1;    //DIO置1,规定的起始信号  

        ADC0832_CLK=1;   //第一个脉冲

        ADC0832_CLK=0;   //第一个脉冲的下降沿,此前DIO必须是高电平

        ADC0832_DIO=1;   //DIO置1, 通道选择信号  

        ADC0832_CLK=1;   //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0

        ADC0832_CLK=0;   //第二个脉冲下降沿

        ADC0832_DIO=Ch;   //DI置0,选择通道0

        ADC0832_CLK=1;    //第三个脉冲

        ADC0832_CLK=0;    //第三个脉冲下降沿

        ADC0832_DIO=1;    //第三个脉冲下沉之后,输入端DIO失去作用,应置1

        ADC0832_CLK=1;    //第四个脉冲

        for(i=0;i<8;i++)  //高位在前

        {

                ADC0832_CLK=1;         //第四个脉冲

                ADC0832_CLK=0;

                dat<<=1;       //将下面储存的低位数据向右移

                dat|=(unsigned char)ADC0832_DIO;          //将输出数据DIO通过或运算储存在dat最低位

        }                                 

        ADC0832_CS=1;          //片选无效

        return dat;         //将读书的数据返回     

}

//LED亮度调节初始化函数

void PWM_Init(void)

{

    TMOD|= 0x11;

        TH1 = 0xfe; //11.0592

        TL1 = 0x33;

        TR1  = 1;

    IE =0x8A;        

}

//LED亮度调节程序

char  timer1,         Duty_Cnt;

void T1zd(void) interrupt 3    //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断

{

        TH1 = 0xfe; //11.0592

        TL1 = 0x33;

    if(timer1 == 10)   

        {

                timer1 = 0;  

                LED = 0;

        }

        if(Duty_Cnt == timer1)         

        {

                         LED = 1;

        }

        timer1++;

}

//光照检测         进行PWM占空比转换

int adc_value = 0;

uchar adc_cnt = 0;

uint  adc_add_value = 0;

void Caluc_Value(void)

{

  uchar        ad_value_temp;


  ad_value_temp = Read_ADC0832(0);

  adc_add_value += ad_value_temp;  

  adc_cnt ++;

  if(adc_cnt >= 20)

  {

                adc_value = adc_add_value / 20;

                adc_value = 255 - adc_value;                                           //获取到光照强度

                adc_cnt = 0;

                adc_add_value = 0;


                Duty_Cnt =         8 - (adc_value / 10) * 4 / 10;                  //LED亮度等级

        }                        


}


//声音检测

char Cnt_V = 0;

char Open_Flag = 0;

char Sel_Fll = 0;

void Key_Scan()

{

  if(!K3)                                                //模式设置按键检测到

  {

        delaym(10);


           Sel_Fll = !Sel_Fll;


        while(!K3)  ;

  }

  if(Sel_Fll == 0)                                  //模式0  光照控制

  {

          if(K1)

          {

           while(K1)

           {

                    LED = 1;        EA = 0;

                   Open_Flag = 0;

           }

          }

          else

          {

                 if(!Open_Flag){LED = 0;        EA = 1;}                 Open_Flag = 1;

          }

  }

  else                                                      //模式1  声音控制

  {

  if(!K1)                                                            //声音检测

  {

        delaym(20);


           Cnt_V++;           Cnt_V %= 6;

        if(Cnt_V == 1)                                  //第一次检测到

        {

           Duty_Cnt = 2;

           LED = 0;        EA = 1;        

        }

        else if(Cnt_V == 2)                     //第二次检测到                 亮度等级1

        {

          Duty_Cnt = 4;


        }

        else if(Cnt_V == 3)                      //第三次检测到                   亮度等级2

        {

          Duty_Cnt = 6;


        }

        else if(Cnt_V == 4)                           //第四次检测到          亮度等级3

        {

         Duty_Cnt = 8;


        }  

        else if(Cnt_V == 5)                                 //第五次检测到                          关闭LED

        {

          LED = 1;        EA = 0;        

        }  

      while(!K1)  ;


  }

   }


}

//主程序

void main()

{

        PWM_Init();         EA = 1;         //PWM初始化         

        while(1)

        {        

          Key_Scan();                        //声音检测及模式设置函数

                if(Open_Flag && !Sel_Fll)           //光照控制模式

                {

                        Caluc_Value();                                  //光照转换为LED亮度等级

                }

        }

}


需要解释什么呢,有需求可以联系Q562463654

这个程序写的不错,注释说明也很全,很少见到的了。这是一个灯箱吗,模式选择没看懂,整体应该是用PWM调整光照亮度,用ADC检测光照亮度,可以通过声音,估计是拍掌的动作,选择光亮等级和关灯

对的,模式选择就是有两个,一个进入声音检测模式,一个是根据光照强度点亮灯泡

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top