家用定时供电插座的设计.docx
《家用定时供电插座的设计.docx》由会员分享,可在线阅读,更多相关《家用定时供电插座的设计.docx(16页珍藏版)》请在冰豆网上搜索。
家用定时供电插座的设计
家用定时供电插座的设计
一、设计要求
本次设计要求实现一个具有定时、按键设置及控制、定时时间显示等功能的定时开关插座,具体要求及指标如下:
(2)具有定时时间显示和时钟显示。
(3)可以利用按键调整显示时间和定时时间。
(3)定时时间到继电器上电,蜂鸣器响。
二、设计说明
本次设计时钟电路,使用了AT89C52单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的分、秒,用蜂鸣器来进行定时提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过五个模块:
继电器、键盘、芯片、蜂鸣器、LCD液晶显示即可满足设计要求。
1主电路
主电路主要就是芯片的运行,加载程序后,在外部时钟的作用下,将按照程序运行,从而可以实现设计的要求,进行时钟时间和定时时间的调整,并且能够在到达定时时间后控制蜂鸣器发出声响。
主电路
2、显示电路
显示电路即可以让我们看到时间的调整和定时时间的调整,显示调整后的时间。
利用1602液晶显示屏显示时间,利用程序把1602芯片上对应的端口与单片机对应的I/O口进行连接,以便使时间能够正确的在液晶屏上显示。
1602芯片原理图
3、按键电路
本设计中利用按键S9、S13、S17行时间的调整。
其中S9为设定时间的按键,S13和S17为设定时间加和减的按键。
蜂鸣器主要是到定时时间进行响铃提请。
键盘电路原理图
蜂鸣器电路原理图
4、继电器电路
当电子时钟走到和定时时间相同时,蜂鸣器响的同时继电器也会吸合,以便使插座上电。
继电器电路原理图
三、整体原理图(见附图)
四、设计体会
通过这次课程设计不仅使我巩固了本课程所学的基本知识,还使我具有了撰写科研报告的初步训练能力,我相信这些能力在我以后的工作或者是再学习中一定会起到不小的作用,一切的辛苦和艰难都是值得的。
在设计前应该对所要实现的功能有一定的了解,定下有大概的流程图,把设计模块化,写程序时也应该一个模块一个模块的写,这样方便理解,也方便以后的检查。
在仿真和实物的过程中要了解所使用芯片的功能及引脚的排列方式,这样焊接时比较方便。
五、C语言程序
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable1[]="00:
00:
00";
sbitdula=P2^6;
sbitwela=P2^7;
sbitlcden=P3^4;//位定义
sbitlcdrw=P3^6;
sbitlcdrs=P3^5;
sbits1=P3^0;
sbits2=P3^1;
sbits3=P3^2;
sbitrd=P3^7;
sbitbeep=P2^3;//定义蜂鸣器
sbitreplay=P0^6;定义继电器
ucharnum,count,s1num;//显示的位数;响应中断数;按键次数;
uinti;
charshi,fen,miao,shi1,fen1,miao1;
voiddelay(uintz)//延时程序
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)//控制指令
{
lcdrs=0;//低电平时选择指令寄存器
lcdrw=0;//低电平时进行写操作
delay(5);
lcden=1;//E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令
P0=com;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)//数据指令
{
lcdrs=1;
lcden=1;//均为高时是读出数据的内容
delay(5);
P0=date;
delay(5);
lcden=0;
}
voidinit()//初始化
{
dula=0;
wela=0;
lcdrw=0;
lcden=0;
delay(15);
write_com(0x38);//设置为4位总线,单行显示
delay(5);
write_com(0x38);
delay(5);
write_com(0x38);
write_com(0x38);//重复多次以确定可以正确设置
write_com(0x08);//无光标正常显示
write_com(0x01);//清显示
write_com(0x06);//向右显示
write_com(0x0c);//显示开关控制。
write_com(0x80+1);//d7为高时,显示数据存储地址
TMOD=0x11;//工作方式3
TH0=(65536-50000)/256;//定时时间为50ms
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//打开定时器
TR0=1;//启动定时器
write_com(0x80+4);//秒的设定
for(num=0;num<8;num++)
{
write_data(table1[num]);
delay(20);
}
write_com(0x80+0x40+4);
for(num=0;num<8;num++)
{
write_data(table1[num]);
delay(20);
}
}
voidwrite_sfm(ucharadd,uchardate)//调整时间
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);//控制指令,0x40:
字符发生器RAM地址设置进行加
write_data(0x30+shi);//数据指令
write_data(0x30+ge);
}
voidwrite_shedingsfm(ucharadd1,uchardate1)//设定定时时间
{
ucharshi1,ge1;
shi1=date1/10;
ge1=date1%10;
write_com(0x80+add1);//控制指令
write_data(0x30+shi1);
write_data(0x30+ge1);
}
voidkeyscan()
{
rd=0;
if(s1==0)
{
delay(5);
if(s1==0)
{
s1num++;
while(!
s1);//s1按下
}
}
if(s1num==1)//按下次数
{
TR0=0;//停止定时器工作
write_com(0x80+0x40+11);//调整时间设置,控制秒设定
write_com(0x0f);//光标显示
}
if(s1num==2)
{
write_com(0x80+0x40+8);//控制分钟设定
write_com(0x0f);//控制光标闪烁
}
if(s1num==3)
{
write_com(0x80+0x40+5);//控制时设定
write_com(0x0f);
}
if(s1num==4)
{TR0=1;//启动定时器,定时时间的设定
write_com(0x80+11);//控制秒的设定
write_com(0x0f);//光标显示
}
if(s1num==5)
{
write_com(0x80+8);//定时分钟的设定
write_com(0x0f);
}
if(s1num==6)
{
write_com(0x80+5);//定时时的显示
write_com(0x0f);
}
if(s1num==7)
{
s1num=0;//按键次数清零
write_com(0x0c);//显示此时为无光标状态
}
if(s1num!
=0)//有按键时
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!
s2);
if(s1num==1)
{
miao++;
if(miao==60)
{
miao=0;
}
write_sfm(10,miao);//第10位进行秒的设定
write_com(0x80+0x40+11);//控制秒的设定
}
if(s1num==2)
{
fen++;
if(fen==60)
{
fen=0;
}
write_sfm(7,fen);
write_com(0x80+0x40+8);
}
if(s1num==3)
{
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
write_com(0x80+0x40+5);
}
if(s1num==4)
{
TR0=1;//定时器启动
miao1++;
if(miao1==60)
{
miao1=0;
}
write_shedingsfm(10,miao1);
write_com(0x80+11);
}
if(s1num==5)
{
fen1++;
if(fen1==60)
{
fen1=0;
}
write_shedingsfm(7,fen1);
write_com(0x80+8);
}
if(s1num==6)
{
shi1++;
if(shi1==24)
{
shi1=0;
}
write_shedingsfm(4,shi1);
write_com(0x80+5);
}
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!
s3);
if(s1num==1)
{
miao--;
if(miao==-1)
{
miao=59;
}
write_sfm(10,miao);
write_com(0x80+0x40+11);
}
if(s1num==2)
{
fen--;
if(fen==-1)
{
fen=59;
}
write_sfm(7,fen);
write_com(0x80+0x40+8);
}
if(s1num==3)
{
shi--;
if(shi==-1)
{
shi=23;
}
write_sfm(4,shi);
write_com(0x80+0x40+5);
}
if(s1num==4)
{
TR0=1;
miao1--;
if(miao1==-1)
{
miao1=59;
}
write_shedingsfm(10,miao1);
write_com(0x80+11);
}
if(s1num==5)
{
fen1--;
if(fen1==-1)
{
fen1=59;
}
write_shedingsfm(7,fen1);
write_com(0x80+8);
}
if(s1num==6)
{
shi1--;
if(shi1==-1)
{
shi1=23;
}
write_shedingsfm(4,shi1);
write_com(0x80+5);
}
}
}
}
voidmain()//主函数
{
init();//初始化函数
while
(1)
{
keyscan();//键盘扫描
if(count==20)//响应中断20次,时间1s
{
count=0;//清零
miao++;//秒加1
if(miao==60)//60秒时分加1
{
miao=0;
fen++;
if(fen==60)//60分时时加1
{
fen=0;
shi++;
if(shi==24)//24时时时全为0,从00:
00:
00开始计时
{
shi=0;
}
write_sfm(4,shi);//修改时
}
write_sfm(7,fen);//修改分
}
write_sfm(10,miao);//修改秒
if((shi==shi1)&&(fen==fen1)&&(miao==miao1))//蜂鸣器电路的运行
{
for(i=0;i<10;i++)
{
beep=0;//蜂鸣器响
delay(50);
beep=1;
delay(50);
}
replay=0;
}
}
}
}
voidtimer0()interrupt1//中断函数
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}