lcd显示的秒表单片机课程设计.docx
- 文档编号:480617
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:41
- 大小:365.35KB
lcd显示的秒表单片机课程设计.docx
《lcd显示的秒表单片机课程设计.docx》由会员分享,可在线阅读,更多相关《lcd显示的秒表单片机课程设计.docx(41页珍藏版)》请在冰点文库上搜索。
lcd显示的秒表单片机课程设计
单片机课程设计
题目:
1602LCD显示的秒表
系别/班级:
信息工程系11级嵌入式技术与应用专业
小组成员:
王玉瑶吴秋云
吴颖盈项念念
小组成员学号:
110407115110407215
110407116110407216
指导老师:
万振宇老师
1单片机原理…………………………………………………3
2课程设计的任务与要求……………………………………3
3课程设计目的………………………………………………4
4芯片资料……………………………………………………5
4.1AT89C51……………………………………………5
4.21602LCD……………………………………………8
5电路分析…………………………………………………16
6代码分析…………………………………………………21
7设计分析…………………………………………………29
8调试成功与否……………………………………………31
9参考文献…………………………………………………36
10附录
1602LCD秒表的显示源代码………………………37
1602LCD秒表的显示原理图………………………43
一、单片机原理
单片机控制秒表是集于单片机技术、模拟电子技术、数字技术为一体的机电一体化高科技产品,具有功耗低,安全性高,使用方便等优点。
它是一种在线式实时控制计算机,需要有较强的抗干扰能力,较低的成本。
本次设计内容为以8051单片机为核心的秒表,采用数码管显示,单片机技术控制。
利用单片机的定时器/计数器定时和技术的原理,用集成电路芯片、LCD数码管以及按键来设计计时器。
将软、硬件有机地结合起来,使它拥有正确的计时、暂停、清零、并同时可以用数码管显示,在现实生活中应用广泛。
2、课程设计的任务与要求
设计任务:
利用AT89C51单片机结合1602LCD显示器设计一个秒表
设计要求:
1.本设计实现一个1602LCD显示秒表
2.利用AT89C51控制整个电路来实现秒表的显示。
大体上可以讲1602LCD秒表的显示主要包括硬件和软件两部分。
重点就是各部分硬件的连接设计以及程序的编写。
本章讲述的就是系统硬件的设计,其中包括各模块的器件选择和电路设计。
三、课程设计目的
《MCS-51单片机原理及应用》课的课程设计是四个学生一组完成一个老师给的一个题目,叫1602LCD显示的秒表。
为了让我们能够综合运用自己学的课程的基本知识,能够进行单片机的应用,掌握单片机程序设计调试和应用电路设计、分析及调试检测。
通过这个实验:
1.、使我们增进对单片机知识的进一步认识,也同时加深对单片机理论知识的理解。
2、使我们掌握单片机的内部功能模块的应用,
3、使我们了解和掌握单片机应用系统的软硬件设计过程,方法即实现,为了以后设计和实现单片机应用系统打下基础。
4、芯片资料
4、1AT89C51
AT89C51是128字节内部RAM,4KB可编程Flash存储器(可擦写1000次),三级程序存储器保密,静态工作频率:
0Hz-24MHz,2个16位定时/计数器,一个串行通讯口,6个中断源,32条I/O引线,有片内时种振荡器。
输入输出引脚资料:
(1)P0端口[P0.0-P0.7]P0是一个8位漏极开路型双向I/O端口,端口置1(对端口写1)时作高阻抗输入端。
作为输出口时能驱动8个TTL。
在访问外部程序和外部数据存储器时,P0口是分时转换的地址(低8位)/数据总线,访问期间内部的上拉电阻起作用。
(2)P1端口[P1.0-P1.7]P1是一个带有内部上拉电阻的8位双向I/0端口。
输出时可驱动4个TTL。
端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
(3)P2端口[P2.0-P2.7]P2是一个带有内部上拉电阻的8位双向I/0端口。
输出时可驱动4个TTL。
端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。
而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。
(4)P3端口[P3.0-P3.7]P2是一个带有内部上拉电阻的8位双向I/0端口。
输出时可驱动4个TTL。
端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
其它控制或复用引脚:
(1)ALE/PROG30访问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的低位字节。
即使不访问外部存储器,ALE端仍以不变的频率输出脉冲信号(此频率是振荡器频率的1/6)。
在访问外部数据存储器时,出现一个ALE脉冲。
(2)PSEN29该引是外部程序存储器的选通信号输出端。
当AT89C51由外部程序存储器取指令或常数时,每个机器周期输出2个脉冲即两次有效。
但访问外部数据存储器时,将不会有脉冲输出。
(3)EA/Vpp31外部访问允许端。
当该引脚访问外部程序存储器时,应输入低电平。
要使AT89C51只访问外部程序存储器(地址为0000H-FFFFH),这时该引脚必须保持低电平。
AT89C51特殊功能寄存器列表(适用于同一架构的芯片)
符 号
地 址
注 释
*ACC
E0H
累加器
*B
F0H
乘法寄存器
*PSW
D0H
程序状态字
SP
81H
堆栈指针
DPL
82H
数据存储器指针低8位
DPH
83H
数据存储器指针高8位
*IE
A8H
中断允许控制器
*IP
D8H
中断优先控制器
*P0
80H
端口0
*P1
90H
端口1
*P2
A0H
端口2
*P3
B0H
端口3
PCON
87H
电源控制及波特率选择
*SCON
98H
串行口控制器
SBUF
99H
串行数据缓冲器
*TCON
88H
定时器控制
TMOD
89H
定时器方式选择
TL0
8AH
定时器0低8位
TL1
8BH
定时器1低8位
TH0
8CH
定时器0低8位
TH1
8DH
定时器1高8位
带*号的特殊功能寄存器都是可以位寻址的寄存器
4.11602LCD
1602字符型LCD简介:
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780.
1602LCD主要技术参数:
显示容量:
16×2个字符
芯片工作电压:
4.5—5.5V
工作电流:
2.0mA(5.0V)
模块最佳工作电压:
5.0V
字符尺寸:
2.95×4.35(W×H)mm
引脚功能说明:
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下表1所示:
编号
符号
引脚说明
编号
符号
引脚说明
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:
引脚接口说明
第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条控制指令,如下表2所示:
序号
指令
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
读出的数据内容
表2:
控制命令表
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相兼容的芯片时序下表3如下:
读状态
输入
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=高脉冲
输出
无
表3:
基本操作时序表
读写操作时序如图2和3所示:
图2读操作时序
图3写操作时序
1602LCD的RAM地址映射及标准字库表:
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
要显示字符时要先输入显示字符地址,图4是1602的内部显示地址。
图41602LCD内部显示地址
例如第二行第一个字符的地址是40H,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。
每次输入指令前都要判断液晶模块是否处于忙的状态。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图5所示,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码
图5字符代码与图形对应图
1602LCD的一般初始化(复位)过程:
延时15mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:
显示模式设置
写指令08H:
显示关闭
写指令01H:
显示清屏
写指令06H:
显示光标移动设置
写指令0CH:
显示开及光标设置
五、电路分析
总体设计分析
本系统中,硬件电路主要有电源电路,晶振电路,复位电路,显示电路以及一些按键电路等,本系统采用AT89C51单片机为中心器件,利用定时器计数器定时和记数的原理,结合硬件电路如电源电路,晶振电路,复位电路,显示电路,蜂鸣器电路以及一些按键电路等来设计计数器,将软、硬件有机地结合起来。
硬件系统采用PROTEUS功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。
5.1电源电路
电源电路是系统最基本的部分,任何电路都离不开电源部分,
随着半导体工艺的发展,稳压电路也采用集成电路器件来制成。
可采用独立的稳压电源。
这种供电方式的优点是稳压可靠,且有各种成熟电路可供选择。
由集成稳压器具有体积小,外界线路简单,使用方便,工作可靠等优点。
因此,在各种电子设备中应用十分普遍,为了跟上时代的发展,可采用W7800系列三端稳压器,主要利用它的输出电压是固定的在使用中不能进行调整等优点。
5.2晶振电路
AT89C51内部的振荡电路是一个高增益反相放大器,引脚RXD和TXD分别是此反向振荡放大器的输入端和输出端。
该反向放大器可以配置为内部方式的片内振荡器。
如图所示,这里选用12MHE的内部振荡方式,电路如下:
电容器C1,C2起稳定振荡频率,快速起振的作用,C1,C2可在20~100PF之间取,这里取30PF,接线时要使晶振振荡器尽可能接近单片机。
5.3复位电路
采用上电+按键复位电路,上电后,由于电容充电,使RST持续一段时间高电平时间。
当单片机已在运行之中时,按下复位按键也能使RST持续一段时间的高电平,从而实现上电加开关复位的操作。
这不仅能时单片机复位,而且还能使单片机的外围芯片也同时复位,当程序出现错误时,可以随时使电路复位。
复位是单片机的初始化操作。
其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。
除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态时,为摆脱困境,也需按复位键重新启动。
除PC之外,复位操作还对其他一些寄存器有影响,它们的复位状态如表1所示。
寄存器
复位状态
寄存器
复位状态
PC
0000H
TCON
00H
ACC
00H
TL0
00H
PSW
00H
TH0
00H
SP
07H
TL1
00H
DPTR
0000H
TH1
00H
P0-P3
FFH
SCON
00H
IP
XX000000B
SBUF
不定
IE
0X000000B
PCON
0XXX0000B
TMOD
00H
表1一些寄存器的复位状态
因STC89C52单片机需高电平(3.7~5.5V)复位,且复位时流入单片机的电流不能超过10mA。
具体参数:
根据所需要的复位参数可得当按下SW键时出现两个机器周期的高电平在单片机REST端产生的压降等于:
=
图复位电路
5.4显示电路
显示电路既可以选用液晶显示器,也可以选用数码管显示,我们采用液晶显示电路
1602LCD引脚接口说明
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
DataI/O
2
VDD
电源正极
10
D3
DataI/O
3
VL
液晶显示偏压信号
11
D4
DataI/O
4
RS
数据命令选择端口(H/L)
12
D5
DataI/O
5
R/W
读/写选择端(H/L)
13
D6
DataI/O
6
E
使能信号
14
D7
DataI/O
7
D1
DataI/O
15
BLA
背光源正极
8
D1
DataI/O
16
BLK
背光源负极
显示电路部分引脚分析:
3脚:
VL,液晶显示偏压信号,用于调整LCD1602的显示对比度,一般会外接电位器用以调整偏压信号,此脚电压为0时可以得到最强的对比度。
4脚:
RS,数据/命令选择端,当此脚为高电平时,可以对1602进行数据字节的传输操作,而为低电平时,则是进行命令字节的传输操作。
命令字节,即是用来对LCD1602的一些工作方式作设置的字节;数据字节,即使用以在1602上显示字节。
5脚:
R/W,读写选择端。
当此脚为高电平可对LCD1602进行读数据操作,反之进
行写数据操作。
6脚:
E,使能信号,其实是LCD1602的数据控制时钟信号,利用该信号的上升沿实现对LCD1602的数据传输。
7~14脚:
8位并行数据口,使得对LCD1602的数据读写大为方便。
基本操作时序:
(1)读状态:
输入:
RS=L,RW=H,E=H;输出:
D0~D7=状态字
(2)写指令:
输入:
RS=L,RW=L,D0~D7=指令码,E=高脉冲;输出:
无
(3)读数据:
输入:
RS=H,RW=H,E=H;输出:
D0~D7=数据
(4)写数据:
输入:
RS=H,RW=L,D0~D7=数据,E=高脉冲;输出:
无
需要两个写时序:
①当我们要写指令字,设置LCD1602的工作方式时:
需要把RS置为低电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。
②当我们要写入数据字,在1602上实现显示时:
需要把RS置为高电平,RW置为低电平,然后将数据送到数据口D0~D7,最后E引脚一个高脉冲将数据写入。
6、代码分析
#include
crol(),cror()。
#defineucharunsignedchar,#defineuintunsignedint,definedelayNOP(){nop();nop();nop()}皆属于宏定义,后者是将三个延时周期定义在一起,用一个delayNOP()表示。
VoidLCD_intialize,voidLCD_Set_POS(uchar),voidDisplay_String(char*,char);皆为调用函数,第一个是调用LCD初始化函数;第二个是调用LCD的显示位置函数;第三个是调用LCD写数据函数;第四个是调用LCD指定行上显示字符串函数。
SbitK1=P1^0,sbitK2=P2^1,sbitBEEP=3^0,sbitLCD_RS=P2^0,sbitLCD_RW=P2^1,sbitLCD_EN=P2^2;皆为个函数接口声明,定义K1、K2为两个控制开关;定义BEEP为扬声器接口;RS为寄存器选择高电平
(1)时选择数据寄存器、低电平(0)时选择指令寄存器;RS为读写信号,高电平
(1)时惊醒读操作,低电平(0)时进行写操作;E(或EN)端为使能端(enable),将单片机与LCD1602显示器连接。
UcharKeyCount=0;KeyCount为按键计数变量,用于累计按键的次数。
定义其为无符号整型,并且付初值为0.
ucharcodemsg1[]={"SecondWatch0"},ucharcodemsg2[]={">>>>"};定义两个一维数组,在protues仿真软件中,当按下play键后,1602LCD显示屏是会出现这两个数组中的字符。
ucharcodePrompts[][16]=
{
{":
:
1---->"},
{":
:
2---->:
:
2"},
{":
:
1->2:
:
3-->"},
{":
:
1->2:
:
3-->4"}
}
定义一个二维数组,将其中的一维显示于1602LCD上。
K1为启停控制按钮,第一次按下时开始计数,显示“:
:
1--”;当第二次按下时停止计数,显示":
:
2---->:
:
2";……
ucharTime_Buffer[]={0,0,0,0},ucharLCD_Display_Buffer[]={"00:
00:
00:
00"};定义两个数组,一个用于计时缓冲,一个用于显示时间缓冲。
voidBeeP()
{
uchari,j=70;
for(i=0;i<180;i++)
{
while(--j);BEEP=~BEEP;
}
BEEP=0;
}定义一个调用蜂鸣器的子函数。
For(i=0;i<180;i++)用于控制蜂鸣器响的时间,BEEP=~BEEP用于使蜂鸣器进行短暂的响一下又不响的效果。
因为蜂鸣器接地,只有当P3.0接入高电平(即1)时,蜂鸣器才工作。
所以在响了一声过后,级(执行完成之后)将BEEP赋值为0,让它处于不导通状态,蜂鸣器不响。
voidDelayX(uintms)
{
uchari;
while(ms--)for(i=0;i<120;i++);
}定义一个延时子函数
voidShow_Second()
{
uchari;
LCD_Set_POS(0X45);设置LCD显示起点
for(i=3;i!
=0xff;i--)
{
将两位整数的1、100s,秒,分,时转换为8位数字字符
LCD_Display_Buffer[2*i+1]=Time_Buffer[i]/10+'0';
LCD_Display_Buffer[2*i]=Time_Buffer[i]%10+'0';
在i=3,2,1,0时分别显示时,分,秒,1/100s
LCD_Write_Data(LCD_Display_Buffer[2*i+1]);
LCD_Write_Data(LCD_Display_Buffer[2*i]);
LCD_Write_Data(':
');
}定义显示计时函数
}LCD_Set_POS(0X45),调用函数,用于调用设置显示位置函数,在此子函数中又嵌套了一个函数调用,LCD_Write_Command(Position|0X80)(即LCD_Write_Command(0X45|0X80))函数。
进行或操作:
45
0
1
0
0
0
1
0
1
80
1
0
0
0
0
0
0
0
C5
1
1
0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- lcd 显示 秒表 单片机 课程设计