万年历显示课设.docx

上传人:b****7 文档编号:9305973 上传时间:2023-02-04 格式:DOCX 页数:32 大小:227.17KB
下载 相关 举报
万年历显示课设.docx_第1页
第1页 / 共32页
万年历显示课设.docx_第2页
第2页 / 共32页
万年历显示课设.docx_第3页
第3页 / 共32页
万年历显示课设.docx_第4页
第4页 / 共32页
万年历显示课设.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

万年历显示课设.docx

《万年历显示课设.docx》由会员分享,可在线阅读,更多相关《万年历显示课设.docx(32页珍藏版)》请在冰豆网上搜索。

万年历显示课设.docx

万年历显示课设

任务书

一.实现的功能。

1.用89c52单片机和时钟芯片DS12C887设计一个万年历显示

在液晶模块上。

2.可以用独立的触发式按键可以调节年、月、日、及时、分、秒信息。

二.主要元器件:

STC89C52,DS12C887,12864

 

前言

单片机技术作为计算机技术的一个分支,广泛地应用于工业控制,智能仪器仪表,机电一体化产品,家用电器等各个领域。

“单片机原理与应用”在工科院校各专业中已作为一门重要的技术基础课而普遍开设。

学生在课程设计,毕业设计,科研项目中会广泛应用到单片机知识,而且,进入社会后也会广泛接触到单片机的工程项目。

鉴于此,提高“单片机原理及应用”课的教学效果,让学生参与课程设计实习甚为重要。

单片机应用技术涉及的内容十分广泛,如何使学生在有限的时间内掌握单片机应用的基本原理及方法,是一个很有价值的教学项目。

为此,我们进行了“单片机的学习与应用”方面的课程设计,锻炼学生的动脑动手以及协作能力。

单片机课程设计是针对模拟电子技术,数字逻辑电路,电路,单片机的原理及应用课程的要求,对我们进行综合性实践训练的实践学习环节,它包括选择课设任务、软件设计,硬件设计,调试和编写课设报告等实践内容。

通过此次课程设计实现以下三个目标:

第一,让学生初步掌握单片机课程的试验、设计方法,即学生根据设计要求和性能约束,查阅文献资料,收集、分析类似的相关题目,并通过元器件的组装调试等实践环节,使最终硬件电路达到题目要求的性能指标;第二,课程设计为后续的毕业设计打好基础,毕业设计是系统的工程设计实践,而课程设计的着眼点是让学生开始从理论学习的轨道上逐渐引向实际运用,从已学过的定性分析、定量计算的方法,逐步掌握工程设计的步骤和方法,了解科学实验的程序和实施方法。

第三,培养学生勤于思考乐于动手的习惯,同时通过设计并制作单片机类产品,使学生能够自己不断地学习接受新知识(如在本课设题目中存在智能测温器件DS18B20,就是课堂环节中不曾提及的“新器件”),通过多人的合作解决现实中存在的问题,从而不断地增强学生在该方面的自信心及兴趣,也提高了学生的动手能力,对学生以后步入社会参加工作打下一定良好的实践基础。

目录

任务书………………………………………………………………………………………2

前言………………………………………………………………………………………3

目录………………………………………………………………………………………4

第一章单片机的介绍……………………………………………………………

各应用芯片的简介……………………………………………………………

第二章方案的设计与规划……………………………………………………

1.整体方案的设计与构思………………………………………………

2.硬件方案的设计与选择………………………………………………

3.软件方案的设计与选择………………………………………………

第三章调试过程………………………………………………………………………

第四章实验程序………………………………………………………………………

第五章总结与体会…………………………………………………………………

第六章致谢……………………………………………………………

附录一:

参考文献

附录二:

原器件清单

 

第一章单片机的介绍

一.单片机的简介。

单片机是一种可通过编程控制的微处理器,单片机芯片自身不能单独运用于某项工程或产品上,它必须靠外围数字器件或模拟器件的协调才可发挥其自身的强大功能。

单片机属于控制类数字芯片,目前其应用领域已非常广泛:

1.工业自动化。

如数据采集、测控技术。

2.智能仪器仪表。

如数字示波器、数字信号源、数字万用表、感应电流表等。

3.消费类电子产品。

如洗衣机、电冰箱、空调机、电视机、微波炉、IC卡、汽车电子设备等。

4.通信方面。

如调制解调器、程控交换技术、手机、小灵通等。

5.武器装备。

如飞机、军舰、坦克、航天飞机、智能武器等。

