电子时钟实验报告.docx
- 文档编号:17840928
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:49
- 大小:342.83KB
电子时钟实验报告.docx
《电子时钟实验报告.docx》由会员分享,可在线阅读,更多相关《电子时钟实验报告.docx(49页珍藏版)》请在冰点文库上搜索。
电子时钟实验报告
微机与单片机接口开发实验报告
题目:
基于单片机的电子钟设计
姓名:
张昭
学号:
102021239
专业:
信号与信息处理
任课教师:
黄冰教授
完成日期:
2011年9月1日
摘要
随着科技的发展,单片机的应用正在不断深入,涉及到日常生活的方方面面。
本设计是基于单片机AT89S51为控制核心,以液晶为显示的数字时钟。
本数字时钟设计的原理相对简单,所以硬件电路也相对简单,难点和重点主要放在C语言的编程上,使用到定时器的子程序、延时程序、时分秒的控制程序、液晶模块和单片机模块的初始化程序、液晶显示的程序等,各个函数交叉调用,配合主程序的运行。
关键字:
LCD1602AT89S51定时器
Abstract
Withthedevelopmentoftechnology,SCMapplicationsaredeepening,involvingallaspectsofdailylife.ThedesignisbasedontheMCUAT89S52forthecontrolofthecore,theliquidcrystaldisplaydigitalclock.Thedigitalclockdesignprincipleisrelativelysimple,thehardwarecircuitisrelativelysimple,difficult,andfocusedmainlyontheCprogramminglanguage,usethetimersubroutine,delayprocedures,minutesandsecondsofthecontrolprogram,theLCDmoduleandmicrocontrollermoduleinitializationprocedures,proceduresforliquidcrystaldisplay,cross-eachfunctioncall,withthemainprogramtorun.
Keywords:
LCD1602AT89S51timer
1实验任务
设计一个多功能LCD电子钟。
要求
(1)能显示年、月、日、时、分、秒(通常显示时、分、秒);
(2)能对年、月、日、时、分、秒进行预置;
(3)具有定时功能,定时时间到声光报告。
2设计方案
2.1硬件设计
2.1.1原理框图
2.1.2控制模块
a.晶振电路
b.复位电路
以上三部分构成了单片机最小系统,其中P0和P2口的部分管脚接显示模块,P3口接控制模块,P2口的部分管脚接报警模块。
2.1.3显示模块
1602LCD主要技术参数:
显示容量:
16×2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×4.35(W×H)mm
引脚功能说明:
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下表1所示:
表1:
引脚接口说明表
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
第1脚:
VSS为地电源。
第2脚:
VDD接5V正电源。
第3脚:
VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
D0~D7为8位双向数据线。
第15脚:
背光源正极。
第16脚:
背光源负极。
硬件连接原理图如下:
2.1.4按键电路
S0显示日期(按下显示日期,弹起后回到显示时间状态);
S1显示闹钟(按下显示闹钟,弹起后回到显示时间状态);
S2设置日期(按键1次设置年,2次设置月,3次设置日);
S3设置时间(按键1次设置星期,2次设置时,3次设置分,4次设置秒);
S4设置闹钟(按键1次设置时,2次设置分,3次设置秒);
S5增加一(设置中对所选择变量加一);
S6减少一(设置中对所选择变量减一);
2.1.5报警部分模块
2.2软件设计
2.2.1基本资源的使用
本次实验采用了AT89S52型单片机,1602LCD液晶显示屏,蜂鸣器、发光二极管。
为了实现时钟,定时,闹钟,秒表的功能,用到了单片机的外部中断,计时器中断,及I/O端口.
资源
功能
外部中断
外部中断INT1
设置时分秒(每按一次改变设置类型)
外部中断INT0
设置年月日(每按一次改变设置类型)
定时器
定时器T0
用溢出中断设置闹钟(每按一次改变设置类型)
定时器T1
定时器中断(每隔1S调整一次时间)
I/O端口
P0,P2,P3
LCD接口,蜂鸣器、发光二极管、按键
2.2.2程序设计的基本思路
主程序循环显示当前的时间并扫描按键S0对应P3.0(显示日期)和按键S1对应P3.1(显示闹钟时刻)是否有按下,并比较判断定时时刻是否到达;按键S2对应INT0中断用来设置日期,每按下一次可分别对年、月、日进行设置,P3.6和P3.7用来对所要设置的属性进行加一和减一操作,S7对应的P2.4统一的返回键,当处在中断设置状态时按此键可以返回至正常显示时间状态;按键S3对应INT1中断用来设置时间,操作同上面的日期设置;按键S4对应定时器T0,让T0工作在计数模式,通过设置计数初值为最大,当P3.3管脚来一个低电平时,加一后计数器产生溢出中断,以此用作外部中断来设置闹钟时刻。
2.2.3程序的主要流程图
3仿真与调试结果
本实验采用Keil4和Protues7.7SP2联合仿真调试
显示时间:
设置日期:
设置闹钟:
仿真结果:
经过多次的反复测试与分析,掌握了硬件的设计与分析的能力,对所学的知识得到很大的提高与巩固。
最终实现功能:
(1)能显示阳历年、月、日、星期、小时、分、秒
(2)显示模块采用LCD液晶显示,要求能用按键调整日期、时间和闹钟。
(3)能进行定时,并进行声光报警。
4心得体会
本次电子时钟的实验课程设计,学习将理论和实践相结合,对数字器件及集成电路有较深入的认识,初步掌握综合运用所学知识分析和设计一般数字系统的基本方法,增强动手解决实际问题的能力。
认识到了自身的许多缺点和不足,初步接触到了如何将硬件和软件相连接来实现一定的自动化。
在试验板的焊接过程中,更深地意识到焊接技术的重要性。
使我明白现实生活中电子钟的工作原理,锻炼了查找资料的能力。
附录
附录1参考文献
[1]高峰编著.单片微型计算机原理与接口技术.北京:
科学出版社,2003
[2]陈粤初等.单片机应用系统设计与实践.北京:
北京航空航天大学出版社,1991
[3]邹逢兴主编.计算机硬件技术及应用基础.长沙:
国防科技大学出版社,2001
[4]黄冰等编著.微机原理及应用.重庆:
重庆大学出版社,2003
[5]曾峰等.印制电路板(PCB)设计与制作.北京:
电子工业出版社,2005
[6]周润景,张丽娜,刘印群.PROTEUS入门实用教程[M].北京:
机械工业出版社,2007,314-325
[7]戴佳,戴卫恒.51单片机C语言应用程序设计实例精讲[M].北京:
电子工业出版社,2006,231-246
[8]徐爱钧,彭秀华.KeilCx51V7.0单片机高级语言编程与uVision2应用实践[M].(第二版)北京:
电子工业出版社,2008,156-171
[9]肖炎根,舒望.基于实时钟芯片的电子万年历设计[J].电子技术,2007,卷号(36):
91-94
[10]王怀平,王仁波,胡开明.Proteus仿真设计基于单片机AT89C51的电子万年历[J].科技广场,2008,卷号(10):
197-198
[11]鲁刚强.基于液晶显示器的单片机系统设计[J].科技资讯,2008,卷号(35):
22-23
[12]余威明.MCU语音型电子万年历的开发[J].浙江工贸职业技术学院学报,2004,卷号(4):
20-25
[13]邱关源.电路[M].(第四版)北京:
高等教育出版社,2006,241-268.
[14]陈凯.液晶显示万年历、时间、星期及温度[D].湖南:
湖南理工学院,2009.
[15]张海兵,李敏.Protel电路设计实例与分析[M].北京:
人民邮电出版社,2005,119-205
[16]黄劼,徐晓秋.单片机原理及接口技术[M].北京:
国防工业出版社,2008,102-112
[17]刘迎春.MCS-51单片机原理及应用教程[M].北京:
清华大学出版社,2005,145-157
[18]张齐,朱宁西.单片机应用系统设计技术:
基于C51的Proteus仿真[M].(第二版)北京:
电子工业出版社,2009,245-264
附录2硬件电路原理图
附录3硬件电路PCB图
附录4程序清单
/***********************************************************
DISPLAY.H
***********************************************************/
#include
#defineucharunsignedchar
/************************定义端口**********************************/
sbitrs=P2^0;
sbitrw=P2^1;
sbiten=P2^2;
structdateType//定义日期数据类型
{
unsignedintyear;
unsignedcharmonth;
unsignedcharday;
};
structtimeType//定义时间数据类型
{
unsignedcharweek;
unsignedcharhour;
unsignedcharmin;
unsignedcharsec;
};
//定义全局变量,日期、时间、闹钟和计数器
structdateTypedateNow={2000,2,29};//设置默认日期2000年2月29日
structtimeTypetimeNow={07,23,58,30};//设置默认时间周日23:
58:
30
structtimeTypesetClock={0,0,05,20};//设置默认的闹铃00:
05:
20
unsignedcharcount=0;
voidlcd_wdat(uchardate);
voidlcd_wcmd(ucharcom);
/**************************延时函数*********************************/
voiddelay2us(uchark)
{
while(--k);
}
voiddelay1ms(uchark)
{
inti,j;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
voiddelay(unsignedintcount)
{
unsignedintj;
while(count--!
=0)
{
for(j=0;j<72;j++);
}
}
/*********************判定是否是闰年*********************/
unsignedcharleap_year(unsignedintn)
{
if((n%4==0&&n%100!
=0)||n%400==0)
return1;
else
return0;
}
/**********************判定是否是30天***********************/
unsignedcharis_30day(unsignedcharn)
{
switch(n)
{
case1:
return0;
case2:
return0;
case3:
return0;
case4:
return1;
case5:
return0;
case6:
return1;
case7:
return0;
case8:
return0;
case9:
return1;
case10:
return0;
case11:
return1;
case12:
return0;
}
}
/***********************1602初始化************************/
voidlcd_init(void)
{
delay1ms(5);
lcd_wcmd(0x38);
lcd_wcmd(0x0c);
lcd_wcmd(0x06);
lcd_wcmd(0x01);
lcd_wcmd(0x80);
delay2us(200);
}
/******************设置显示位置*****************************/
voidlcd_pos(unsignedcharpos)
{
lcd_wcmd(pos|0x80);
}
/***********************1602写指令***********************/
voidlcd_wcmd(ucharcom)
{
rs=0;
rw=0;
P0=com;
en=0;
delay2us(200);
en=1;
delay2us(200);
en=0;
}
/***********************1602写数据***********************/
voidlcd_wdat(uchardate)
{
rs=1;
rw=0;
P0=date;
en=0;
delay2us(200);
en=1;
delay2us(200);
en=0;
}
/********************显示日期***************************************/
voiddisplay_date()
{
unsignedchararray[16];
unsignedchari=0;
unsignedcharj=0;
unsignedinttemp=0;
array[i++]='D';
array[i++]=':
';
array[i++]=dateNow.year/1000+0x30;
temp=dateNow.year%1000;
array[i++]=temp/100+0x30;
temp=temp%100;
array[i++]=temp/10+0x30;
array[i++]=temp%10+0x30;
array[i++]='-';
array[i++]=dateNow.month/10+0x30;
array[i++]=dateNow.month%10+0x30;
array[i++]='-';
array[i++]=dateNow.day/10+0x30;
array[i++]=dateNow.day%10+0x30;
array[i++]='\a';
delay1ms(10);
lcd_pos(0x00);//设置显示位置
while(array[j]!
='\a')
{
lcd_wdat(array[j]);//显示字符
j++;
}
lcd_wcmd(0x02);//光标复位
}
/*****************中断内显示日期*****************************/
voididisplay_date()
{
unsignedchararray[16];
unsignedchari=0;
unsignedcharj=0;
unsignedinttemp=0;
array[i++]='S';
array[i++]=':
';
array[i++]=dateNow.year/1000+0x30;
temp=dateNow.year%1000;
array[i++]=temp/100+0x30;
temp=temp%100;
array[i++]=temp/10+0x30;
array[i++]=temp%10+0x30;
array[i++]='-';
array[i++]=dateNow.month/10+0x30;
array[i++]=dateNow.month%10+0x30;
array[i++]='-';
array[i++]=dateNow.day/10+0x30;
array[i++]=dateNow.day%10+0x30;
array[i++]='\a';
delay1ms(10);
lcd_pos(0x00);//设置显示位置
while(array[j]!
='\a')
{
lcd_wdat(array[j]);//显示字符
j++;
}
lcd_wcmd(0x02);//光标复位
}
/*********************显示时间*********************************/
voiddisplay_time()
{
unsignedchararray[16];
unsignedchari=0;
unsignedcharj=0;
array[i++]='T';
array[i++]=':
';
array[i++]=0+0x30;
array[i++]=timeNow.week+0x30;
array[i++]='-';
array[i++]=timeNow.hour/10+0x30;
array[i++]=timeNow.hour%10+0x30;
array[i++]=':
';
array[i++]=timeNow.min/10+0x30;
array[i++]=timeNow.min%10+0x30;
array[i++]=':
';
array[i++]=timeNow.sec/10+0x30;
array[i++]=timeNow.sec%10+0x30;
array[i++]='\a';
delay1ms(10);
lcd_pos(0x00);//设置显示位置
while(array[j]!
='\a')
{
lcd_wdat(array[j]);//显示字符
j++;
}
lcd_wcmd(0x02);//光标复位
}
/*********************中断内显示时间*********************************/
voididisplay_time()
{
unsignedchararray[16];
unsignedchari=0;
unsignedcharj=0;
array[i++]='S';
array[i++]=':
';
array[i++]=0+0x30;
array[i++]=timeNow.week+0x30;
array[i++]='-';
array[i++]=timeNow.hour/10+0x30;
array[i++]=timeNow.hour%10+0x30;
array[i++]=':
';
array[i++]=timeNow.min/10+0x30;
array[i++]=timeNow.min%10+0x30;
array[i++]=':
';
array[i++]=timeNow.sec/10+0x30;
array[i++]=timeNow.sec%10+0x30;
array[i++]='\a';
delay1ms(10);
lcd_pos(0x00);//设置显示位置
while(array[j]!
='\a')
{
lcd_wdat(array[j]);//显示字符
j++;
}
lcd_wcmd(0x02);//光标复位
}
/*********************显示闹钟时刻*******************************/
voiddisplay_clock()
{
unsignedchararray[16];
unsignedchari=0;
unsignedcharj=0;
array[i++]='C';
array[i++]=':
';
array[i++]=setClock.hour/10+0x30;
array[i++]=setClock.hour%10+0x30;
array[i++]=':
';
array[i++]=setClock.min/10+0x30;
array[i++]=setClock.min%10+0x30;
array[i++]=':
';
array[i++]=setClock.sec/10+0x30;
array[i++]=setClock.sec%10+0x30;
array[i++]='\a';
delay1ms(10);
lcd_pos(0x00);//设置显示位置
while(array[j]!
='\
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 时钟 实验 报告