单片机控制照明电路设计文档格式.docx

上传人:b****2 文档编号:5239685 上传时间:2023-05-04 格式:DOCX 页数:43 大小:415.53KB
下载 相关 举报
单片机控制照明电路设计文档格式.docx_第1页
第1页 / 共43页
单片机控制照明电路设计文档格式.docx_第2页
第2页 / 共43页
单片机控制照明电路设计文档格式.docx_第3页
第3页 / 共43页
单片机控制照明电路设计文档格式.docx_第4页
第4页 / 共43页
单片机控制照明电路设计文档格式.docx_第5页
第5页 / 共43页
单片机控制照明电路设计文档格式.docx_第6页
第6页 / 共43页
单片机控制照明电路设计文档格式.docx_第7页
第7页 / 共43页
单片机控制照明电路设计文档格式.docx_第8页
第8页 / 共43页
单片机控制照明电路设计文档格式.docx_第9页
第9页 / 共43页
单片机控制照明电路设计文档格式.docx_第10页
第10页 / 共43页
单片机控制照明电路设计文档格式.docx_第11页
第11页 / 共43页
单片机控制照明电路设计文档格式.docx_第12页
第12页 / 共43页
单片机控制照明电路设计文档格式.docx_第13页
第13页 / 共43页
单片机控制照明电路设计文档格式.docx_第14页
第14页 / 共43页
单片机控制照明电路设计文档格式.docx_第15页
第15页 / 共43页
单片机控制照明电路设计文档格式.docx_第16页
第16页 / 共43页
单片机控制照明电路设计文档格式.docx_第17页
第17页 / 共43页
单片机控制照明电路设计文档格式.docx_第18页
第18页 / 共43页
单片机控制照明电路设计文档格式.docx_第19页
第19页 / 共43页
单片机控制照明电路设计文档格式.docx_第20页
第20页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

单片机控制照明电路设计文档格式.docx

《单片机控制照明电路设计文档格式.docx》由会员分享,可在线阅读,更多相关《单片机控制照明电路设计文档格式.docx(43页珍藏版)》请在冰点文库上搜索。

单片机控制照明电路设计文档格式.docx

单片机、数码管、时钟芯片、按键、继电器等部件。

根据灯光控制器的功能要求,以AT89S52为核心控制电路系统。

系统总体结构框图如图1所示。

(1)单片机芯片,AT89S52所要求的电压比较低,能以3V的超底压工作,但性能却很优越,可以编程也可以擦除。

单片机的EEPROM可擦除重复1000次,而CPU和诸多功能模块组合在一个闪存芯片里面,AT89S52单片机则就显得更为轻巧,能为更多的嵌入式系统提供合适的解决方法。

(2)时钟芯片,选择DS1302时钟芯片。

单片机计时,要用到计数器占用硬件资源,还要设置中断、查询等操作也会占用单片机资源。

时钟芯片DS1302能很好的解决这个问题。

(3)显示模块,选用由发光二极管和小数点形成的“8”字型数码管。

它具有价格低、优良的配置、而且很方便与单片机接口等顺应人们需求的优点。

驱动方式选择动态显示。

(4)按键模块,选择独立式按键。

本设计用到五个按键,分别是选择键、加键、减键、确定键以及定时开关键。

图1系统结构框图

3硬件设计

3.1芯片及元器件介绍

3.1.1AT89S52单片机芯片

单片机引脚功能介绍

VCC:

电源电压。

GND:

接地。

PO口:

此端口占有8位,而且不是单向的。

如果内存芯片连接外部,可以用来作为一种低8的地址线和数据线;

在ROM编程状态下,它是输入的,而在验证状态下,则是输出的。

最多能够驱动8个LSTTL门电路。

P1口:

此端口占有8位,而且不是单向的,既拥有上拉电阻又可以充当I/O口。

在ROM编程和验证的状态下,只占有低8的地址。

P2口:

如果单片机连接外部的存储器,它送出高8位的地址。

在ROM编程和验证的状态下,它将占有高8位的地址,同时还可以接受控制信号。

能作用于4个LSTTL的门电路。

P3口:

此引脚还有第二功能,在日常生活里,大多数情况下都不会用第一功能。

具体情况如下表所示:

P3.0RXD(串行接收)

P3.1TXD(串行发送)

P3.2INTO(外输0个中断)

P3.3INT1(外中断1输入)

P3.4T0(定时0计输入)

P3.5T1(定时1计输入)

P3.6WR非(外RAM写选)

P3.7RD非(外ROM读选)

P3口还可用于接板信号。

RST:

复位输入接口,在高电平的时候才能工作。

在振荡器启动的情况下,高电平显示能够超过两个周期,就可以复位。

