毕业设计基于单片机STC89C52RC的模拟路灯控制系统设计Word文件下载.docx
《毕业设计基于单片机STC89C52RC的模拟路灯控制系统设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《毕业设计基于单片机STC89C52RC的模拟路灯控制系统设计Word文件下载.docx(31页珍藏版)》请在冰豆网上搜索。
系统总框图如下:
2.2单元电路设计
2.2.1光耦传感电路
光耦传感电路再整个项目中起着至关重要的作用,当74ALS373给三极管信号时,三极管处于饱和状态,此时光耦传感电路形成通路。
当有车辆通过马路时此时它可感知物体,从而传给单片机,再由单片机来控制LED灯显示。
2.2.2光敏反馈电路
光敏反馈电路是通过光敏电阻的变化来调节输出,由于上图中只有光敏电阻是可变的,所以可以通过比较器来调节输出,从而来控制电路。
比较器当去掉运放的反馈电阻时,或者说反馈电阻趋于无穷大时(即开环状态),理论上认为运放的开环放大倍数也为无穷大(实际上是很大,如LM324运放开环放大倍数为100dB,既10万倍)。
此时运放便形成一个电压比较器,其输出如不是高电平(V+),就是低电平(V-或接地)。
当正输入端电压高于负输入端电压时,运放输出低电平。
当光敏电阻有光照射时,它的电阻大概在5KΩ左右,在黑暗情况下时,它的电阻大概在50KΩ左右,它的变化使得比较器的输入端口电压变化,通过比较器体现出来,然后输出端连接到单片机控制端。
输出高电平大概在4V左右,低电平是0V。
2.2.3键盘输入及数码管显示电路
2.2.4LED灯电路构成
LED的内在特征决定了它是最理想的光源去代替传统的光源,它有着广泛的用途。
体积小,LED基本上是一块很小的晶片被封装在环氧树脂里面,所以它非常的小,非常的轻。
耗电量低,LED耗电非常低,一般来说LED的工作电压是2-3.6V。
工作电流是0.02-0.03A。
这就是说:
它消耗的电不超过0.1W。
灯体内也没有松动的部分,这些特点使得LED可以说是不易损坏的。
2.2.5蜂鸣器发生及LED指示灯电路
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
;
蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
而我们用的是压电式蜂鸣器,图如上所示,当我们是pnp三极管工作在饱和状态时,三极管输出低电平,反之三级管输出高电平,使得蜂鸣器发出声音。
2.2.6故障检测电路
2.2.7直流稳压电路
三端集成稳压电路,这是一种集成电路的稳压电路,其功能是稳定直流输出电压。
这种集成电路只有三根引脚,使用很方便,在许多场合都有着广泛应用。
稳压电路的作用是使得输出的直流电压在电网电压或负载电流发生变化时保持稳定。
它由电源变压器、整流电路、滤波电路、稳压电路等4部分组成的。
变压器的作用是将交流市电变换成所需要的交流电压;
整流电路的作用是将交流电变换成单向脉动直流电;
滤波电路的作用是将脉动电压中的脉动成分去掉,输出比较平滑的直流电压;
3软件设计
主控制芯片为STC89C52RC,测量周期为Atmega16实现,由于处理器速度较快,所以采用c语言编程方便简单.软件流程图如下:
4系统测试
4.1总功率测量(室温条件下)
输入信号
频率
幅度
测量时域总功率(w)
测量频域总功率(w)
理论值
估算误差
正弦波
100Hz
1Vpp
0.127
0.129
0.125
1.2%
1KH
0.126
0.129
1.3%
音频信号
20Hz-10KHz
20mVpp-5Vpp
0.783
0.761
X
《5%
1.803
1.777
X
结果分析:
由于实验室提供的能够模仿音频信号的且能方便测量的信号只有正弦信号,所以我们用一款比较差点的信号发生器产生信号,然后进行测量,发现误差不达,在+-5%以内。
我们以音频信号进行测量,由于其实际值无法测量,所以我们只能根据时域和频域以及估计其误差,都在5%以内。
4.2单个频率分量测量(室温条件下)
频率
幅度
最大功率频点
最大功率频点功率
次大功率频点
次大功率频点功率
正弦波
500Hz
100mVpp
500Hz
1.20mw
520Hz
0.04mW
5KHz
1Vpp
5KHz
120mw
5.02KHz
3.56mw
20Hz-10K
880Hz
23mw
600Hz
4.3mw
结果分析:
我们首先以理论上单一频率的正弦波为输入信号,在理想状况下,其频谱只在正弦波频率上有值,而由于有干扰,所以在其他频点也有很小的功率。
音频信号由于有多个频点,所以没有一定的规律性。
由于音频信号波动较大,没有一定的规律,且实验室没有专门配置测量仪器,所以我们只好以正弦波和三角波作为信号进行定量分析测量,以及对音频信号进行定性的分析和测量。
我们发现其数字和用电脑模拟的结果符合得很近。
5结论
本设计以单片机STC89C52RC系统为核心部件,采用光电检测技术,通过软件分时复用控制算法对系统进行优化,分模块实现赛题要求。
在系统设计过程中,充分利用单片机的强大功能,力求以方便灵活的软件编程简化复杂难调的硬件电路,满足系统设计要求。
坚持“人性化”理念,在具体设计中,使用键盘输入、七段数码管显示形成较为友好的人机交互界面。
整机操作简单,使用方便,并很好的完成竞赛的全部要求。
本设计主要特色:
●采用全集成混合信号在线系统单片机——STC89C52RC主控系统,提高系统运行速度、简化硬件设计;
●优化的软件算法,智能化的自动控制;
●传感器检测系统,采用光敏电阻与光耦传感器;
●信号通过光电耦合器传递,实现控制电路与供电驱动电路隔离;
●声光告警指示电路;
在本次设计过程中,我们三人通力合作,排除万难,终于按时完成了赛题设计任务。
在这短短的四天三夜比赛过程中我们不仅提高了自己解决问题的能力,而且深深体会到团队协作精神的重要性。
参考文献:
《信号与系统》,ALANV.OPPENHEIM著,西安:
西安交通大学出版社,1997年;
《数字图像处理学》,元秋奇著,北京:
电子工业出版社,2000年;
《模拟电子线路基础》,吴运昌著,广州:
华南理工大学出版社,2004年;
《数字电子技术基础》,阎石著,北京:
高等教育出版社,1997年;
《数据结构与算法》,张晓丽等著,北京:
机械工业出版社,2002年;
《ARM&
Linux嵌入式系统教程》,马忠梅等著,北京:
北京航空航天大学出版社,2004年;
《单片机原理及应用》,李建忠著,西安:
西安电子科技大学,2002年;
附录:
附1:
元器件明细表:
1、D8255AC
2、STC89C52
3、DAC0832
4、ADC0809
5、74LS245
6、液晶320*240
附2:
仪器设备清单
1、数字示波器
2、数字万用表
3、信号发生器
4、稳压电源
附3:
电路图图纸
附4:
程序清单
/**********
************
模拟路灯程序
***************
***************/
#include<
reg52.h>
absacc.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
#definecom8255XBYTE[0xff7f]//8255端口定义
#definepa8255XBYTE[0xff7c]
#definepb8255XBYTE[0xff7d]
#definepc8255XBYTE[0xff7e]
bitcounta,countb;
ucharbdatacurrentp1;
//p1实时信号
sbitsunshine=currentp1^0;
sbitsensor1=currentp1^1;
sbitsensor2=currentp1^2;
sbitsensor3=currentp1^3;
sbittrouble1=currentp1^4;
sbittrouble2=currentp1^5;
ucharbdatasensorvalue;
//信号标志位
sbitsensor1value=sensorvalue^0;
sbitsensor2value=sensorvalue^1;
sbitsensor3value=sensorvalue^2;
sbitled1en=sensorvalue^3;
//到达显示时间
sbitled2en=sensorvalue^4;
//到达显示时间
sbitalarmen=sensorvalue^5;
//关闭报警
ucharbdataoutnum;
//输出信号
sbitsensorswitch=outnum^1;
//传感器总开关
sbitledswitch=outnum^2;
sbitled1switch=outnum^3;
sbitled2switch=outnum^4;
sbitalarmled1=outnum^6;
sbitalarmled2=outnum^7;
sbitalarmspeaker=outnum^5;
sbitlock=P3^1;
sbitdir2=P3^0;
sbitdir1=P2^0;
//是否全局变量待定
ucharms/*毫秒*/,msd,ms500,
second,minute,hour,//时钟
a1hour,a1minute,a1second,//a灯开灯时间
a2hour,a2minute,a2second,//a灯关闭时间
a3hour,a3minute,a3second,//a灯灯亮时长
aihour,aiminute,aisecond,//a灯定时时间
b1hour,b1minute,b1second,//b灯开灯时间
b2hour,b2minute,b2second,//b灯关灯时间
b3hour,b3minute,b3second,//b灯灯亮时长
bihour,biminute,bisecond,//b灯定时时间
k2num,//调时开关
k3num,//切换显示开关
k6num;
//高峰期开关
uintyear;
//年月日
uchardate,month;
ucharcodetable[]={//数码管编码
0xfc,0x60,0xda,0xf2,
0x66,0xb6,0xbe,0xe0,
0xfe,0xf6,0xee,0x3e,
0x9c,0x7a,0x9e,0x8e};
/****************/
voidinit()//初始化
{a1hour=16,//默认值16点开a灯
a2hour=7,//默认值7点关b灯
a3second=30,//默认a灯亮三十秒
b1hour=16,//默认16点开b灯
b2hour=7,//默认7点关b灯
b3second=30,//默认b灯亮三十秒
com8255=0x80;
pc8255=0xff;
com8255=0x89;
//8255ab出c入
ms=0;
second=0;
minute=0;
hour=0;
date=27;
month=7;
year=2011;
P1=0xff;
dir1=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TMOD=0x11;
EA=1;
ET0=1;
TR0=1;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET1=1;
}
/**************/
voiddelayms(uintz)//延时一毫秒
{
uintx=0;
uchary=0;
for(x=z;
x>
0;
x--)
for(y=120;
y>
y--);
}
/*显示函数*/
voiddisplay(ucharh,ucharm,uchars)//显示
{ucharn,j,temp=0x80/*选管最高位*/;
ulongnum=s+m*1000+h*1000000;
for(j=0;
j<
8;
j++)
{pb8255=temp;
temp=_cror_(temp,1);
n=num%10;
if(j==2||j==5)
pa8255=0x90;
else
pa8255=table[n];
num=num/10;
delayms(5);
pa8255=0x00;
}
voiddisdead(ucharh,ucharm,uchars)//熄灭显示
{ucharn,j,temp=0x80;
{pb8255=temp;
if(j==2||j==5)
pa8255=0x00;
else
pa8255=0x00;
}
voiddisdead1(ucharh,ucharm,uchars,ucharwei1,ucharwei2)//调时熄灭显示
if(j==wei1||j==wei2)//试验
elseif(j==2||j==5)
pa8255=0x90;
voiddispdate(ulongy,ucharm,uchard)//显示年月日
ulongnum=d+m*100+y*10000;
for(j=0;
{pb8255=temp;
temp=_cror_(temp,1);
n=num%10;
pa8255=table[n];
num=num/10;
delayms(5);
pa8255=0x00;
}
/******************/
ucharkeyscan()//键盘扫描
{uchartemp,temp1;
temp=pc8255;
temp=temp&
0xfe;
if(0xfe!
=temp)
{delayms(10);
if(temp!
=0xfe)
{
temp1=pc8255;
temp1=temp1&
while(temp1!
{if(temp1==0x7e)//状
dispdate(year,month,date);
else
{
if(k3num==0)
display(hour,minute,second);
//可改变
elseif(k3num==1)
display(a1hour,a1minute,a1second);
elseif(k3num==2)
display(a2hour,a2minute,a2second);
elseif(k3num==3)
display(a3hour,a3minute,a3second);
elseif(k3num==4)
display(b1hour,b1minute,b1second);
elseif(k3num==5)
display(b2hour,b2minute,b2second);
elseif(k3num==6)
display(b3hour,b3minute,b3second);
//态
}//机
//display(num1);
//second++;
//display(second+minute*100+hour*1000);
}
}
}
returntemp;
voiddecrease(uchar*h,uchar*m,uchar*s)//减少数值
{
switch(k2num)
{case1:
(*s)--;
if(*s==-1)
*s=59;
break;
case2:
(*m)--;
if(*m==-1)
*m=59;
case3:
(*h)--;
if(*h==-1)
*h=23;
}
voidincrease(uchar*h,uchar*m,uchar*s)//数值增加
{
switch(k2num)
{case1:
(*s)++;
if(*s==60)
*s=0;
break;
case2:
(*m)++;
if(*m==60)
*m=0;
case3:
(*h)++;
if(*h==24)
*h=0;