课程设计doc.docx

上传人:b****2 文档编号:575198 上传时间:2023-04-29 格式:DOCX 页数:16 大小:241.58KB
下载 相关 举报
课程设计doc.docx_第1页
第1页 / 共16页
课程设计doc.docx_第2页
第2页 / 共16页
课程设计doc.docx_第3页
第3页 / 共16页
课程设计doc.docx_第4页
第4页 / 共16页
课程设计doc.docx_第5页
第5页 / 共16页
课程设计doc.docx_第6页
第6页 / 共16页
课程设计doc.docx_第7页
第7页 / 共16页
课程设计doc.docx_第8页
第8页 / 共16页
课程设计doc.docx_第9页
第9页 / 共16页
课程设计doc.docx_第10页
第10页 / 共16页
课程设计doc.docx_第11页
第11页 / 共16页
课程设计doc.docx_第12页
第12页 / 共16页
课程设计doc.docx_第13页
第13页 / 共16页
课程设计doc.docx_第14页
第14页 / 共16页
课程设计doc.docx_第15页
第15页 / 共16页
课程设计doc.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

课程设计doc.docx

《课程设计doc.docx》由会员分享,可在线阅读,更多相关《课程设计doc.docx(16页珍藏版)》请在冰点文库上搜索。

课程设计doc.docx

课程设计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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2