当89C51能够工作后,ALE端将放出只有正常振荡六分之一频率的正向脉冲,如果示波器能够探查出,那么就可以确定该芯片是好的。

51单片机连接外存储时,P0可以占有地址,也可以作用于数据信号。

此时就要看有没有ALE信号了,一旦有,那么低8位地址就是有用的。

反之,则是传输的数据信号。

ALE信号可在外部的情况下输出时钟或者是定时的信号。

但要记住的是,如果接到外存储,将会自动过滤掉一个ALE的脉冲。

可以驱动8个LSTTL门电路。

PSEN非:

可以判断外程序存储的读选端口。

当访问外部的程序存储器时,一旦取得指令,一个机器周期内要有两次有效的输出信号。

EA非/VPP:

内、外ROM选择。

只有此端口为高电平,CPU才会访问内程序存储;

当然超过容量的特殊情况下,会自动接到外程序存储。

反之低电平时,CPU不会去理会内部的程序存储,只会关注外部的程序指令。

但要记住的是,如果是编程LB1的话,在复位过程中会将此端口的状态进行锁存。

XTAL1:

一个可以接外晶和电容的端口。

在外振荡的状态下,此引脚外部输入的是时钟脉冲。

XTAL2:

另一个可以接外晶和电容的端口。

在外振荡的状态下,此引脚是悬浮的。

3.1.2继电器

本系统中电磁继电器作为主要的控制器件。

由于本系统中,照明电路中需要用到继电器来控制电路。

把继电器的一端接上一个可以发光的二极管和一个一千欧姆大小的电阻,这里的电阻起到了限流的作用。

如果在电路运行的时候,发光二极管发光,此时继电器的线圈上有电流。

同时,在电路中还需要并联一个普通的二极管。

它的作用主要是使得一些元器件能够正常工作。

本电路采用5V大小的继电器。

 

3.2时钟电路

单片机系统里面都有晶振,他就好比单片机的心脏,在单片机系统里面他是不可缺少的一部分,它全称晶体振荡电路。

把定时元件外接在XTAL1、XTAL2引脚上,使单片机内部的振荡电路产生自激振荡。

经常使用的内部时钟方式是选用电容和晶振组成的并联谐振回路。

振荡晶体可在1.2~12MHz范围内选择电容大小可以起到频率微调的作用。

本系统中,选用30pF大小的电容,外接32.768KHz晶振,Vcc1为后备电源,Vcc2为主电源。

即使主电源关闭,时钟也能照常运行。

Vcc1或Vcc2两者中较大的会自动给DS1302进行供电。

如果在传送过程中RSTS置为低电平,就会终止此次数据传送,I/O引脚变为高阻态。

上电后,在Vcc>

2V之前,RST要保持低电平。

只有在SCLK为低电平时,才能将RST置为高电平。

SCLK为时钟输入端。

电路如图2所示。

图2时钟电路

3.3复位电路

单片机的初始化操作首先需要复位,然后才是程序初始化。

它的主要是为了让程序从AT89S52的初始地址0000H处开始执行。

除系统的正常初始化状态外,有时因为操作的错误或者程序的运行发生错误,系统会发生死锁。

这个时候就需要使用按复位键,重新启动系统,这样可以有效的解决死锁状态。

AT89S52单片机内部自带复位电路,RESET引脚是高电平的时候有效,可以通过自动复位或手动复位两种复位方式来进行复位操作。

本设计系统中是低电平有效复位,用户开机的时候就启动复位操作,在+5伏时进入工作状态。

复位电路如图3所示。

图3复位电路

3.4键盘电路

键盘电路如图4所示,单片机P2口用来信号输入,当S1,S2,S3,S4,S5开关其中的任何一个按下时,其对应的P2.0,P2.1,P2.2,P2.3,P2.4口就会为低电平,然后进行单片机相应的操作。

具体实现的功能为:

S1—选择所需调整的时间参数,S2—加时间,S3—减时间,S4—确定参数设定,S5—控制定时的开与关。

按确定键将依次显示时间和各个定时时段,接着按选择键就可以选择要调整的时间(时、分、秒)按加(减)键就可以调整时间或重新定时。

最后,按下确定键,就完成了对参数的设定。

调整时间步骤如下:

1按下确定键,数码管显示当前时间,并停留不动

2按下选择键,数码管显示所选时间,两位数字闪动。

3按加键或减键,自由调整时间,长按则加快增加或减少。

调整定时和调整时间方法一样。

图4键盘电路

3.5数码管显示电路

显示电路是时钟模块中最为重要的部分,因为端口的问题以及动态显示方式的优越性,本系统采用的一个四位数码管,使用共阳极接法以及动态显示,以三极管作为驱动进行数码管的显示。

在本设计中的数码管是显示当前时间和定时时间,因为按键设置有加键和减键,所以先要对数据进行存储然后进行累加或减。

