1.26k likes | 1.41k Views
单片机的结构与原理 MCS-51 指令系统及汇编程序设计 单片机 C 语言及程序设计 单片机中断系统 MCS-51 单片机定时器 / 计数器 单片机串行口 单片机系统扩展 单片机的系统配置及接口. 本章要点 单片机主要应用于测控系统中,单片机应用系统通常需要人的干预。 单片机应用系统经常需要连接一些外部设备,其中键盘和显示器是构成人机对话的一种基本方式,使用最为频繁。 本章主要讲述 键盘 、 显示器 、 A/D 转换器、 D/A 转换器、 开关器件 等的工作原理及接口电路及程序编写 。. 第 9 章 单片机系统配置及接口.
E N D
单片机的结构与原理MCS-51指令系统及汇编程序设计单片机C语言及程序设计单片机中断系统MCS-51单片机定时器/计数器单片机串行口单片机系统扩展单片机的系统配置及接口单片机的结构与原理MCS-51指令系统及汇编程序设计单片机C语言及程序设计单片机中断系统MCS-51单片机定时器/计数器单片机串行口单片机系统扩展单片机的系统配置及接口
本章要点 单片机主要应用于测控系统中,单片机应用系统通常需要人的干预。 单片机应用系统经常需要连接一些外部设备,其中键盘和显示器是构成人机对话的一种基本方式,使用最为频繁。 本章主要讲述键盘、显示器、A/D转换器、D/A转换器、开关器件等的工作原理及接口电路及程序编写。
第9章 单片机系统配置及接口 图9-1 单片机应用系统配置框图
第9章 单片机系统配置及接口 目 录 9.1 键盘接口 9.2 LED显示接口 9.3 A/D转换接口 9.4 D/A转换接口
9.1 单片机与键盘接口 键盘是一组按键的组合,它是常用的单片机输入设备。是一种常开型按钮开关,操作人员可以通过键盘输入数据或命令,实现简单的人机通信。
单片机与键盘接口 按键按照接口原理可分为编码键盘与非编码键盘两类。 编码键盘主要是用硬件来实现对按键的识别,硬件结构复杂; 非编码键盘主要是由软件来实现按键的定义与识别,硬件结构简单,软件编程量大。 在单片机组成的测控系统及智能化仪器中,用的最多的是非编码键盘,独立式按键和矩阵式键盘都是非编码键盘。 重点讨论非编码键盘的原理、接口技术和程序设计。
一、键盘基本问题 1、键的识别 当按键K未被按下时,P1.0输入为高电平;当K闭合时,P1.0输入为低电平。 图9-2 按键电路
2、键的抖动 由于机械触点的弹性作用,按键在闭合时不会马上稳定地接通,在断开时也不会一下子断开。在闭合及断开的瞬间均伴随有一连串的抖动,。 抖动时间一般为5~10ms。在触点抖动期间检测按键的通与断状态,可能导致判断出错。为确保CPU对键的一次闭合仅做一次处理,必须去除键抖动。
+5V 4.7K 4.7K Q & a S b & Q 按键去抖电路
单片机与键盘接口 (a)检测按键 (b)释放按键 按键去抖流程图
二、键盘结构及处理程序 1、独立式键盘 独立式按键是指各按键相互独立地接通一条输入数据线。当任何一个键按下时,与之相连的输入数据线即可读入数据0,而没有按下时读入1。 图9-4 独立式键盘 优点:电路简单; 缺点:键数较多时,要占用较多的I/O线。
独立式按键程序设计 独立式按键程序设计一般采用查询方式,逐位查询每根I/O端口线的输入状态,若某一根I/O端口线的输入为低电平,则可确认该I/O端口线所对应的按键已按下,然后再转向该键的功能处理程序。
9.1.2 键盘结构及处理程序 例 设计一个独立式按键的键盘接口,并编写键扫描程序,电路原理图如下图所示,键号从上到下分别为0~7。
C语言程序清单: #include<reg52.h> void key() { unsigned char k; P1=0xff; //输入时P1口置全1 k=P1; //读取按键状态 if(k==0xff) //无键按下,返回 return; delay20ms(); //有键按下,延时去抖 k=P1; if(k==0xff) //确认键按下 return; //抖动引起,返回 while(P1!=0xff); //等待键释放
9.1.2 键盘结构及处理程序 switch(k) { case:0xfe … //0号键按下时执行程序段 break; case:0xfd … //1号键按下时执行程序段 break; … //2~6号键程序省略 case:0x7f … //7号键按下时执行程序段 break; } }
9.1.2 键盘结构及处理程序 二.行列式键盘 为了减少键盘与单片机接口时所占用I/O线的数目,在键数较多时,通常都将键盘排列成行列矩阵形式。每一水平线(行线)与垂直线(列线)的交叉处通过一个按键来连通。 图9-5 4×4矩阵键盘接口 利用这种结构只需N条行线和M条列线, 即可组成具有N×M个按键的键盘。
9.1.2 键盘结构及处理程序 图 9 | 5 4 × 4 矩 阵 键 盘 接 口
9.1.2 键盘结构及处理程序 ◆行扫描法工作原理 • 判别键盘中有无键按下。向行线输出全0,读入列线状态。如果有键按下,总有一列线被拉至低电平,从而使列输入不全为1。 • 查找按下键所在位置。依次给行线送低电平,查列线状态。全为1,则所按下的键不在此行;否则所按下的键必在此行且是在与零电平列线相交的交点上的那个键。 • 对按键位置进行编码。找到所按下按键的行列位置后,对按键进行编码,即求得按键键值。
9.1.2 键盘结构及处理程序 键盘扫描识别子程序1 #include<reg52.h> char key() { char row,col, k =-1; //定义行、列、返回值 P1=0xf0; if((P1&0xf0)==0xf0) return k; //无键按下,返回 delay20ms(); //延时去抖 if((P1&0xf0)==0xf0) return k; //抖动引起,返回
9.1.2 键盘结构及处理程序 for(row=0;row<4;row++) //行扫描 { P1=~(1<<row); //扫描值送P1 k=P1&0xf0; if(k!=0xf0) //列线不全为1, { while(k&(1<<(col+4))) //所按键在该列 col++; //查找为0列号 k=row*4+col; //计算键值 P1=0xf0; while((P1&0xf0)!=0xf0); //等待键释放 break; } } return k; //返回键值 }
4X4矩阵式键盘按键扫描程序2 unsigned char scan_key(void) { unsigned chari,temp,m,n; bit find=0; //有键按下标志位 P0=0xff; //P0口低4位做输入口,先输出全1 for(i=0;i<4;i++) { P2=0xfe<<=i; //逐列送出低电平 temp=~P0; //读行值,并取反 temp=temp&0x0f; //屏蔽掉行值高4位 while(temp!=0x00) //判断有无键按下,为0则无键按下 { m=i; //保存列号至m变量 find=1; //置找到按键标志
独立式按键程序设计 switch(temp) //判断哪一行有键按下,记录行号到n变量 { case 0x01: n=0;break; //第0行有键按下 case 0x02: n=1;break; //第1行有键按下 case 0x04: n=2;break; //第2行有键按下 case 0x08: n=3;break; //第3行有键按下 default:break; } } } if(find==0) return -1; //无键按下则返回-1 else return(n*4+m); //否则返回键值,键值=行号*4+列号 }
9.1.2 键盘结构及处理程序 ◆行列反转法工作原理 • 判别键盘中有无键按下。(方法同行扫描法) • 行为输出,列为输入,从行线输出权扫描字0,读取列线值; • 输入变输出,再读。将上一步读取到的列线输入值从列线输出,读取行线值。 • 定位求键值。根据上一步输出的列线值和读取到的行线值就可以确定所按下键所在的位置,从而查表确定键值。
9.1.2 键盘结构及处理程序 行列反转法识别子程序 C语言程序代码: #include<reg52.h> char key() { char code keycode[]= { 0xee,0xde,0xbe,0x7e, 0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b, 0xe7,0xd7,0xb7,0x77 } //键盘表,定义16个按键的行列组合值
9.1.2 键盘结构及处理程序 char row,col,k=-1,i; //定义行、列、返回值、循环控制变量 P1=0xf0; if((P1&0xf0)==0xf0) return k; //无键按下,返回-1 delay20ms(); //延时去抖 if((P1&0xf0)==0xf0) return k; //抖动引起,返回-1 P1=0xf0; col=P1&0xf0; //行输出全0,读取列值 P1=col|0x0f; row=P1&0x0f; //行列反转,列值输出,读取行值
9.1.2 键盘结构及处理程序 //查找行列组合值在键盘表中位置 for(i=0;i<16;i++) if((row|col)==keycode[i]) //找到,i即为键值, { //否则,返回-1 key=i; //对重复键,该方法 break; //处理为无键按下 } P1=0xf0; while((P1&0xf0)!=0xf0); //等待键释放 return k; //返回键值 }
三、中断扫描方式 为了提高CPU的效率,可以采用中断扫描工作方式,即只有在键盘有键按下时才产生中断申请,CPU响应中断,进入中断服务程序进行键盘扫描,并做相应处理。也可以采用定时扫描方式,即系统每隔一定时间进行键盘扫描,并做相应处理。
9.1.3 中断扫描方式 图9-6 中断方式键盘接口
本节的内容 一、 键盘基本问题 按键的识别、去抖 二、 键盘结构及处理程序 独立式键盘的接口,程序编写,扫描法 矩阵式键盘的接口电路, 行扫描法的工作原理,程序编写 行列反转法的原理,程序 三、 中断扫描方式 中断扫描方式的接口电路,编程
9.2 LED显示接口技术 • LED数码管的结构原理 • LED显示接口电路及显示方式 • LED大屏幕显示器和接口
LED数码管简介 LED数码管的结构和原理 数码管工作原理 数码管的字型码 静态显示的概念 单片机与LED数码管接口 LED数码管静态显示 多位静态显示接口 动态显示的概念 LED数码管动态显示 动态显示接口 • 单片机与LED数码管接口知识分布网络
一、 LED显示器结构原理 单片机中通常使用7段LED构成字型为“8”且加一个小数点的数码管,以显示数字、符号及小数,常见数码管如下图。
9.2.1 LED显示器结构原理 显示器有共阴极和共阳极两种。发光二极管的阳极连在一起的称为共阳极显示器,阴极连在一起的称为共阴极显示器。 一位显示器由8个发光二极管组成,其中,7个发光二极管构成字型“8”的各个笔划,另一个为小数点。 当在某段发光二极管上施加一定的正向电压时,该段笔划即亮;不加电压则暗。
9.2.1 LED显示器结构原理 以共阴极显示器为例,当a、b、c三段送1时,数码管显示数字7。 (a)共阴极 (c)引脚配置外形图 (b)共阳极
LED数码管字型编码 • 若将数值0送至单片机的P1口,数码管上不会显示数字“0”。显然,要使数码管显示出数字或字符,直接将相应的数字或字符送至数码管的段控制端是不行的,必须使段控制端输出相应的字形编码。 • 将单片机P1口的P1.0、P1.1 …P1.7八个引脚依次与数码管的a、b…f、dp八个段控制引脚相连接。
对于同一个字符,共阳极和共阴极的字型编码之间有什么关系?对于同一个字符,共阳极和共阴极的字型编码之间有什么关系?
9.2.1 LED显示器结构原理 表9-1 共阴极和共阳极7段LED显示字型编码表 以上为8段,8段最高位为小数点段。表中为小数点不点亮段码。
LED数码管静态显示 • 静态显示是指数码管显示某一字符时,相应的发光二极管恒定导通或恒定截止。 • 这种显示方式的各位数码管的公共端恒定接地(共阴极)或+5V(共阳极)。每个数码管的八个段控制引脚分别与一个八位I/O端口相连。只要I/O端口有显示字型码输出,数码管就显示给定字符,并保持不变,直到I/O口输出新的段码。
LED数码管显示的简易秒表设计 • 学习目标: • 通过对由8个LED发光二极管显示一位数0~9简易秒表的制作,进一步熟悉单片机与LED数码管的接口技术,了解LED数码管的结构、工作原理、显示方式和制作方法。 • 任务描述: • 用单片机实现一位数简易秒表控制,计时范围为0~9s,并将计时时间在一位数码管上显示。
控制程序 //程序:ex5_1.c //功能:0~9简易秒表 #include <reg52.h> unsigned char led[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //定义数组led存放数字0~9的字型码,共阳管字型码 void delay1s( ) //采用定时器1实现1秒延时 { unsigned char i; for(i=0;i<0x14;i++) //设置20次循环次数 { TH1=0x3c; //设置定时器初值为3CB0H,TH1=(65536-50000)/256; TL1=0xb0; // TL1=(65536-50000)/256; TR1=1; //启动T1 while(!TF1); //查询计数是否溢出,即定时50ms时间到,TF1=1 TF1=0; //50ms定时时间到,将T1溢出标志位TF1清零 } }
控制程序 void main() //主函数 { unsigned char i; TMOD=0x10; //设置定时器1工作于方式1,16位计数器 while(1) { for(i=0;i<10;i++) { P1=led[i]; //字型显示码送段控制口P1 delay1s(); //延时1秒 } } }
两位数码管静态显示接口电路 用静态显示方式做N位显示器需要多少个8位I/O口,怎样实现? 8×N个, 限制了单片机连接数码管的个数,硬件电路复杂,成本高。
LED数码管动态显示 • 动态显示是一种按位轮流点亮各位数码管的显示方式,即在某一时段,只让其中一位数码管“位选端”有效,并送出相应的字型显示编码。 • 此时,其它位的数码管因“位选端”无效而都处于熄灭状态;下一时段按顺序选通另外一位数码管,并送出相应的字型显示编码,依此规律循环下去,即可使各位数码管分别间断地显示出相应的字符。这一过程称为动态扫描显示。
LED数码管动态显示 74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收 发器,可双向传输数据。74LS245还具有双向三态功能,既可以输出,也可以输入数据。 当8051单片机的P0口总线负载达到或超过P0最大负载能力时, 必须接入74LS245等总线驱动器。
//程序:ex5_2.c //功能:六位数码管动态显示“012345” #include <reg52.h> //函数名:delay50ms //函数功能:采用定时器1、工作方式1实现50ms延时,晶振频率12MHz //形式参数:无 //返回值:无 void delay1s() { unsigned char i; for(i=0;i<0x14;i++) { TH1=0x3c; // 置定时器初值 TL1=0xb0; TR1=1; // 启动定时器1 while(!TF1); // 查询计数是否溢出,即定时到,TF1=1 TF1=0; // 50ms定时时间到,将定时器溢出标志位TF1清零 }} • 控制程序
控制程序 void main() //主函数 { unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92}; //设置数字0~5字型码 unsigned char i,w; TMOD=0x10; //设置定时器1工作方式1 while(1) { w=0x01; //位选码初值为01H for(i=0;i<6;i++) { P2=~w; //位选码取反后送位控制口P2口 w<<=1; //位选码左移一位,选中下一位LED P1=led[i]; //显示字型码送P1口 delay1s(); //延时1s } } }
LED数码管静态显示和动态显示比较 • 静态:显示位数较少,占用I/O端口线多,占用CPU时间少,编程简单。 • 动态:显示位数较多,节省I/O端口资源,硬件电路简单,但显示亮度低于静态显示方式。占用CPU更多的时间。 • 总结:多位显示时采用动态显示方式,若显示位数少,采用静态显示方式更加便捷。
作业: 具有简单控制功能的简易秒表设计 任务要求: 用单片机控制2位数码管实现00-59的简易秒表,并利用3个独立式按键实现秒表的启动、停止和复位功能。