感应台灯的设计与实现Word文档下载推荐.docx
- 文档编号:4475214
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:17
- 大小:127.27KB
感应台灯的设计与实现Word文档下载推荐.docx
《感应台灯的设计与实现Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《感应台灯的设计与实现Word文档下载推荐.docx(17页珍藏版)》请在冰点文库上搜索。
3.1.1测距模块的选择
方案一:
红外线测距模块
SHARF夏普原装红外测距传感器GP2Y0A21YK0F量程10-80cm
Risym
方案二:
超声测距模块
H¥
-SRF05超声波测距摸块
附资料原理图
工作电压:
4.5V~5.5V。
功耗电流:
最小1mA最大20mA
谐振频率:
40KHz
探测距离范围:
4毫米〜4米。
误差:
4%经比较,超声测距模块的距离和工作电压都符合系统要求,而且超声测距模块比较便宜,所以本次设计采用超声测距模块。
3.1.2台灯电路的选择
采用三极管放大电路
采用上拉电源的方式
经比较,本次设计采用四组LED没有必要采用三极管放大电路,三极管电路复杂,上拉电源的方法电路简单,而且灌入单片机的电流在可控范围内,所以本次设计米用方案二。
3.2方案描述
系统总体框图如图所示。
超声测距模块测出超声波从发出到返回过程的时间,单
片机通过计时器记录这一时间,并按照公式计算出物体到系统的距离。
这个距离再通过显示模块显示出来,距离作为一个参数,PWM波参考距离的值开启或关闭
LED灯。
超声波测
计时器
距模块
J显示
STC89C5
2单片机
4个LED灯
当物体与系统间的距离为0-50cm时,开启四盏灯,距离为50-100cm时开启三盏灯,距离为100-150cm时开启两盏灯,距离为150-200cm时开启一盏灯,距离大于200cm时关闭台灯。
3.3设计原理由单片机的P3A3引脚产生一个20us的脉冲信号,超声测距模块接收到此信号的时候,产生超声波,同时ECH(引脚产生高电平信号,当接收到超声波以后,echo引脚产生低电平信号,单片机通过定时器1中断来记录时间,以此来计算距离。
单片机得出距离以后,通过定时器0中断来驱动计时数码管和距离显示数码管和PWM波,以此来控制LED灯。
3.4程序
#include<
reg52.h>
//包括一个52标准内核的头文件
#defineucharunsignedchar//定义一下方便使用
#defineuintunsignedint
#defineulongunsignedlong
〃***********************************************
sfrCLK_DI'
V=0x97;
//
//
为STC单片机定义,系统时钟分频为STC单片机的IO口设置地址定义
sfr
P0M1
=0X93;
P0M0
=0X94;
P1M1
=0X91;
P1M0
=0X92;
P2M1
=0X95;
P2M0
=0X96;
**********************************************
sbitTrig=
:
P3A3;
产生脉冲引脚
sbitEcho
=P3A2;
回波引脚
sbittest=
P3A1;
测试用引脚
sbitLED仁卩3八4;
sbitLED2=P3A5;
sbitLED3=P3A6;
sbitLED4=P3A7;
〃定义4个灯泡引脚
定义计时器计时变量
staticunsignedcharsecond,minute,hour;
〃unsignedinttcount;
unsignedcharm;
uchar
table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管显示0-9
code计时用
inttime_count=1;
unsignedchardistances;
ucharcodeSEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//数码管
0-9
uintdistance[4];
//测距接收缓冲区
ucharge,shi,bai,temp,flag,outcomeH,outcomeL,i;
//自定义寄存器
bitsucceed_flag;
//测量成功标志
//********函数声明
voidconversion(uinttemp_data);
voiddelay_20us();
voidpai_xu();
voidmain(void)//主程序{
uintdistance_data,a,b;
ucharCONT_1;
CLK_DIV=0X03;
//系统时钟为1/8晶振(pdf-45页)
P0M1=0;
//将io口设置为推挽输出
P1M1=0;
P2M1=0;
P0M0=0XFF;
P1M0=0XFF;
P2M0=0XFF;
i=0;
flag=0;
test=0;
Trig=0;
//首先拉低脉冲输入引脚
TMOD=0x11;
//定时器0,定时器1,16位工作方式
TR0=1;
//启动定时器0
IT0=0;
ET0=1;
ET1=1;
EX0=0;
EA=1;
由高电平变低电平,触发外部中断打开定时器0中断打开定时器1中断关闭外部中断打开总中断0
while
(1)//程序循环{
EA=0;
Trig=1;
delay_20us();
Trig=0;
//while(Echo==0);
succeed_flag=0;
EX0=1;
TH1=0;
TL1=0;
TF1=0;
TR1=1;
//EA=1;
产生一个20us的脉冲,在Trig引脚等待Echo回波引脚变高电平清测量成功标志打开外部中断
定时器1清零
启动定时器1
while(TH1<
30);
TR1=0;
等待测量的结果,周期
//关闭定时器1关闭外部中断
65.535毫秒(可用中断实现)
if(succeed_flag==1)
{
distance_data=outcomeH;
//distance_data<
<
=8;
//distance_data=distance_data|outcomeL;
//位结果数据
distance_data/=40;
//等于厘米
}//
米,Y米=(X秒*344)/2
/344==》X秒=0.0058*Y米==》厘米二微秒/58
if(succeed_flag==0)
distance_data=0;
test=!
test;
测量结果的高8位
放入16位的高8位
与低8位合并成为16
微秒的单位除以58
为什么除以58等于厘
X秒=(2*Y米)
没有回波则清零
测试灯变化
}distance[i]=distance_data;
//i++;
distances=distance_data;
将测量结果的数据放入缓冲区
if(i==3)
distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
pai_xu();
distance_data=distance[1];
a=distance_data;
if(b==a)CONT_1=0;
if(b!
=a)CONT_1++;
if(CONT_1>
=3){CONT_1=0;
b=a;
conversion(b);
}i=0;
}
}//外部中断0,用做判断回波电平
外部中断是0号
取出定时器的值取出定时器的值至成功测量的标志关闭外部中断
INTO_()interrupt0//
outcomeH=TH1;
//outcomeL=TL1;
//succeed_flag=1;
//EX0=0;
//定时器0中断,用做显示timer0()interrupt1//定时器0中断是1号
TH0=(65536-5)/256;
TL0=(65536-5)%256;
switch(flag)
{case0x00:
P0=ge;
P1=table[minute/10];
P2=0x17;
flag++;
break;
case
0x01:
P0=shi;
P1=(table[minute%10]&
0x7f);
P2=0x2b;
case0x02:
P0=bai;
P1=table[second/10];
P2=0x4d;
case0x03:
P1=table[second%10];
P2=0x8f;
}//计时器显示和距离显示
time_count++;
if(distances<
5&
&
distances==5)
LED1=0;
LED2=0;
LED3=0;
LED4=0;
}if(5<
distances&
(distances<
50||distances==50))
if(time_count<
distances)
LED2=1;
LED3=1;
LED4=1;
else
LED1=1;
if(time_count>
50)
{time_count=1;
}//距离在0-50,1个台灯变化,其余三个都亮
if(51<
100||distances==100)){
distances-50)
}if(time_count>
}//50-100一个灭一个变化两个常亮
if(101<
150||distances==150)){
distances-100)
time_count=1;
}//100-150依次类推
if(151<
200||distances==200)){
distances-150)
if(distances>
200)
}//以上为台灯显示,pwmt皮输出
tcount++;
if(tcount==5800)
{tcount=0;
second++;
if(second==60)
{second=0;
minute++;
if(minute==60)
{minute=0;
hour++;
if(hour==24)
{hour=0;
}//计时器时间变量增加
//*****************************************************************
//定时器1中断,用做超声波测距计时
timer1()interrupt3//定时器0中断是1号
//******************************************************************//显示数据转换程序voidconversion(uinttemp_data)
ucharge_data,shi_data,bai_data;
bai_data=temp_data/100;
temp_data=temp_data%100;
//取余运算shi_data=temp_data/10;
temp_data=temp_data%10;
//取余运算ge_data=temp_data;
bai_data=SEG7[bai_data];
shi_data=SEG7[shi_data];
ge_data=SEG7[ge_data]
bai=bai_data;
shi=shi_data;
ge=ge_data;
//******************************************************************
voiddelay_20us()
{ucharbt;
for(bt=0;
bt<
100;
bt++);
voidpai_xu()
{uintt;
if(distance[0]>
distance[1]){t=distance[0];
distance[0]=distance[1];
distance[1]=t;
if(distance[0]>
distance[2]){t=distance[2];
distance[2]=distance[0];
distance[0]=t;
if(distance[1]>
distance[2]){t=distance[1];
distance[1]=distance[2];
distance[2]=t;
四•实用化的可能性、推广价值
到目前为止,在灯具市场上,很少见到采用+5V的直流电源供电的一种人体智能台灯,它具有既不会出现触电的意外,又具有使用寿命长、无辐射、又不污染等优点,有许多普通按键台灯所无法比及的优势,智能化台灯一方面可以更节省电能,有利于环保,另一方面,在黑暗的时候自动开关灯的功能也让使用者使用起来更方便,省去黑暗中摸灯的麻烦。
五•创新点
1.附带测距显示功能,可实时掌握距离大小。
2•附带时间显示功能,可即时了解台灯开启时间六•作品实物图片
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 感应 台灯 设计 实现