单片机接口技术与语言编程PPT公开课.ppt
第章单片机接口技术与语言编程,8051单片机支持的编程语言:汇编语言 PL/M语言 BASIC语言 C语言 C+语言,一、MCS-51单片机的C语言编程,对单片机的指令系统不要求了解,仅要求对8051的存储器结构有一定了解;寄存器分配、不同存储器的寻址及数据类型等细节可由编译器管理;程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;提供的库包含许多标准子程序,具有较强的数据处理能力;由于具有方便的模块化编程技术,使已编好程序可容易地移植;,1-1、C语言与汇编语言相比,有如下优点:,1-2、编译器、开发套件和 IDE,(1)编译器:由源代码文件生成目标文件,(2)开发套件:包含了编译器、链接器等开发工具的组合包,(3)IDE(Integrated Development Environment 集成开发环境)将项目管理、源代码编辑和程序编译、链接、调试等各种工具组合在一个功能强大的环境中,具有良好人机界面。,8051单片机所使用的C语言编译器简称为 Cx51,例如包含Cx51、Ax51、BL51、LIB51、OH51、RTX51等,Keil Vision3 IDE,Keil Vision3 IDE,Cx51.exe,Keil C51开发套件 v7.50,C51的程序结构,#include void delay();void main()delay();P0=0 x33;,例:文件led.c内的代码如下:,程序的入口 函数名固定,且与书写的位置无关 有且仅有一个,库函数或用户自定义的函数 可以有若干个,C51程序大体上是若干函数的集合,C语言编程的三大要素,数据 数据类型、数据结构、存储类型 运算 算术运算、关系运算、逻辑运算、位操作 控制 顺序结构、选择结构、循环结构、函数,C51的数据类型,位变量的使用 不能定义成一个指针,如不能定义:bit*pointer;不存在位数组如不能定义:bit b_array 位变量定义时,存储类型只允许为data、bdata或者idata,如果将位变量的存储类型定义成其它类型都将导致编译出错。,char 数据类型,单片机应用中ASCII字符和字符串的使用比较少(因为很少需要大量的文本信息),因此在单片机应用中定义为 unsigned char 和 char 的变量常用来表示数值。,数据类型的使用,单片机系统总存储空间往往比较有限,因此在实际使用中应注意节约存储空间;对于8位单片机,8位的数据类型是运算最快的;而对于16位单片机,8位的数据和16位的数据可能运算速度是一样的。,常量 又称为标量,常量的值在程序执行过程中不能改变。,符号常量(不是严格意义上的常量,只是一个宏)使用#define 语句定义 定义在ROM里的常量使用“code”关键字定义的数据 定义在RAM里的常量使用“const”关键字定义的数据,在C51中常量的定义有3种方式:,常量和变量,常量和变量,在C51中常量的使用:,9:P0=constA;C:0 x008F758014MOVP0(0 x80),#0 x14 10:P1=constB;C:0 x00929000A2MOVDPTR,#constB(0 x00A2)C:0 x0095E4CLRAC:0 x009693MOVCA,A+DPTRC:0 x0097F590MOVP1(0 x90),A 11:P2=constC;C:0 x00998508A0MOVP2(0 xA0),constC(0 x08),#include#define constA 20 unsigned char code constB=20;unsigned char const constC=20;,常量和变量,在C51中常量的使用:,1、符号常量(常用)是一个宏,在编译时常被当作指令的立即数。2、定义在ROM中的常量(常用)存放在ROM中,掉电不丢失,访问需要MOVC指令,和16位地址,访问速度较慢。3、定义在RAM中的常量存放在RAM中,访问较快,但占用RAM资源,掉电丢失,需要在单片机上电时进行初始化。,#include#define constA 20 unsigned char code constB=20;unsigned char const constC=20;,变量 在程序执行过程中,其值可以改变的量称为变量。变量只能存放在RAM中。,数据类型 存储器类型 变量名=初值 例:unsigned char xdata Flag=0 x0F;,C51的变量的定义:,常量和变量,C51数据的存储类型,在讨论C51的数据类型的时候,必须理解数据的存储类型和它与8051单片机存储器结构的关系.,定义变量时如果省略“存储器类型”选项,则按编译时使用的存储器模式SMALL、COMPACT、或LARGE来使用默认的存储器类型。,SMALL:默认存储类型为data,访问速度最快,容量小COMPACT:默认存储类型为pdataLARGE:默认存储类型为xdata,访问效率最低,代码长,容量大,一般使用SMALL模式,对部分容量大的变量,手动指定存储器类型(如定义为xdata类型)。,C51数据的存储模式,unsigned char i,j;unsigned char i,j;例3:设单片机fosc=6MHz,要求在P2.思路:高电平持续时间35%,低电平持续时间65%,应考虑取其公因数。;unsigned char i;glucCounter=0;1、判断是否有键按下;D1=1;/熄灭如:#define CONST 20#include 0;j-)2-6 外部总线接口的应用uiTemp+;while(ucTable i!=0 x01)/不是末尾则输出#define uchar unsigned char2-4 串行通信接口,C51的运算符,1、算术运算2、关系运算3、逻辑运算4、位操作运算,循环移位指令?,#include extern unsigned char_cror_(unsigned char,unsigned char);extern unsigned char _crol_(unsigned char,unsigned char);extern unsigned int _iror_(unsigned int,unsigned char);extern unsigned int _irol_(unsigned int,unsigned char);extern unsigned long _lror_(unsigned long,unsigned char);extern unsigned long _lrol_(unsigned long,unsigned char);,C51的流程控制,(略),二、MCS-51单片机接口技术,例:用单片机设计一台数控方波发生器,二、MCS-51单片机接口技术,2-0 并行IO的基本应用 2-1 键盘控制接口 2-2 显示器控制接口 2-3 定时/计数器的使用 2-4 串行通信接口 2-5 外部总线接口 2-6 外部总线接口的应用,单片机的IO功能分为两大类:,由并行IO实现,由AD和DA模块实现,2-0 并行IO的基本应用,基本应用:开关量输出控制(继电器、模拟开关、灯泡、发光二极管等)开关量输入(开关、按键、开关型传感器(限位开关)等)波形输出(矩形波、PWM等),复杂控制:并行数据IO控制(数码管、液晶、键盘等)串行数据IO控制(IIC总线模拟、SPI总线模拟等)第二功能的使用(通用数据总线、外部中断输入等),1、并行IO的应用概述,注意事项:并行IO主要用于数字量(开关量)的输入输出,逻辑电平为CMOS电平,即1接近于电源电压,0接近于0V。使用并行IO时应当注意IO口的驱动能力!1、IO口的允许电压最大为电源电压,一般为5V;2、每个IO口的输出驱动电流,一般不能超过15mA;3、当被控制的设备(如灯泡,继电器等)需要更大的电压或电流时,需要外接驱动电路或者驱动芯片;当输入数字量信号的高电平超过或 低于5V时(如工业常用12V、24V传感器),需使用适当的电平转换电路。,1、并行IO的应用概述,1、并行IO的应用概述,常用简单驱动和转换电路:,负载,例如:灯泡、继电器、电磁阀、电动机,增大驱动电流(几十mA 几A),光耦的功能:电平转换 输入输出端的逻辑电平大小可以任意转换;电气隔离 输入端和输出端可以使用不同的电源,从而使输入端和输出端隔离,提高抗干扰能力,并为单片机提供一定的保护功能。,常用简单驱动电路:,使用光耦进行连接,P2=0 xf7;/点亮D4TR0=1;unsigned intKEY=1;/准双向口例:#define PI 3.使用查询方式进行编程:2-0 并行IO的基本应用for(i=20;i0;i-)if(I=4)P1_0=0;i=0;例:如题设所示电路图,要求编程控制8个发光二极管以1s的间隔依次循环点亮。#define 符号常量名 常量(数字或字符等)解:采用定时器T0的方式1进行编程当然采用不同的通信标准时,还需进行相应的电平转换,有时还要对信号进行光电隔离。ucPreKey=KEY;/存储前一状态IO驱动电路和电平转换电路当输入数字量信号的高电平超过或 低于5V时(如工业常用12V、24V传感器),需使用适当的电平转换电路。KEY=1;/准双向口_ 1、RS-232C接口标准,2、LED的控制,sbit的使用,分析电路:1、由图,D3由IO引脚P2.2控制;2、由硬件电路可知,当IO口输出逻辑电平0时对应的LED点亮,当IO口输出逻辑电平1时LED熄灭。,例:如上图所示电路图,要求编程控制发光二极管D3点亮。,普通发光二极管只需要几个mA的电流就可以点亮,#include sbit D3=P22;void main()D3=0;/点亮LED while(1)/循环,挂起;,按要求编程:,_,_,_,引用含有SFR符号定义的头文件 定义符号D3为P2口的第2位 D3可以换为其他自定义符号,作用相同,如:sbit P2_2=P22;点亮发光二极管的功能语句 while(1)无限循环,用于程序的反复执行或者程序挂起,很重要!使用tab或者空格,使程序结构清晰,便于阅读 适当加入注释,使编程思路清晰,便于阅读和后期的修改,sbit的使用,while(1)循环,#include sbit D3=P22;void main()D3=0;/点亮LED while(1)/循环,挂起;,while(1)D3=0;,可以实现相同的功能,while(1)循环,如果主函数中没有while(1)循环会出现怎么样的情况?,#include;void main();,while(1)循环,读取按键代码,例:使用单片机作为控制器,设计一个数学计算器。,例:使用单片机作为控制器,设计一个数学计算器。,void main();while(1);,while(1)循环,计算器、或其它基于按键操作的设备,自动测量仪器、工业自动化控制等设备,while(1)循环,while(1);,do;While(1),while(1)循环,例:如题设所示电路图,要求编程控制发光二极管D1实现闪烁变化。,分析电路:1、由图,D1由IO引脚P2.0控制;2、由硬件电路可知,当IO口输出逻辑电平0时对应的LED点亮,当IO口输出逻辑电平1时LED熄灭。,while(1)循环,a=a+CONST;void main(void)(可以用任意的符号、数据或表达式进行替换)delay1ms(5);例1:实现数值065535的变化显示,每隔50ms数值加1。并行IO主要用于数字量(开关量)的输入输出,逻辑电平为CMOS电平,即1接近于电源电压,0接近于0V。unsigned char i,j;void delay(uchar ucData);并行数据IO控制(数码管、液晶、键盘等)ET0=1;EA=1;while(1)循环while(1)循环#include reg51.void delay(unsigned char ucData)多个LED的控制,巧用移位指令uchar key;2-2 显示器控制接口ucPreKey=KEY;/存储前一状态uiTemp+;#include reg51.,按要求编程:,#include sbit D1=P20;void main()while(1)/无限循环 D1=0;/点亮 D1=1;/熄灭,问题:闪烁频率有多快?人眼能分辨出来吗?如何降低频率?比如说使闪烁频率变为每秒闪烁1次。,加入延时,while(1)循环,延时的设计,要求:实现发光二极管每秒钟闪烁1次。,分析设计要求:1、每秒钟闪烁1次,即亮0.5秒,灭0.5秒,如此循环;2、设计难点:如何实现0.5秒的计时(延迟、延时)?,思路之一:单片机执行语句需要时间;单片机每条语句执行所需的时间是确定的(指令周期);通过编程使单片机执行一些指令,可以实现延时;,晶振为12MHz时,1个机器周期为1us,单周期指令的指令周期为1us双周期指令的指令周期为2us,依此类推,设计目标:0.5s=500ms=500000us,考虑使用循环语句,unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-);,MOVR6,#20D1:MOVR7,#248 DJNZR7,$DJNZR6,D1,延时的设计,MOVR6,#20D1:MOVR7,#248 DJNZR7,$DJNZR6,D1,单周期指令,1us单周期指令,1us双周期指令,2us双周期指令,2us,设晶振12MHz,延时的设计,10ms延迟的编程实现,unsigned char i,j;for(i=20;i0;i-)for(j=248;j0;j-);,设晶振12MHz,unsigned char i,j;for(i=10;i0;i-)for(j=248;j0;j-);,设晶振6MHz,延时的设计,500ms延迟的编程实现,设晶振12MHz,uchar i,j,k;for(k=50;k0;k-)for(i=20;i0;i-)for(j=248;j0;j-);,MOVR5,#50D1:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1,延时的设计,500ms延迟的编程实现,设晶振12MHz,uchar i,j,k;for(k=50;k0;k-)for(i=20;i0;i-)for(j=248;j0;j-);,应用于延时精度要求一般的场合,延时的设计,通常设计一个任意ms延迟的延迟函数(自定义函数),void delay(unsigned char ucData)unsigned char i,j,k;for(k=ucData;k0;k-)for(i=20;i0;i-)for(j=248;j0;j-);,延时的设计,例:如题设所示电路图,要求编程控制发光二极管D1实现闪烁变化,闪烁频率1Hz。,分析电路(略),按要求编程:,#include sbit D1=P20;void delay(unsigned char ucData)unsigned char i,j,k;for(k=ucData;k0;k-)for(i=20;i0;i-)for(j=248;j0;j-);void main()while(1)/无限循环 D1=0;/点亮delay(50);/0.5秒延迟 D1=1;/熄灭delay(50);,延时的设计,多个LED的控制,巧用移位指令,分析电路:1、由图,D1D8分别由IO引脚P2.0P2.7控制;2、依次循环点亮即:P2.0=P2.1=P2.2=P2.7=P2.0 3、考虑以字节为单位控制IO口状态。,例:如题设所示电路图,要求编程控制8个发光二极管以1s的间隔依次循环点亮。,2-5 外部总线接口TMOD=0 x01;例:如题设所示电路图,要求编程对按键次数进行计数,按一下键,计数值加一。#define uchar unsigned charconvert(uiTemp);实现方法:SM2 地址帧 数据帧2、硬件:外接额外电路(触发器、滤波电路)(略)D3=0;/点亮LED#define uchar unsigned charP2=0 xef;/点亮D5ET0=1;EA=1;按键是单片机系统与操作人员之间交互重要组件,用于完成操作人员对单片机系统的输入控制。sbit P2_0=P20;while(1)6个数码管以5ms左右的间隔依次点亮,显示对应的数据。unsigned char i;1-1、C语言与汇编语言相比,有如下优点:unsigned char i,j;if(KEY=0)&(ucPreKey=1),#include void delay(unsigned char ucData);void main()while(1)P2=0 xfe;/点亮D1delay(100);P2=0 xfd;/点亮D2delay(100);P2=0 xfb;/点亮D3delay(100);P2=0 xf7;/点亮D4delay(100);P2=0 xef;/点亮D5delay(100);P2=0 xdf;/点亮D6delay(100);,P2=0 xbf;/点亮D7 delay(100);P2=0 x7f;/点亮D8 delay(100);void delay(unsigned char ucData)unsigned char i,j,k;for(k=ucData;k0;k-)for(i=20;i0;i-)for(j=248;j0;j-);,按要求编程:,多个LED的控制,巧用移位指令,D1点亮,D2点亮,D3点亮,D4点亮,D5点亮,D6点亮,D7点亮,D8点亮,考虑使用位左移指令,多个LED的控制,巧用移位指令,#include void delay(unsigned char ucData);void main()unsigned char i,ucTemp;while(1)ucTemp=0 x01;for(i=8;i0;i-)P2=ucTemp;delay(100);ucTemp=ucTemp 1;,使用移位指令和流程控制语句简化编程,赋初值,P2口输出、延时、移位,0000 00011111 11100000 00101111 1101,多个LED的控制,巧用移位指令,查表法的使用,如上题,适当使用移位指令可以简化位操作编程,但移位指令不是万能的,有些情况下使用移位指令往往力不从心,如:,例:如题设所示电路图,要求编程控制8个发光二极管按如下方式实现变换闪烁:左移两次、右移两次、向外扩展两次、向内收缩两次、闪烁两次。,左移,右移,向外扩展,向内收缩,闪烁,#include void delay(unsigned char ucData);void main()while(1)P2=0 xfe;/点亮D1delay(100);P2=0 xfd;/点亮D2delay(100);;,方法一:,使用移位指令,可以完成左移、右移的控制,但是在完成向外扩展和向内收缩的控制上比较麻烦。,方法二:,查表法的使用,unsigned char code ucTable=0 xFF,0 xFE,0 xFD,0 xFB,0 xF7,0 xEF,0 xDF,0 xBF,0 x7F,/左移两次 0 xFF,0 xFE,0 xFD,0 xFB,0 xF7,0 xEF,0 xDF,0 xBF,0 x7F,0 xFF,0 x7F,0 xBF,0 xDF,0 xEF,0 xF7,0 xFB,0 xFD,0 xFE,/右移两次 0 xFF,0 x7F,0 xBF,0 xDF,0 xEF,0 xF7,0 xFB,0 xFD,0 xFE,0 xFF,0 x18,0 x24,0 x42,0 x81,0 x42,0 x24,0 x18,/扩展两次 0 xFF,0 x18,0 x24,0 x42,0 x81,0 x42,0 x24,0 x18,0 x00,0 xFF,/闪烁两次 0 x00,0 xFF,0 x01/结束码;,查表法:预先将复杂而又有规律的控制代码或者数据定义成一个数组,在程序执行过程中依次访问数组中的数据,可以使用简洁的语句实现复杂的控制动作,从而达到节约程序代码空间、增加程序可读性和便于修改的目的。,查表法的使用,#include unsigned char code ucTable;void delay(unsigned char ucData);void main()unsigned char i;while(1)i=0;/索引值赋初值while(ucTable i!=0 x01)/不是末尾则输出 P2=ucTable i;/输出控制代码 i+;/索引值加一 delay(100);/延迟1秒,按要求编程:,如何判断数组的末尾?1、可以预先定义一个特定数据,用于表示数组的末尾。2、如果已知数组长度,则可以直接使用索引值判断;,查表法的使用,#include unsigned char code ucTable 56;void delay(unsigned char ucData);void main()unsigned char i;while(1)i=0;/索引值赋初值while(i 56)/不是末尾则输出 P2=ucTable i;/输出控制代码 i+;/索引值加一 delay(100);/延迟1秒,按要求编程:,如何判断数组的末尾?1、可以预先定义一个特定数据,用于表示数组的末尾。2、如果已知数组长度,则可以直接使用索引值判断;,查表法的使用,查表法应用的要点:1、系统的控制要求可以由一系列控制数据表示出来;2、这些控制数据的使用具有一定规律性,如“依次逐个使用”、或者其他可以用特定的算法表示出来的规律性;3、使用查表法的一半步骤:a.根据设计要求建立控制数据数组b.对数组的索引变量进行编程控制c.通过索引变量引用控制数据,完成控制功能,(控制向量、控制参数),查表法的使用,宏的使用,#define 语句的应用,宏的定义 此处使用#define语句定义了一个符号常量PI,它的值是3.1415926。宏的使用 定义好符号常量PI后,在编程中使用这个符号,它就等价于3.1415926。如:a=PI+2;等价于 a=3.1415926+2;,例:#define PI 3.1415926,case 0 x21:;/如果按下键2,例:如题设所示电路图,控制6个共阴数码管使用动态显示的方式显示“123456”。RS-232C(EIA)500ms延迟的编程实现多个LED的控制,巧用移位指令2、由硬件电路可知,当IO口输出逻辑电平0时对应的LED点亮,当IO口输出逻辑电平1时LED熄灭。RB81时收到的数据进入SBUF,并使RI置1,进而在中断服务中将数据从SBUF读走)。使用并行IO时应当注意IO口的驱动能力!加入延迟,防止对一次短暂按键的多次响应,延迟时间大于等于人的一次正常按键的持续时间。while(1)P2=ucTable i;/输出控制代码TL0=(65536-250)%256;delay1ms(5);/5ms延迟0 x01/结束码要求一次按键计数值只加一次。unsigned char i;预先将复杂而又有规律的控制代码或者数据定义成一个数组,在程序执行过程中依次访问数组中的数据,可以使用简洁的语句实现复杂的控制动作,从而达到节约程序代码空间、增加程序可读性和便于修改的目的。uiTemp+;2-2 显示器接口void main(),宏的分类:1、固定不变的宏 这一类宏所代表的值或表达式在整个C文件中始终保持不变。如:#define CONST 20#define uchar unsigned char#define D1_ON P2_1=02、带有参数的宏 这一类宏所代表的表达式根据所传递的参数的不同而发生变化。它与函数的形式类似,但有着本质的区别。如:#define setbit(var,bit)var|=(0 x01(bit),#define 语句的应用,宏的使用,2、带有参数的宏#define setbit(var,bit)var|=(0 x01(bit),setbit(i=1;k,i+1);=i=1;k|=(0 x01(i+1);,宏的使用,宏的意义:,替换,几个常用的宏,#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define 符号常量名 常量(数字或字符等),#define CONST 20a=a+CONST;,#define setbit(var,bit)var|=(0 x01(bit)setbit(P2,1);,P2|=(0 x01(1);,a=a+20;,宏的使用,小结:并行IO的基本应用,1、并行IO的应用概述并行IO的应用领域IO驱动电路和电平转换电路2、LED的编程控制2-1 sbit的使用2-2 while(1)循环2-3 延时的设计2-4 多个LED的控制,巧用移位指令2-5 查表法的使用2-6 宏的使用,二、MCS-51单片机接口技术,2-0 并行IO的基本应用 2-1 键盘控制接口 2-2 显示器控制接口 2-3 定时/计数器的使用 2-4 串行通信接口 2-5 外部总线接口 2-6 外部总线接口的应用,2-1 键盘接口,1、按键的作用:按键是单片机系统与操作人员之间交互重要组件,用于完成操作人员对单片机系统的输入控制。,2、按键的控制方法,单个按键的控制,当单片机系统所需的按键数量比较少时,往往采用一个IO引脚控制一个按键的接口方式。,如图:按键按下时,P0.0输入为0按键松开时,P0.0输入为1,图中,按键和电阻可以交换位置,交换后输入逻辑刚好相反。,例:如题设所示电路图,要求编程对按键次数进行计数,按一下键,计数值加一。,分析电路:1、按键由P2.0控制;2、按键按下时为0,按键松开时为1;因此判断是否按下按键,只要判断P2.0口输入是否为0即可。,单个按键的控制,1,0,未按键,按下,按键松开,1,键按下时P2.0口的逻辑电平变化:,人为按键通常按下时间为几百毫秒。,单个按键的控制,#include#define uchar unsigned charsbit KEY=P20;void delay(uchar ucData);void main()uchar ucCounter;ucCounter=0 x00;/计数初值 KEY=1;/准双向口 while(1)if(KEY=0)ucCounter+;/计数值加一delay(30);/延迟300ms,按要求编程:,P2口是准双向口,所以用作输入时,应当先向IO口写1;加入延迟,防止对一次短暂按键的多次响应,延迟时间大于等于人的一次正常按键的持续时间。如果按下按键后持续较长时间不松开,会不停计数(每隔0.3秒加一),这与电脑键盘的工作方式相似。如果希望一次按下只加一次,怎么办?,单个按键的控制,#include#define uchar unsigned charsbit KEY=P20;void main()uchar ucCounter;uchar ucPreKey;ucCounter=0 x00;/计数初值 KEY=1;/准双向口 ucPreKey=1;while(1)if(KEY=0)/存储前一状态,要求一次按键计数值只加一次。,ucPreKey保存上一次扫描时按键的输入状态(KEY=0)&(ucPreKey=1)即按键信号的下降沿,单个按键的控制,按要求编程:,按键抖动的影响,当用手按下一个按键时,往往所按按键在闭合位置和断开位置之间弹跳几下才会稳定到闭合状态;在释放一个按键时,也会出现类似的情况。这就是按键抖动。这是由机械结构的固有特性决定的,不可避免。按键抖动的持续时间大小不一,一般在10ms左右。,断开,按下,理想按键过程:,抖动约10ms,断开,按下,实际按键过程:,单个按键的控制,#include#define uchar unsigned charsbit KEY=P20;void main()uchar ucCounter;uchar ucPreKey;ucCounter=0 x00;/计数初值 KEY=1;/准双向口 ucPreKey=1;while(1)if(KEY=0)/存储前一状态,当存在按键抖动时,右侧程序将对抖动时的每一个下降沿进行计数,从而出错。因此应当采取一定的措施消除抖动的影响,断开,按下,单个按键的控制,#include#define uchar unsigned charsbit KEY=P20;void main()uchar ucCounter,ucPreKey;ucCounter=0 x00;/计数初值 KEY=1;/准双向口 ucPreKey=1;while(1)if(KEY=0)/存储前一状态,要求消除按键抖动的影响,实现一次按键计数值只增加一次。,实现方法:1、软件:延迟再扫描2、硬件:外接额外电路(触发器、滤波电路)(略),单个按键的控制,按要求编程:,行列式键盘的控制,键盘是多按键输入设备,键盘输入信息的主要过程如下:1、判断是否有键按下;2、确定按下的是哪一个键;3、把此键代表的信息翻译成计算机所能识别的代码,如ASCII或其他特征代码。,编码键盘和非编码键盘 上述2、3步主要由硬件完成,称为编码键盘;单片机完成和键盘的通讯编程;上述2、3步主要由软件完成,成为非编码键盘;单片机完成键盘驱动和编码的编程。(常用),当单片机系统所需的按键数量比较多时,如果继续采用一个IO引脚控制一个按键的接口方式,所需的IO引脚较多;为了节约引脚资源,一般采用行列式键盘的接口方式。,例:如右图,需要控制16个按键。如果采用行列式键盘只需要8个引脚就可以了,按键数量越多,行列式键盘节约引脚的优势就越明显。,行列式键盘的控制,例:如题设所示电路图,要求编写4x4键盘的扫描程序,返回按键代码。,分析电路:当没有按键按下时列信号P1.4P1.5输入均为1当有按键按下时如果行信号P1.0P1.3输出为0,则按键对应的列信号输入为0。,行列式键盘的控制,例:如题设所示电路图,要求编写4x4键盘的扫描程序,返回按键代码。,编程思路:1、判断是否有键按下全扫描,2、确定按下的是哪一个键(确定按键代码)逐行扫描,行列式键盘的控制,按键编码,为了识别按键,必须对键盘中的按键进行编码,每一个按键都有一个确定的按键代码。如果使用非编码键盘,按键的编码方式可以由用户自由定义。,如:,2,1,行列式键盘的控制,按要求编程:,全扫描 四行一起扫描,以判断是否有键按下;同时采用了延迟再扫描的方法进行消抖。逐行扫描 四行依次扫描,判断按键的行列位置;生成按键代码 使用不同的编程语句可以生成不同的按键代码。,uchar kbscan(void)uchar sccode,recode;P1=0 xf0;/低四位输出、高四位输入 if(P1/如果没有键按下,返回0 x00,行列式键盘,while(1);void delay(uchar ucData);#define uchar unsigned char0 xFF,0 xFE,0 xFD,0 xFB,0 xF7,0 xEF,0 xDF,0 xBF,0 x7F,/左移两次uchar ucCounter;;void delay(unsigned char ucData)EA=1;for(k=ucData;k0;k-)定义在ROM里的常量使用“code”关键字定义的数据8051单片机的串行口方式2和方式3适于这种主从式的通信结构。3、逻辑运算4、位操作运算unsigned char i,j;单片机执行语句需要时间;while(1)/循环,挂起MOVR6,#20500ms延迟的编程实现ET0=1;小结:并行IO的基本应用,#include#define uchar unsigned char#define uint unsigned intvoid delay(uchar ucData);uchar kbscan();void main()uchar key;while(1)key=kbscan();/扫描按键,获取按键代码 switch(key)case 0 x00:;/如果不按键,break;case 0 x11:;/如果按下键1,break;case 0 x21:;/如果按下键2,break;default:break;,典型编程:,行列式键盘,二、MCS-51单片机接口技术,2-0 并行IO的基本应用 2-1 键盘接口 2-2 显示器接口 2-3 定时/计数器的使用 2-4 串行通信接口 2-5 外部总线接口 2-6 外部总线接口的应用,2-2 数码管显示的编程控制,数码显示器件:数码管:由发光二极管阵列构成。用于显示数字和简单英文字符。液晶显示模块:由液晶面板和液晶驱动模块构成。用于显示各种符号和图形。,1、数码管的工作原理,数码管的结构 共阳极数码管 共阴极数码管,共阳,共阴,1、数码管的工作原理,数码管的结构 共阳极数码管 共阴极数码管 数码管的显示 段码,数码管显示的内容 位码,(即com端)数码管是否点亮,g,1、数码管的工作原理,数码管的段码(以共阴数码管为例),MSB,LSB,1、数码管的工作原理,多个数码管的控制 静态显示,每个数码管单独控制,所有数码管同时点亮 动态显示,段码共用,位码分别控制,每个数码管循环点亮,段码输入,位码扫描,1、数码管的工作原理,多个数码管的控制 静态显示,每个数码管单独控制,所有数码管同时点亮 动态显示,段码共用,位码分别控制,每个数码管循环点亮,段码输入,位码扫描,例:如题设所示电路图,控制6个共阴数码管使用动态显示的方式显示“123456”。,2、多位数码管的动态显示,段码,位码,驱动电路(为什么?怎样实现?),#include#define uchar unsigned charuchar code LED_seg10=0 x3f,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F;uchar code LED_bit6=0 x01,0 x02,0 x04,0 x08,0 x10,0 x20;void delay1ms(uchar ucData);void main()uchar i;uchar ucData6=1,2,3,4,5,6;while(1)for(i=0;i6;i+)P2=LED_seg ucDatai;P0=LED_bit i;delay1ms(5);,按要求编程:段码和位码输出采用查表法;6个数码管以5ms左右的间隔依次点亮,显示对应的数据。如果数码管亮度太低,或者数码管有明显的闪烁,则通过调节间隔时间,可以使显示稳定。(怎样调节?)显示效果如何?亮度、残影,2、多位数码管的动态显示,while(1)convert(a);for(i=0;i6;i+)P2=LED_seg ucDatai;P0=LED_bit i;delay1ms(5);P0=0 x00;P2=0 x00;P0=0;,按要求编程:段码和位码输出采用查表法;6个数码管以5ms左右的间隔依次点亮,显示对应的数据。如果数码管亮度太低,或者数码管有明显的闪烁,则通过调节间隔时间,可以使显示稳定。(怎样调节?)显示效果如何?亮度、残影(Ghost),2、多位数码管的动态显示,二、MCS-51单片机接口技术,2-0 并行IO的基本应用 2-1 键盘接口 2-2 显示器接口 2-3 定时/计数器的使用 2-4 串行通信接口 2-5 外部总线接口 2-6 外部总线接口的应用,数码管显示实验:“实现数值065535的变化显示”,问题:如何使数值变化的速度减慢?(如每隔1秒数值加1),void m