数字时钟课程设计.docx
- 文档编号:14316771
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:29
- 大小:242.66KB
数字时钟课程设计.docx
《数字时钟课程设计.docx》由会员分享,可在线阅读,更多相关《数字时钟课程设计.docx(29页珍藏版)》请在冰点文库上搜索。
数字时钟课程设计
1.引言
近年来随着计算机在社会领域的渗透和大规模集成电路的发展,单片机的应用正在不断地走向深入,由于它具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
数字钟是采用数字电路实现对时,分,秒数字显示的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
1.1设计任务与要求
1.利用AT89C51定时器设计一个电子时钟;2.显示格式位“XXXXXX”,从左向右分别是:
时、分、秒;3.显示部分用1602LCD显示屏;4.具有四个调整键K0,K1,K2,K3;5.按下相应的键可以调整时,分,秒;6.调整到哪一位哪一位闪烁;7.在1602上方显示“年,月,日,星期”。
1.2数字钟得实用价值和理论意义
数字钟是采用数字电路实现对时,分,秒数字显示的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
1.3设计所用器件简介
1.3.1单片机简介
MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。
INTEL公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,当然,功能或多或少有些改变,以满足不同的需求,其中89C51就是这几年在我国非常流行的单片机,它是由美国ATMEL公司开发生产的。
以后我们将用89C51、89S51来完成一系列的实验。
MCS-51系列单片机
MCS-51系列单片机分为两大系列,即51子系列与52子系列。
51子系列:
基本型,根据片内ROM的配置,对应的芯片为8031、8051、8751、8951
52子系列:
增强型,根据片内ROM的配置,对应的芯片为8032、8052、8752、8952
这两大系列单片机的主要硬件特性如下表:
上表中可以看到,8031、8031、8032、80C32片内是没有ROM的,对应着上表看,我们可以发现,51系列的单片机的RAM大小为128B,52系列的RAM大小为256B,51系列的计数器为两个16位的,52系列的计数器为三个16位计数器。
51系列的中断源为5个,52系列的中断源为6个。
1.3.21602LCD的基本参数及引脚功能
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图10-54所示:
图10-541602LCD尺寸图
1602LCD主要技术参数:
显示容量:
16×2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×4.35(W×H)mm
引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:
编号
符号
引脚说明
编号
符号
引脚说明
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脚:
背光源负极。
1602LCD的指令说明及时序
1602液晶模块内部的控制器共有11条控制指令,如表所示:
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
11
从CGRAM或DDRAM读数
1
1
读出的数据内容
控制命令表
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:
1为高电平、0为低电平)
指令1:
清显示,指令码01H,光标复位到地址00H位置。
指令2:
光标复位,光标返回到地址00H。
指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:
控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标。
指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示,高电平时双行显示F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据。
指令11:
读数据。
与HD44780相兼容的芯片时序表如下:
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
输入
RS=L,R/W=L,D0—D7=指令码,E=高脉冲
输出
无
读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,D0—D7=数据,E=高脉冲
输出
无
2.设计内容
3.程序设计及硬件电路
程序流程图
3.1原理图(protues)
3.2原理图(protel)
4.仿真结果
上电后按下K0开始运行:
按下K3秒闪烁
按下K1闪烁减一(05调到04)
按下K2加一(04调到05)
根据按下K0的次数可以改变闪烁的位置进行分,时,年,月,日,星期的调整
调整分
调整时
调整年
调整月
调整日
调整星期
5.收获、体会和建议
单片机数字钟可以说是一个较小的系统,开始时我们觉得通过C语言较容易实现,确实,只实现一个能够正常走时并且能够校时的数字钟是比较容易的。
但我们想错了,毕竟是第一次从总体角度来考虑地完成一个小系统,好多的实际性的问题我们没有考虑,所以造成我们最终设计的数字钟精度不高,并且存在好多问题,当然问题多了对我们来说是好事,这样我们在解决更多问题时学会更多解决问题的方法,对我们也算是长长经验吧。
通过这次对数字钟的设计,让我了解了设计电路的程序,也让我了解了关于数字钟的原理与设计理念,要设计一个完整的电路总要经过多次的失败才能成功的,在设计中,遇到了许多匪夷所思的问题,一个人就是想破脑子也做不出来,这时候,就需要去询问老师、和同学探讨,共同解决出现的问题,也许就是因为老师的一句提醒、同学的探讨中就会豁然开朗。
。
从这次设计中我也觉得自己还对单片机的功能了解只是个皮毛,单片机强大的功能还等着我们去开发。
通过这次设计,不仅使我学到了知识,让我对电路设计有了大概的了解;其次,还体会到了团队精神。
总而言之,这次设计是成功的。
6.参考文献
1杨文龙.单片机原理及应用.西安:
西安电子科技大学出版社,1993
2李朝青.单片机原理及接口技术.北京:
北京航空航天大学出版社,2003
3胡汉才.单片机原理及系统设计.北京:
清华大学出版社,2003
4杨忠煌,黄博俊,李文昌.单芯片8051实务与应用.北京:
中国水利水电出版社,2001
7.附:
源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable1[]={"2011-00-00-MON"};//星期一MON星期二TUE星期三WED星期四THU星期五FRI星期六SAT星期天SUN
ucharcodetable2[]={"00:
00:
00"};
ucharcodetable[]={'0','1','2','3','4','5','6','7','8','9'};
ucharnum,count,miao,fen,xiao,week,day,month,year,shi,ge,flag,num1;
sbitLCD_RW=P3^7;
sbitLCD_RS=P3^5;
sbitLCD_E=P3^4;
sbitk1=P1^0;//选择
sbitk2=P1^1;//增加
sbitk3=P1^2;//减少
sbitk4=P1^3;//开始
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//////////////////////////////////////////////////////////////////////////////////////
///lcd显示
voidinit(void);//初始化函数
voidwrite_com(ucharcommand);//写指令函数
voidwrite_date(uchardat);//写数据函数
voidLCD_disp_char(ucharx,uchary,uchardat);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)
//voidLCD_check_busy(void);//检查忙函数。
我没用到此函数,因为通过率极低。
voiddelay_n40us(uintn);//延时函数
//********************************
//*******初始化函数***************
voidinit(void)
{
write_com(0x38);//设置8位格式,2行,5x7
write_com(0x0c);//整体显示,关光标,不闪烁
write_com(0x06);//设定输入方式,增量不移位
write_com(0x01);//清除屏幕显示
delay_n40us(100);//实践证明,用for循环200次就能可靠完成清屏指令。
}
//********************************
//********写指令函数************
voidwrite_com(uchardat)
{
P2=dat;
LCD_RS=0;//指令
LCD_RW=0;//写入
LCD_E=1;//允许
LCD_E=0;
delay_n40us
(1);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。
}
//*******************************
//********写数据函数*************
voidwrite_date(uchardat)
{
P2=dat;
LCD_RS=1;//数据
LCD_RW=0;//写入
LCD_E=1;//允许
LCD_E=0;
delay_n40us
(1);
}
//********************************
//********延时函数***************
voiddelay_n40us(uintn)
{uinti;
ucharj;
for(i=n;i>0;i--)
for(j=0;j<2;j++);//在这个延时循环函数中我只做了2次循环,
}//实践证明我的LCD1602上普通的指令只需1次循环就能可靠完成。
////////////////////////////////////////////////////////////////////////
voidmain()
{
init();
write_com(0x80);///////初始化
for(num=0;num<15;num++) ////////显示年月日
{
write_date(table1[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<15;num++)/////////////显示时间
{
write_date(table2[num]);
delay(5);
}
while
(1)
{
if(count==20)//////////计时的数
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
xiao++;
if(xiao==24)
{
xiao=0;
week++;if(week==8)week=0;
switch(week)
{
case1:
write_com(0x80+0x0c);write_date('M');delay(5);
write_date('O');delay(5);
write_date('N');break;
case2:
write_com(0x80+0x0c);write_date('T');delay(5);
write_date('U');delay(5);
write_date('E');break;
case3:
write_com(0x80+0x0c);write_date('W');delay(5);
write_date('E');delay(5);
write_date('D');break;
case4:
write_com(0x80+0x0c);write_date('T');delay(5);
write_date('H');delay(5);
write_date('U');break;
case5:
write_com(0x80+0x0c);write_date('F');delay(5);
write_date('R');delay(5);
write_date('I');break;
case6:
write_com(0x80+0x0c);write_date('S');delay(5);
write_date('T');delay(5);
write_date('A');break;
case7:
write_com(0x80+0x0c);write_date('S');delay(5);
write_date('U');delay(5);
write_date('N');break;
}
day++;
if((month%2==0&&day==31)||(month%2==1&&day==32&&month!
=2)||(((year%4==0&&year%100!
=0)||year%400==0)&&month==2&&day==30)||((!
(year%4==0&&year%100!
=0)||year%400==0)&&month==2&&day==29))
{////////////////////判断每月有多少天
day=0;
month++;
if(month==13)
{
month=1;
year++;
shi=year/10;
ge=year%10;
write_com(0x80+0x04);
write_date(table[ge]);
write_com(0x80+0x03);
write_date(table[shi]);
}
shi=month/10;
ge=month%10;
write_com(0x80+0x07);
write_date(table[ge]);
write_com(0x80+0x06);
write_date(table[shi]);
}
shi=day/10;
ge=day%10;
write_com(0x80+0x0a);
write_date(table[ge]);
write_com(0x80+0x09);
write_date(table[shi]);
}
shi=xiao/10;
ge=xiao%10;
write_com(0x80+0x45);
write_date(table[ge]);
write_com(0x80+0x44);
write_date(table[shi]);
}
shi=fen/10;
ge=fen%10;
write_com(0x80+0x48);
write_date(table[ge]);
write_com(0x80+0x47);
write_date(table[shi]);
}
shi=miao/10;
ge=miao%10;
write_com(0x80+0x4b);
write_date(table[ge]);
write_com(0x80+0x4a);
write_date(table[shi]);
}//////////////////////////////////////////显示目前的年月日和具体时间
if(k1==0)////////////////按键K1按下
{
delay(10);
if(k1==0)
{
TR0=0;
flag++;
num1=0;
if(flag==8)flag=1;
switch(flag)
{
case1:
write_com(0x80+0x4b);write_com(0x0f);break;
case2:
write_com(0x80+0x48);write_com(0x0f);break;
case3:
write_com(0x80+0x45);write_com(0x0f);break;
case4:
write_com(0x80+0x0a);write_com(0x0f);break;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 时钟 课程设计