基于1602液晶显示的数字时钟(课程论文)Word格式.doc
- 文档编号:5220333
- 上传时间:2023-05-04
- 格式:DOC
- 页数:15
- 大小:146KB
基于1602液晶显示的数字时钟(课程论文)Word格式.doc
《基于1602液晶显示的数字时钟(课程论文)Word格式.doc》由会员分享,可在线阅读,更多相关《基于1602液晶显示的数字时钟(课程论文)Word格式.doc(15页珍藏版)》请在冰点文库上搜索。
利用对蜂鸣器的控制来实现闹钟功能。
同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过三个模块:
键盘、芯片、显示屏即可满足设计要求。
整体线路见附录一所示:
1.2、各部分功能实现
1.2.1、控制部分(AT89C52):
单片机采用52系列单片机。
由ATMEL公司生产的AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
在单芯片上,拥有灵巧的8位CPU和在线系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。
AT89S52具有以下标准功能:
8K字节Flash,256字节RAM,32位I/O口线,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
而且,它还具有一个看门狗(WDT)定时/计数器,如果程序没有正常工作,就会强制整个系统复位,还可以在程序陷入死循环的时候,让单片机复位而不用整个系统断电,从而保护你的硬件电路。
单片机最小系统:
单片机最小系统主要由复位电路,晶振电路,电源等几部分组成。
1)复位电路:
图1复位电路
复位电路有两种方式:
上电复位和按钮复位,我们主要用按钮复位方式。
如图1所示:
2)晶振电路:
晶振电路如图2所示:
图2晶振模块原理图
选取原则:
电容选取22pF,晶振为12MHz。
3)电源:
AT89S52单片机的供电电源是5V的直流电。
4)EA非/Vpp脚:
我们没有用外部扩展ROM,因此EA非/Vpp为高电平,即接+5V电源。
1.2.2、键盘控制系统设计:
按键需要4个,分别实现为时间调整、时间的加、时间的减、闹钟调整四个功能。
用单片机的4个I/O口接收控制信号,其电路如图3所示:
图3按键调时电路
通过控制键来控制所要调节的是时、分、还是秒。
在控制键按下后LCD中会在相应的位置出现光标,这时在通过加数键或减数键来控制时分秒的加或减。
在调闹钟键按下后LCD中也会在相应的位置出现光标,这时也通过加数键或减数键来设置闹钟。
1.2.3、1602液晶屏的显示电路
1.2.3.1、1602液晶屏的介绍:
液晶显示器简称是利用液晶经过处理后能够改变光线传输方向的特性,达到显示字符或者图形的目的。
其特点是体积小、重量轻、功耗极低、显示内容丰富等特点,在单片机应用系统中有着日益广泛的应用。
1602芯片:
主要用于显示时间和定时时间。
1602芯片由点阵字符液晶显示器件和专用的行、列驱动器、控制及必要的链接件、结构件组装而成,可以显示数字和西文字符,但不能显示图形,已经可以满足本次设计的需要。
1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。
1.2.3.2、显示电路:
显示电路图如图4所示:
图4显示电路图
1.2.4、闹钟部分:
闹钟部分主要由蜂鸣器,三极管,电阻组成。
其电路图如图5所示:
图5闹钟电路
当单片机的P1^5接口输出为高电平时,蜂鸣器响,当输出为低电平时,蜂鸣器停止。
2、软件编程
程序主要分为两个部分,即液晶显示部分和控制按键部分。
由于本设计采用的是用按键分别控制,可以在主函数中调用一个键盘扫描的函数,当相应的不同按键按下后通过控制单片机P2的输出,从而控制液晶的显示。
源程序见附录二所示:
编程思路:
在确定了时钟要实现的功能后按照上述各按键所实现的效果编写程序。
本程序包含液晶写指令函数(write-com())、写数据函数(write-data())、初始化函数(init())、写入时分秒函数(write-sfm())和键盘扫描函数,这些程序围绕主函数相互调用。
3、总结与体会
在本次设计的过程中,我发现很多的问题,同时也让我认识到单片机课程设计重点就在于软件算法的设计,需要有很巧妙的程序算法。
从这次的课程设计中,我真真正正意识到,在写程序时,逻辑思维要清晰,要有耐心。
在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单片机更是如此,程序只有经常写和读才能提高,这就是我在这次设计中的最大收获。
参考文献:
[1].李光才.单片机课程设计实例指导[M].北京:
北京航空航天大学出版社2004.
[2]朱定华.单片机原理及接口技术实验[M].北京:
北方交通大学出版社2002.11
[3]刘湘涛.江世明.单片机原理与应用[M].北京:
电子工业出版社,2006.
[4]何立民.单片机应用系统设计[M].北京:
北京航空航天大学出版社,1993.
[5]楼然笛.单片机开发[M].北京:
人民邮电出版社,1994.
[6]付家才.单片机控制工程实践技术[M].北京:
化学工业出版社2004.3.
附录一:
图6数字时钟的整体线路
附录二:
#include<
reg52.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitbeep=P1^5;
//定义蜂鸣器的io口
sbitrw=P2^1;
//定义读写的io口
sbitrs=P2^0;
//定义接收与发送指令的io口
sbitlcden=P2^2;
//定义使能端的io口
sbitk1=P3^0;
//定义调时键的io口
sbitk2=P3^1;
//定义加数键的io口
sbitk3=P3^2;
//定义减数键的io口
sbitk4=P3^3;
//定义调闹钟键的io口
ucharcount,count1,num,num1,num2;
charh,min,sec,h1,min1,sec1;
uchartable[]={"
23:
59:
57"
};
uchartable1[]={"
00:
00:
00"
voiddelay(uintms) //延时程序
{
inti;
while(ms--)
{
for(i=0;
i<
250;
i++)
{
_nop_();
}
}
}
delay1(ucharz)//延时程序
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
bitwrite_busy()//判断是否为繁忙状态
{
bitresult;
rs=0;
rw=1;
lcden=1;
_nop_();
result=(bit)(P0&
0x80);
lcden=0;
returnresult;
}
voidwrite_com(ucharcom)//写指令函数
{
while(write_busy());
rs=0;
rw=0;
lcden=0;
P0=com;
lcden=1;
voidwrite_data(uchardate)//写数据函数
{
while(write_busy());
rs=1;
P0=date;
voidwrite_pos(ucharpos)//设定地址
{
write_com(pos|0x80);
//数据指针=80+地址变量
voidwrite_sfm(ucharadd,uchardate)//设定时分秒及其显示与地址
uintshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_data(0x30+shi);
write_data(0x30+ge);
voidwrite_sfm1(ucharadd,uchardate)//设置闹钟时分秒及其显示与地址
write_com(0x80+add);
voidkeyscan()//键盘扫描
{
if(k1==0)
{
delay1(5);
if(k1==0)
{
while(!
k1);
num++;
if(num==1)
{
TR0=0;
write_com(0x80+0x40+11);
write_com(0x0f);
}
if(num==2)
{
write_com(0x80+0x40+8);
}
if(num==3)
write_com(0x80+0x40+5);
if(num==4)
num=0;
write_com(0x0c);
TR0=1;
}
}
}
if(num!
=0)
if(k2==0)
delay1(5);
if(k2==0)
{
while(!
k2)
if(num==1)
{
sec++;
if(sec==60)
sec=0;
write_sfm(10,sec);
write_com(0x80+0x40+0x10);
}
if(num==2)
{
min++;
if(min==60)
min=0;
write_sfm(7,min);
write_com(0x80+0x40+8);
}
if(num==3)
h++;
if(h==24)
h=0;
write_sfm(4,h);
write_com(0x80+0x40+5);
}
}
if(k3==0)
{
delay1(5);
if(k3==0)
{
while(!
k3);
if(num==1)
{
sec--;
if(sec==-1)
sec=59;
write_sfm(10,sec);
if(num==2)
{
min--;
if(min==-1)
min=59;
write_sfm(7,min);
write_com(0x80+0x40+8);
}
if(num==3)
h--;
if(h==-1)
h=23;
write_sfm(4,h);
write_com(0x80+0x40+5);
}
}
if(k4==0)
{
if(k4==0)
k4);
num1++;
if(num1==1)
{
write_sfm1(10,sec1);
write_sfm1(7,min1);
write_sfm1(4,h1);
}
if(num1==2)
{
write_com(0x80+11);
write_com(0x0f);
}
if(num1==3)
write_com(0x80+8);
if(num1==4)
write_com(0x80+5);
if(num1==5)
num1=0;
write_com(0x0c);
write_sfm(7,min);
write_sfm(4,h);
}
}
}
if(num1!
{
if(k2==0)
{
delay1(5);
if(k2==0)
{
while(!
if(num1==2)
{
sec1++;
if(sec1==60)
sec1=0;
write_sfm1(10,sec1);
write_com(0x80+0x10);
}
if(num1==3)
{
min1++;
if(min1==60)
min1=0;
write_sfm1(7,min1);
write_com(0x80+8);
}
if(num1==4)
h1++;
if(h1==24)
h1=0;
write_sfm1(4,h1);
write_com(0x80+5);
}
if(k3==0)
{
delay1(5);
if(k3==0)
{
while(!
if(num1==2)
{
sec1--;
if(sec1==-1)
sec1=59;
write_sfm1(10,sec1);
if(num1==3)
{
min1--;
if(min1==-1)
write_sfm1(7,min1);
write_com(0x80+8);
}
if(num1==4)
h1--;
if(h1==-1)
h1=23;
write_sfm1(4,h1);
write_com(0x80+5);
}
}
voidinit()//程序初始化函数
uinti;
h=23;
min=59;
sec=57;
h1=00;
min1=00;
sec1=00;
num=0;
write_com(0x38);
delay
(1);
write_com(0x0c);
//显示开,关光标
write_com(0x06);
//移动光标
write_com(0x01);
//清除LCD的显示内容
i=0;
while(table1[i]!
='
\0'
)//显示闹钟(静态)
write_data(table1[i]);
i++;
write_pos(0x40);
while(table[i]!
)//显示时间(静态)
write_data(table[i]);
TMOD=0x01;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 1602 液晶显示 数字 时钟 课程 论文
![提示](https://static.bingdoc.com/images/bang_tan.gif)