单片机课程设计加热定时器.docx
《单片机课程设计加热定时器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计加热定时器.docx(15页珍藏版)》请在冰点文库上搜索。
单片机课程设计加热定时器
嵌入式系统课程设计
设计名称加热定时器
专业班级
学号
姓名
指导教师
专业班级
学生姓名
课程名称
嵌入式系统
设计名称
加热定时器
设计周数
指导教师
设计
任务
主要
设计
参数
设计一个加热定时器,主要实现定时功能。
主要设计参数:
1、早7:
00起加热,晚10:
00起加热,保证热水。
2、周末全天供水。
3、准确实现定时功能。
设计内容
设计要求
1、设计要求:
为热水器定时加热
2、每天早7:
00起加热,晚10:
00起加热,保证热水;周末全天供水。
3、控制面板设计。
主要参考
资料
《单片机原理与接口技术》李晓林等,电子工业出版社,2011。
学生提交
归档文件
课程设计说明书1份
课程设计任务书
注:
课程设计完成后,学生提交的归档文件应按,封面—任务书—说明书—图纸的顺序进行装订上交(大张图纸不必装订)
……………………………………装………………………………………订…………………………………………线………………………………………
专业班级学号姓名成绩
一.实验目的
1、掌握可任意预置的定时构成、原理与设计方法;
2、熟悉集成电路的使用方法。
3、通过应用单片机系统,培养创新意识,提高动手能力。
二.设计要求
1、每天早7:
00起加热,晚10:
00起加热,保证热水;周末全天供水。
2、控制面板设计。
主要设计参数:
1、能准确实现加热时间控制。
2、保证热水供应。
三.定时加热器优点
传统的大容量电热水器的加热时间一般都比较长,如果热水器一直开着,则会一直耗能耗电,而定时开关控制器则可有效解决这些问题,使电热水器使用起来更加舒适省电。
这样,电热水器不仅可以充分利用闲置的时间,避免用户使用时长时间的等待,减少不必要的保温,也可以更加节约电能,特别对低谷及高峰用电有差价的地区.利用晚间低谷用电开机加热,白天用电高峰关机保温,便能大量节约电费开支。
本文中的定时控制器主要是以单片机AT89C51作为核心控制元件,通过外围电路来控制热水器的电源,以达到定时开关机的目的。
四.设计原理
1硬件组成
本电热水器控制系统在加电后即可进入正常计时状态,用户可以随时校准时间并设定热水器的开关时间,以便控制器能够在设定的开关时刻通过单片机的输出端口控制输出继电器的动作,进而控制热水器的启闭。
该系统的硬件原理图见图1所示。
本系统的核心单片机AT89C2051为20脚300MIL封装,是一种带有2KBFLASHE2PROM的单片机。
该单片机除了少了两个并口外,能兼容MCS-51系列单片机的所有功能,且具备体积小、功能强、运行速度快等特点。
1.1引脚功能及结构
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc>2.0V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
I/O为串行数据输入输出端(双向),后面有详细说明。
SCLK为时钟输入端。
1.2数据输入输出(I/O)
在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。
同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。
1.3DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,
1.4键盘、显示以及输出控制这三种电路。
1.41显示电路
本系统中的显示电路主要由七段共阳显示译码器74LS47、3线-8线译码器74tHC138、7个PNP型三极管和六个数码管组成。
通过AT89C2051的P1.4~P1.7口将要显示字符的BCD码输出到74LS47的四个输人端,然后译码并输出相应的笔段来驱动LED数码管(共阳)。
LED数码管显示采用动态扫描方式,即在某一时刻,只有一个数码管被点亮。
数码管的位选信号由AT89C2051的P3.3~P3.5输出,并经74HCl38译码后通过三极管放大,以驱动相应的数码管。
1.42键盘电路
键盘电路跟显示电路一样采用扫描方式,并利用动态显示时的数码管驱动位置信号来判断相应按键的状态。
单片机的P3.3~P3.5口输出的BCD码经译码器译码后,相应的Y口呈低电平,而AT89C2051的P3.7口平时为高电平(由于有上拉电阻),只有当某一按键按下时,P3.7才被下拉为低,这时,单片机将利用程序查询P3.7是否为低,如果P3.7为低电平,则读回单片机P3.3~.P3.5口的值(从缓冲区读取),并判断是那个按键按下.然后调用相应的处理程序进行处理。
1.43输出控制电路
单片机的控制输出是通过P3.0~P3.2口完成的。
当程序开始时,这三个口的输出状态都是低电平,AT89C2051通过程序查询三路输出的ON或OFF状态预置时间是否已到,若时间到,则改变相应的输出状态,以完成对外部电路的控制。
中断功能申请寄存器IE介绍
中断允许寄存器IE(可以打开和屏蔽相应的中断)
EX0/EX1ET1/ET0ES位:
分别是外部中断、定时中断、串口中断允许控制位。
=0:
禁止中断;=1:
允许中断。
EA:
总的中断允许控制位(总开关):
=0:
禁止全部中断;=1:
允许中断。
工作方式寄存器TMOD
高四位对于定时器1,低四位对应定时器0M1,M0:
工作方式选择位。
工作方式0=00:
13位定时器/计数器;工作方式1=01:
16位定时器/计数器(常用);
工作方式2=10:
可自动重装的8位定时器/计数器(常用);工作方式3=11:
T0分为2个8位定时器/计数器;仅适用于T0。
C/T:
定时方式/计数方式选择位。
=0:
内部提供信号脉冲。
=1:
外部提供信号脉冲。
GATE:
定时器启动控制位
=0:
程序控制。
=1:
硬件控制。
例如:
TMOD=00000001=0x01;//设定时器0为16位模式1
例如:
TMOD=00010000=0x10;//设定时器1为16位模式1
如何选择16位内部脉冲计数寄存器,并选择定时器0作为为定时器,且用软件方式实现定时器启动控制。
TMOD的值为多少?
定时0,选择低四位(高四位全为0)
16位计数寄存器选工作方式1即M1M0值为01
内部脉冲C/T值为0
软件启动定时器GATE值为0
TMOD=00000001=0x01
定时器控制寄存器TCON(高四位与定时器中断有关,低四位与外部中断有关)
TR0/TR1:
定时器运行启停控制位(可由用户通过软件设置)。
=0:
定时器停止运行;
=1:
定时器启动运行。
TF0/TF1:
定时器溢出中断申请标志位(由硬件自动置位)。
=0:
定时器未溢出;
=1:
定时器溢出(由全“1”变成全“0”)时由硬件自动置位,申请中断,中断被CPU响应后由硬件自动清零。
启动定时器和判断是否溢出
TRx赋值为1,即可启动相应的定时器
如果TFx的值为1,即可以判断计数寄存器的值已经溢出。
可以用位赋值。
TCON=00010000=0x10代表什么?
即TR0的值为1,TF0的值为0。
定时器已经启动,并且计数寄存器的计数值还没有溢出。
(不能产生有效的内容中断信号)
2软件设计
2.1主程序流程
本系统的主程序工作过程是首先循环进行8个数码管的扫描显示(DISPLY段),然后比较所有预置时间(COMP段)是否与当前时间相等,如相等则转向相应处理程序。
比较完成(或处理完成)后,再判断有无按键(PP2段)按下,没有则返回继续显示、比较、判断;有按键按下则转向相应的处理程序。
按键转移采用偏移量加表格跳转转移法(KEY段)。
预置时间比较则采用逐一比较法,即对每一个预设的值都进行比较,如果相等,则进行相应的处理。
在具体比较时(COMP1段),首先比较TH值,如不相等,则直接转出并置"时间到"标志CCB为0,而如果TH、TM、TS全部对应相等,则置该标志为1,其软件流程见图2所示。
此次设计的可预置热水器控制电路,实现对时间和分钟的现实,可以设置热水器的使用时间,使热水器自动加热和停止,并且设置了水位比较电路可以进行报警。
由石英晶体振荡器产生频率为1000Hz的信号,经过三片74LS160进行分频后,得到1Hz的秒脉冲信号,再经过2片74LS90连接成的60进制计数器后得到1/60秒的分脉冲信号。
将分信号传输给两片74LS290连成的六十进制计数器进行分的计数,再由分计数的进位驱动二十四进制的时计数器。
时间计数器连接七段译码显示器进行时间的现实。
预置时间的电路与此相同。
预置时间计数器产生的输出进入减法器进行自动减一的设置,减法器的输出信号进入比较器,与正常时间计数器产生的信号进行比较。
当两者相等时,自动开始加。
由时计数器和分计数器产生的输出接入比较器,与设定时间电路的时计数器和分计数器相比较,当时间相等时热水器停止加热。
由传感器感知水位,经由模数转换器转换成八位二进制数,再由二进制→BCD码转换器将其转换成8421BCD码,输出的数据经计数器传入七段译码显示器进行水位的显示。
从水位计数器引出的信号进入比较器,与比较器中设置的水位进行比较,当其水位低于设定值时,自动停止工作并进行水位报警。
其中水位报警电路由555定时器构成的单稳态单路和多谐振荡电路组成。
2.2秒脉冲发生器的软件设计
系统中的秒脉冲发生器是由定时器T0和内存空间TT0配合完成的。
其中T0工作于l6位计数器模式,当T0向上计数并由全1变为全0时产生中断。
本程序中,T0的初值为0DC00H,大约0.01秒中断一次。
这里使用的晶振频率为11.0592MHz,由此可计算出日误差约为0.78s。
其操作流程如图3所示,系统产生中断后,首先保存ACC和PSW的值,然后为T0重装初值,并判断中断次数是否小于100,若是,则转出中断服务,反之则将秒计数器加1。
秒计数器大于59时,则为分计数器加1,同时秒计数器清0。
同样,分计数器如大于59,则为时计数器加1,同时分计数器清0。
时计数器如大于23时则清0并转出中断服务。
TD中断100次的时间刚好为1秒钟。
3、程序
#include
#include"DS1302.h"/************端口定义****************/
sbithot=P1^7;
sbitAdd_hour=P3^0;
sbitAdd_min=P3^1;
unsignedcharqiangdanum=0;
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
//unsignedcharcodeduan[]={};
unsignedcharge=0,shi=0;
voiddelay(unsignedintms)//晶振12M
{
unsignedinti,j;
for(j=ms;j>0;j--)
{
for(i=0;i<120;i++);
}
}
voiddisplay(void)
{
P2=0x7f;
P0=table[week];
delay(5);
P2=0xbf;
P0=0x40;
delay(5);
P2=0xdf;
P0=table[h1];
delay(5);
P2=0xef;
P0=table[h0];
delay(5);
P2=0xf7;
P0=table[mi1];
delay(5);
P2=0xfb;
P0=table[mi0];
delay(5);
P2=0xfd;
P0=table[s1];
delay(5);
P2=0xfe;
P0=table[s0];
delay(5);
}
{
write_ds1302(0x8e,0x00);//写保护寄存器,在对时钟或RAM写前WP一定要为0
write_ds1302(0x8c,year);//年
write_ds1302(0x88,month);//月
write_ds1302(0x86,day);//日
write_ds1302(0x8A,week);//星期
write_ds1302(0x84,hour);//时
write_ds1302(0x82,minute);//分
write_ds1302(0x80,second);//秒
write_ds1302(0x8e,0x80);//写保护寄存器
}
voidchangtime()
{
unsignedcharChange_minute,Change_hour;
Change_minute=minute;
Change_hour=hour;
if(0==Add_min)
{
while(0==Add_min)
{
display();
}
Change_minute++;
if(Change_minute==90)
{Change_minute=0;
}
if(Change_minute%16==10)
{Change_minute+=6;
}
write_ds1302(0x8e,0x00);//写保护寄存器,在对时钟或RAM写前WP一定要为0
write_ds1302(0x8c,year);//年
write_ds1302(0x88,month);//月
write_ds1302(0x86,day);//日
write_ds1302(0x8A,week);//星期
write_ds1302(0x84,hour);//时
write_ds1302(0x82,Change_minute);//分
write_ds1302(0x80,second);//秒
write_ds1302(0x8e,0x80);//写保护寄存器
}
if(0==Add_hour)
{
while(0==Add_hour)
{
display();
}
Change_hour++;
if(Change_hour==0x24)
{Change_hour=0;}
if(Change_hour%16==10)
{Change_hour+=6;}
write_ds1302(0x8e,0x00);//写保护寄存器,在对时钟或RAM写前WP一定要为0
write_ds1302(0x8c,year);//年
write_ds1302(0x88,month);//月
write_ds1302(0x86,day);//日
write_ds1302(0x8A,week);//星期
write_ds1302(0x84,Change_hour);//时
write_ds1302(0x82,Change_minute);//分
write_ds1302(0x80,second);//秒
write_ds1302(0x8e,0x80);//写保护寄存器
}
}
voidmain()
{
hot=1;
initial_ds1302();
while
(1)
{
read_time();//读时间
display();
if()
changtime();
if(week<=0x05)
{
if(hour>=0x07&hour<=0x22)
{
hot=0;
}
else
{
hot=1;
}
}
else
{
hot=0;
}
五、设计总结
在这次设计过程中,体现出组员相互合作设计电路的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
在此感谢我们的XX老师.,老师严谨细致、一丝不苟的作风一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的思路给予我无尽的启迪;这次电路设计的每个实验细节和每个数据,都离不开老师您的细心指导。
而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。
同时感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊。
由于本人的设计能力有限,在设计过程中难免出现错误,恳请老师们多多指教,我十分乐意接受你们的批评与指正,本人将万分感谢。