单片机课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
--1602LCD显示电话拨号键盘按键
琼州学院电子信息工程学院
课程设计报告
课程名称: 单片机课程设计
设计题目:1602LCD显示电话拨号键盘按键
专 业: 通信工程
班 级: 2010级1班
学生姓名: ***
学 号:
起止日期: 2013年4月,2013年6月
指导教师:
指导教师评语: 最终成绩: 指导教师签名: 年 月 日 成项 目 权 重 成 绩 绩1、设计过程中的学习态度 0.2 评2、课程设计的质量及答辩 0.5 定 3、设计报告书规范程度 0.3
4、总成绩
目 录
1.设计目的 ..................................................... 2 2.设计要求 ..................................................... 2 3.设计
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
..................................................... 2
3.1单片机最小系统 ........................................... 2
3.2输入按键系统 ............................................. 3
3.3 1602LCD显示系统......................................... 3
3.4设计原理图 ............................................... 6 4.
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
与编程 .................................................. 7
4.1系统流程图 ............................................... 7
4.2 LCD显示程序流程图....................................... 7
4.3 设计程序 ................................................ 8 5.仿真 ........................................................ 14 6.在实现过程中遇到的问题及排除措施 ............................ 15 7.设计
心得体会
决胜全面小康心得体会学党史心得下载党史学习心得下载军训心得免费下载党史学习心得下载
................................................ 16 参考文献 ...................................................... 16
1602LCD显示电话拨号键盘按键
摘要:本设计以89C51单片机为核心,设计1602LCD显示电话拨号键盘按键,对按键输入系统,LCD1602的引脚功能、控制命令、读写时序进行了分析。在keil中进行编程,在proteus软件中进行了仿真。
关键字:单片机;1602LCD显示屏;键盘系统
1
1.设计目的
单片机原理与应用课程设计是单片机原理与应用专业课程的实践性教学环节,通过该教学环节,要求达到以下目的:
(1)培养学生工程设计能力和综合分析问题、解决问题的能力,能根据工程需求,利用Proteus环境等构建原理图,利用Keil等环境编写调试单片机功能程序,最终构建工程的硬件平台和软件平台,达到预定功能,实现单片机具体应用;
(2)熟悉在Proteus环境中的ISIS模块原理图绘制,掌握仿真的基本方法;
(3)掌握Keil C编程及C51编程语言和汇编语言开发;
(4)掌握单片机片内资源编程,能熟练应用相关片内资源合理配置相关寄存器;
(5)实现由原理图到PCB图,硬件与软件结合实现功能,提高电子电路的设计和实验能力,为以后从事生产和科研工作打下一定的基础。
2.设计要求
要求以51单片机作为微控制器,通过1602LCD显示屏显示拨号键盘,键值包括数字0-9及“*”“#”等12个按键。数字显示为逐个显示方式,最多显示11位。 3.设计方案
首先构建单片机最小系统、键盘输入系统及1602LCD显示系统。通过单片机扫面键值,将其结果输入到1602LCD显示屏上。
3.1单片机最小系统
[1]单片机最小系统主要由电源、复位、震荡电路以及扩展部分等部分组成。
2
图3.1单片机最小系统
3.2输入按键系统
独立的键盘与单片机相连时,每个按键都需要单片机的一个I/O口,若按键较多时,占用的I/O口资源就会过多,为此就引入了矩阵键盘。本次设计共有0~9、#、*共12个按键,因此引入3*4的矩阵键盘,共需要7个I/O口,7条线分别与单片机P3口相连。
图3.2输入按键系统
3.3 1602LCD显示系统
AT89C51单片机,P0口输出时,必须使用上拉电阻,提高电压,否则无法得到输出结果。
3
图3.3 1602 LCD显示系统
3.31 LCD1602原件显示原理
图3.3 1LCD1602原件图
表1 LCD1602引脚功能
编号 符号 引脚说明 编号 符号 引脚说明
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 D8 背光源正极
8 D1 数据 16 D9 背光源负极
3.32 LCD1602引脚说明
第1脚:VSS为地电源;
4
第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脚:背光源正极。
[2]第16脚:背光源负极。
3.33 LCD1602指令
1602液晶模块内部的控制器共有11条指令,如下表所示
表2液晶模块内部控制其指令
RS R/D7 D6 D5 D4 D3 D2 D1 D0 序指令
W 号
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 1 0 写数到CGRAM或DDRAM 要写的数据内容
11 1 1 从CGRAM或DDRAM读数 读出的数据内容
指令说明:
指令1:清显示,指令码01H,光标复位到地址00H位置;
指令2:光标复位,光标返回到地址00H;
指令3:光标和显示位置设置I/D,光标移动方向,高电平向右移,低电平向左移,S:屏幕上所有文字是否左移或右移,高电平表示有效,低电平表示无效; 指令4: 显示开关控制。D:控制整体的显示开与关,高电平表示开显示,低电平表示
5
关显示。C:控制光标的开与关,高电平表示有光标,低电平表示无光标。B:控制光标是否闪烁,高电平闪烁,低电平不闪烁;
指令5:光标或显示移位S/C,高电平时显示移动的文字,低电平时显示移动的光标; 指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线。N:低电平时为单位行显示,高电平时为双行显示。F:低电平时显示5*7的点阵字符,高电平时显示5*10的显示字符。
指令7:字符发生器RAM地址设置;
指令8:DDRAM地址设置;
指令9:读忙信号和光标地址。BF:忙标志位,高电平表示忙,此时模块不能接收命令
[2]或数据,如果为低电平表示不忙。
3.34 LCD1602数字代码
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,其中阿拉伯数字的代码为:
代码 数字
00110000 0
00110001 1
00110010 2
00110011 3
00110100 4
00110101 5
00110110 6
00110111 7
00111000 8
00111001 9
3.4设计原理图
根据设计要求画出原理图
6
图3.4设计原理图
4. 分析与编程
4.1系统流程图
图4.1为系统总流程图。首先系统进入初始化,系统开始运行,当
检测
工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训
键盘没有按下时,则返回继续检测直至有键盘按下;当扫描到键盘按下时,读取按键值,并检测是否超过10位,若没有超过则送入液晶显示;若超过10位则系统重新初始化。 4.2 LCD显示程序流程图
显示程序流程图如图4.2。流程图分析:首先对1602显示屏进行初始化,然后检查忙信号,若BF=0,则获得显示RAM的地址,写入相应的数据显示;若BF=1,则代表模块正在进行内部操作,不接受人和外部指令和数据,知道BF=0为止。
7
开始 开始
对1602初始化 系统初始化 写入显示设置命令
键盘扫描 延时
N 设置按键 检查忙信号 是否按下 N Y
BF=0? 读取按键 N Y
按键是否 Y 获得显示RAM地址 超过11位 N 获得
延时 显示
写入相应数据
图4.1 系统流程图 数据显示 完毕,
Y
结束
4.2 LCD显示程序流程图
4.3 设计程序
#include
#include
#define uchar unsigned char #define uint unsigned int #define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
sbit BEEP=P1^0;
8
sbit LCD_RS=P2^0;
sbit LCD_RW=P2^1;
sbit LCD_EN=P2^2;
void DelayMS(uint ms);
bit LCD_Busy_Check();
void LCD_Set_Position(uchar Position); void Write_LCD_command(uchar cmd); void Write_LCD_data(uchar dat); //--标题字符串
char code Title_Text[]={"-- phone Code --"}; //--键盘拔号与键盘符号映射表
uchar code key_Table[]={'1','2','3','4','5','6','7','8','9','*','0','#'};
//--键盘拔号数字缓冲
uchar Dial_Code_Str[]={" "}; //此处空格太少,会在屏幕上显示一个字符出来
uchar keyNo=0xff;
int tCount=0;
//------------------------------------ //延时
//------------------------------------ void DelayMS(uint x)
{
uchar i;
while(x--)
for(i=0;i<120;i++)
;
}
//-------------------------------- //在LCD指定的行上显示字符串
//--------------------------------
9
void Display_String(uchar *str,uchar LineNo) {
uchar k;
LCD_Set_Position(LineNo);
for(k=0;k<16;k++)
Write_LCD_data(str[k]);
}
//---------------------------------------------- //忙检查
//--------------------------------------------- bit LCD_Busy_Check()
{
bit LCD_Status;
LCD_RS=0;//寄存器选择
LCD_RW=1;//读状态寄存器
LCD_EN=1;//开始读
DelayMS(1);
LCD_Status=(bit)(P0&0x80) ;
LCD_EN=0;
return LCD_Status;
}
//---------------------------------------------------
//写LCD命令
//----------------------------------------------------
void Write_LCD_Command(uchar cmd) {
while((LCD_Busy_Check()&0x80)==0x80);//忙等待
LCD_RS=0;//选取择命令寄存器
LCD_RW=0;//写
10
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
DelayNOP();
LCD_EN=1;
DelayNOP();
LCD_EN=0;
}
//-----------------------------------------
//发送数据
//----------------------------------------
void Write_LCD_Data(uchar Str) {
while((LCD_Busy_Check()&0x80)==0x80);//忙等待
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=Str;
DelayNOP();
LCD_EN=1;
DelayMS(1);
LCD_EN=0;
}
//-------------------------------------------------
//LCD初始化
//-------------------------------------------------
void Initialize_LCD()
{
Write_LCD_Command(0x38);
11
DelayMS(5);
Write_LCD_Command(0x0C);//清屏
DelayMS(5);
Write_LCD_Command(0x06);//字符进入模式,屏幕不动,字符后移。
DelayMS(5);
Write_LCD_Command(0x01);//显示开,关光标。
DelayMS(5);
}
//-------------------------------------- //设置显示位置
//-------------------------------------- void LCD_Set_Position(uchar Position) {
Write_LCD_Command(Position | 0x80); }
//-----------------------------------------------
//t0控制按键声音
//-----------------------------------------------
void T0_INT() interrupt 1
{
TH0=-600/256;
TL0=-600%256;
BEEP=~BEEP;
if(++tCount==200)
{
tCount=0;
TR0=0;
}
}
//-------------------------
12
//键盘扫描
//------------------------
//=============================================================
uchar Getkey()
{
uchar i,j,k=0;
uchar keyScanCode[]={0xef,0xdf,0xbf,0x7f};//键盘扫描码
uchar keyCodeTable[]={0xee,0xed,0xeb,0xde,0xdd,0xdb,0xbe,0xbd,0xbb,0x7e,0x7d,0x7b};
P3=0x0f;
//扫描键盘获取按键序号
if(P3!=0X0F)
{
for(i=0;i<4;i++)
{
P3=keyScanCode[i];
for(j=0;j<3;j++)
{
k=i*3+j;
if(P3==keyCodeTable[k])
return k;
}
}
}
else return 0xff;
}
//------------------------------- //main
//-------------------------------- void main()
13
{
uchar i=0,j;
P0=P2=P1=0XFF;
IE=0X82;
TMOD=0X01;
Initialize_LCD(); //LCD初始化
Display_String(Title_Text,0x00);//在第一行显示标题 while(1)
{
keyNo=Getkey();//获取按键值
if(keyNo==0xff)
continue;//无按键时继续扫描
if(++i==12)//超过11位时清空
{
for(j=0;j<16;j++)
Dial_Code_Str[j]=' '; i=0;
}
Dial_Code_Str[i]=key_Table[keyNo];//将待显示字符放入待显示的拔号串中
Display_String(Dial_Code_Str,0x40);//在第二行显示号码 TR0=1;//T0中断控制按键声音
while(Getkey()!=0xff);//等待按键释放
}
}
5.仿真
仿真图根据实验原理图的元器件,在Proteus软件中绘制出,检查无误后导入运行
程序,并观对结果进行分析,观察仿真结果是否真确的达到的实验所预期的效果,如果
14
没有达到,则分析原因,找出错误,直至达到预期效果;如果达到预期效果,则描述实验结果。
实验仿真图如下图:
图5 仿真图
仿真结果符合实验预期要求,LCD1602显示按键值,且按键超过11位时,前11位按键值清零,重新显示按键值。
6.在实现过程中遇到的问题及排除措施
本次课程设计中,在单片机最小系统初始设计时,电容和晶振选择不合理,导致无法起振。通过查阅资料,多次实验,确定了合适的电容与晶振。在开始设计电路时,P0口与显示屏相连时未考虑到添加上拉电阻,显示屏无法显示按键值,添加上拉电阻后,显示正常。在对键盘输入系统编程时,显示屏始终只显示一位按键值或者显示屏显示到15位时不能继续显示按键值,通过对程序的修改,最终达到预期的效果。
15
7.设计心得体会
通过本次课程设计,进一步加深了对51单片机的理解,熟悉了Proteus环境中的ISIS模块原理图绘制,掌握了仿真的基本方法和Keil C编程及C51编程语言和汇编语言开发以及两者之间的联调。对按键扫描输入系统和LCD1602显示系统的工作原理及编程方法有了更进一步的了解。在设计过程当中,遇到各种各样的问题,我们通过不断地讨论与查阅资料来一一解决,不仅锻炼了我们团队合作的能力也培养了我们分析与解决问题的能力。通过这次课程设计,锻炼了我们最基本的单片机的设计能力,更重要的是让我更深刻的认识了单片机实际中的应用的广泛性和重要性。
8.参考文献
[1] 林立.单片机原理及应用-基于Proteus和Keil C [M].北京:电子工业出版社,2013:58-59.
[2] 梁强.字符型液晶模块1602快速使用[J].科技信息,2012,(35):138-139.
16