作息时钟设计.docx
《作息时钟设计.docx》由会员分享,可在线阅读,更多相关《作息时钟设计.docx(26页珍藏版)》请在冰豆网上搜索。
![作息时钟设计.docx](https://file1.bdocx.com/fileroot1/2023-2/21/141a0a94-277b-41cb-ae1e-9dec4473e5f5/141a0a94-277b-41cb-ae1e-9dec4473e5f51.gif)
作息时钟设计
课题名称
作息时钟设计
课题工作内容
“作息时钟设计”的硬件电路主要由单片机控制电路、数码管显示电路、DS1302、主要实现:
1、单片机驱动数码管显示时间。
2、到设定的闹钟时间后蜂鸣器响。
指标要求
1、单片机驱动数码管显示现在时间。
2、设定闹钟
进程安排
第一天:
下达任务、理解课题要求、收集和消化相关资料;第二天:
方案论证和制定,元器件采购;第三~四天:
硬件制作、调试第五~八天:
软件设计、调试第九天:
根据设计内容,撰写设计报告第十天:
作品演示、答辩考核
主要参考文献
《单片机应用系统设计技术》张齐著电子工业出版社《单片机原理及应用技术》范力旻电子工业出版社《例说8051》谢亮、陈敌北、张义和人民邮电出版社《单片机C语言应用100例》王东锋王会良电子工业出版社《51系列单片机设计实例》楼然苗李光飞北航出版社
地点
秋白楼
起止日期
2012.6.10-6.23
目录
一、设计背景.............................................1
1.1单片机技术的发展及应用............................1
1.1.1单片机技术的发展................................1
1.1.2单片机技术的应用................................2
二、系统工作原理及总休设计...............................2
2.1系统总体方框图.....................................2
2.2DS1302............................................3
2.3数码管显示.........................................3
2.4AT89C5............................................4
2.5晶振...............................................5
三、原理图...............................................5
四、总结.................................................6
五、程序清单.............................................7
六、原件清单..............................................12
七、实物..................................................12
一、设计背景
1.1单片机技术的发展及应用
现代的计算机都是大规模集成电路计算机,具有功能强、结构紧凑、系统可靠等特征。
随着半导体技术的发展,能够在一个硅片上制造出上百万个品体管,于是出现了以一个大规模集成电路为主的中央处理器—微处理器(up),以及大容量的集成电路半导体存储器,通用和专用的输入输出接口电路,由这些大规模集成电路组成各种类型的微型计算机。
1.1.1单片机技术的发展
所谓单片机(microcontroller)是指在一个集成芯片中,集成微处理器(CPU)、存储器、基本的I/O接口以及定时/计数、通信部件,即在一个芯片上实现一台微型计算机的基本功能。
1970年微型计算机研制成功之后,随着就出现了单片机(即单片微型计算机)。
美国Intel公司1971年生产的4位单片机4004和1972年生产的雏形8位单片机8008,特别是1976MCS-48单片机问世以来,在短短的二十几年间,经历了四次更新换代,其发展速度大约每二、三年要更新一代、集成度增加一倍、功能翻一番。
其发展速度之快、应用范围之广,己达到了惊人的地步,它己渗透到生产和生活的各个领域。
尽管目前单片机的品种很多,但其中最具典型性的当数Intel公司的MCS-51系列单片机。
MCS-51是在MCS-48的基础上于80年代初发展起来的,虽然它仍然是8位的单片机,但其功能有很大的增强。
由于PHILIPS.ATMEL,WELBORD,LG等近百家IC制造商都主产51系列兼容产品,具有品种全、兼容性强、软硬件资料丰富等特点。
因此,MCS-51应用非常广泛,成为继MCS-48之后最重要的单片机品种。
直到现在MCS-51仍不失为单片机中的主流机型。
国内尤以Intel的MCS-51系列单片机应用最广。
由于8位单片机的高性能价格比,估计近十年内,8位单片机仍将是单片机中的主流机型。
1.1.2单片机技术的应用
随着计算机技术的发展和在控制系统中的广泛应用,以及设备向小型化、智能化发展,作为高新技术之一的单片机以其体积小、功能强、价格低廉、使用灵活等优势,显示出很强的生命力。
它和一般的集成电路相比有较好的抗干扰能力,对环境的温度和湿度都有较好的适应性,可以在工业条件下稳定工作。
且单片机广泛地应用于各种仪器仪表,使仪器仪表智能化,提高它们的测量速度和测量精度,加强控制功能。
如MCS-51系列.单片机控制的“船舶航行状态自动记录仪”、“烟叶水分测试仪”、“智能超声波测厚仪”等。
单片机也广泛地应用于实时控制系统中,例如对工业上各种窑炉的温度、酸度、化学成分的测量和控制。
将测量技术、自动控制技术和单片机技术相结合,充分发挥其数据处理功能和实时控制功能,使系统工作处于最佳状态,提高系统的生产效率和产品质量。
从航空航天、地质石油、冶金采矿、机械电子、轻工纺织等行业的分布系统与智能控制以及机电一体化设备和产品,到邮电通信、日用设备和器械,单片机都发挥了巨大作用。
其应用大致可分为以下几方面:
(1)机电一体化设备的控制核心
机电一体化是机械设备发展的方向。
单片机的出现促进了机电一体化技术的发展,它作为机电产品的控制器,充分发挥其自身优点,大大强化了机器的功能,提高了机器的自动化、智能化程度。
最典型的机电产品机器人,每个关节或动作部位都是一个单片机控制系统。
(2)数据采集系统的现场采集单元
大型数据采集系统,要求数据采集的同步性和实时性要好。
使用单片机作为系统的前端采集单元,由主控计算机发出采集命令,再将采集到的数据逐一送到主计算机中进行处理。
如有些气象部门、油田采油部门以及电厂等均可采用这样的系统。
(3)分布控制系统的前端控制器
在直接控制级的计算机分布控制系统(DCS)中,单片机作为过程控制中每一分部操作或控制的控制器,进行数据采集、反馈计算、控制输出,并在上位机命令的指挥下进行相应协调工作。
(4)智能化仪表的机芯
自动化仪表的智能化程度越来越高。
采用单片机的智能化仪表可具有自整定、自校正、自动补偿和自适应功能,还可进行数字PID调节,软件消除电流热噪声等等,解决传统仪表所不能解决的难题。
单片机的应用使这种性能如虎添翼,如自动计费电度表、燃气表中己有这方面的应用。
许多工业仪表中的智能流量计,气体分析仪、成分分析仪等也采用了这项技术。
甚至有的保健治疗仪中也采用了单片机控制。
(5)消费类电子产品控制
该应用主要反映在家电领域,如洗衣机、空调器、保安系统、VCD视盘机、电子秤、IC卡、手机、BP机等。
这些设备中使用了单片机机芯后,大大提高了其控制功能和性能,并实现了智能化、最优化控制。
(6)终端及外围设备控制
计算机网络终端设备,如银行终端、商业POS(自动收款机)以及计算机外围设备如打印和L、通信终端和智能化UPS等。
在这些设备中使用单片机,使其具有计算、存储、显示、输入等功能,具有和计算机连接的接口,使计算机的能力及应用范围大大提高。
二、系统工作原理及总体设计
2.1系统总体方框图
本次设计实现的功能主要有:
使用2个4位七段数码管来显示现在的时间,显示格式为“时分秒”,中间用小数点分隔。
能够根据预先设定好的作息时间表自动启停控制电路,完成对外部设备的实时控制。
2.2DS1302
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
下图为DS1302的引脚功能图:
要特别说明的是备用电源B1,可以用电池或者超级电容器(0.1F以上)。
虽然DS1302在主电源掉电后的耗电很小,但是,如果要长时间保证时钟正常,最好选用小型充电电池。
可以用老式电脑主板上的3.6V充电电池。
如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。
100μF就可以保证1小时的正常走时。
DS1302在第一次加电后,必须进行初始化操作。
初始化后就可以按正常方法调整时间。
2.3数码管
数码管采用的是共阳管,输出高电平时相应的灯亮。
则显示0~9输出的数应为0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff。
2.4AT89C52
图2-2AT89C52单片机引脚图
AT89C52的工作特性:
·内含4KB的FLASH存储器檫写次数1000次;
·内含128字节的RAM;
·具有32根可编程I/O线;
·具有2个16位编程定时器
·具有6个中断源,5个中断矢量,2级优先权的中断结构;
·具有1个全双工的可编程串行通信接口;
·具有1个数据指针DPTR;
·具有可编程3级程序锁定位;
·AT89C52的工作电源为5(1±0.2)V且典型值为5V;
·AT89C52最高工作频率为24MHZ;
·AT89C52的编程频率为3~24MHZ,编程启动电流和启动电压分别为1mA、5或12V。
2.5晶振电路:
晶振在数字电路的基本作用是提供一个时序控制的标准时刻。
数字电路的工作是根据电路设计,在某个时刻
没完成特定的任务,如果没有一个时序控制的标准时刻,整个数字电路就会成为“聋子”,不知道什么时刻该做什么事情了。
晶振的作用是为系统提供基本的时钟信号。
通常一个系统共用一个晶振,便于各部分保持同步。
有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。
晶振的工作原理:
主板时钟芯片即分频器的原始工作振荡频率,由石英晶体多谐振荡器的谐振频率来产生,晶振其实是一个频率产生器,他主要把传进去的电压转化为频率信号。
提供给分频率一个基准的14.318MHZ的振荡频率,它是一个多谐振荡器的正回馈环电路,也就是说它把输入作为输出,把输出作为输入的回馈频率,像这样一个永无休止的循环自激过程。
三、原理图
四、总结
本次课程设计是对单片机理论学习的检验,是将理论应用到实践中的一个平台。
通过本课程设计,使我们进一步学习与理解计算机控制系统的构成原理、接口电路与应用程序,进一步巩固与综合专业基础知识和相关专业课程知识,提高了我们运用理论知识解决实际问题的实践技能;也更加知道了查阅资料的重要性。
自此对单片机更有了感性的认识,提高了对次的兴趣,对以后的发展很有帮助。
五、程序清单
#include
#definew_second0x80//秒写入地址
#definew_minute0x82//分写入地址
#definew_hour0x84//时写入地址
#definew_day0x86//日写入地址
#definew_month0x88//月写入地址
#definew_week0x8a//星期写入地址
#definew_year0x8c//年写入地址
#definer_second0x81//秒读出地址
#definer_minute0x83//分读出地址
#definer_hour0x85//时读出地址
#definer_day0x87//日读出地址
#definer_month0x89//月读出地址
#definer_week0x8b//星期读出地址
#definer_year0x8d//年读出地址
#definew_wp0x8e//指令写允许端地址
#defineucharunsignedchar
uchartable[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//7段数码管编码
ucharsecond;//秒指针
ucharminute;//分指针
ucharhour;//时指针
ucharday;//日指针
ucharmonth;//月指针
ucharweek;//星期指针
ucharyear;//年指针
ucharcc;
ucharh_clock,m_clock,h,m;
sbitchange=P1^0;//选择按钮
sbitok=P1^2;//确定更改按钮
sbitcrrect=P1^1;//更改按钮
sbitlook=P1^3;//时间和年月日查看切换按钮
sbitclock=P1^4;//闹钟设定
sbitce=P3^2;//ds1302片选端
sbitsclk=P3^0;//ds1302时控端
sbitio=P3^1;//ds1302串口端
sbitclock_beef=P3^7;//蜂鸣器控制端
sbitclock_button=P1^5;//闹钟启停按钮
voidwrite_ds1302(ucharaddr,uchardat)//写程序
{uchari,temp;
ce=0;sclk=0;ce=1;
for(i=0;i<8;i++)
{sclk=0;
temp=addr;
io=(bit)(temp&0x01);//每一次只传送一位数据
addr>>=1;
sclk=1;
}
for(i=0;i<8;i++)
{sclk=0;
temp=dat;
io=(bit)(temp&0x01);
dat>>=1;
sclk=1;
}
ce=0;
}
ucharread_ds1302(ucharaddr)//读程序
{uchari,temp;
ce=0;sclk=0;ce=1;
for(i=0;i<8;i++)
{sclk=0;
temp=addr;
io=(bit)(temp&0x01);
addr>>=1;
sclk=1;
}
for(i=0;i<8;i++)
{temp>>=1;
sclk=0;
if(io)temp=temp|0x80;
elsetemp=temp&0x7f;
sclk=1;
}
returntemp;
}
voidset_ds1302()//初始化ds1302
{write_ds1302(w_wp,0x00);
write_ds1302(w_second,second);
write_ds1302(w_minute,minute);
write_ds1302(w_hour,hour);
write_ds1302(w_day,day);
write_ds1302(w_month,month);
write_ds1302(w_week,week);
write_ds1302(w_year,year);
write_ds1302(w_wp,0x80);
}
voidview1()//时间显示
{uchari;
P0=table[second%16];//秒显示
P2=0x01;
for(i=0;i<=160;i++);
P2=0;
P0=table[second/16];
P2=0x02;
for(i=0;i<=160;i++);
P2=0;
P0=table[minute%16]-0x80;//分显示,(-0x80表示dp点亮)
P2=0x04;
for(i=0;i<=160;i++);
P2=0;
P0=table[minute/16];
P2=0x08;
for(i=0;i<=160;i++);
P2=0;
P0=table[hour%16]-0x80;//时显示
P2=0x10;
for(i=0;i<=160;i++);
P2=0;
P0=table[hour/16];
P2=0x20;
for(i=0;i<=160;i++);
P2=0;
}
voidview2()//日期显示
{uchari;
P2=0;
P0=table[week%16];//星期显示
P2=0x01;
for(i=0;i<=160;i++);
P2=0;
P0=table[week/16];
P2=0x02;
for(i=0;i<=160;i++);
P2=0;
P0=table[day%16]-0x80;//日显示
P2=0x04;
for(i=0;i<=160;i++);
P2=0;
P0=table[day/16];
P2=0x08;
for(i=0;i<=160;i++);
P2=0;
P0=table[month%16]-0x80;//月显示
P2=0x10;
for(i=0;i<=160;i++);
P2=0;
P0=table[month/16];
P2=0x20;
for(i=0;i<=160;i++);
P2=0;
P0=table[year%16]-0x80;//年显示
P2=0x40;
for(i=0;i<=144;i++);
P2=0;
P0=table[year/16];
P2=0x80;
for(i=0;i<=144;i++);
P2=0;
}
voidview3()//闹钟设定程序
{uchari;
P0=table[m%16];
P2=0x01;
for(i=0;i<=160;i++);
P2=0;
P0=table[m/16];
P2=0x02;
for(i=0;i<=160;i++);
P2=0;
P0=table[h%16]-0x80;
P2=0x04;
for(i=0;i<=160;i++);
P2=0;
P0=table[h/16];
P2=0x08;
for(i=0;i<=160;i++);
P2=0;
}
voidbeep()//蜂鸣器启动程序
{inti;
clock_beef=~clock_beef;
for(i=1;i<=50;i++)
{second=read_ds1302(r_second);
minute=read_ds1302(r_minute);
hour=read_ds1302(r_hour);
view1();
}
}
voiddisplay1()//读秒,分,时程序
{second=read_ds1302(r_second);
minute=read_ds1302(r_minute);
hour=read_ds1302(r_hour);
view1();
if((h_clock==read_ds1302(r_hour))&&
(m_clock==read_ds1302(r_minute)))//判断时分
{while(~clock_button)
{beep();
}
clock_beef=0;
}
}
voiddisplay2()//读星期,日,月,年程序
{week=read_ds1302(r_week);
day=read_ds1302(r_day);
month=read_ds1302(r_month);
year=read_ds1302(r_year);
view2();
if((h_clock==read_ds1302(r_hour))&&
(m_clock==read_ds1302(r_minute))&&(~clock_button))
{while(~clock_button)
{beep();
}
clock_beef=0;
}
}
voidcrrect_ds1302(ucharcc)//更改程序
{
while(~crrect);
switch(cc)
{
case1:
if(read_ds1302(r_minute)==0x59)
minute=0x00;
else{if(read_ds1302
(r_minute)%16==9){minute=read_ds1302
(r_minute)/16;minute=(minute+1)*16;}
else
minute=read_ds1302(r_minute)+1;
}
set_ds1302();
break;
case2:
if(read_ds1302(r_hour)==0x23)
hour=0x00;
else{if(read_ds1302(r_hour)
<0x20)
{if
(read_ds1302(r_hour)%16==9){hour=read_ds1302
(r_hour)/16;hour=(hour+1)*16;}
elsehour=read_ds1302(r_hour)+1;
}
else
hour=read_ds1302(r_hour)+1;
}
set_ds1302();
break;
case3:
if(read_ds1302(r_week)==0x07)
week=0x01;
elseweek=read_ds1302(r_week)+1;
set_ds1302();
break;
case4:
if(read_ds1302(r_day)==0x31)
day=0x01;
else{if(read_ds1302
(r_day)%16==9){day=read_ds1302(r_day)/16;day=(day+1)
*16;}
else
day=read_ds1302(r_day)+1;
}
set_ds1302();
break;
case5:
if(read_ds1302(r_month)==0x12)
month=0x01;
else{if(read_ds1302
(r_month)%16==9){month=read_ds1302
(r_month)/16;month=(month+1)*16;}
else
month=read_