基于单片机的光感自动控制百叶窗系统文档格式.docx
《基于单片机的光感自动控制百叶窗系统文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的光感自动控制百叶窗系统文档格式.docx(20页珍藏版)》请在冰点文库上搜索。
利用内部复位电路进行初始化
清屏(DISPLAYCLEAR);
功能设置(FUNCTIONSET);
DL=1:
8Bit接口数据;
N=0:
1行显示;
F=0:
5×
7dot字形;
显示开/关控制(DISPLAYON/OFFCONTROL)
D=0:
显示关;
C=0:
光标关;
B=0:
消隐关
输入方式设置(ENTRYMODESET)
I/D=1:
(增量):
S=0:
无移位:
ADC0809
图1
ADC0809内部结构图
IN7~IN0——模拟量输入通道
ALE——地址锁存允许信号。
对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。
START——转换启动信号。
START下降沿时启动芯片,开始进行A/D转换;
在A/D转换期间,START应保持低电平。
A、B、C——地址线。
通道端口选择线,A为低地址,C为高地址,
CLK——时钟信号。
通常使用频率为500KHz的时钟信号
EOC——转换结束信号。
EOC=0,正在进行转换;
EOC=1,转换结束。
D7~D0——数据输出线。
D0为最低位,D7为最高
OE——输出允许信号。
OE=0,输出数据线呈高阻;
OE=1,输出转换得到的数据。
Vref——参考电源参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。
ULN2003
图2
ULN2003引脚图
步进电动机28BYJ-48
图3内部接线图
表3
八相励磁顺序表
二、硬件总体设计:
系统组成方案:
1、AD转换模块
如图1
R10为标准10K电阻,RV1为10K滑动变阻器,以代替光敏电阻仿真。
由于仿真软件只支持ADC0808芯片仿真,故在仿真时使用此芯片,实际电路板中选用了ADC0809。
处于实际电路板焊接时候引脚选用方便考虑,选用IN7输出口。
即将模拟输入选择口ADDA、ADDB、ADDC接入VCC。
处于实际电路焊接考虑,将ST接入P3.0口,EOC接入P3.1口,OE接入P3.2口,CLK接入P3.3口,具体电路如右图。
图4AD转换电路图
图5ADC0808控制端接口图
2、
LCD显示
LCD接口如图所示,由于单片机P0口和P2口在单片机的右边,故将LCD的输入口和控制口分别接入P0和P2口,由于P0口无上拉电阻,故接入LCD时接入一排上拉电阻。
如右图
图6LCD电路图
3、步进电动机驱动
如果直接用单片机驱动步进电动机,因为单片机的输出电流太低,功率不够,无法驱动步进电动机,故接入达林顿管ULN2003来增加输出功率,处于实际电路焊接考虑,使用P3.4~P3.7端口。
电路如下图
图7
步进电动机驱动电路
由于步进电动机电路简单,以及在仿真中方便观察电动机的状态(正转、反转)和持续的时间,故将电动机的驱动输出换成发光二极管。
图8二极管代替步进机电路
4、暂停控制
用开关控制,开关闭合时步进电动机暂停,LCD显示暂停状态(*字符),但依旧可以测量出光强值。
图9,暂停开关电路
总体电路图如下(仿真,未接晶振及复位电路,使用发光二极管代替步进电动机)
图10总电路仿真图
三、软件总体设计:
设计程序以及设计的原因和方法如下
#include<
reg52.h>
unsignedcharget_data;
unsignedinttemp;
unsignedcharcodetab1[]="
welcomeon!
"
;
unsignedcharcodetab2[]="
light:
unsignedcharcodetab3[]="
mcd"
sbitST=P3^0;
sbitEOC=P3^1;
sbitOE=P3^2;
sbitCLK=P3^3;
sbitA1=P3^5;
sbitB1=P3^6;
sbitC1=P3^7;
sbitD1=P3^4;
sbitRS=P2^0;
sbitRW=P2^1;
sbitE=P2^2;
sbitkey=P2^4;
/*步进步伐,根据所购买的步进电动机28BYJ-48说明书,使用八相驱动*/
#definer1{A1=1;
B1=1;
C1=1;
D1=0;
}
#definer2{A1=1;
C1=0;
}
#definer3{A1=1;
D1=1;
#definer4{A1=1;
B1=0;
#definer5{A1=1;
#definer6{A1=0;
#definer7{A1=0;
#definer8{A1=0;
/*产生定时信号,作为ADC芯片的时钟信号*/
voidtimer()
{
TMOD=0x10;
TH0=(65536-190)/256;
TL0=(65536-190)%256;
EA=1;
ET0=1;
TR0=1;
/*延迟函数,单位为ms*/
voiddelay(unsignedintt)
inti,j;
for(i=t;
i>
0;
i--)
for(j=112;
j>
j--);
/*写指令*/
writecom(unsignedcharcom)
RS=0;
RW=0;
P0=com;
E=0;
delay
(1);
E=1;
/*写数据*/
writedata(unsignedchardate)
RS=1;
P0=date;
/*写数字*/
voidwritecount(unsignedintData)
switch(Data)
{case0:
writedata(0x30);
break;
case1:
writedata(0x31);
case2:
writedata(0x32);
case3:
writedata(0x33);
case4:
writedata(0x34);
case5:
writedata(0x35);
case6:
writedata(0x36);
case7:
writedata(0x37);
case8:
writedata(0x38);
case9:
writedata(0x39);
}
/*步进电动机正、反转*/
voidbujin(unsignedintpd)
if(pd)
{
r1
delay(5);
r2
r3
r4
r5
r6
r7
r8
else
{
};
/*显示函数,这里只是控制显示的光强值,显示为4位10进制数,*/
voiddisp(unsignedinta)
unsignedintc;
a*=4;
/*将转换所得模拟信号(最大为255)转成10进制数,因为10K光敏电阻对应的光强约为1cd,即1000mcd,为方便显示,故将模拟信号乘以4,估算以作参考*/
writecom(0xc0+7);
writecount(a/1000);
writecom(0xc0+8);
writecount(a%1000/100);
writecom(0xc0+9);
writecount(a%100/10);
writecom(0xc0+10);
writecount(a%10);
writecom(0xc0+11);
for(c=0;
c<
3;
c++)
writedata(tab3[c]);
/*判断函数,为了防止光敏电阻随各种因素导致的光强而不稳定的变动,使得驱动的步进电动机不停的微微转动,将光强分为5个等级,不同等级驱动步进电动机转的时间不同*/
pduan(unsignedinta)
unsignedintx;
if(a<
51)x=0;
elseif(a<
102)x=1;
153)x=2;
204)x=3;
elsex=4;
return(x);
/*主函数,前面包括LCD初始化,写入LCD第一行显示字符“welcomeon!
”和第二行显示字符“light:
”、“mcd”*/
main()
unsignedintcompare=0;
unsignedintdji;
unsignedinti,j,k;
writecom(0x38);
writecom(0x0c);
writecom(0x06);
writecom(0x80+1);
for(i=0;
i<
11;
i++)
writedata(tab1[i]);
writecom(0xc0+1);
for(j=0;
j<
6;
j++)
writedata(tab2[j]);
timer();
while
(1)/*主循环,不断的执行AD转换*/
ST=0;
OE=0;
ST=1;
while(EOC==0);
OE=1;
get_data=P1;
temp=get_data;
disp(temp);
/*不断的显示当前光强值*/
dji=pduan(temp);
writecom(0x80+14);
writedata(0x2a);
/*写空字符显示,以清除暂停状态显示的字符*/
if(key)/*判断是否执行暂停状态*/
{
writecom(0x80+14);
writedata(0x20);
/*显示暂停状态字符‘*’*/
if(dji>
compare)/*判断步进机为正转还是反转*/
{
for(k=25*(dji-compare);
k>
k--)/*所需转的角度*/
bujin(0);
compare=dji;
}
elseif(dji<
compare)
for(k=25*(compare-dji);
k--)
bujin
(1);
elsecompare=dji;
};
/*中断程序,产生时钟定时信号*/
voidt0(void)interrupt1using0
CLK=~CLK;
四、所遇问题及解决方法:
仿真时LCD无任何字符显示,检查源程序的LCD初始化是否正确,修改错误,重新载入源程序仿真。
显示的转换数据为错乱数据,网上查阅ADC0809芯片功能书发现改芯片的输出口与IO口的高低位相反,OUT0~OUT7为高位到低位,恰与我们平时定义的相反。
步进电动机驱动之后震而不能转,自习对照电动机的管脚说明书,重新正确接入每一个引脚。
五、实物图展示:
图10
电路板侧面图
图11
电路板正面图
图12
背面焊接图
六、心得体会:
通过这一次的电路设计,掌握了LCD液晶显示、AD转换和步进电动机驱动的方法,对单片机运用技术又有了进一步的提高。
单片机可以驱动电路和实现的功能多种多样,对单片机的灵活运用显然还欠缺许多知识,但经过这次的课程设计,相信对单片机的各方面可以慢慢学习渗透,将其融会贯通。