目前国内外用得最多的还是以51内核扩展出的单片机,51单片机是8位单片机,随着现代技术的发展16位,32位也已应用于各行各业。

二.课程设计的芯片简介。

本次课程设计我们用的主要元器件有:

(1)主核单片机STC89c52RC

STC89c52RC是STC公司生产的8位单片机有4KB的片内ROM、有4个8位并行I/O口、5个中断源、2个16位定时器/计数器等功能部件,共有40个管脚。

(2)时钟芯片DS12C887

DS12C887时钟芯片能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部有锂电池,外部断电后其内部时间信息还可以保持10年之久。

时间有12和24小时制,还有闹钟设置等。

(3)液晶显示12864

带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;低电压低功耗,其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。

可以显示8×4行16×16点阵的汉字.也可用于图形显示.

第二章方案的设计与规划

1.整体方案的设计与构思

先搭建好单片机的最小系统即复位电路、电源电路和晶振电路(11.0592MHz),把P0口用来和液晶12864及时钟芯片DS12C887的数据接口,为了增强P0口的驱动能力必须加一个10K的上拉排阻,液晶12864的控制口分别由P2.0~P2.2口来控制,而DS12C887得控制口则如下边的硬件所述。

因为DS12C887芯片具有自动产生世纪、年、月、日、时、分、秒等时间信息的功能所以单片机则不需要产生时间,只需把它的时间信息读过来显示在液晶上,即可完成精确的计时。

2.硬件方案的设计与选择

A.51单片机的最小系统如图

:

B.时钟芯片DS12C887管脚图

DS12C887的控制接口说明:

(1)AD0~AD7接单片机的P0.0~P0.7口。

(2)RW接P2.5口、DS接P2.6口、CS接P2.3口、

AS接P2.4口、IRQ接P3.3口、RST接VCC。

(3)MOT和Vss接地

C.液晶12864与单片机的接口

3.软件方案的设计与选择

 

第三章调试过程

高效稳定的软件程序是本次课设数字时钟运行的基础。

在本次课设中我们采用了高效时钟芯片DS12C887作为我们的计数器来产生时间,来确保时间的精准性。

我们为了方便起见,在写软件时采用了分模块的方法,来在主函数中调用这些子函数。

(1)液晶显示的调试:

12864的管脚说明:

管脚号

管脚名称

电平

管脚功能描述

1

VSS

0V

电源地

2

VCC

3.0+5V

电源正

3

V0

-

对比度(亮度)调整

4

RS(CS)

H/L

RS=“H”,表示DB7——DB0为显示数据

RS=“L”,表示DB7——DB0为显示指令数据

5

R/W(SID)

H/L

R/W=“H”,E=“H”,数据被读到DB7——DB0

R/W=“L”,E=“H→L”,DB7——DB0的数据被写到IR或DR

6

E(SCLK)

H/L

使能信号

7--14

DB0--DB7

H/L

三态数据线

15

PSB

H/L

H:

8位或4位并口方式,L:

串口方式

16

NC

-

空脚

17

/RESET

H/L

复位端,低电平有效

18

VOUT

-

空脚

19

A

VDD

背光源正端(+5V)

20

K

VSS

背光源负端

了解了12864的管脚后,还要搞清它的操作时序,因为12864具有读写两功能,而我们本次的课设则不需要读操作,所以就没看读操作时序,下图是写操作时序。

(写操作时序)

1、RS,R/W的配合选择决定控制界面的4种模式:

RS

R/W

功能说明

L

L

MPU写指令到指令暂存器(IR)

L

H

读出忙标志(BF)及地址记数器(AC)的状态

H

L

MPU写入数据到数据暂存器(DR)

H

H

MPU从数据暂存器(DR)中读出数据

2、E信号

E状态

执行动作

结果

DR——>I/O缓冲

配合R进行读数据或指令

3.指令说明

(1)、显示开/关设置

CODE:

R/W       D/I          DB7        DB6         DB5         DB4         DB3        DB2         DB1        DB0

L

L

L

L

H

H

H

H

H

H/L

功能:

设置屏幕显示开/关。

           DB0=H,开显示;DB0=L,关显示。

不影响显示RAM(DDRAM)中的内容。

(2)、设置显示起始行

CODE:

     R/W       D/I         DB7        DB6        DB5         DB4         DB3        DB2         DB1        DB0

L

L

H

H

          行地址(0~63)

功能:

执行该命令后,所设置的行将显示在屏幕的第一行。

