功能要求:
模式指示燈,亮是自動模式,滅是手動模式
臺燈控制引腳
按鍵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;?????????????????????????????? // 全局計數變量
uchar gIndex;???????????????????????????????????? // 亮度變量,0是最暗,9是最亮,一共10檔
uint? gTime=0;???????????????????????????????? // 計時變量,用于計時多久沒檢測到有人
/*********************************************************/
// 毫秒級的延時函數,time是要延時的毫秒數
/*********************************************************/
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轉換結果
/*********************************************************/
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_();???????????????????????????? // 結束此次傳輸
ADC_DAT = 1;
ADC_CLK = 1;
ADC_CS? = 1;
if(dat1==dat2)?????????????????????????? // 返回采集結果
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)????????????????????? // 只要當前亮度不為最低才能減少亮度
{
gIndex--;?????????????????? // 亮度降低一檔
DelayMs(300);????????????????? // 延時0.3秒
}
}
// 亮度增加
if(Key3==0)??????????????????????????????? // 如果按鍵3被按下去
{
if(gIndex<9)????????????????????? // 只要當前亮度不為最高才能增加亮度
{
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;
}
/*********************************************************/
// 主函數
/*********************************************************/
void main()
{
uchar ret;
TimerInit(); ????????????????????????????? // 定時器初始化
LED=0;??????????????????????????????????????? // 指示燈點亮(自動模式指示燈)
ret=Get_ADC0832();??????????????? // 獲取AD采集結果(環(huán)境光照強度)
AutoControl(ret);???????????????????? // 上電先進行一次自動亮度控制
AutoControl(ret+7);
while(1)
{
/* 模式切換控制 */
if(Key1==0)???????????????????????????????????????? // 如果按鍵1被按下去
{
LED=~LED;???????????????????????????????? // 切換LED燈狀態(tài)
if(LED==0)????????????????????????????????? // 如果切換后是自動模式的話
{
ret=Get_ADC0832();?????? // 獲取AD采集結果(環(huán)境光照強度)
AutoControl(ret);??????????? // 進行一次自動亮度調整
AutoControl(ret+7);
}
DelayMs(10);???????????????????????????? // 延時消除按鍵按下的抖動
while(!Key1);???????????????????????????? // 等待按鍵釋放
DelayMs(10);???????????????????????????? // 延時消除按鍵松開的抖動
}
/* 亮度控制 */
if(LED==1)?????????????????????????????????????????? // 如果LED是滅的
{
ManualControl();???????????????????? // 則進行手動控制
}