《8051单片机原理及应用》 课件 郭玲 第9、10章 人机接口开发、传感器模块开发技术_第1页
《8051单片机原理及应用》 课件 郭玲 第9、10章 人机接口开发、传感器模块开发技术_第2页
《8051单片机原理及应用》 课件 郭玲 第9、10章 人机接口开发、传感器模块开发技术_第3页
《8051单片机原理及应用》 课件 郭玲 第9、10章 人机接口开发、传感器模块开发技术_第4页
《8051单片机原理及应用》 课件 郭玲 第9、10章 人机接口开发、传感器模块开发技术_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络空间安全学院网络安全基础技术应用第九章人机接口开发目录CONTENT9.1.STN-LCD液晶显示开发9.2.状态机设计9.3.总线扩展复用设计9.4.人机接口综合练习9.1.STN-LCD液晶显示开发液晶显示终端是单片机应用系统中最常见的人机接口输出显示设备,单片机学习板通常都预留液晶显示接口。图9.1-1是连接LCD12864显示屏的插座示例。图9.1-1液晶LCD12864显示连接接口9.1.STN-LCD液晶显示开发表9.1-1是插座管脚定义。管脚号管脚名管脚功能

管脚号管脚名管脚功能1VSS电源地11DB4数据位42VDD电源正极12DB5数据位53V0液晶显示对比度调节13DB6数据位64RS数据/命令选择14DB7数据位75R/W读/写选择15PSB串并选择:“1”并行;“0”串行。6E使能信号16NC空脚,7DB0数据位017/RES复位信号,低电平有效8DB1数据位118VOUTLCD驱动电压输出端9DB2数据位219BLA背光源正极10DB3数据位320BLK背光源负极表9.1-1LCD12864管脚定义表如下:9.1.STN-LCD液晶显示开发LCD全称LiquidCrystalDisplay,液晶就是液态的晶体,是一种特殊的混合物质,具有固态物质和液态物质的双重特性。液晶分子的排列受到电场影响会发生偏转,当它偏转使得光线通过,就显示图像,当它偏转阻挡了光线传播,就没有图像。本节要介绍型号12864的STN-LCD液晶屏。STN-LCD液晶屏,是一种超扭曲向列屏(STN,SuperTwistedNematic),液晶分子在电场作用下,能发生180度以上的扭曲,从而改变旋光状态形成显示图像。LCD12864表示像素阵列为128×64像素(列×行),基于128×64=8192个像素阵列,LCD可以显示汉字及图形。目前市场有带字库和不带字库两种产品,不带字库的液晶屏由开发人员自己编写字型码,带有字库的程序中无需编写字形码,直接显示字型。图9.1-2展示了LCD12864的外观。图9.1-2LCD12864外观9.1.STN-LCD液晶显示开发液晶的显示基础是像素阵列,每个像素类似一个发光二极管(实际上是液晶分子的偏转),当不同位置的像素点亮后就构成了字符。一个英文字母或数字通常使用8列16行个像素点,一个汉字通常使用16列16行个像素点。表9.1-2列出了数字“5”、字母“A”、汉字“汉”的字模(宋体)编码,它们的显示情况如图9.1-3所示,均为纵向取模。符号字模5x00,0x1F,0x11,0x11,0x11,0x10,0x10,0x00,0x00,0x98,0x04,0x04,0x04,0x88,0x70,0x00,A0x00,0x00,0x03,0x1C,0x07,0x00,0x00,0x00,0x04,0x3C,0xC4,0x40,0x40,0xE4,0x1C,0x04,汉x08,0x06,0x40,0x30,0x03,0x40,0x78,0x47,0x40,0x40,0x40,0x47,0x78,0x00,0x00,0x00,0x20,0x20,0x3E,0xC0,0x01,0x01,0x02,0x04,0xC8,0x30,0xC8,0x04,0x02,0x01,0x01,0x00,表9.1-2取模编码9.1.STN-LCD液晶显示开发纵向取模是从上到下取字节,如图9.1-3所示,对字母和数字,先取(X=0)的8个字节,再取(X=1)的8个字节。对于汉字,Y方向有16个比特2个字节,先取(X=0)的16个字节,再取(X=1)的16个字节。(c)(b)(a)图9.1-3字符显示取模(编码)原理9.1.STN-LCD液晶显示开发LCD液晶显示屏分为带字库和不带字库两种类型。带字库的液晶支持ASCII字符集和GB2312字符集,一个汉字占用16×16个点,所以12864液晶屏最多可显示4行8列共32个汉字。或者4行16列共64个ASCII码。不带字库的LCD需要开发人员自己提供图形编码,设计灵活,开发人员根据自己的应用场景灵活选择。1.LCD液晶有显示缓存(DisplayDataRAM,DDRAM)。显示缓存DDRAM存放要显示字符的编码。此外,LCD液晶模块还有字库存储区,分为三个存储区:中文字库CGROM、ASCII码半宽字库HCGROM、自定义的字形空间CGRAM。9.1.STN-LCD液晶显示开发LCD显示区域与DDRAM的缓存地址一一映射,作为编程人员要记住它们的对应关系,见表9.1-3。上表中80H是第一行的第一个汉字显示区域,如果要显示ASCII字符,那么地址80H可显示两个字符。行号第1列第2列第3列第4列第5列第6列第7列第8列第一行80H81H82H83H84H85H86H87H第二行90H91H92H93H94H95H96H97H第三行88H89H8AH8BH8CH8DH8EH8FH第四行98H99H9AH9BH9CH9DH9EH9FH表9.1-3LCD12864的显示区域与缓存DDRAM的对应关系任务1.在LCD12864屏幕上显示信息任务要求:在LCD12864屏幕上显示课程名字、开发人姓名以及班级学号。任务说明:点阵式图形液晶显示屏LCD能够动态显示图形汉字以及各种符号信息,相对于数码管而言,显示内容更丰富,为各种电子产品提供了友好的人机界面,具有工作电压低、微功耗、体积小、可视面积大、无电磁辐射、数字接口、寿命长等特点。开发任务使用的液晶控制器是ST7920。任务资讯:1.液晶工作时序如下:(1)写时序,单片机写数据到液晶的时序(并行)如图9.1-4所示:在RS周期时间内,R/W低电平、E高电平时,单片机在DB0--DB7输出有效数字。图9.1-4写数据到液晶(并行)任务1.在LCD12864屏幕上显示信息(2)读时序,单片机从液晶读数据的时序(并行)如图9.1-5所示:在RS周期时间内,R/W高电平、E高电平,LCD将数据发送到DB0-DB7数据线上。图9.1-5读数据到单片机(并行)在图9.1-4和图9.1-5中,RS是命令和显示数据内容的指示信号(数据/命令选择),当单片机写指令给液晶的时候,RS是低电平;当单片机读/写显示内容时,RS是高电平。任务1.在LCD12864屏幕上显示信息2.液晶显示的指令控制液晶的游标、显示状态等都受到指令的控制。在如图9.1-4和图9.1-5所示的时序中,当RS为低电平时,单片机向液晶发送操作指令,其数据线上DB0-DB7上的数值为指令码。液晶控制器(以ST7920为例)提供基本指令和扩充指令两套控制命令,常用指令见表9.1-4所示。指令RSR/W指令码DB7DB6DB5DB4DB3DB2DB1DB0功能功能设定000x3000110RE00RE=0基本指令集清除显示000x0100000001DDRAM的地址计数器AC设定为00H,并清除DDRAM里的显示内容。地址归位000x0200000010DDRAM的地址计数器AC设定为00H,游标也回到原点,DDRAM内容不发生变化。进入点设定000x04+偏移地址000001I/DSI/D=0,光标左移,DDRAM地址计数器AC减1;I/D=1,光标右移,AC加1;S=0,画面整体不变S=1,画面整体移动显示状态开关000x08+偏移地址00001DCBD:整体显示控制位当D=1,整体显示ON;当D=0,整体显示OFF,DDRAM里的内容不变。C:光标控制位,1:光标ON;0:光标OFF。B:光标位置反白控制位。1:ON,光标所在地址上的数据反白显示;0:OFF。任务1.在LCD12864屏幕上显示信息指令RSR/W指令码DB7DB6DB5DB4DB3DB2DB1DB0功能游标或显示移位控制000x10+偏移值0001S/CR/L00设定游标的移动与显示的移位控制位,不改变DDRAM内容。R/L=1:光标向右移动;R/L=0:光标向左移动S/C=1:光标显示跟着光标移动;S/C=0:光标显示移位off。设定CGRAM地址000x60+偏移地址01AC5AC4AC3AC2AC1AC0设定CGRAM地址到地址计数器AC。设定DDRAM地址000x80+偏移地址1AC6AC5AC4AC3AC2AC1AC0设定DDRAM地址到地址计数器AC。读取忙碌标志01读出值BFAC6AC5AC4AC3AC2AC1AC0BF:1,忙碌标志位,1表示忙碌,同时可以读出地址计数器AC的值。写资料到RAM10写入的数D7D6D5D4D3D2D1D0写入资料到内部的RAM。读出RAM11读出的值D7D6D5D4D3D2D1D0从内部RAM读取资料功能设定000x3400110RE00RE=1扩充指令集设定绘图RAM地址000x80+偏移地址1AC6AC5AC4AC3AC2AC1AC0在扩充指令集下,设定CGRAM地址到地址计数器AC。任务1.在LCD12864屏幕上显示信息(1)写数据的子函数。在写数据的时候没有读忙标志,而是做了延时处理。voidLCD12864_Write_Data(unsignedchardat){LCD_E=0;LCD_RW=0;//选择写模式LCD_RS=1;//选择数据模式//延时Delay100us(1);//将数据准备LCD_Data=dat;Delay100us(1);LCD_E=1;//表示开始写入数据,上升沿写入数据Delay100us(50);//延时等待数据全部发送完成}任务1.在LCD12864屏幕上显示信息(2)向12864中写入命令的子函数voidLCD12864_Write_Com(unsignedcharcom){//首先我们设置片选信号LCD_E=0;//片选信号一般设置为0表示片选LCD_RW=0;//选择写模式LCD_RS=0;//选择命令模式//延时Delay100us(1);//数据准备LCD_Data=com;Delay100us(1);LCD_E=1;//表示开始写入数据,上升沿写入数据Delay100us(50);}任务1.在LCD12864屏幕上显示信息(3)读12864的状态ucharReadStatusLCD(void){LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;Delay100us(1);LCD_E=1;Delay100us(1);while(LCD_Data&Busy);//检测忙信号LCD_E=0;return(LCD_Data);}任务1.在LCD12864屏幕上显示信息任务具体代码:此代码基于图9.1-1接口电路STC15F2K60S2单片机开发,如果使用其它接口电路更改管脚定义即可。#include<STC15F2K60S2.H>#include<math.h>#include<INTRINS.H>#defineucharunsignedchar#defineuintunsignedint#definexcharunsignedcharcode#define LCD_DataP0#define DELAYMS80//MCUInterfaceDefinationsbitLCD_RS = P2^0;任务1.在LCD12864屏幕上显示信息sbitLCD_RW = P2^1;sbitLCD_E =P1^2;sbitLCD_PSB= P2^6;sbitLCD_RST = P3^4;ucharcodelesson[]={"单片机应用"};ucharcodename[]={"姓名:王小明"};ucharcodeclasses[]={"班级:天才班"};ucharcodeID[]={"学号:203011758"};#defineBusy0x80//用于检测LCD状态字中的Busy标识voidDelay100us(unsignedchark) //@11.0592MHz{任务1.在LCD12864屏幕上显示信息unsignedchari,j;while(k--) { _nop_(); _nop_(); i=2; j=15; do { while(--j); }while(--i); }}

任务1.在LCD12864屏幕上显示信息//向12864中写入数据voidLCD12864_Write_Data(unsignedchardat){LCD_E=0;LCD_RW=0;//选择写模式LCD_RS=1;//选择数据模式//延时Delay100us(1);//将数据准备LCD_Data=dat;Delay100us(1);LCD_E=1;//表示开始写入数据,上升沿写入数据任务1.在LCD12864屏幕上显示信息Delay100us(50);//延时等待数据全部发送完成}//向12864中写入命令voidLCD12864_Write_Com(unsignedcharcom){//首先我们设置片选信号LCD_E=0;//片选信号一般设置为0表示片选LCD_RW=0;//选择写模式LCD_RS=0;//选择命令模式//延时Delay100us(1);//将数据准备任务1.在LCD12864屏幕上显示信息LCD_Data=com;Delay100us(1);LCD_E=1;//表示开始写入数据,上升沿写入数据Delay100us(50);}//读状态ucharReadStatusLCD(void){LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;Delay100us(1);任务1.在LCD12864屏幕上显示信息LCD_E=1;Delay100us(1);while(LCD_Data&Busy);//检测忙信号LCD_E=0;return(LCD_Data);}//对LCD12864进行初始化voidLCD12864_Init(){LCD_PSB=1;//并口,如果是0则为SPI串口 /*开始初始化的步骤*/LCD12864_Write_Com(0x30); //基本指令集任务1.在LCD12864屏幕上显示信息LCD12864_Write_Com(0x08); //光标画面都OFFLCD12864_Write_Com(0x01); //显示归零LCD12864_Write_Com(0x06); //光标右移,画面整体不变LCD12864_Write_Com(0x0c); //画面、光标都开启显示}/*显示中文和ascii码。单个字符实际坐标:0x80->0x870x90->0x970x88->0x8f0x98->0x9f//这个坐标我们自己规定的,再换算成上面的实际坐标就可以了任务1.在LCD12864屏幕上显示信息输入坐标(1,1)->(1,8)(4,1)->(4,8)再指出需要显示的字符*/unsignedcharLCD_addr[]={0x80,0x90,0x88,0x98};voidLCD12864_Display_Char(ucharx,uchary,uchardat){LCD12864_Write_Com(0x30);LCD12864_Write_Com(0x06);//写入地址LCD12864_Write_Com(LCD_addr[x-1]+(y-1));//上面的输入坐标//写入数据LCD12864_Write_Data(dat);任务1.在LCD12864屏幕上显示信息}//显示汉字voidLCD12864_Display_Chars(unsignedcharx,unsignedchary,unsignedchar*dat){LCD12864_Write_Com(0x30);LCD12864_Write_Com(0x06);//写入地址LCD12864_Write_Com(LCD_addr[x-1]+(y-1));//写入数据while(*dat!='\0'){LCD12864_Write_Data(*dat);dat++;}}任务1.在LCD12864屏幕上显示信息voidmain(){ Delay100us(10); LCD12864_Init(); LCD12864_Display_Chars(1,1,lesson);//显示字库中的中文数字LCD12864_Display_Chars(2,1,name);//显示字库中的中文数字LCD12864_Display_Chars(3,1,classes);//显示字库中的中文LCD12864_Display_Chars(4,1,ID);//显示字库中的中文数字 while(1) { ; } }任务1.在LCD12864屏幕上显示信息二维码9.1-1LCD显示12864屏应用程序任务25参考代码及开发结果见二维码9.1-1。9.2.状态机设计状态机是有限状态机(Finite-statemachine,FSM)的简称,也称有限状态自动机。有限状态机表示一个系统是有限个状态,有限状态机中的状态可以在事件触发下自动转移到下一个状态,在转移过程中通常伴随有某个动作。通常用状态转移图描述状态转移的过程。状态:指物质系统所处的状况。将一个系统离散化,可以得到很多种状态,例如:地铁闸机有打开、关闭两个状态,电风扇可以划分为一档、二档、三档、关闭等状态。状态可以用状态变量来表示。转移:一个状态在某个事件触发后,进入到另外一个状态的过程,就称为转移。地铁闸机从关闭到打开,就说状态发生了转移。事件:执行某个操作的触发条件或者口令,是状态机中进入某个状态的条件,比如过地铁闸机,“刷卡”就是一个事件。动作:也称输出或响应,指在某个状态时特定发生的事情。比如,地铁闸机在关闭或打开两个状态转换的过程中,就有关门、开门的动作。9.2.状态机设计FSM设计可以将复杂的问题分解为状态管理和状态转换,是数字电路中非常重要的设计方法。状态机设计首先要画状态迁移图。以地铁闸机为例,状态迁移过程如图9.2-1所示。图中圆方框是状态,方框内“|”左边是状态,右边是该状态的响应动作,箭头表示转移过程,箭头曲线上的文字表明了状态变化的条件(事件)。图9.2-1状态迁移图第五章使用行列扫描矩阵按键法获得两行8个按键的键值,本章介绍使用状态机获得键值的方法。9.2.状态机设计矩阵按键检测的状态转移图如图9.2-2所示,一共有四个状态,起始状态空闲;当有按键按下,先进行软件消抖,防止误操作;当检测到按键持续按下,则确认有按键按下,同时记录按下的时间,以区分短按和长按。当按键释放,则回到起始空闲状态。图9.2-2按键检测状态图传统做法都是在程序中增加延时消除按键抖动,但是频繁调用延时delay子函数让单片机空操作,实用性不高,采用状态机则可以避免单片机的空跑,任务26采用状态机编程思想编写按键检测代码。任务2.状态机实现键盘扫描任务要求:4行4列矩阵式键盘,当任一按键短时按下,就在数码管上显示该按键值;当任一按键长时按下就熄灭显示。1.任务资讯及分析:(1)键盘是人机接口的重要输入设备,4×4、4×2键盘在电子产品中应用十分广泛。同学们在理解键盘扫描原理的基础上,还要了解数码管显示键值的技巧。(2)矩阵式键盘由行线和列线组成,按键的两端分别连接一个行线、一个列线,按键电路和第5章图5.2-4一致。键值从左到右、从上往下在0~15编号,键值=行号×4+列号(行号、列号均在0~3之间取值)如图9.2-4所示,图5.2-4矩阵键盘只有两行,因此对应键值0~7。图9.2-3矩阵键盘的键值任务2.状态机实现键盘扫描(3)检测按键键值的方法有逐列扫描法、行列反转法。本次采用行列反转法编写程序。(4)为了避免单片机延时空转,保证实时性,采用状态机思想编程。2.代码规划:(1)编写键盘扫描程序,行列反转法获得键值,同时让键值显示在数码管上。程序流程如图9.2-4所示:图9.2-4程序流程图任务2.状态机实现键盘扫描(2)采用模块化编程思想,定义状态机及按键相关数据类型://状态typedefenum_keyState_TypeDef{ keyStateIdle=0, keyStateDebounce, keyStateConfirm, keyStatePressLong, }keyStateTypeDef;//响应typedefenum_keyRESP_TypeDef{任务2.状态机实现键盘扫描keyRESPNull=0x00, keyRESPClick=0x01, keyRESPLongPress=0x02}keyRESPTypeDef;//事件typedefenum{ keyEventPress=0, keyEventRelease}keyEventTypeDef;//与按键有关的数据(或属性)typedefstruct_keyData_TypeDef{任务2.状态机实现键盘扫描unsignedintkeyCount;//按键次数 keyRESPTypeDefkeyRESP;//按键事件 keyStateTypeDefkeyState;//按键状态 keyEventTypeDefkeyEvent;//按键管脚电平}keyDataTypeDef;//变量定义,函数定义keyDataTypeDefkeyData;voidKeyEventCheck(void);voidKeyReadStateMachine(void);任务2.状态机实现键盘扫描(3)状态机函数/************检测是否有按键按下************************/staticvoidKeyEventCheck(void)//检查是否有按键按下{ P0=0x0f;//列线Y拉高,行线X拉低 if(P0!=0x0f)//检查列线,是否有按键按下 keyData.keyEvent=keyEventPress; else keyData.keyEvent=keyEventRelease;}/******状态机,读取矩阵键盘键值************************/voidKeyReadStateMachine(void){9.2.状态机设计staticu8col; KeyEventCheck(); switch(keyData.keyState) { casekeyStateIdle: if(keyData.keyEvent==keyEventPress)//如果有按键按下 keyData.keyState=keyStateDebounce;//去抖 break; casekeyStateDebounce: if(keyData.keyEvent==keyEventPress)//去抖后依旧按下 { keyData.keyState=keyStateConfirm;

keyData.keyRESP=keyRESPNull;任务2.状态机实现键盘扫描if(P00==0)col=1;//确定列号//查询按键号码 if(P01==0)col=2; if(P02==0)col=3; if(P03==0)col=4; P0=0xf0;//列线Y拉低,行线X拉高 if(P06==0){key_value=col-1;} if(P07==0){key_value=col+3; } } else { keyData.keyState=keyStateIdle; keyData.keyRESP=keyRESPNull; }任务2.状态机实现键盘扫描 break;

casekeyStateConfirm: if((keyData.keyEvent==keyEventPress)&(keyData.keyCount>=keyLongPressTime)) { keyData.keyState=keyStatePressLong; keyData.keyCount=0; } elseif((keyData.keyEvent==keyEventPress)&(keyData.keyCount<keyLongPressTime)) {任务2.状态机实现键盘扫描 keyData.keyCount++; keyData.keyState=keyStateConfirm; } else { keyData.keyCount=0; keyData.keyState=keyStateIdle;//按键释放 keyData.keyRESP=keyRESPClick;//按键响应 } break; casekeyStatePressLong: if(keyData.keyEvent==keyEventPress) //一直等待释放任务2.状态机实现键盘扫描{ keyData.keyState=keyStatePressLong; keyData.keyRESP=keyRESPNull; keyData.keyCount=0; } else { keyData.keyState=keyStateIdle; keyData.keyRESP=keyRESPLongPress; keyData.keyCount=0; } break; default:break; } }任务2.状态机实现键盘扫描(4)定时器中断程序/******定时器0中断服务函数,定时事件1ms***********************/voidTimer0_Isr(void)interrupt1{ staticu8intr=0; DisplayScan();//每隔1ms数码管扫描一次 if(++intr==10) { intr=0; KeyReadStateMachine();//每隔10ms扫描按键一次 } if(keyData.keyRESP==keyRESPClick) {任务2.状态机实现键盘扫描dspbuf[7]=key_value%10;//按键值的个位数 dspbuf[6]=key_value/10;//按键值的十位数 } if(keyData.keyRESP==keyRESPLongPress)//数码管熄灭 { dspbuf[7]=10; dspbuf[6]=10; dspbuf[5]=10; dspbuf[4]=10; dspbuf[3]=10; dspbuf[2]=10; dspbuf[1]=10; dspbuf[0]=10; }}任务2.状态机实现键盘扫描二维码9.2-1状态机矩阵按键扫描应用程序任务26参考代码及开发结果见二维码9.2-1。以上程序依靠状态机完成了按键扫描,没有调用延时函数,防止了单片机空转。9.3.总线扩展复用设计尽管现代单片机管脚功能丰富,但在实际应用中还存在着因为管脚数量不够用而需要系统扩展的时候。为此引入总线的概念。总线是计算机系统的重要组成部分,它是一组信号线的集合,是计算机系统各模块间传送地址、数据和控制信息的公共通路。总线是各部件联系的纽带,它是计算机通信接口的重要技术。单片机总线就是单片机连接扩展设备的一组公共信号线。按照功能划分,总线可以划分为地址总线、数据总线和控制总线:地址总线(AddressBus,AB),单片机向外发出的地址信号,以选择外部设备或者设备内部存储单元。数据总线(DataBus,DB),单片机与外部设备之间进行数据传送的一组信号线。数据总线是双向的,既可以由单片机向外部输出数据,也可以由外部向单片机输入数据。控制总线(ControlBus,CB),单片机发出的一组控制命令信号线。按照总线的数量又可以划分为并行扩展总线和串行扩展总线:9.3.总线扩展复用设计并行扩展总线:单片机一次传输一个字节,数据总线有8条。串行扩展总线:单片机一次传输一个位,数据总线只有1条。当单片机连接设备时,如果管脚数量不够用,可以将设备通过扩展总线与单片机连接起来,如图9.3-1所示。每次只有一个设备被选中传输信息。图9.3-1三总线扩展示意图9.3.1.总线扩展应用电路设计如果扩展总线上的设备数量太多,为了节省地址线,通常增加译码器电路。图9.3-2展示了一种地址总线电路设计方法。P0端口是数据总线,P27、P26、P25经过译码后与WR或非后构成了地址总线。图9.3-2译码器地址总线扩展示意图9.3.1.总线扩展应用电路设计3-8译码器电路见图9.3-3。地址选择管脚CBA分别连接P27、P26、P25,使能端G1、G2A、G2B直接连接到相应的高电平或地,输出则连接到了图9.3-4或非门的输入一端。或非门的另一端WR受跳线J13控制,连接单片机P42脚或者接地。单片机自带WR和RD功能脚,WR和RD时序由51单片机自动产生,在执行MOVXA,@DPTR时,RD自动跳变到低电平;在执行MOVX@DPTR,A时,WR自动跳变到低电平。指令MOVX意味着要访问寄存器片外存储器DPTR。图9.3-4电路可以利用单片机自带WR功能节约编程量。图9.3-3译码器电路9.3.1.总线扩展应用电路设计锁存器电路见图9.3-5,使能/OE直接连接GND,LE连接或非门输出,当LE是高电平,锁存器输出跟随输入;当LE是低电平时,锁存器闭锁,输入不起作用,输出Q保持原有电平。图9.3-4或非门电路

图9.3-5锁存器电路9.3.1.总线扩展应用电路设计器的编码情况如表9.3-1所示,仅使用了4个编码。P2.7、P2.6、P2.5作用说明111数码管的段选共阳数码管1108位数码管的位选101蜂鸣器、电机、继电器控制P0高电平时,蜂鸣器、继电器动作100控制LED指示灯组P0低电平时,LED点亮其他无无表9.3-1总线扩展3-8译码器的编码表9.3.1.总线扩展应用电路设计LED灯组的总线复用电路如图9.3-6所示,LED的负极连接锁存器输出,译码器选中Y4C后,P0控制LED的亮灭。图9.3-6LED指示灯电路9.3.1.总线扩展应用电路设计LED灯组的总线复用电路如图9.3-6所示,LED的负极连接锁存器输出,译码器选中Y4C后,P0控制LED的亮灭。图9.3-6LED指示灯电路9.3.1.总线扩展应用电路设计LED灯组的总线复用电路如图9.3-6所示,LED的负极连接锁存器输出,译码器选中Y4C后,P0控制LED的亮灭。图9.3-6LED指示灯电路任务2.状态机实现键盘扫描二维码9.3-1总线复用LED点亮应用程序点亮LED灯的程序参考二维码9.3-1:9.3.1.总线扩展应用电路设计数码管总线复用数码管连接电路如图9.3-7所示。8位数码管的显示段码短接在一起,受锁存器U7的控制,当Y7C被3-8译码器选中(高电平),显示段码按照P0的输出显示字型;当Y7C释放后(低电平),显示段码维持原有字型。因为数码管其实就是异形发光二极管组成,因此,显示段码也串联了限流电阻。8位数码管的位选受锁存器U8的控制,当Y6C被3-8译码器选中,P0端口的输出就决定了哪个数码管被选中,注意,同一时刻一次只能选中一个数码管。图9.3-7数码管显示连接电路9.3.1.总线扩展应用电路设计二维码9.3-2总线复用数码管动态显示应用程序数码管显示年月日的程序参考二维码9.3-2:9.4.人机接口综合练习在学习了人机接口电路的基本模块后,现在开始人机接口综合练习。生活中很多产品如空调、冰箱、电视机、测控系统等都是典型单片机应用系统,本节以前面章节的知识为基础进行综合性练习。任务3.人机接口综合练习——模拟风扇控制系统任务要求:模拟一个风扇控制系统。按键控制风扇的转动速度和定时时间,数码管实时显示风扇的工作模式,动态倒计时显示剩余的定时时间。图9.4-1是系统框图,由数码管显示、单片机最小系统、按键输入和PWM控制保护电路组成。图9.4-1模拟风扇控制系统框图(第七届蓝桥杯预赛试题)任务3.人机接口综合练习——模拟风扇控制系统模拟风扇控制系统功能描述如下:1.工作模式设备具有“睡眠风”、“自然风”和“常风”三种工作模式,可以通过按键切换,通过单片机管脚输出PWM信号控制电机运行,信号频率为1KHz。(1)“睡眠风”模式下,对应PWM占空比为20%;(2)“自然风”模式下,对应PWM占空比为30%;(3)“常风”模式下,对应占空比为70%。2.数码管显示数码管实时显示设备当前工作模式和剩余工作时间(倒计时),如图9.4-2所示。图9.4-2工作模式和剩余工作时间显示前3位显示工作模式:1-睡眠风;2-自然风;3-常风。后4位显示剩余工作时间(单位秒)。任务3.人机接口综合练习——模拟风扇控制系统3.按键控制控制系统一共有四个按键,每个按键的功能如下:(1)第1个按键是工作模式切换按键。每按下一次,设备循环切换三种工作模式;(2)第2个按键是定时按键。为了简化开发,定时时间在0、1、2分钟间切换,假设每按下一次,定时时间就重置一次,倒计时重新开始。设备剩余工作时间为0时,停止PWM信号输出。第3个按键定义为“停止”按键。按下后,立即清零剩余工作时间,PWM信号停止输出,除非第2个按键重新设置定时时间。(4)第4个按键定义为“室温”按键。按下后,数码管显示当前室温,数码管显示格式如图9.4-3所示,再次按下该按键,返回工作模式和剩余工作时间显示。室温测量功能不应影响设备正在执行的PWM信号输出、停止、模式切换和计时等功能。图9.4-3当前室温显示任务3.人机接口综合练习——模拟风扇控制系统4.LED指示灯“睡眠风”模式下L1点亮,“自然风”模式下L2点亮,“常风”模式下L3点亮;按下停止按键或倒计时结束时,LED全部熄灭。任务分析:风扇电机的输入信号是PWM波形,频率固定1KHz,占空比在20%、30%、70%可调。令定时器0的定时周期时间100us。开始输出PWM信号时,输出高电平,当定时到200us、或者300us、700us时输出低电平。以20%占空比为例,PWM波形如图9.4-4所示。图9.4-4占空比20%的PWM波形任务3.人机接口综合练习——模拟风扇控制系统开启定时器1,用于数码管周期性动态扫描。该系统平时都显示工作状态和时间,有按键输入时,则切换显示内容、调整PWM占空比或测量室温,因此在main函数的大循环里实施按键检测。图9.4-5和图9.4-6展示了程序流程,在主程序中要执行两个功能,一个是检测按键,一个是管理显示内容。任务3.人机接口综合练习——模拟风扇控制系统图9.4-5主流程图任务3.人机接口综合练习——模拟风扇控制系统图9.4-6数码管显示内容管理的流程图9.3.1.总线扩展应用电路设计二维码9.4-1风扇控制系统应用编程

任务25具体代码参考二维码9.4-1:谢谢&提问网络空间安全学院网络安全基础技术应用第十章传感器模块开发技术目录CONTENT10.1.传感器知识简介10.2.温度传感DS18B20数据的读取10.3.超声波数据的读取10.1.传感器知识简介传感器是人工智能的基础,传感器代替了人对周围环境的感知能力,人的“五官”——眼、耳、鼻、舌、皮肤分别具有视觉、听觉、嗅觉、触觉等功能,能直接感受外部环境和世界的变化,人的大脑对“五官”感受到的信息进行加工、处理,从而调节人的行为活动。传感器可以代替人的五官功能,甚至其能力比人的感官功能更加强大。比如,摄像头可以代替人的眼睛,录音机可以采集声音,各种化学试剂可以代替代替鼻子和舌头分辨物品的成分,压力传感器、温度传感器可以代替皮肤获得重量以及冷热信息。表征世界和环境的参量有很多种,我们可以分为电量和非电量两大类。10.1.传感器知识简介电量:电压、电流、电阻等。非电量:压力、位移、重量、速度、温度、酸碱度等。我们知道人工智能的核心是计算机,就是说能和计算机连接的数据才属于人工智能的范畴。计算机能检测到的是电参量。因此非电量要转换成电参量。能将非电量按照一定的规律(数学函数法则)转换成电量的器件或装置,就称为传感器。随着科学技术的发展,传感器技术、通信技术和计算机技术构成了现代信息产业的三大支柱产业,分别充当着信息系统的“感官”、“神经”和“大脑”,它们可以构成一个完整的自动检测系统。10.1.1.传感器电路传感器通常由敏感元件和转换元件组成,如图10.1-1所示。图中敏感元件是指传感器中能直接感受和响应被测量的部分;转换元件是指传感器中能将敏感元件感受或响应的被测量转换成适于传输和测量的电信号部分;调理电路是把传感元件输出的电信号转换成便于处理、控制、记录和显示的有用电信号所涉及的有关电路,如放大、滤波、阻抗变换等电路。图10.1-1传感器的组成框图10.1.传感器知识简介以温度传感器为例,温度传感器内部电路说明如下。1.图10.1-2中RT是铂电阻,是敏感元件。金属铂在温度变化时自身电阻值也随之改变,因此可以利用这个特性测量温度。2.图10.1-2中电阻桥是温度测量电路。测量电阻桥电压就得到温度值。测量原理如下:是非平衡电桥的输出电压。电源流过电桥臂的电流见公式(10.1-1)、(10.1-2),输出电压公式(10.1-3)。(10.1-1)(10.1-2)10.1.传感器知识简介当

时,电桥平衡,;当RT发生变化,电桥非平衡,,根据电压差就可以得到铂电阻对应的温度。图10.1-2电阻桥法的测温原理图

(10.1-3

)10.1.2.传感器的分类1.按照工作原理分类:传感器按其传感的工作原理不同,大体上可分为物理型、化学型及生物型三大类。(1)物理传感器利用某些变换元件的物理性质,以及某些功能材料的特殊物理性能制成的传感器。如利用金属、半导体材料在被测量作用下引起的电阻值变化的电阻式传感器;利用磁阻随被测量变化的电感、差动变压器式传感器;利用压电晶体在被测力作用下产生的压电效应而制成的压电式传感器等。特别值得提及的是近年来利用半导体材料的某些特殊性质又制成了多种传感器,如利用半导体材料的压阻效应、光电效应和霍尔效应制成的压敏、光敏和磁敏传感器。10.1.2.传感器的分类物理传感器中又可分为物性型传感器和结构型传感器、所谓物性型传感器是利用某些功能材料本身所具有的内在特性及效应把被测量直接转换为电量的传感器。如利用压电晶体制成的压力传感器,就是利用压电材料本身所具有的正压电效应而实现压力测量的;又例如光敏电阻,则是利用半导体材料对光强的变化使其电导率发生变化的所谓光电导效应而制成的传感器。结构型传感器是以结构(如形状、尺寸等)为基础,利用某些物理规律实现把被测信息转换为电量,例如气隙型电感式传感器,它必须由按规定尺寸制成的铁芯、一定匝数的线圈以及和铁芯有一定间隙的衔铁组成,只有满足这些结构与尺寸上的要求,才能保证在被测量使衔铁与铁芯间间隙变化时使其磁阻变化,从而产生相应的电信号;10.1.2.传感器的分类(2)化学传感器是利用电化学反应原理,把无机和有机化学物质的成分、浓度等转换为电信号的传感器。最常用的是离子选择性电极,利用这种电极来测量溶液中的pH值或某些离子的活度,如K、Na、Ca等。化学传感器广泛应用于化学分析,以及化学工业的在线检测及环保监测。(3)生物传感器它是一种利用生物活性物质选择性的识别和测定生物化学物质的传感器,生物活性物质对某种物质具有选择性亲和力,也称其为功转换能识别能力,利用这种单一的识别能力来判断某种物质是否存在,其浓度是多少,进而利用电化学的方法进行电信号的转换。10.1.2.传感器的分类2.按照被测物理量分类按传感器的被测物理量进行分类,这种分类方法可以表现传感器的功能。比如:位移、速度,加速度、力、压力、流速、温度、光强、湿度、黏度和浓度等传感器。这种分类方法通常忽略传感器的工作原理,如温度传感器中就包含有用不同材料和方法制成的各种温度传感器,如热电偶温度传感器、热敏电阻温度传感器、PN结二极管温度传感器、热释电温度传感器等。3.按输出信号分类:按照传感器输出的信号特征,可以分为模拟传感器、数字传感器、开关传感器。模拟传感器:将被测量的非电学量转换成模拟电信号。数字传感器:将被测量的信号量转换成数字输出信号(二进制数字构成的码字输出)。开关传感器:当一个被测量的信号达到某个特定阈值时,传感器相应地输出一个特定地低电平或高电平信号。10.1.3.传感器的主要特征参数1.分辨率(Resolution)分辨率是传感器在规定测量范围内所能检测出的被测输入量的最小变化量,有时用该值对满量程输入值百分数表示,则称为分辨力。比如一个温度传感器的分辨率是0.5℃,那么只有温度变化超过0.5度,传感器的输出值才会发生变化。2.灵敏度(Sensitivity)灵敏度是指传感器在稳态工作情况下输出量变化△y对输入量变化△x的比值,即输出、输入量的量纲之比。传感器灵敏度是输出——输入特性曲线的斜率。如果传感器的输出和输入之间显线性关系,则灵敏度S是一个常数。否则,它将随输入量的变化而变化。当传感器的输出、输入量的量纲相同时,灵敏度可理解为放大倍数。提高灵敏度,可得到较高的测量精度。但灵敏度愈高,测量范围愈窄,稳定性也往往愈差。10.1.3.传感器的主要特征参数3.精度精度反应了传感器的测量准确度,可以用测量误差来表示。误差越小,表明测量值越接近真实值;反之则表明测量值偏离真实值较大。误差的表示方法有三种,分别是引用误差、相对误差和绝对误差。(1)引用误差引用误差=(绝对误差的最大值/测量满量程)×100%(2)相对误差相对误差=(绝对误差的最大值/测量值)×100%(3)绝对误差绝对误差值=|测量值-真实值|,绝对误差表明了测量值偏离真实值的大小程度。工业测量中仪表铭牌上会注明精度等级,精度等级是最大误差去掉正负号及百分号。常见的精度等级有0.005、0.02、0.05、0.1、0.2、0.35、0.4、0.5、1.0、1.5、2.5、4.0等,数值越小,代表精度越高。10.1.3.传感器的主要特征参数例1:一台精度为0.5级、量程范围500~700℃的温度传感器,它最大允许误差是多少?检验时某点最大绝对误差是4℃,问此表是否合格?根据精度定义表达式,允许的绝对误差的最大值=满量程×(精度/100)=700×0.005=3.5℃此温度传感器最大允许误差3.5℃.检验某点的最大绝对误差为4℃,大于3.5℃,因此传感器不合格。例2:某温度传感器测量范围是0~500℃,根据工艺要求,测量误差不允许超过±2℃,应该如何选择其精度才能满足要求?知道了量程和误差,现在问的是传感器选取多大的精度合适,因为精度是引用误差的值,所以先计算引用误差引用误差=(绝对误差的最大值/测量满量程)×100%=2/500×100%=0.4%精度是0.4,因此,精度要选择0.4或者小于0.4的传感器才能满足要求。10.2.1.DS18B20功能概述DS18B20是美信(MAXIM)公司开发的一款数字温度传感器,它提供9~12位的摄氏温度测量精度,并具有用户可编程的过温和低温报警功能。1.芯片外观及管脚DS18B20采用1-wire即单线通信方式——单根数据线(图10.2-1中的DQ)与微控制器交换数据。传感器温度检测范围是-55℃至+125℃,即使温度范围超过-10℃至+85℃依然有±0.5℃的精度的精度。图10.2-1温度传感器18B20芯片的外观图10.2.1.DS18B20功能概述18B20只有三种功能管脚。(1)VDD:电源管脚,在图10.2-2外部供电方式下,VDD提供3.0~5.5V电源;在图10.2-3寄生电源供电模式下,VDD要和GND连接在一起,此时DQ高电平时给内部寄生电容供电,低电平时内部寄生电容放电。图10.2-2寄生电源供电模式下的电路连接图图10.2-3外部供电模式下的电路连接图10.2.1.DS18B20功能概述(2)DQ:数据线。DQ连接DS18B20和微控制器,DQ是开漏管脚,在使用的时候,必须在该管脚上连接一个上拉电阻4.7K,DQ支持数据输入和输出双向传输。(3)VSS:接地线。2.温度值存储和计算DS18B20内部有一组暂存存储器(scratchpadmemory),如图10.2-5所示。Byte0、1存储温度测量结果;Byte2、3存储过温和低温报警值;Byte4是配置寄存器;Byte8是CRC校验寄存器。图10.2-4暂存寄存器的存储内容10.2.1.DS18B20功能概述(1)温度寄存器Byte0、Byte1DS18B20的核心功能是温度测量并通过内置的模数转换器,将温度值转换为数字形式存储。Byte0、Byte1分别存储了温度的低8位和高8位。两个字节的内部定义如表10.2-1所示。表10.2-1两个温度寄存器的位定义10.2.1.DS18B20功能概述温度寄存器2个字节共16位。Byte0的Bit7~bit5:整数部分。Byte0的Bit4~bit0:小数部分,小数点后面的值。Byte1的Bit15~bit11:符号位,当S=0的时候,是正数,当S=1是负数。Byte1的Bit10~bit8:整数部分。DS18B20模数转换精度有9、10、11、12位四种精度可选,它们的分辨率分别是0.5℃、0.25℃、0.125℃、0.0625℃。上电后默认是12位转换精度。当12位精度时,两个字节里所有位的值都有效;当11位精度时,bit0无效;当10位精度时,bit1和bit0无效;当9位精度时,bit2、bit1、bit0无效。10.2.1.DS18B20功能概述(2)阈值寄存器Byte2和Byte3图10.2-5是阈值寄存器的位定义,注意:最高位是符号位,其余是整数数值。图10.2-5TH和TL寄存器的位定义(3)配置寄存器Byte4图10.2-6是配置寄存器的位定义,bit6和bit5是不同分辨率的选择设置,见表10.2-2。。图10.2-6配置寄存器的位定义表10.2-2不同分辨率的转换时间10.2.1.DS18B20功能概述(4)CRC校验寄存器CRC校验公式:CRC校验(即循环冗余校验)是数据通讯中最常用的差错检测措施。在使用的时候,对通讯数据进行多项式计算,并将得到的结果附在帧的后面(如图10.2-4所示,是DS18B20传输数据的最后一个字节)。接收设备在接收到帧数据后做同样的计算,如果计算结果为0,就表示通信正确,否则错误。单片机读取DS18B20的寄存器值后,要转换成温度值,在寄存器值基础上乘以分辨率。表10.2-3是12位转换精度下温度寄存器输出数据与测量值之间的关系表。10.2.1.DS18B20功能概述计算举例:第1行:07D0H×0.0625=125,温度值125℃。第3行:0191H×0.0625=25.0625,温度值25.0625℃。第7行:(FFFFH-FFF8+1)×0.0625=(7H+1)×0.0625=0.5,人为加上符号位后是-0.5℃。第7行开始,符号位是1,表明温度值负数。转换时,要反码加1后再进行计算。表10.2-3温度值与温度寄存器内容转换关系10.2.2.DS18B20的单总线数据通信过程单片机访问DS18B20有三个步骤:第1步:总线复位,见图10.2-7。首先单片机拉低总线最少480μs,DS18B20等待16-60μs后,DS18B20主动拉低总线60-240μs。图10.2-7总线复位过程第2步:单片机发送ROM地址,选定器件。第3步:单片机发送DS18B20功能命令10.2.2.DS18B20的单总线数据通信过程这两个步骤都有读和写总线的过程,其时序如图10.2-8所示,在单片机“写”18B20的过程中,数据至少要维持45μs让18B20采样;在单片机“读”的过程中,CPU至少要在总线拉低维持15us后再读总线数据。图10.2-8主机写和读的时间顺序10.2.2.DS18B20的单总线数据通信过程按照两个时序图编写DS18B20的底层驱动代码。1.首先编写延时函数:voidDelay_OneWire(unsignedintt)//延时t个微秒{ unsignedchari; while(t--){ for(i=0;i<12;i++); }}2.初始化bitinit_ds18b20(void)10.2.2.DS18B20的单总线数据通信过程{ bitinitflag=0; DQ=1;//在复位之前,确认DQ在高电平 Delay_OneWire(12); DQ=0;//下降沿,提醒从机有事件发生 Delay_OneWire(80);//延时大于480us DQ=1;//交出总线,等待从机的应答 Delay_OneWire(10);//14 initflag=DQ;//从机将总线拉低,表示复位正确,否则失败 Delay_OneWire(5); returninitflag;}10.2.2.DS18B20的单总线数据通信过程3.数据写,通过单总线向DS18B20写一个字节voidWrite_DS18B20(unsignedchardat){ unsignedchari; for(i=0;i<8;i++)//循环8次,完成8个位的传输 { DQ=0;//抢占总线 DQ=dat&0x01;//LSB开始 Delay_OneWire(5); DQ=1;//释放总线 dat>>=1; } Delay_OneWire(5);}10.2.2.DS18B20的单总线数据通信过程4.数据读,从DS18B20读取一个字节unsignedcharRead_DS18B20(void){ unsignedchari; unsignedchardat; for(i=0;i<8;i++)//循环8次,读完整字节 { DQ=0;//下降沿,提醒从机有事件

10.2.2.DS18B20的单总线数据通信过程 dat>>=1; DQ=1;//释放总线 if(DQ)//dat初始化是0,如果读到1,就改变dat的值 { dat|=0x80;//先获得LSB,最后MSB } Delay_OneWire(5); } returndat;}任务1.DS18B20温度测量应用开发图10.2-9是DS18B20电路连接图,使用表10.2-5的通信过程。图10.2-9DS18B20连接电路表10.2-4推荐通信过程,注意:Tx是主机发送数据给从机,Rx表示主机等待从机发送数据给它。序号MastermodeData(LSBfirst)说明1TxReset主机发布复位脉冲2RxPresenceDS18B20应答脉冲3TxCCh主机发布跳过ROM命令4Tx44h主机发布温度转换命令5

等待等待18B20转换结束,等待时间见表6TxReset主机发布复位脉冲7RxPresenceDS18B20应答脉冲8TxCCh主机发布跳过ROM命令9TxBEh主机发布温度读取命令10Rx9databytes18B20将暂存寄存器的内容发送给主机。任务1.DS18B20温度测量应用开发具体任务要求如下:1.查询DS18B20的温度值,要求能显示正温度和负温度,正数的时候符号位数码管熄灭,负数的时候符号位显示“-”。2.按键切换是否显示小数点后温度值,第一次按下,带小数的显示,温度值精确到小数点后3位;再次按下温度值只显示整数部分。-25℃整数的显示格式:

-25.125℃小数的显示格式:任务1.DS18B20温度测量应用开发3.为了调试方便,温度值同步发送到电脑串口。任务分析:单片机按照表10.2-5的流程读写DS18B20获取温度值。unsignedintrd_temperature(void){unsignedinttemp;unsignedcharlow,high;init_ds18b20();Write_DS18B20(0xCC);Write_DS18B20(0x44);//启动温度转换任务1.DS18B20温度测量应用开发Delay_OneWire(200);init_ds18b20();Write_DS18B20(0xCC);Write_DS18B20(0xBE);//读取寄存器low=Read_DS18B20();//低字节high=Read_DS18B20();//高字节 temp=(high&0x0f); temp<<=8; temp|=low; returntemp;}任务1.DS18B20温度测量应用开发1.由于DS18B20的温度有两个字节构成,在上面的程序中我

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论