欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機智能臺燈源程序
[打印本頁]
作者:
llx888888888
時間:
2020-4-8 09:04
標題:
單片機智能臺燈源程序
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
作者:
xuwei517
時間:
2020-5-5 11:32
程序里的 碼表代碼 沒看懂是用共陰還是共陽的數碼管呢? 請教下
作者:
??4554
時間:
2020-8-11 20:52
接5伏,是共陽
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1