哪位帮我解答下代码功能,谢谢
#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检测光照亮度,可以通过声音,估计是拍掌的动作,选择光亮等级和关灯
对的,模式选择就是有两个,一个进入声音检测模式,一个是根据光照强度点亮灯泡