加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

基于51單片機(jī)的智能臺燈設(shè)計

10/17 09:23
549
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
  • 方案介紹
  • 相關(guān)文件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

功能要求:

模式指示燈,亮是自動模式,滅是手動模式

臺燈控制引腳

按鍵1,模式切換按鍵

按鍵2,亮度減少按鍵

按鍵3,亮度增加按鍵

人體紅外檢測功能

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char????????? // 以后unsigned char就可以用uchar代替

#define uint? unsigned int???????????? // 以后unsigned int 就可以用uint 代替

sbit LED???? = P1^0;????????????????????? // 模式指示燈,亮是自動模式,滅是手動模式

sbit Lamp??? = P1^4; ?????????????????? // 臺燈控制引腳

sbit Key1??? = P1^1;?????????????????????? // 按鍵1,模式切換按鍵

sbit Key2??? = P1^2; ??????????????????? // 按鍵2,亮度減少按鍵

sbit Key3??? = P1^3;?????????????????????? // 按鍵3,亮度增加按鍵

sbit ADC_CS? = P2^3; ?????????????????? // ADC0832的CS引腳

sbit ADC_CLK = P2^0; ??????????????????? // ADC0832的CLK引腳

sbit ADC_DAT = P2^1; ??????????????????? // ADC0832的DI/DO引腳

sbit Module? = P2^2;????????????????????? // 人體紅外檢測模塊

uchar gCount=0;?????????????????????????????? // 全局計數(shù)變量

uchar gIndex;???????????????????????????????????? // 亮度變量,0是最暗,9是最亮,一共10檔

uint? gTime=0;???????????????????????????????? // 計時變量,用于計時多久沒檢測到有人

/*********************************************************/

// 毫秒級的延時函數(shù),time是要延時的毫秒數(shù)

/*********************************************************/

void DelayMs(uint time)

{

uint i,j;

for(i=0;i<time;i++)

for(j=0;j<112;j++);

}

/*********************************************************/

// ADC0832的時鐘脈沖

/*********************************************************/

void WavePlus()

{

_nop_();

ADC_CLK = 1;

_nop_();

ADC_CLK = 0;

}

/*********************************************************/

// 獲取指定通道的A/D轉(zhuǎn)換結(jié)果

/*********************************************************/

uchar Get_ADC0832()

{

uchar i;

uchar dat1=0;

uchar dat2=0;

ADC_CLK = 0;?????????????????? // 電平初始化

ADC_DAT = 1;

_nop_();

ADC_CS = 0;

WavePlus();?????????????????????? // 起始信號

ADC_DAT = 1;

WavePlus();?????????????????????? // 通道選擇的第一位

ADC_DAT = 0;

WavePlus();?????????????????????? // 通道選擇的第二位

ADC_DAT = 1;

for(i=0;i<8;i++)???????????????? // 第一次讀取

{

dat1<<=1;

WavePlus();

if(ADC_DAT)

dat1=dat1|0x01;

else

dat1=dat1|0x00;

}

for(i=0;i<8;i++)???????????????? // 第二次讀取

{

dat2>>= 1;

if(ADC_DAT)

dat2=dat2|0x80;

else

dat2=dat2|0x00;

WavePlus();

}

_nop_();???????????????????????????? // 結(jié)束此次傳輸

ADC_DAT = 1;

ADC_CLK = 1;

ADC_CS? = 1;

if(dat1==dat2)?????????????????????????? // 返回采集結(jié)果

return dat1;

else

return 0;

}

/*********************************************************/

// 定時器初始化

/*********************************************************/

void TimerInit()

{

TMOD = 0x01;?????????????????????????? // 使用定時器0,工作方式1

TH0? = 252;???????????????????? // 給定時器0的TH0裝初值

TL0? = 24;??????????????????????? // 給定時器0的TL0裝初值

ET0? = 1;?????????????????????????????????? // 定時器0中斷使能

EA?? = 1;????????????????????????? // 打開總中斷

TR0? = 1;?????????????????????????????????? // 啟動定時器0

}

/*********************************************************/

// 手動控制

/*********************************************************/

void ManualControl()

{

// 亮度減少

if(Key2==0)??????????????????????????????? // 如果按鍵2被按下去

{

if(gIndex>0)????????????????????? // 只要當(dāng)前亮度不為最低才能減少亮度

{

gIndex--;?????????????????? // 亮度降低一檔

DelayMs(300);????????????????? // 延時0.3秒

}

}

// 亮度增加

if(Key3==0)??????????????????????????????? // 如果按鍵3被按下去

{

if(gIndex<9)????????????????????? // 只要當(dāng)前亮度不為最高才能增加亮度

{

gIndex++;????????????????????????? // 亮度增加一檔

DelayMs(300);????????????????? // 延時0.3秒

}

}

}

/*********************************************************/

// 自動控制

/*********************************************************/

void AutoControl(uchar num)

{

if(num<59)????????????????????????????????????????????????? // 最亮

gIndex=9;

else if((num>65)&&(num<81))??????????????? // 第二亮

gIndex=8;

else if((num>87)&&(num<103))????????????? // 第三亮

gIndex=7;

else if((num>109)&&(num<125))

gIndex=6;

else if((num>131)&&(num<147))

gIndex=5;

else if((num>153)&&(num<169))

gIndex=4;

else if((num>175)&&(num<191))

gIndex=3;

else if((num>197)&&(num<213))

gIndex=2;

else if((num>219)&&(num<235))

gIndex=1;

else if(num>241)??????????????????????????????????????? // 最暗

gIndex=0;

}

/*********************************************************/

// 主函數(shù)

/*********************************************************/

void main()

{

uchar ret;

TimerInit(); ????????????????????????????? // 定時器初始化

LED=0;??????????????????????????????????????? // 指示燈點(diǎn)亮(自動模式指示燈)

ret=Get_ADC0832();??????????????? // 獲取AD采集結(jié)果(環(huán)境光照強(qiáng)度)

AutoControl(ret);???????????????????? // 上電先進(jìn)行一次自動亮度控制

AutoControl(ret+7);

while(1)

{

/* 模式切換控制 */

if(Key1==0)???????????????????????????????????????? // 如果按鍵1被按下去

{

LED=~LED;???????????????????????????????? // 切換LED燈狀態(tài)

if(LED==0)????????????????????????????????? // 如果切換后是自動模式的話

{

ret=Get_ADC0832();?????? // 獲取AD采集結(jié)果(環(huán)境光照強(qiáng)度)

AutoControl(ret);??????????? // 進(jìn)行一次自動亮度調(diào)整

AutoControl(ret+7);

}

DelayMs(10);???????????????????????????? // 延時消除按鍵按下的抖動

while(!Key1);???????????????????????????? // 等待按鍵釋放

DelayMs(10);???????????????????????????? // 延時消除按鍵松開的抖動

}

/* 亮度控制 */

if(LED==1)?????????????????????????????????????????? // 如果LED是滅的

{

ManualControl();???????????????????? // 則進(jìn)行手動控制

}

 

  • 有需要資料的可了解一下.docx

相關(guān)推薦

電子產(chǎn)業(yè)圖譜