万年历课程设计报告.docx
- 文档编号:17415445
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:16
- 大小:187.56KB
万年历课程设计报告.docx
《万年历课程设计报告.docx》由会员分享,可在线阅读,更多相关《万年历课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
万年历课程设计报告
运城学院
单片机课程设计报告
课题名称基于单片机的电子万年历的设计与实现
单位运城学院
所在院(系)计算机科学与技术系
班级1201班
指导教师
学生姓名高慧明尹鑫孟凯
陈海明王武杰叶帅
2015年5月28日
1.引言……………………………………………………………1
2.课程设计总体设计方案……………………………………2
2.1设计思路………………………………………………2
2.2设计方框图……………………………………………2
3.设计原理分析…………………………………………………3
3.1时钟电路的设计…………………………………………3
3.2控制电路的设计……………………………………………3
3.3电路原理图………………………………………5
4.软件设计……………………………………………………6
4.1程序流程图……………………………………6
4.2软件仿真……………………………………………6
4.3功能测试……………………………………………7
5.程序代码……………………………………………………7
6.设计心得……………………………………………………11
7.参考文献……………………………………………………11
电子万年历
引言
在日新月异的21世纪里,家用电子产品得到了迅速发展。
许多家电设备都趋于人性化、智能化,这些电器设备大部分都含有CPU控制器或者是单片机。
单片机以其高可靠性、高性价比、低电压、低功耗等一系列优点,近几年得到迅猛发展和大范围推广,广泛应用于工业控制系统、通讯设备、日常消费类产品和玩具等。
并且已经深入到工业生产的各个环节以及人民生活的各个方面,如车间流水线控制、自动化系统等、智能型家用电器(冰箱、空调、彩电)等。
用单片机来控制的小型家电产品具有便携实用,操作简单的特点。
本文设计的电子万年历属于小型智能家用电子产品。
利用单片机进行控制,实时时钟芯片进行记时,外加显示电路,和温度显示电路,可实现时间的调整和和温度的显示。
电子万年历既可广泛应用于家庭,也可应用于银行、邮电、宾馆、医院、学校、企业、商店等相关行业的大厅,以及单位会议室、门卫等场所。
因而,此设计具有相当重要的现实意义和实用价值。
关键词:
电子万年历52系列单片机 时钟芯片 FLASH存储器 液晶显示
第2章总体设计方案
2.1设计思路
2.1.1方案1——基于AT89S52单片机的电子万年历设计
不使用时钟芯片,而直接用AT89S52单片机来实现电子万年历设计。
AT89S52是一种带8K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。
单片机的可擦除只读存储器可以反复擦写1000余次。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89S52是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
若采用单片机计时,利用它的一个16位定时器/计数器每50ms产生一个中断信号,中断20次后产生一个秒信号,然后根据时间进制关系依次向分、时、日、星期、月、年进位。
这样就实现了直接用单片机来实现电子万年历设计。
2.1.2方案2——基于DS1302的电子万年历设计
在以单片机为核心构成的装置中,经常需要一个实时的时钟和日历,以便对一些实时发生事件记录时给予时标,实时时钟芯片便可起到这一作用。
过去多用并行接口的时钟芯片,如MC146818,DS12887等。
它们已能完全满足单片机系统对实时时钟的要求,但是这些芯片与单片机接口复杂、占用地址,数据总线接线多、芯片体积大占用空间多、近年来串行接口的各种芯片在单片机系统中应用愈来愈多,串行接口的实时时钟芯片也出现了不少,DS1302是一个综合性能较好且价格便宜的串行接口实时时钟芯片。
利用单片机AT89C52进行控制,采用DS1302作为实时时钟芯片,其三线接口SCLK、I/O、/RST与单片机进行同步通信,外加掉电存储电路、显示电路、键盘电路,即构成一个基本的电子万年历系统,若还要添加其他功能,在这基础上外扩电路即可。
由于在系统设计时,需要考虑以下几点因素:
功耗低、精确度高、软件编程较简单,芯片的体积小、芯片成本低等,而DS1302芯片有上面所述的诸多优点,所以本设计采用方案2。
2.1.3方案3——基于AT89C52单片机的电子万年历设计
本方案选用的是单片机(AT89C52)来实现电子万年历的功能,DS1302作为实时时钟芯片。
共具备两个功能:
(1)显示年月日及时分秒、星期、温度、农历日期等信息
(2)具有可调整日期和时间功能(具有闹钟调节模块,但是未能成功实现闹钟功能)。
2.2设计方框图
该设计的硬件电路的总体框图如图1所示:
图1设计方框图
第3章设计原理分析
3.1时钟电路的设计
实时时钟芯片DS1302采用串行数据传输,可为掉电保护电源提供可编程的充电功能,也可以关闭充电功能,芯片采用32768Hz晶振。
要特别说明的是,备用电源BT1可以用电池或超级电容(10万μF以上)。
虽然DS1302在主电源掉电后耗电很小,但如果要长时间保证时钟正常,最好选用小型充电电池。
如果断电时间较短(几小时或几天),可以用漏电较小的普通电解电容代替(100μF就可以保证1小时的正常走时)。
DS1302在第一次加电后,需进行初始化操作。
初始化后就可以按正常方法调整时间及闹铃。
DS1302的时钟电路如图2所示。
图2DS1302时钟电路
3.2控制电路的设计
AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。
18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。
如图3所示:
图3万年历控制电路
(1).微处理器
在设计过程中我使用单片机AT89C52,通过软件编程的方法实现了以24小时为一个周期同时显示小时,分钟和秒的要求,该定时闹钟设有四个按键,使之具备了校时、定时功能。
利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。
同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
在PROTEUS软件环境下的AT89C52单片机如图4所示:
图4PROTEUS软件环境下的AT89C52芯片
(2).显示电路
就时钟而言,通常可采用液晶显示或数码管显示。
由于一般的段式液晶屏,需要专门的驱动电路,而且液晶显示作为一种被动显示,可视性相对较差;对于具有驱动电路和微处理器接口的液晶显示模块(字符或点阵),一般多采用并行接口,对微处理器的接口要求较高,占用资源多。
另外,AT89C52本身无专门的液晶驱动接口,故使用液晶显示LGM12641BS1R,对于显示文字比较适合。
初始化时,由软件编写的指令就集中在显示功能的设置上。
LGM12641BS1R的指令可带一个、两个参数,或无参数。
若指令中含有参数,则每条指令执行时均须先送入参数,再送入指令代码。
由于状态位作用不一样,因此执行不同指令必须检测不同状态位。
液晶显示模块LGM12641BS1R如图5所示:
图5液晶显示电路LGM12641BS1R
(3).按键电路
由于设计的是电子万年历,需要实现多种功能的显示,并要能够切换显示和调节年月日,故在设计过程中按键的设计就显得尤为重要。
在设计过程中我一共采用了4个按键,尽量在小的空间里实现最多的功能。
其中return键是设置功能返回键,按下一次就能够直接退出功能设置模块。
在调整显示环境下UP和DOWN键是显示调整位的的加1和减1键,FUNCTION键进入模块设置界面,以及“确定”功能。
按键电路如图6所示:
图6按键电路
3.3电路原理图
电路原理图如图7所示:
图7万年历设计总原理图
第4章软件设计
4.1程序流程图
该设计主程序流程图如图8所示:
图8主程序流程图
4.2软件仿真
加载源程序运行,顺利实现了单片机数字电子钟的“小时”、“分钟”、“秒”的显示。
该电子万年历的显示效果及电子万年历时间和日期的调节效果分别如图9和图10所示:
图9电子万年历的运行效果
图10电子万年历时间和日期的调节效果
4.3功能测试
表1功能测试
计时功能
LCD能显示当前的时、分、和秒,具体是时跟分一起显示,分跟秒一起显示,通过按键来切换
星期显示功能
通过按键可以切换到星期显示的界面,按返回键则重新回到主界面显示
时间调整功能
通过按键可以调整或设定年、月、日、星期、时、分,且能实现秒的微调功能
室温检测并显示功能
通过智能传感器DS18B20能够实现检测功能,并通过LCD能完成液晶显示功能
闰年功能
能计时到万年,且能自动判断闰年与平年,并实现正确的计时操作
第5章程序代码
主程序代码
#include
#include
#include
#include
#include
#include
#include
/*****************************预定义**************************************/
#defineucharunsignedchar
#defineuintunsignedint
/****************************************************************************/
sbitbell=P2^0;//定义蜂鸣器端口
sbitin=P2^7;//定义红外检测端口
/*****************************************************************************
*名称:
Timer0_Service()inturrupt1
*功能:
中断服务程序整点报时3声嘟嘟的声音
*****************************************************************************/
voidTimer0_Service()interrupt1
{
staticucharcount=0;
staticucharflag=0;//记录鸣叫的次数
count=0;
TR0=0;//关闭Timer0
TH0=0x3c;
TL0=0XB0;//延时50ms
TR0=1;//启动Timer0
count++;
if(count==20)//鸣叫1秒
{
bell=~bell;
count=0;
flag++;
}
if(flag==6)
{
flag=0;
TR0=0;//关闭Timer0
}
}
/*****************************************************************************
*名称:
Timer2_Servie()interrupt5
*功能:
中断服务程序整点报时一分钟
*****************************************************************************/
voidTimer3_Service()interrupt5
{
staticucharcount;
TF2=0;//软件清除中断标志
count++;
if(in==1)
{
count=0;//计算清0
TR2=0;//关闭Timer2
bell=1;//关闭蜂鸣器
}
if(count==120)//一分钟后关闭报警
{
count=0;//计算清0
TR2=0;//关闭Timer2
bell=1;//关闭蜂鸣器
}
}
/******************************************************************************
*函数名称:
main()
********************************************************************************/
voidmain(void)
{
ucharclock_time[7]={0x00,0x00,0x12,0x29,0x06,0x08};//定义时间变量秒分时日月年
ucharalarm_time[2]={0,0};//闹钟设置alarm_time[0]:
分钟alarm_time[1]:
小时
uchartemperature[2];//定义温度变量temperature[0]低8位temperature[1]高8位
Lcd_Initial();//LCD初始化
clock_Initial(clock_time);//时钟初试化
/*******************中断初始化***************************/
EA=1;//开总中断
ET0=1;//Timer0开中断
ET2=1;//Timer2开中断
TMOD=0x01;//Timer0工作方式1
RCAP2H=0x3c;
RCAP2L=0xb0;//Timer2延时50ms
while
(1)
{
switch(Key_Scan())
{
caseup_array:
{
Key_Idle();
}
break;
casedown_array:
{
Key_Idle();
}
break;
caseclear_array:
{
Key_Idle();
}
break;
casefunction_array:
{
Key_Function(clock_time,alarm_time);
}
casenull:
{
Clock_Fresh(clock_time);//时间刷新
Lcd_Clock(clock_time);//时间显示
Sensor_Fresh(temperature);//温度更新
Lcd_Temperture(temperature);//温度显示
Calendar_Convert(0,clock_time);
Week_Convert(0,clock_time);
//整点报时
if((*clock_time==0x59)&&(*(clock_time+1)==0x59))
{
bell=0;
TR2=1;//启动Timer2
}
//闹钟报警
if(*alarm_time==*(clock_time+1))//分钟相吻合
if(*(alarm_time+1)==*(clock_time+2))//小时相吻合
{
bell=0;
TR2=1;//启动Timer2
}
}
break;
}
}
}
第6章设计心得
这次课程设计,我们组分工合作。
经过这次设计,大家都有了很大的收获,对单片机编程控制有了进一步的了解。
该设计涉及到了单片机的时序控制,数据接口包括并行数据接口以及串行通信接口,同时用到了控制按键、环境信息检测、数据显示处理等。
这次设计,基本上涉及到了所有的单片机控制功能模块。
因此,通过这次设计,能完全掌握单片机的所有基本控制,这也是我们组选择该题目的一个重要原因。
通过这次课程设计让我们对所学内容有了进一步的理解
第7章参考文献
[1]李建忠.单片机原理及应用.西安电子科技大学出版2006.02
[2]余发山.单片机原理及及应用技术.中国矿业大学出版社2003.12
[3]何立民.单片机应用技术选编.北京航空航天大学出版社2000.08
[4]周航慈.单片机程序设计基础.北京航空航天大学出版社1991.11
[5]黄遵熹.单片机原理接口与应用.西北工业大学出版社1997.05
:
指导教师评语及成绩评定:
成绩:
指导教师签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 万年历 课程设计 报告