基于51单片机的人机接口电路设计(贺铁梅)2012.09.08

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机的人机接口电路设计

一、功能描述

键盘和显示是单片机应用系统中实现人机对话的一种基本形式,两种接口设计的

好坏,直接影响到人机接口的友好程度。在对一个系统进行操作时,往往离不开人与机器的对话,人机接口界面可以满足人与机器之间的交流。可以通过按键将所需要信号与信息输入给系统,经过系统处理后,所期待的效果又可以通过屏幕来显示出来,这样就可以很好的达到人与机器的交流目的。

二、硬件电路图

基于51单片机的人机接口电路如图1.1所示。电路结构包括基本的复位电路、晶振电路、串口程序下载电路、键盘电路及屏幕显示电路。

图1.1 基于51

单片机的人机接口电路设计

显示电路

键盘控制

AT89C51

图1 人机接口电路结构框图

复位电路 晶振电路

三、接口定义

接口定义说明包括单片机的I/O 口的定义、中断的选择。在键盘电路中引入了外部中断方式0,减少了CPU 的工作强度。屏幕接口电路采用的是并行工作方式,51单片的的I/O 口较多,采用并行方式可以增大数据传输的速度,可以将信息实时显示。具体接口定义如表1.1所示。

表1 A T89C51接口定义

I/O 口 定义

引脚号 引脚名 接口说明 备注 1~8 P1口 接矩阵键盘 10 RXD 接MAX232 11

TXD 接MAX232

12 /INT0 接74ls13四输入与非门输出引入中断

21 P2.0 接屏幕的RST 22 P2.1 接屏幕的RS 23 P2.2 接屏幕的RW 24 P2.3 接屏幕的E

32~38 P0口

接屏幕的数据口DB0~DB7 中断

类型 中断方式 按键中断

中断方式0

四、程序流程图

1、主程序

在主程序中,执行两个任务:1)初始化,键盘初始化,屏幕初始化;2)判断中断是否发生。程序开始,进行初始化,若有中断发生,则屏幕有相应的显示;若无中断发生,则屏幕不显示或保留原显示,继续等待中断发生。主程序流程图如图2.1所示。

2、初始化

初始化函数主要包括键盘初始化和屏幕初始化。键盘的初始化:1)设置中断标志位flag 初值为0,表示无中断产生,若有中断产生,则中断标志位flag 变为1;2)给P1口赋初值,若外部有键被按下,则P1口的值发生改变,引发外部中断;3)设置外部中

开始 初始化

中断发生?

Y N

屏幕显示 结束

图2.1 主程序流程图

断0的触发方式为下降沿触发,然后开启外部中断0,最后开启总中断。屏幕初始化主要是对显示地址的初始化。程序流程图分别如图2.2,2.3所示。

4、中断

进入中断以后,中断标志位置1。然后将外部中断0关闭,避免同时按下两个键时产

生干扰;外部中断响应后开始进行键盘扫描;最后再给P1口重新赋初值,将之前关闭的外部中断打开,等待下一次的中断服务。程序流程图如图2.4所示。

5、按键扫描

按键扫描子函数实现的功能是判断哪一个按键被按下。扫描开始后,通过行列检测的方式检测是否有按键被按下;确认按键被按下后,读取P1口的值,判断出哪个按键被按下,屏幕显示相应的内容。程序流程图如图2.5所示。

6、屏幕写指令

写指令函数程序流程图如图2.6所示。该函数的功能是向控制器写入操作指令。首先判断控制器的状态是的忙,如果忙则继续等待,不忙则进行下一步。再将读写控制端

读取键值 屏幕显示

消抖重新检测

扫描开始 扫描结束

图2.5 按键扫描程序流程

按键检测 按键按下? N

Y

Y

键盘扫描 开外部中断 进入中断 退出中断

图2.4 中断程序流程图

关外部中断 flag=1 P1口赋初值

中断标志位赋初值

初始化开始

中断配置 结束

图2.2 按键初始化程序流程图

图2.3 屏幕初始化流程图

初始化开始 屏幕复位 写清屏指令 写开显示指令

结束

写基本指令集

R/W 置0,使控制器为写的状态,再将RS 置低,然后向P0口送入指令数据,指令等待接收。当使能端E 形成一个下降沿时,指令被接收。控制器完成相应的指令动作 7、屏幕写数据

写数据函数程序流程图如图7所示。该函数的功能是向控制器写入显示数据。首先判断控制器的状态是的忙,如果忙则继续等待,不忙则进行下一步。再将读写控制端R/W 置0,使控制器为写的状态,再将RS 置高,然后向P0口送入数据,数据等待接收。当使能端E 形成一个下降沿时,数据被接收,在屏幕上进行相应的显示。

五、程序

1)主函数

#include #include<12864.h> #include void main() { Lcm_init(); key_init(); while(flag==1) { Lcm_display(); } }

图2.6 写指令流程图

开始 测忙? RS=0 将指令送入P0口 将使能端置高E=1 将使能端置低E=0

结束

Y

N 读状态

R/W=0 图2.7 写数据流程图

开始 测忙? RS=1 将数据送入P0口 将使能端置高E=1 将使能端置低E=0

结束

Y

N

读状态

R/W=0

2)、12864.c

#include<12864.h>

uchar S1[]= "2012年7 月20 号";

uchar S2[]= "文理学院";

uchar S3[]= "第三实验楼";

uchar S4[]= "1 楼112";

/*****************延时函数*********************/ void delay_1ms(uint x)

{

uint i,j;

for(j=0;j

for(i=0;i<110;i++);

}

/*****************写指令函数*********************/ void write_cmd(uchar cmd)

{

RS=0;

RW=0;

E =0;

P0=cmd;

delay_1ms(5);

E =1;

delay_1ms(5);

E =0;

}

/*****************写数据函数*********************/ void write_date(uchar date)

{

RS=1;

RW=0;

E =0;

P0=date;

delay_1ms(5);

E =1;

delay_1ms(5);

E =0;

}

/*****************显示位置函数*********************/ void Lcm_pos(uchar *ptr,uchar ddram)

{

uchar i,j=0,x;

if(ddram<0x88)

Line=0; //定位行地址:第一行

else if(ddram<0xA0)

相关文档
最新文档