作息时间控制器.docx
《作息时间控制器.docx》由会员分享,可在线阅读,更多相关《作息时间控制器.docx(21页珍藏版)》请在冰豆网上搜索。
作息时间控制器
河南理工大学
电子设计综合训练报告
作息时间控制器
姓名:
陈平单亚洲
学号:
310708020807310708020808
专业班级:
自动化07-8班
指导老师:
谭兴国
所在学院:
电气工程与自动化学院
2010年7月1日
摘要
本设计是基于Atmel89S52单片机和Proteus仿真的一款实用性很强的多功能作息时间控制器。
具有时间显示、校时、闹钟设置、响铃提醒等功能。
具体来讲,该作息时间控制器是由一个单片机数字钟及控制电路搭建起来的简单系统;硬件电路主要由单片机最小系统(包括USB供电电路、上电加按键复位电路、时钟晶振电路等)、数码管显示电路、按键控制电路、LED闪烁秒指示和闹钟提醒电路;软件采用功能强大、可读性强的高级语言C语言编写,作品设计制作过程中始终采用程序和系统联机调试;同时,实时采用Proteus进行系统的仿真并改进,大大提高了设计的效率。
由于单片机集成度高、功能强、通用性好,特别是它体积小、重量轻、功耗低、价格便宜、可靠性高、抗干扰能力强和使用方便等独特优点,使得它在作息时间控制器的设计中具有独特的优势,是很好的选择;采用USB供电的单片机最小系统,在只有时钟晶振电路和上电加按键复位电路的情况下,只需内置一些简单的程序,无需外部扩展太多的硬件电路和存储器等;键盘采用独立按键,已能够满足全部要求,即可实现对时间和闹钟的模式设定、时间的小时和分钟校准以及闹钟的设定,使得占用资源较少,编程也变得很简单;时间显示采用四位共阴数码管分别显示“时/分”,数码管功耗极低,而且价格便宜,采用动态扫描,使得占用MCU较少的I/O口资源;秒显示采用红色LED灯闪烁来指示,闹钟采用低功耗的蜂鸣器,性价比极高,简单实用。
总之,该作息时间控制器利用单片机控制技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好特点,拥有人性化的闹铃提醒功能,可被广泛应用于我们日常的学习、工作和生活当中。
关键字:
时间控制器AT89S52多功能动态扫描12
目录
1概述3
1.1引言3
1.2作息时间控制器研究的背景和意义3
1.3作息时间控制器的功能3
2系统总体方案及硬件设计5
2.1系统整体方案5
2.2硬件设计5
2.1.1单片机复位电路5
2.1.2单片机时钟晶振电路6
2.1.3数码管显示电路6
2.1.4按键控制电路7
2.1.5秒闪烁和闹钟提示电路7
3软件设计9
3.1主程序设计9
3.2时钟主要程序设计9
3.3键盘程序设计10
3.4中断程序设计10
4Proteus软件仿真11
4.1Proteus仿真图11
4.2仿真结果分析与改进11
5课程设计体会12
参考文献12
附1源程序代码13
附2系统原理图24
1概述
1.1引言
时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。
从古代的水漏、十二天干地支,到后来的机械钟表以及当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。
致力于作息时间控制器的研究和充分发挥时钟的作用,将有着重要的意义。
1.2作息时间控制器研究的背景和意义
20世纪末,电子技术获得了飞速的发展。
在其推动下,现代电子产品几乎渗透到了社会的各个领域,有力的推动和提高了社会生产力的发展与信息化程度,同时也使现代电子产品性能进一步提升,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂容易使人忘记当前的时间。
然而遇到重大事情的时候,一旦忘记时间,就会给自己或他人造成很大麻烦。
想知道时间,手表当然是一个很好的选择,但是,在忙碌当中,我们还需要一个“助理”及时的给我们提醒时间。
所以,计时器最好能够拥有一个定时系统,随时提醒容易忘记时间的人。
最早能够定时、报时的时钟属于机械式钟表,但这种时钟受到机械结构、动力和体积的限制,在功能、性能以及造价上都没办法与电子时钟相比。
作息时间控制器是采用电子电路实现对时、分、秒进行数字显示的计时装置,广泛应用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品。
由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得作息时间控制器的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,因此,研究作息时间控制器,有着非常现实的意义。
1.3作息时间控制器的功能
作息时间控制器利用单片机控制技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好特点,拥有人性化的闹铃提醒功能,可被广泛应用于我们日常的学习、工作和生活当中。
它主要有以下几种功能:
1)使用4位七段显示器来显示现在的时间。
显示格式为“时分”,由LED闪动作为秒计数表示。
2)可以设定作息时间,并进行到时提示。
3)能够根据预先设定好的作息时间表自动启停控制电路,完成对外部设备的实时控制。
4)可以设置现在的时间及显示定时设置时间。
2系统总体方案及硬件设计
2.1系统整体方案
该系统主要以微控制器单片机AT89S52为控制核心,周围附加复位电路、时钟电路、显示电路、提示电路和按键电路等。
系统框图如图2.1所示:
图2.1
2.2硬件设计
该作息时间控制器的硬件电路主要是由单片机最小系统(包括USB供电电路、上电加按键复位电路、时钟晶振电路等)、数码管显示电路、按键控制电路、LED闪烁秒指示和闹钟提醒电路组成的,具体电路如下分述:
2.1.1单片机复位电路
单片机常用的复位电路有四种,分别为:
上电复位、按钮脉冲复位、按钮电平复位、上电+按钮电平复位,很显然采用上电+按钮复位电路更优越,电路图如图2.1.1所示:
图2.1.1
2.1.2单片机时钟晶振电路
51单片机有两种时钟产生方式,即内部和外部时钟产生方式。
外部时钟产生方式的时钟脉冲完全由外电路产生,而内部时钟产生方式是指在XTAL1和XTAL2两端跨接晶体或陶瓷谐振器,与内部反相器构成稳定的自激振荡器,其发出的时钟脉冲直接送入片内定时控制部件,由于作息时间控制器对精度要求较高,故采用内部时钟产生方式,硬件电路图见图2.1.2所示:
图2.1.2
2.1.3数码管显示电路
数码管显示方式也分为两种:
静态扫描方式和动态扫描方式。
静态扫描方式显示程序简单,显示度高,由于单片机不需要经常扫描显示器,所以可以节省CPU的时间。
但静态扫描的缺点是占用I/O口资源较多,硬件成本高,而且功耗大。
而作息时间控制器需要显示四位数据,所以采用动态扫描方式,可以减少I/O口资源的占用。
具体电路图如图2.1.3所示:
图2.1.3
2.1.4按键控制电路
常用的键盘有独立式键盘和矩阵式键盘。
在系统要求按键较多时,一般采用矩阵式键盘,可以减少占用I/O口线,但该系统无需太多按键,四个独立式按键即可满足要求,而且程序编写简单。
当按下S1时,可以选择时间和闹钟模式,当分别按下S2和S3时则分别调整小时/分钟自动加1,当系统处在闹钟设置或者时间校准状态时,按下S4则为确定,时间开始从0秒开始计时。
详细电路图见图2.1.4所示:
图2.1.4
2.1.5秒闪烁和闹钟提示电路
每间隔1s,红色LED灯闪烁一次,当到达闹钟设置的时刻时,蜂鸣器发出声音提示,电路图如图2.1.5所示:
图2.1.5
3软件设计
3.1主程序设计
第一次上电,系统先进行初始化,单片机依次开始调用显示子程序、键盘扫描子程序、闹铃子程序,经过延时,返回程序开头循环运行。
主程序流程图如图3.1。
图3.1
3.2时钟主要程序设计
图3.2
3.3键盘程序设计
图3.3
3.4中断程序设计
图3.4
4Proteus软件仿真
应用仿真软件Proteus搭建电路的软件平台,再导入程序进行仿真调试。
如果电路出错,可以在计算机上方便的修改电路,程序出错可以重新编辑程序,这种方法节时、省力,经济、方便。
4.1Proteus仿真图
图4.1
4.2仿真结果分析与改进
刚开始由于自己的粗心,在画仿真图时,将排阻上的一引脚线路接错,导致数码管不能完全显示,经过仔细分析排查找到了原因,最终仿真结果一步步完善,达到了题目的基本要求。
实现了四按键控制“时间/闹钟”的模式设定、“分钟/小时”校准、闹钟设定等功能;实现了LED灯闪烁的秒指示;实现了闹钟定时的提醒;实现了根据预先设定好的作息时间表自动启停控制电路,完成了对外部设备的实时控制。
有待改进的地方是时间的精度问题,这个主要可以通过完善程序来实现,硬件电路的焊接上也有待进一步加强,力争使作品更加实用美观。
5课程设计体会
通过本课程设计,使我深刻的明白了理论和实践的差别,并且让我加深了对单片机的认识和了解。
本次课程设计使我掌握了单片机开发的基本方法及其流程,以及单片机系统设计的总体思路,而且掌握AltiumDesigner和Proteus软件使用方法。
在此过程我们也遇到了许多困难,例如一些元件使用功能,编程等,这都在老师和同学的帮助下和通过网上查资料的途径得到解决,更重要的我们可以把理论运用到实践中去,使理论与实践相结合,使我们的理论知识的到了巩固,在查资料翻阅资料的过程中也丰富了我们的知识跟阅历,让我体会到了学习的乐趣,学习再也不是那么枯燥。
总而言之,本次课程设计让我们得到了锻炼,思路更加宽阔,动手能力也得到了提高,并且掌握了解决问题的方法和途径,培养了我们的创新精神,从而不断地挑胜自己,超越自己。
参考文献
【1】余发山,王福忠.单片机原理及应用技术.徐州:
中国矿业大学出版社,2008.29-32
【2】戴佳,苗龙,陈斌.51单片机应用系统开发典型实例.北京:
中国电力出版社,2005.15-24
【3】徐爱钧,彭秀华.单片机高级语言C51应用程序设计.北京:
电子工业出版社,1998.365-379
附1源程序代码
/***************************************************************
P0口为数码管段码输出,P2^4-P2^7口为位选。
P3_2为模式选择P1_3为小时加1,P1_1为分钟加1,P1_2为闹铃确定键
**************************************************************/
#include
#include
#defineucharunsignedchar;
#defineuintunsignedint;
sbitss=P1^4;
sbitsb1=P1^2;
sbitsb2=P1^3;
sbitsb3=P1^1;
sbitbeep=P1^5;
uchardcode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管段码
ucharwcode[]={0x7F,0xBF,0xDF,0xEF,0xFF};//共阴数码管位选
//uchardcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管段码
//ucharwcode[]={0x01,0x02,0x04,0x08,0x00};//共阳数码管位选
ucharcount=0,second=0,minute=5,hour=10,ji=0;
unsignedchardhour[]={10,0,0},dminute[]={7,0,0};
ucharflag1=2,flag3=0;
bitflag2=0;//flag1为1或2时显示时间flag1为0时显示定时时间。
flag2=0时秒闪动
voidinit(void);
voiddelay(void);
voiddisp(void);
voidint0(void);
scan(unsignedchar);
voidset(void);
voidtimer(void);
voidmatch(void);
voidtiao(void);
voidmain(void)
{
init();
while
(1)
{
disp();
tiao();
match();
if(flag1==0||flag1==1)
{
set();
}
}
}
voidinit(void)//初始化
{
IT0=1;//边缘触发
EX0=1;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;//定时器0,方式一,50ms定时初值
EA=1;
TR0=1;
ET0=1;
}
voiddelay(void)//延时函数
{
unsignedchari,j;
for(i=1;i>0;i--)
for(j=142;j>0;j--);
}
voiddisp(void)//显示函数
{
if(flag1==1||flag1==2)
{
P2=wcode[4];
P0=dcode[hour/10];
P2=wcode[0];
delay();
P2=wcode[4];
P0=dcode[hour%10];
P2=wcode[1];
delay();
P2=wcode[4];
P0=dcode[minute/10];
P2=wcode[2];
delay();
P2=wcode[4];
P0=dcode[minute%10];
P2=wcode[3];
delay();
P2=wcode[4];
if(flag1==2)
flag2=0;
}
if(flag1==0)
{
P2=wcode[4];
P0=dcode[dhour[0]/10];
P2=wcode[0];
delay();
P2=wcode[4];
P0=dcode[dhour[0]%10];
P2=wcode[1];
delay();
P2=wcode[4];
P0=dcode[dminute[0]/10];
P2=wcode[2];
delay();
P2=wcode[4];
P0=dcode[dminute[0]%10];
P2=wcode[3];
delay();
P2=wcode[4];
}
}
voidtiao(void)//时间调整函数
{
if(second>=60)
{
second=0;
minute++;
if(minute>=60)
{
minute=0;
hour++;
if(hour>24)
{
hour=0;
}
}
}
}
voidint0(void)interrupt0//INT0中断服务子程序
{
flag1++;
if(flag1>2)flag1=0;
}
scan(unsignedcharjj)//键扫描函数
{
if(flag1==0)
{
while
(1)
{flag2=1;
if(sb2==0)
{
while(sb2==0)disp();
dhour[jj]=dhour[jj]+1;
if(dhour[jj]>=24){dhour[jj]=0;}
}
if(sb3==0)
{
while(sb3==0)disp();
dminute[jj]=dminute[jj]+1;
if(dminute[jj]>=60){dminute[jj]=0;}
}
if(flag1!
=0)
{
break;
}
disp();
}
}
if(flag1==1)
{
while
(1)
{flag2=1;
if(sb2==0)
{
while(sb2==0)disp();
hour++;
if(hour>=24)hour=0;
}
if(sb3==0)
{
while(sb3==0)disp();
minute++;
if(minute>=60)minute=0;
}
if(flag1==0||flag1==2)
{
break;
}
disp();
}
}
if(flag1==2){return;}
}
voidset(void)
{
switch(ji)
{
case0:
scan(ji);break;
case1:
scan(ji);break;
case2:
scan(ji);break;
default:
break;
}
}
voidtimer(void)interrupt1//定时器0中断服务子程序
{
TH0=0x3c;
TL0=0xb0;//定时器0,方式一,50ms定时初值
count++;
if(count>=20)
{
count=0;
second++;
}
if(flag2==0)
{
if(count<10)
{
ss=0;
}
else
{
ss=1;
}
}
}
voidmatch(void)
{
if(hour==dhour[ji])
{
if(flag1==2&&sb3==0)
{flag3++;
flag3=flag3%2;
}
if(minute==dminute[ji]&&flag3==0)
{
beep=~beep;
delay();
}
}
}
附2系统原理图