(3)ADC控制程序復制代碼
- sbit change= P2^3; //自動模式切換按鍵
- sbit set = P2^2; //設置按鍵
- sbit add = P2^1; //加按鍵
- sbit sub = P2^0; //減按鍵
- /**********************************************************************
- * 名稱 : KEY();
- * 功能 : 按鍵控制
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void KEY()
- {
- uint lum_mean,lum_all;
- uchar b,c;
- if(change==0) //自動切換按鍵按下
- {
- delay(10); //去抖
- if(change==0) //再次判斷按鍵按下
- {
- buzz=0; //蜂鳴器鳴響
- flag_auto=!flag_auto; //自動模式標志位取反
- if(flag_auto==1) //當切換到手動模式時 首先將LED發光比例PWM設置在50%
- scale=20;
- }
- while(!change) display();buzz=1; //等待按鍵釋放 松開按鍵后關閉蜂鳴器、刷新顯示
- }
- if(jiejin==0&&flag_jiejin==1) //接近傳感器檢測到障礙時 開啟報警
- {
- buzz=0;
- flag_jiejin=0;
- }
- if(jiejin!=flag_jiejin) //接近傳感器檢測不到障礙時 關閉報警
- {
- buzz=1;
- flag_jiejin=1;
- }
- if(set==0) //設置鍵按下時
- {
- delay(10);
- if(set==0)
- {
- buzz=0;
- flag_set++; //設置變量++
- if(flag_set==3) //加到3時回復回正常模式
- flag_set=0;
- flag_bs=0; //按下設置 關閉報警
- }
- while(!set) display(); buzz=1;//等待按鍵釋放 松開按鍵后關閉蜂鳴器、刷新顯示
- }
- if(flag_set==1) //加鍵按鍵只有在設置狀態(flag_set!=0)時按下才有效 調分
- {
- if(add==0) //加按鍵按下時
- {
- delay(10); //消抖
- if(add==0)
- {
- buzz=0; //蜂鳴器響
- min++; //分++
- if(min>=60)
- min=0;
- }
- while(!add) display(); buzz=1; //等待按鍵釋放 松開按鍵后關閉蜂鳴器、刷新顯示
- }
- if(sub==0) //減按鍵按下時
- {
- delay(10); //消抖
- if(sub==0)
- {
- buzz=0; //蜂鳴器響
- min--; //分--
- if(min>0)
- min=59;
- }
- while(!sub) display(); buzz=1; //等待按鍵釋放 松開按鍵后關閉蜂鳴器、刷新顯示
- }
- }
- if(flag_set==2) //調秒
- {
- if(add==0) //加鍵按下
- {
- delay(10); //消抖
- if(add==0)
- {
- buzz=0; //蜂鳴器響
- sec++; //秒++
- if(sec>=60)
- sec=0;
- }
- while(!add) display(); buzz=1; //等待按鍵釋放 松開按鍵后關閉蜂鳴器、刷新顯示
- }
- if(sub==0) //減鍵按下
- {
- delay(10);
- if(sub==0) //消抖
- {
- buzz=0; //蜂鳴器響
- sec--; //秒--
- if(sec<0)
- sec=59;
- }
- while(!sub) display(); buzz=1; //等待按鍵釋放 松開按鍵后關閉蜂鳴器、刷新顯示
- }
- while(!sub);
- }
- if(flag_auto==0) //自動模式
- {
- if(flag_rsd==1) //且有人在范圍內時 環境發光強度控制燈光變化
- {
- for(b=0;b<49;b++) //將空數組tt[]內數值整體左移一位
- {
- tt[ b]=tt[b+1]; //將后一數值放到前一位置
- }
- tt[49]=ADC0809(); //將讀出的ad0809數值放入tt[49]
- for(c=0;c<50;c++) //將tt[]內數值相加
- {
- lum_all=lum_all+tt[c];
- }
- lum_mean=lum_all/50; //將總數/50取出平均值
- // lum_all=0; //將總數清零
- if(lum_mean<=30) scale=1; //判斷取出平均值大小 小于30 發光強度0%
- else if(lum_mean>=150) scale=41; //大于150 發光強度100%
- else scale=((lum_mean-30)/3)+1; //其他值時將其計算得到發光強度 (計算目的是為了得到一個1-41之間的數值 控制燈光變化)
- }
- else
- scale=1; //沒有人在范圍內時 將燈光亮度調至0%
- }
- else //手動模式下
- {
- if(flag_set==0) //正常模式下
- {
- if(add==0) //加鍵按下
- {
- delay(10);
- if(add==0)
- {
- // buzz=0; //蜂鳴器響
- scale++; //燈光比例++
- if(scale>=41)
- scale=41;
- display();
- }
- // while(!add) display(); buzz=1;
- }
- if(sub==0) //減鍵按下時
- {
- delay(10);
- if(sub==0)
- {
- // buzz=0; //蜂鳴器響
- scale--; //燈光比例--
- if(scale>1)
- scale=1;
- display();
- }
- // while(!sub) display(); buzz=1;
- }
- }
- }
- }
ljx944848837 發表于 2019-4-2 15:13
太強了,我找這個找好久,一直在思考怎么加學習時間功能
小YY嘿 發表于 2019-5-27 17:57
你下載了沒?
aking991 發表于 2019-12-30 09:05
根據你提供的原理來看,可省去檢測光敏的芯片,用MCU自身的ADC功能代替就行了
gemxie 發表于 2021-6-8 16:44
謝謝樓主分享了,先下載寫來學習
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |