#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亮度等级 } }}
一周热门 更多>