课程设计doc.docx
- 文档编号:20355959
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:16
- 大小:241.58KB
课程设计doc.docx
《课程设计doc.docx》由会员分享,可在线阅读,更多相关《课程设计doc.docx(16页珍藏版)》请在冰豆网上搜索。
课程设计doc
基于单片机的LCD1602液晶电子时钟
王铭
(电子123学号2012131016)
摘要:
随着单片机技术的飞速发展,在其推动下,现代的电子产品几乎渗透到了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高。
时间就是金钱、时间就是生命、时间就是胜利……,准确的掌握时间和分配时间对人们来说至关重要,时钟是我们生活中必不可少的工具。
电子钟的设计方法有很多种,但是基于单片机并通过LCD显示的电子时钟具有编程灵活、精确度高、便于携带、显示直观等特点。
利用AT89C51单片机控制,通过1602字符液晶显示实时时钟信息,这样便构成了一个单片机电子时钟。
关键字:
AT89S52单片机、LCD1602液晶显示器,按键,调时,校准。
1 引言
时间,对人们来说是非常宝贵的,准确的掌握时间和分配时间对人们来说至关重要。
因此自从时钟发明的那刻起,就成为人类的好朋友。
随着时间的流逝,科学技术的不断发展和提高,人们对时间计量的精度要求越来越高,应用越来越广。
怎样让时钟更好、更方便、更精确的显示时间,这就要求人们不断设计研发出新型的时钟。
高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校。
数字式电子钟用集成电路计时时,译码代替机械式传动,用LCD显示器代替指针进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。
在单片机的应用系统中,时钟有两个方面的含义:
一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:
一是用软件实现,即用单片机内部的可编程定时器/计数器来实现;二是用专门的时钟芯片实现。
2总体架构
按照系统的设计功能要求,本时钟系统的设计必须采用单片机软件系统实现,用单片机的自动控制能力配合按键控制,来控制时钟的调整及显示。
在本系统的电路设计方框图如图一所示,它由三部分组成:
①控制部分主芯片采用单片机AT89S52;
②显示部分采用液晶显示器实现时钟显示;
③时钟调节部分使用按键来控制;
图一:
系统总原理图
3.系统设计
3.1单片机控制系统
本次设计时钟电路,使用了ATC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用键盘键上的按键来调整时钟的时、分、秒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过三个模块:
键盘、芯片、显示屏即可满足设计要求。
3.2.各部分功能实现
3.2.1.控制部分(AT89C51)
AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
单片机最小系统
单片机最小系统主要由复位电路,晶振电路,电源等几部分组成。
图二:
最小系统电路
3.2.2键盘控制系统设计
按键需要4个,分别实现为时间调整、小时的加、分钟的减、退出四个功能。
用单片机的4个I/O口接收控制信号,其电路如图。
图三:
键盘控制图
3.2.3.显示电路。
图四:
显示电路图
1602液晶概述
工业字符型液晶,1602是指显示的内容为16*2,能同时显示两行,每行16个字符。
常见的1602字符液晶有两种,一种显示绿色背光黑色字体,另一种显示蓝色背光白色字体,目前市面上绝大多数基于HD44780液晶芯片控制,原理是完全相同的。
本课题所用1602液晶模块,显示屏是蓝色背光白色字体。
图五:
1602图
1602引脚介绍
编号
符号
引脚说明
编号
符号
引脚说明
1
GND
电源地
2
VCC
电源正极
3
VO
液晶显示对比度调节端
4
RS
数据/命令选择端
5
R/W
读写选择
6
E
使能信号
7
D0
数据口
8
D1
数据口
9
D2
数据口
10
D3
数据口
11
D4
数据口
12
D5
数据口
13
D6
数据口
14
D7
数据口
15
BLA
背光电源正
16
BLK
背光电源负
1602字符液晶引脚说明
各个引脚具体功能说明:
第1脚:
GND为地电源。
第2脚:
VCC接5V正电源。
第3脚:
VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生重影,使用一个1K的电位器调整对比度。
第4脚:
RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。
第5脚:
R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
第6脚:
E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:
DB0~DB7为8位双向数据线。
第15~16脚:
背光灯电源。
1602字符液晶使用方法
操作
输入
输出
读状态
RS=L,RW=H,E=H
D0~D7=状态字
写指令
RS=L,RW=L,D0~D7=指令码,E=高脉冲
无
读数据
RS=H,RW=H,E=H
D0~D7=数据
写数据
RS=H,RW=L,D0~D7=数据,E=高脉冲
无
4.软件设计
4.1软件主要要完成的功能
(1)显示时间程序
用软件调节时间,通过程序的调节,最后用LCD现实时钟
(2)调节时间程序
按键调节时间,能实现时、分的调节
4.2软件设计的主要流程
(1)系统总的流程
主要功能是负责时间的显示,通过写地址和写数据来实现时间的调节和控制,最后通过调用显示子程序显示出来
(2)时间控制程序
时间控制程序,用中断准确的控制时间,采用60进制,60秒为一分钟,60分钟为一个小时,全天设置为24小时。
程序流程图如图:
.
图六:
程序流程图
程序用C语言编写,代码见附录,编程时采用KEILC,而仿真用PROTUES,仿真时仿真图如图。
图七:
PROTUES仿真图
图八:
实物图
5小结
众所周知,单片机是电子信息工程专业的一们重要的课程,也是当今电子行业的重要分支之一,应用范围之广,普遍程度之高大家有目共睹,所以学好单片机对于电子信息工程专业的学生来说至关重要,甚至直接关系到日后的就业。
正因为这重要性才需要我们去实践,去锻炼。
在此次课程设计中,在最初的写程序及设计时遇到了一些困难。
因为一开始课堂上接触的是汇编语句,但汇编语句不易读懂,所以难以下手。
后来经过上网了解知道有郭天翔老师的“十天学会单片机”,下载来认真看了后大有所得,也因为之前的C基础,比较容易上手,所以最后程序是用C程序编写。
这样来不仅进一步增强了自己对单片机的兴趣,也让自己对单片机的认识又有新的提高。
在经过后面的查阅,知道单片机深入我们生活的方方面又让我“一定要学好单片机”的念头更深了。
虽然此次的选题难度并不大,但是就是这样一个简单的题目却让我明白“纸上得来终觉浅”的深刻意义。
经过一次次的修改程序和软件调试,使我了解了KEILC和PROTUES软件的使用,为日后自己主动地去设计一些东西打下了基础。
在设计硬件部分时,动手能力的确得加强,很感谢同学的无私帮忙和耐心协助才得以电路板一次成功,让我明白合作总比一个人无谓的单干要好的多。
当然在此期间也出现了不少问题,如:
1.在写程序的时候,中断的灵活使用掌握不是很好;2.焊电路板时一开始没有焊接液晶1602的调背光电阻,使得显示效果不是很好。
但这些问题最后都迎刃而解,让我知道查阅资料的重要性。
通过此次课程设计,我们懂得不管做什么事都要有恒心,只要坚持一切都会会实现的。
让我了解了1602的基本知识和使用方法,激发了强烈的兴趣,也重新让我温习了下WORD的使用。
感谢老师的教导,感谢同学的帮助。
参考文献
[1]陈权昌,李兴富.单片机原理及应用.广州:
华南理工大学出版社,2007.8
[2]李庆亮.C语言程序设计实用教程.北京:
机械工业出版社,2005.3
[3]王艳春现代通信综合实验教程哈尔滨工业大学出版社2011.7
[4]刘宁.单片机多功能时钟的设计.浙江:
浙江海洋学院,2009.
[5]汪文,陈林.单片机原理及应用.湖北:
华中科技大学出版社,2007.
[6]康华光.电子技术基础数字部分.北京:
高等教育出版社,2008.
[7]杨欣.电子设计从零开始.北京:
清华大学出版社,2005.
[8]唐勇.基于单片机的电子钟的设计.湖南:
湖南工学院,2007.
附录
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineKEY_IOP3
//#defineLCD_IOP0
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
sbitSPK=P1^2;
sbitLED=P2^4;
bitnew_s,modify=0;
chart0,sec=50,min=59,hour=23;
charcodeLCD_line1[]="DesignedbyZELD";
charcodeLCD_line2[]="Timer:
00:
00:
00";
charTimer_buf[]="23:
59:
50";
//---------------------------------------------------
voiddelay(uintz)
{
intx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//---------------------------------------------------
/*voidW_LCD_Com(ucharcom)//写指令
{
LCD_RS=0;P0=com;//LCD_RS和R/W都为低电平时,写入指令LCD_EN=1;delay(5);LCD_EN=0;//用EN输入一个高脉冲
}//************************/
voidW_LCD_Com(ucharcom)
{
LCD_RS=0;
P0=com;//P1
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//---------------------------------------------------
/*voidW_LCD_Dat(uchardat)//写数据
{
LCD_RS=1;P0=daLCD_ENt;//LCD_RS为高、R/W为低时,写入数据LCD_EN=1;delay(5);LCD_EN=0;//用EN输入一个高脉冲
}*/
voidW_LCD_Dat(uchardat)
{
LCD_RS=1;
P0=dat;
delay(5);
LCD_EN=1;
delay(5);
LCD_EN=0;
}
//---------------------------------------------------
voidW_LCD_STR(uchar*s)//写字符串
{
while(*s)W_LCD_Dat(*s++);}//---------------------------------------------------
voidW_BUFF(void)//填写显示缓冲区
{
Timer_buf[7]=sec%10+48;Timer_buf[6]=sec/10+48;Timer_buf[4]=min%10+48;Timer_buf[3]=min/10+48;Timer_buf[1]=hour%10+48;Timer_buf[0]=hour/10+48;W_LCD_Com(0xc0+7);W_LCD_STR(Timer_buf);
}
//---------------------------------------------------
ucharread_key(void)
{
ucharx1,x2;
KEY_IO=255;
x1=KEY_IO;
if(x1!
=255){
delay(100);
x2=KEY_IO;
if(x1!
=x2)return255;
while(x2!
=255)x2=KEY_IO;
if(x1==0x7f)return0;
elseif(x1==0xbf)return1;
elseif(x1==0xdf)return2;
elseif(x1==0xef)return3;
elseif(x1==0xf7)return4;
}
return255;
}
//---------------------------------------------------
voidInit()
{
LCD_RW=0;
W_LCD_Com(0x38);delay(50);
W_LCD_Com(0x0c);
W_LCD_Com(0x06);
W_LCD_Com(0x01);
W_LCD_Com(0x80);
W_LCD_STR(LCD_line1);
W_LCD_Com(0xC0);
W_LCD_STR(LCD_line2);
TMOD=0x01;//T0定时方式1
TH0=0x4c;
TR0=1;//启动T0
PT0=1;//高优先级,以保证定时精度
ET0=1;
EA=1;
}
//---------------------------------------------------
voidmain()
{
uinti,j;
ucharKey;
Init();
while
(1){
//-------------------------------
if(new_s){//如果出现了新的一秒,修改时间
new_s=0;sec++;sec%=60;
if(!
sec){min++;min%=60;
if(!
min){hour++;hour%=24;}
}
W_BUFF();//写显示
//-------------------------------
if(!
sec&&!
min){//整点报时
for(i=0;i<200;i++){
SPK=0;for(j=0;j<100;j++);
SPK=1;for(j=0;j<100;j++);
}}
}
//-------------------------------
Key=read_key();//读出按键
switch(Key){//分别处理四个按键
case0:
modify=1;break;
case1:
if(modify){min++;min%=60;W_BUFF();break;}
case2:
if(modify){hour++;hour%=24;W_BUFF();break;}case3:
modify=0;break;
}}
}
//---------------------------------------------------
voidtimer0(void)interrupt1//T0中断函数,50ms执行一次
{
TH0=0x4c;
t0++;t0%=20;//20,一秒钟
if(t0==0){new_s=1;LED=~LED;}
if(modify)LED=0;
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 doc