066c16b3e1e4537156ac44cc78cb470.png (145.12 KB, 下載次數: 39)
下載附件
2020-4-8 09:02 上傳
單片機源程序如下:
- /**********************************************************************
- * 名稱 : 智能調光臺燈
- * 功能 : (1)亮度不夠且有人靠近時臺燈自動亮;
- (2)靠的太近會提醒坐姿不正(蜂鳴器)
- (3)附近無人時臺燈自動熄滅(30秒) 時間可調
- (4)根據環境亮度調節等亮度
- (5)可手動調節臺燈亮度
- (6)設定學習時間
- * 備注 :
- ***********************************************************************/
- //頭函數
- #include <reg52.h>
- #include <ADC0809.H>
- //宏定義
- #define uint unsigned int
- #define uchar unsigned char
- #define DUAN P0 //數碼管段位
-
- unsigned char code tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff}; //0-9的顯示碼表 gc.debfa
- unsigned char code tab_dian[]={0x80,0x9b,0x42,0x0a,0x19,0x0c,0x04,0x9a,0x00,0x08,0xdf}; //帶點0-9的顯示碼表
- uchar pdata tt[51]; //定義空數組用于AD0809取平均值
- uchar scale=20,rsd_sec; //定義占空比比例,熱釋電計時秒變量
- char min,sec; //定義計時分秒
- //位定義
- bit bdata flag_auto, //自動切換標志位
- ss, //閃爍標志位
- flag_bs, //報警位標志位
- flag_rsd, //熱釋電動作標志位
- flag_jiejin=1; //接近傳感器標志位
- uchar flag_set=0; //設置變量:0 正常 1 調分 2 調秒
- uchar lum; //ad0809讀出值
- //函數聲明
- void delay(uchar i);
- //管腳聲明
- sbit LED = P3^4; //PWM輸出
- sbit change= P2^3; //自動模式切換按鍵
- sbit set = P2^2; //設置按鍵
- sbit add = P2^1; //加按鍵
- sbit sub = P2^0; //減按鍵
- sbit rsd = P3^6; //熱釋電
- sbit jiejin=P3^5; //接近開關
- sbit buzz=P3^7;
- sbit W0=P2^7; //數碼管位端
- sbit W1=P2^6;
- sbit W2=P2^5;
- sbit W3=P2^4;
- /**********************************************************************
- * 名稱 : display();
- * 功能 : 數碼管顯示
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void display()
- {
- if(flag_set==0) //正常模式下
- {
- DUAN=tab[min/10]; //送入段碼,秒數高位
- W0=0; //打開位地址
- delay(1); //小延時
- W0=1; //關閉位地址
- DUAN=tab_dian[min%10]; //送入段碼,秒數低位
- W1=0;
- delay(1);
- W1=1;
- DUAN=tab[sec/10]; //送入段碼,分鐘數高位
- W2=0;
- delay(1);
- W2=1;
- DUAN=tab[sec%10]; //送入段碼,分鐘數高位
- W3=0;
- delay(1);
- W3=1;
- }
- else if(flag_set==1) //設置模式下閃爍相應位
- {
- if(ss==1) //閃爍標志 ss=1 正常顯示
- {
- DUAN=~tab[min/10];
- W0=0;
- delay(1);
- W0=1;
- DUAN=~tab_dian[min%10];
- W1=0;
- delay(1);
- W1=1;
- }
- else //閃爍標志 ss=0 熄滅相應位 達到閃爍效果 ss在定時器里500ms取反一次
- {
- DUAN=~tab[10]; //
- W0=0;
- delay(1);
- W0=1;
- DUAN=~tab_dian[10];
- W1=0;
- delay(1);
- W1=1;
- }
- DUAN=~tab[sec/10];
- W2=0;
- delay(1);
- W2=1;
- DUAN=~tab[sec%10];
- W3=0;
- delay(1);
- W3=1;
- }
- else
- {
-
- DUAN=~tab[min/10];
- W0=0;
- delay(1);
- W0=1;
- DUAN=~tab_dian[min%10];
- W1=0;
- delay(1);
- W1=1;
- if(ss==1)
- {
- DUAN=~tab[sec/10];
- W2=0;
- delay(1);
- W2=1;
- DUAN=~tab[sec%10];
- W3=0;
- delay(1);
- W3=1;
- }
- else
- {
- DUAN=~tab[10];
- W2=0;
- delay(1);
- W2=1;
- DUAN=~tab[10];
- W3=0;
- delay(1);
- W3=1;
- }
- }
- }
- /**********************************************************************
- * 名稱 : 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;
- }
- }
- }
- }
- /**********************************************************************
- * 名稱 : init();
- * 功能 : 初始化定時器
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void init()
- {
- TMOD=0x11; //工作方式1
- TH1=0x3c;
- TL1=0xb0; //T1賦初值50ms
- TH0=0xff;
- TL0=0xe7; //T0賦初值25us
- ET0=1;
- ET1=1; //打開中斷允許開關
- EA=1; //中斷總開關
- TR0=1; //開定時器0 開關
- TR1=0; //關定時器0 開關
- }
- /**********************************************************************
- * 名稱 : main();
- * 功能 : 主函數
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void main()
- {
- init(); //調用初始化函數
- flag_auto=1; //初始化手動模式
- rsd=0; //熱釋電引腳置低(有信號時時高電平)
- delay(500); //延時500ms后開機
- while(1) //大循環
- {
- KEY(); //調用按鍵函數
- display(); //調用顯示函數
- }
- }
- /**********************************************************************
- * 名稱 : delay();
- * 功能 : 延時函數:大約1ms
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void delay(uchar i)
- {
- uchar j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- /**********************************************************************
- * 名稱 : void time0() interrupt 1
- * 功能 : 定時器T0 中斷服務函數:PWM脈沖發生函數
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void time0() interrupt 1
- {
- uchar n;
- TH0=0xff;
- TL0=0xe7; //重新賦初值
- n++; //每25us n++
- if(n>scale) //n<設置比例時,打開燈
- {
- LED=1;
- }
- else if(n<=scale)//n大于等于設置比例時 關閉燈
- {
- LED=0;
- }
- if(n==40) //n==40 :25us*40=1ms 1kHZ
- {
- n=0; //n=0
- }
- else ;
- }
- /**********************************************************************
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
智能臺燈.rar
(246.46 KB, 下載次數: 81)
2020-4-8 09:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|