我们把数码管先连接到74LS373锁存器上,然后把锁存器连接到单片机AT89S52上。

在本系统中数码管的所有段选码都由单片机的P1口给出,位选信号由P0.0、P0.1、P0.2和P0.3口控制。

在每一时刻,4位LED可能会显示相同的内容,所以要用扫描显示来使一位亮而其他三位暗,周期为2ms。

由于采用的是共阳极方式,低电平才有效,则要其中一个基极为低电平,三极管导通,集电极为低电平,位选打开,数码管显示。

而段选码由P1口8位I/O口控制,高电平时对应的段被点亮。

在此瞬间,段选码由P2口输出相应的字符电平,P0.0、P0.1、P0.2和P0.3口输出位选码,来保证显示相应的字符。

以此类推,每位进行显示后延时一会,构成视觉暂留,这样看起来就像是一起显示出来的。

如图5所示。

图5显示电路

3.6照明电路

照明电路采用白炽灯进行照明,因为白炽灯额定电压为220V,可根据实际情况并联多个。

继电器K1受时钟电路控制。

照明灯泡使用继电器作为开关驱动照明电路。

J1开关断开时,继电器工作;

当J1导通时,继电器控制电路失效,实现人工手动控制。

三极管为使继电器工作股接在继电器的控制端。

由于单片机输出的是低电平信号有效股选用PNP型三极管,当单片机输出低电平是三极管导通,电流流入继电器,使继电器工作,从而控制照明电路的亮灭,其电路连接图如图6所示:

图6照明电路

3.7单片机系统电源设计

+5V电压源主要为元器件和工作电路提供稳压源。

电源(VCC)是整个系统正常工作的根本。

过大的电源电压会更大程度的缩短芯片的寿命,甚至会损坏芯片和其它元器件;

过小的电源又不能驱动电路工作。

所以设定电源电压合适的值非常重要的。

本电路主要芯片工作的电压都在+5V左右,因此在整个电路板中采用W7800三端稳压芯片将+12V的电压整形为+5V直流电压。

用W7800设计的+5V稳压电源电路图如图7所示:

图7供电直流电源

4软件设计

4.1主程序流程框图

本设计采用C语言,在主程序中,主要实现程序初始化,按键处理,时间的动态显示。

当有键按下时,进入按键处理程序。

Y

N

4.2延时子程序设计

延时程序主要对数码管的显示和按键的扫描进行延时操作。

延时的时间可选5ms~10ms,具体程序如下:

voidDelay(uintnum)

{

while(--num);

}

4.3时间读取和显示子程序设计

用DS1302时钟芯片来读取时间,然后依次显示在四位数码管上。

时间的读取和显示流程图,如图8和图9所示。

N

N

图8DS1302读取时间流程图

图9LED显示时间流程图

4.3.1显示数据子程序

数码管显示初始化程序如下

Voidinitlcm(void)//初始化

Delay_xMs(10);

//功能设置:

一次送8位数据。

sendCMD(0x04);

//点设定:

显示字符/光标从左到右移动

sendCMD(0x0f);

显示设定:

开显示,显示光标和当前显示位并闪动

sendCMD(0x01);

//清DDRAM

sendCMD(0x02);

//DDRAM地址归位

sendCMD(off_cursor);

//关光标

4.4DS1302驱动程序

//寄存器宏定义

#defineWRITE_SECOND0x80

#defineWRITE_MINUTE0x82

#defineWRITE_HOUR0x84

#defineREAD_SECOND0x81

#defineREAD_MINUTE0x83

#defineREAD_HOUR0x85

#defineWRITE_PROTECT0x8E

//初始化DS1302

voidInitial(void)

Write1302(WRITE_PROTECT,0X00);

//禁止写保护

Write1302(WRITE_SECOND,0x56);

//秒位初始化

Write1302(WRITE_MINUTE,0x34);

//分钟初始化

Write1302(WRITE_HOUR,0x12);

//小时初始化

Write1302(WRITE_PROTECT,0x80);

//允许写保护

//位寻址寄存器定义

SBITACC_7=ACC^7;

//管脚定义

SBITSCLK=P3^5;

//DS1302时钟信号7脚

SBITDIO=P3^6;

//DS1302数据信号6脚

SBITCE=P3^7;

//DS1302片选5脚

//地址、数据发送子程序

voidWrite1302(unsignedcharaddr,dat)

unsignedchari,temp;

CE=0;

//CE引脚为低,数据传送中止

SCLK=0;

//清零时钟总线

CE=1;

//CE引脚为高,逻辑控制有效

//发送地址

for(i=8;

i>

0;

i--)//循环8次移位