显示起始行是由Z地址计数器控制的,该命令自动将A0-A5位地址送入Z地址计数器,起始地址可以是0-63范围内任意一行。

Z地址计数器具有循环计数功能,用于显示行扫描同步,当扫描完一行后自动加一。

(3)、设置页地址

CODE:

     R/W       D/I         DB7        DB6         DB5         DB4         DB3        DB2         DB1        DB0

L

L

H

L

H

H

H

页地址(0~7)

功能:

执行本指令后,下面的读写操作将在指定页内,直到重新设置。

(4)、设置列地址

CODE:

     R/W       D/I         DB7        DB6         DB5        DB4          DB3        DB2         DB1        DB0

L

L

L

H

          列地址(0~63)

功能:

DDRAM的列地址存储在Y地址计数器中,读写数据对列地址有影响,在对DDRAM进行读写操作后,Y地址自动加一。

(5)、写显示数据

CODE:

     R/W       D/I         DB7        DB6         DB5         DB4        DB3        DB2          DB1        DB0

L

H

D7

D6

D5

D4

D3

D2

D1

D0

功能:

写数据到DDRAM,DDRAM是存储图形显示数据的,写指令执行后Y地址计数器自动加1。

D7-D0位数据为1表示显示,数据为0表示不显示。

液晶的控制端口为:

P2^0--寄存器选择输入、P2^1--液晶读/写控制

P2^2--液晶使能控制端

首先按照操作时序对其进行了初始化设置,又设定了液晶显示的位置,写了写指令和写数据的模块,具体程序可在源程序中找到。

(2)时钟芯片DS12C887的显示:

操作时钟芯片DS12C887共需要13条信号线,也必须知道其操作时序,才能应用它的功能来计时。

由于它的时序分为Intel和Motorola总线两种时序,共用一个管脚1,当接Vcc时为Motorola模式,接地或悬空时为Intel模式。

而我们用的Intel模式。

其时序图如下图:

具体的操作我们是根据《51单片机C语言教程》(郭天祥)书中的讲解加上自己的想法和英文资料来写的。

具体程序可在源程序中看见。

(3)键盘的添加调试:

我们用了3个触发式独立按键来调节时间。

分别接P1.1—P1.3口,其中P1.1口则控制的是要调节的年、月、日、星期、时、分、秒的位置,共设置8次,首次按下在秒位置上,后面依次向上。

P1.2口则是控制加的,当选定位置之后按下P1.2一次,则在选来的基础上加2.

P1.3口则是控制减得,当选定位置之后按下P1.3一次,则在选来的基础上减2.

第四章课设源程序

/***时间显示带键盘***/

#include

#defineuintunsignedint//宏定义

#defineucharunsignedchar

#defineLCD_dataP0

sbitLCD_RS=P2^0;//寄存器选择输入

sbitLCD_RW=P2^1;//液晶读/写控制

sbitLCD_EN=P2^2;//液晶使能控制端

sbitbeep=P1^0;//蜂鸣器端口定义

sbitkey1=P1^1;//按键端口定义

sbitkey2=P1^2;

sbitkey3=P1^3;

sbitkey4=P1^4;

ucharcodedis1[]={"陕西理工学院"};

ucharcodedis2[]={"TodayIs"};

ucharcodedis3[]={"20年月日"};

ucharcodedis4[]={"时分秒"};

ucharcodedis5[]={"一二三四五六日"};

uchari;//i为固定显示的定义

ucharhour,minute,second,year,mouth,day,week;

uchars1num;//记录按键按下的次数

ucharflag;

bitflag1;//两个位变量

sbitdscs=P2^3;//DS12C887端口定义

sbitdsas=P2^4;

sbitdsrw=P2^5;

sbitdsds=P2^6;

sbitdsirq=P2^7;

voidset_time();

voiddelay(uintz)//延时函数