{

SCLK=0;

temp=addr;

DIO=(bit)(temp&

0x01);

//每次传输低字节

addr>

>

=1;

//右移一位

SCLK=1;

}

//发送数据

i--)

temp=dat;

dat>

CE=0;

//数据读取子程序

unsignedcharRead1302(unsignedcharaddr)

unsignedchari,temp,dat1,dat2;

//读取数据

{

ACC_7=DIO;

ACC>

=1;

}

dat1=ACC;

dat2=dat1/16;

//数据进制转换

dat1=dat1%16;

//十六进制转十进制

dat1=dat1+dat2*10;

return(dat1);

4.5扫描键盘子程序设计

键盘的操作,无论是按键或键盘都是利用机械点的合、断作用。

由于机械触点的弹性作用,CPU可能对键的一次闭合,做出两次键输入处理,此时必须消除抖动的影响来防止这种错误发生。

去除抖动有硬、软件两种方法。

如果按键较多,最好不要采用硬件去抖。

而软件去抖动可以节省硬件花费,实用性和有效性高,所以常采用软件的方法进行消抖。

进行初始化后,实际键值参数变为1FH(连接的是P2口的0,1,2,3,4,初始化即为此值),由于抖动的原因,为确保是有键按下,则必须进行两次比较。

第一次扫描,P2、1FH相等则说明没有按下键,不相等则用软件消除抖动,延迟10毫秒后进行第二次。

若相等则说明之前的现象并不是按键所引发的,如果不相等则表明确实有按键这个动作发生。

具体代码为:

voidkey()

staticucharkey_new;

key_can=20;

P2|=0xf0;

if((P2&

0xf0)!

=0xf0)//按键按下(第一次)

Delay(10);

if(((P2&

=0xf0)&

&

(key_new==1))

{//确认是按键按下(第二次)

key_new=0;

switch(P2&

0xf0)

{

case0xe0:

key_can=1;

break;

case0xd0:

key_can=2;

case0xb0:

key_can=3;

case0x70:

key_can=4;

}

}

else

key_new=1;

键盘主要有独立式和矩阵式两种,独立式按键电路配置灵活,弊端是I/O口浪费较大,适用于键盘较少的电路。

键盘程序作为主程序的一部分,通过查询方式读取键盘动作,根据读取的值,键盘进行相应操作处理程序。

键盘扫描子程序流程图如图10所示。

图10键盘扫描子程序流程图

4.6时钟子程序

#include<

regx52.h>

#defineucharunsignedchar

#defineuintunsignedint

uchardispcode[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71,0x00};

//定义0到F的段选码

uchardispbitcode[]={0xfe,0xfd,0xfb,0xf7,

0xef,0xdf,0xbf,0x7f};

//数码管的位选码

uchardispbuf[8]={0,0,16,0,0,16,0,0};

//定义一个缓冲区

uchardispbitcnt;

ucharsecond;

ucharminite;

ucharhour;

uinttcnt;

ucharmstcnt;

uchari,j;

voidmain(void)

TMOD=0x02;

//定时器0工作方式2

TH0=0x06;

//每250us中断一次

TL0=0x06;

TR0=1;

//启动定时器0

ET0=1;

//定时器0中断允许

EA=1;

//CPU开中断

while

(1)

if(P0_0==0)

{for(i=5;

i>

i--)

for(j=248;

j>

j--);

//延时检查是否是P0_0被按下

if(P0_0==0)//如果被按下

second++;

//秒就加1

if(second==60)

second=0;

dispbuf[0]=second%10;

//存放秒的个位

dispbuf[1]=second/10;

//存放秒的十位

while(P0_0==0);

//等待P0_0变高

if(P0_1==0)

minite++;

if(minite==60)

minite=0;

dispbuf[3]=minite%10;

dispbuf[4]=minite/10;

while(P0_1==0);

}}

if(P0_2==0)

for(i=5;

hour++;

if(hour==24)

hour=0;

dispbuf[6]=hour%10;

dispbuf[7]=hour/10;

while(P0_2==0);

}}}}

voidt0(void)interrupt1using0//定时器0中断服务程序

{

P1=dispcode[dispbuf[dispbitcnt]];

//为位选码

P3=dispbitcode[dispbitcnt];

//为段选码

dispbitcnt++;

if(dispbitcnt==8)

dispbitcnt=0;

tcnt++;

if(tcnt==4000)//此时有一秒钟了(4000*250us)

tcnt=0;

if(second==60)

if(minite==60)

dispbuf[0]=second%10;

dispbuf[1]=second/10;

dispbuf[3]=minite%10;

dispbuf[4]=minite/10;

dispbuf[6]=hour%10;

dispbuf[7]=hour/10;

5原理图绘制和仿真

本次论文设计的原理图绘制所采用的软件是protel99se,而原理图仿真采用的是proteus软

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2