{

uintx,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

voidbuzzer()//蜂鸣器函数

{

beep=0;

delay(100);

beep=1;

delay(100);

}

/****写指令到LCD****/

/***RS=L,RW=L,E=高脉冲,D0-D7=指令码****/

voidwrite_cmd(ucharcmd)

{

LCD_RS=0;

LCD_RW=0;

LCD_EN=0;

P0=cmd;

delay(5);

LCD_EN=1;

delay(5);

LCD_EN=0;

}

/****写数据到LCD****/

/***RS=H,RW=L,E=高脉冲,D0-D7=数据****/

voidwrite_dat(uchardat)

{

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

P0=dat;

delay(5);

LCD_EN=1;

delay(5);

LCD_EN=0;

}

/**设定显示位置**/

voidlcd_pos(ucharX,ucharY)

{

ucharpos;

switch(X)

{

case0:

X=0x80;break;

case1:

X=0x90;break;

case2:

X=0x88;break;

case3:

X=0x98;break;

default:

break;

}

pos=X+Y;

write_cmd(pos);//显示地址

}

voidwrite_sfm(ucharadd,uchardate)

{

charshi,ge;

shi=date/10;

ge=date%10;

write_cmd(0x98+add);

write_dat(0x30+shi);

write_dat(0x30+ge);

}

voidwrite_nyr(ucharadd,chardate)

{

charshi,ge;

shi=date/10;

ge=date%10;

write_cmd(0x88+add);

write_dat(0x30+shi);

write_dat(0x30+ge);

}

voidwrite_week(charwe)

{

write_cmd(0x95);//星期显示位置

write_dat(0x20);

switch(we)

{

case0:

write_dat('S');

delay(5);

write_dat('u');

delay(5);

write_dat('n');

break;

case1:

write_dat('M');

delay(5);

write_dat('o');

delay(5);

write_dat('n');

break;

case2:

write_dat('T');

delay(5);

write_dat('u');

delay(5);

write_dat('e');

delay(5);

write_dat('s');

break;

case3:

write_dat('W');

delay(5);

write_dat('e');

delay(5);

write_dat('d');

write_dat('n');

delay(5);

write_dat('e');

delay(5);

break;

case4:

write_dat('T');

delay(5);

write_dat('h');

delay(5);

write_dat('u');

delay(5);

write_dat('r');

delay(5);

write_dat('s');

break;

case5:

write_dat('F');

delay(5);

write_dat('r');

delay(5);

write_dat('i');

break;

case6:

write_dat('S');

delay(5);

write_dat('a');

delay(5);

write_dat('t');

delay(5);

write_dat('u');

delay(5);

write_dat('r');

break;

default:

break;

}

}

/***LCD初始化设定****/

voidlcd_init()

{

//set_time();//首次初始化时间使用

/*LCD初始化*/

write_cmd(0x30);//基本指令操作

delay(5);

write_cmd(0x0c);//显示开关光

delay(5);

write_cmd(0x01);//清除LCD显示内

delay(5);

/*固定显示内容*/

lcd_pos(0,0);//设置显示位置为第一行的第一个字符

i=0;

while(dis1[i]!

='\0')

{

write_dat(dis1[i]);//显示字符

i++;

}

lcd_pos(1,0);//设置显示位置为第二行的第一个字符

i=0;

while(dis2[i]!

='\0')

{

write_dat(dis2[i]);//显示字符

i++;

}

lcd_pos(2,0);//设置显示位置为第三行的第一个字符

i=0;

while(dis3[i]!

='\0')

{

write_dat(dis3[i]);//显示字符

i++;

}

lcd_pos(3,0);//设置显示位置为第四行的第一个字符

i=0;

while(dis4[i]!

='\0')

{

write_dat(dis4[i]);

i++;

}

}

voidwrite_ds(ucharadd,uchardate)//写12C887函数

{dscs=0;//按照INTEL时序编写

dsas=1;

dsds=1;

dsrw=1;

P0=add;//写地址

dsas=0;

dsrw=0;

P0=date;

dsrw=1;

dsas=1;

dscs=1;

}

ucharread_ds(ucharadd)//读12C887函数

{//按照INTEL时序编写

uchards_date;

dscs=0;

dsrw=1;

dsds=1;

dsas=1;

P0=add;//送地址

dsas=0;

dsds=0;

P0=0xff;//读数据之前要把P0口置为高电平

ds_date=P0;

dsas=1;

dsds=1;

dscs=1;

returnds_date;

}

voidset_time()//DS12C887上电默认时间初始化

{

write_ds(0,0);

write_ds(1,0);

write_ds(2,36);

write_ds(3,0);

write_ds(4,10);

write_ds(5,0);

write_ds(6,2);

write_ds(7,28);

write_ds(8,12);

write_ds(9,10);

}

voidkeyscan()

{

if(key1==0)

{

delay(5);

if(key1==0)

{

flag=1;

s1num++;

while(!

key1)

{switch(s1num)

{

case1:

write_cmd(0x9d);//秒

write_cmd(0x0f);//光标闪烁

break;

case2:

write_cmd(0x9b);//分

break;

case3:

write_cmd(0x99);/

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

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1