版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第三章MCS-51单片机的接口技术与C语言编程,华强2009-2010(2),单片机与应用,8051单片机支持的编程语言:汇编语言PL/M语言BASIC语言C语言C+语言,一、MCS-51单片机的C语言编程,对单片机的指令系统不要求了解,仅要求对8051的存储器结构有一定了解;寄存器分配、不同存储器的寻址及数据类型等细节可由编译器管理;程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;提供的库包含许多标准子程序,具有较强的数据处理能力;由于具有方便的模块化编程技术,使已编好程序可容易地移植;,1-1、C语言与汇编语言相比
2、,有如下优点:,1-2、编译器、开发套件和IDE,(1)编译器:由源代码文件生成目标文件,(2)开发套件:包含了编译器、链接器等开发工具的组合包,(3)IDE(IntegratedDevelopmentEnvironment集成开发环境)将项目管理、源代码编辑和程序编译、链接、调试等各种工具组合在一个功能强大的环境中,具有良好人机界面。,8051单片机所使用的C语言编译器简称为Cx51,例如包含Cx51、Ax51、BL51、LIB51、OH51、RTX51等,KeilVision3IDE,KeilVision3IDE,Cx51.exe,KeilC51开发套件v7.50,C51的程序结构,#in
3、cludevoiddelay();voidmain()delay();P0=0 x33;,例:文件led.c内的代码如下:,程序的入口函数名固定,且与书写的位置无关有且仅有一个,库函数或用户自定义的函数可以有若干个,C51程序大体上是若干函数的集合,C语言编程的三大要素,数据数据类型、数据结构、存储类型运算算术运算、关系运算、逻辑运算、位操作控制顺序结构、选择结构、循环结构、函数,C51的数据类型,位变量的使用不能定义成一个指针,如不能定义:bit*pointer;不存在位数组如不能定义:bitb_array位变量定义时,存储类型只允许为data、bdata或者idata,如果将位变量的存储类
4、型定义成其它类型都将导致编译出错。,char数据类型,单片机应用中ASCII字符和字符串的使用比较少(因为很少需要大量的文本信息),因此在单片机应用中定义为unsignedchar和char的变量常用来表示数值。,数据类型的使用,单片机系统总存储空间往往比较有限,因此在实际使用中应注意节约存储空间;对于8位单片机,8位的数据类型是运算最快的;而对于16位单片机,8位的数据和16位的数据可能运算速度是一样的。,常量又称为标量,常量的值在程序执行过程中不能改变。,符号常量(不是严格意义上的常量,只是一个宏)使用#define语句定义定义在ROM里的常量使用“code”关键字定义的数据定义在RAM里
5、的常量使用“const”关键字定义的数据,在C51中常量的定义有3种方式:,常量和变量,常量和变量,在C51中常量的使用:,9:P0=constA;C:0 x008F758014MOVP0(0 x80),#0 x1410:P1=constB;C:0 x00929000A2MOVDPTR,#constB(0 x00A2)C:0 x0095E4CLRAC:0 x009693MOVCA,A+DPTRC:0 x0097F590MOVP1(0 x90),A11:P2=constC;C:0 x00998508A0MOVP2(0 xA0),constC(0 x08),#include#defineconst
6、A20unsignedcharcodeconstB=20;unsignedcharconstconstC=20;,常量和变量,在C51中常量的使用:,1、符号常量(常用)是一个宏,在编译时常被当作指令的立即数。2、定义在ROM中的常量(常用)存放在ROM中,掉电不丢失,访问需要MOVC指令,和16位地址,访问速度较慢。3、定义在RAM中的常量存放在RAM中,访问较快,但占用RAM资源,掉电丢失,需要在单片机上电时进行初始化。,#include#defineconstA20unsignedcharcodeconstB=20;unsignedcharconstconstC=20;,变量在程序执行过
7、程中,其值可以改变的量称为变量。变量只能存放在RAM中。,数据类型存储器类型变量名=初值例:unsignedcharxdataFlag=0 x0F;,C51的变量的定义:,常量和变量,C51数据的存储类型,在讨论C51的数据类型的时候,必须理解数据的存储类型和它与8051单片机存储器结构的关系.,定义变量时如果省略“存储器类型”选项,则按编译时使用的存储器模式SMALL、COMPACT、或LARGE来使用默认的存储器类型。,SMALL:默认存储类型为data,访问速度最快,容量小COMPACT:默认存储类型为pdataLARGE:默认存储类型为xdata,访问效率最低,代码长,容量大,一般使用
8、SMALL模式,对部分容量大的变量,手动指定存储器类型(如定义为xdata类型)。,C51数据的存储模式,C51的运算符,1、算术运算2、关系运算3、逻辑运算4、位操作运算,循环移位指令?,#includeexternunsignedchar_cror_(unsignedchar,unsignedchar);externunsignedchar_crol_(unsignedchar,unsignedchar);externunsignedint_iror_(unsignedint,unsignedchar);externunsignedint_irol_(unsignedint,unsigne
9、dchar);externunsignedlong_lror_(unsignedlong,unsignedchar);externunsignedlong_lrol_(unsignedlong,unsignedchar);,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的基本应用,基本应用
10、:开关量输出控制(继电器、模拟开关、灯泡、发光二极管等)开关量输入(开关、按键、开关型传感器(限位开关)等)波形输出(矩形波、PWM等),复杂控制:并行数据IO控制(数码管、液晶、键盘等)串行数据IO控制(IIC总线模拟、SPI总线模拟等)第二功能的使用(通用数据总线、外部中断输入等),1、并行IO的应用概述,注意事项:并行IO主要用于数字量(开关量)的输入输出,逻辑电平为CMOS电平,即1接近于电源电压,0接近于0V。使用并行IO时应当注意IO口的驱动能力!1、IO口的允许电压最大为电源电压,一般为5V;2、每个IO口的输出驱动电流,一般不能超过15mA;3、当被控制的设备(如灯泡,继电器等
11、)需要更大的电压或电流时,需要外接驱动电路或者驱动芯片;当输入数字量信号的高电平超过或低于5V时(如工业常用12V、24V传感器),需使用适当的电平转换电路。,1、并行IO的应用概述,1、并行IO的应用概述,常用简单驱动和转换电路:,负载,例如:灯泡、继电器、电磁阀、电动机,增大驱动电流(几十mA几A),光耦的功能:电平转换输入输出端的逻辑电平大小可以任意转换;电气隔离输入端和输出端可以使用不同的电源,从而使输入端和输出端隔离,提高抗干扰能力,并为单片机提供一定的保护功能。,常用简单驱动电路:,使用光耦进行连接,2、LED的控制,sbit的使用,分析电路:1、由图,D3由IO引脚P2.2控制;
12、2、由硬件电路可知,当IO口输出逻辑电平0时对应的LED点亮,当IO口输出逻辑电平1时LED熄灭。,例:如上图所示电路图,要求编程控制发光二极管D3点亮。,普通发光二极管只需要几个mA的电流就可以点亮,#includesbitD3=P22;voidmain()D3=0;/点亮LEDwhile(1)/循环,挂起;,按要求编程:,_,_,_,引用含有SFR符号定义的头文件定义符号D3为P2口的第2位D3可以换为其他自定义符号,作用相同,如:sbitP2_2=P22;点亮发光二极管的功能语句while(1)无限循环,用于程序的反复执行或者程序挂起,很重要!使用tab或者空格,使程序结构清晰,便于阅读
13、适当加入注释,使编程思路清晰,便于阅读和后期的修改,sbit的使用,while(1)循环,#includesbitD3=P22;voidmain()D3=0;/点亮LEDwhile(1)/循环,挂起;,while(1)D3=0;,可以实现相同的功能,while(1)循环,如果主函数中没有while(1)循环会出现怎么样的情况?,#include;voidmain();,while(1)循环,读取按键代码,例:使用单片机作为控制器,设计一个数学计算器。,例:使用单片机作为控制器,设计一个数学计算器。,voidmain();while(1);,while(1)循环,计算器、或其它基于按键操作的设备
14、,自动测量仪器、工业自动化控制等设备,while(1)循环,while(1);,do;While(1),while(1)循环,例:如题设所示电路图,要求编程控制发光二极管D1实现闪烁变化。,分析电路:1、由图,D1由IO引脚P2.0控制;2、由硬件电路可知,当IO口输出逻辑电平0时对应的LED点亮,当IO口输出逻辑电平1时LED熄灭。,while(1)循环,按要求编程:,#includesbitD1=P20;voidmain()while(1)/无限循环D1=0;/点亮D1=1;/熄灭,问题:闪烁频率有多快?人眼能分辨出来吗?如何降低频率?比如说使闪烁频率变为每秒闪烁1次。,加入延时,whil
15、e(1)循环,延时的设计,要求:实现发光二极管每秒钟闪烁1次。,分析设计要求:1、每秒钟闪烁1次,即亮0.5秒,灭0.5秒,如此循环;2、设计难点:如何实现0.5秒的计时(延迟、延时)?,思路之一:单片机执行语句需要时间;单片机每条语句执行所需的时间是确定的(指令周期);通过编程使单片机执行一些指令,可以实现延时;,晶振为12MHz时,1个机器周期为1us,单周期指令的指令周期为1us双周期指令的指令周期为2us,依此类推,设计目标:0.5s=500ms=500000us,考虑使用循环语句,unsignedchari,j;for(i=20;i0;i-)for(j=248;j0;j-);,MOV
16、R6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1,延时的设计,MOVR6,#20D1:MOVR7,#248DJNZR7,$DJNZR6,D1,单周期指令,1us单周期指令,1us双周期指令,2us双周期指令,2us,设晶振12MHz,延时的设计,10ms延迟的编程实现,unsignedchari,j;for(i=20;i0;i-)for(j=248;j0;j-);,设晶振12MHz,unsignedchari,j;for(i=10;i0;i-)for(j=248;j0;j-);,设晶振6MHz,延时的设计,500ms延迟的编程实现,设晶振12MHz,uchari,j,k
17、;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,uchari,j,k;for(k=50;k0;k-)for(i=20;i0;i-)for(j=248;j0;j-);,应用于延时精度要求一般的场合,延时的设计,通常设计一个任意ms延迟的延迟函数(自定义函数),voiddelay(unsignedcharucData)unsignedchari,j,k;for(k=ucDa
18、ta;k0;k-)for(i=20;i0;i-)for(j=248;j0;j-);,延时的设计,例:如题设所示电路图,要求编程控制发光二极管D1实现闪烁变化,闪烁频率1Hz。,分析电路(略),按要求编程:,#includesbitD1=P20;voiddelay(unsignedcharucData)unsignedchari,j,k;for(k=ucData;k0;k-)for(i=20;i0;i-)for(j=248;j0;j-);voidmain()while(1)/无限循环D1=0;/点亮delay(50);/0.5秒延迟D1=1;/熄灭delay(50);,延时的设计,多个LED的控
19、制,巧用移位指令,分析电路:1、由图,D1D8分别由IO引脚P2.0P2.7控制;2、依次循环点亮即:P2.0=P2.1=P2.2=P2.7=P2.03、考虑以字节为单位控制IO口状态。,例:如题设所示电路图,要求编程控制8个发光二极管以1s的间隔依次循环点亮。,#includevoiddelay(unsignedcharucData);voidmain()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;/点亮
20、D5delay(100);P2=0 xdf;/点亮D6delay(100);,P2=0 xbf;/点亮D7delay(100);P2=0 x7f;/点亮D8delay(100);voiddelay(unsignedcharucData)unsignedchari,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的控制,巧用移位指令,#includevoiddelay(unsig
21、nedcharucData);voidmain()unsignedchari,ucTemp;while(1)ucTemp=0 x01;for(i=8;i0;i-)P2=ucTemp;delay(100);ucTemp=ucTemp1;,使用移位指令和流程控制语句简化编程,赋初值,P2口输出、延时、移位,00000001111111100000001011111101,多个LED的控制,巧用移位指令,查表法的使用,如上题,适当使用移位指令可以简化位操作编程,但移位指令不是万能的,有些情况下使用移位指令往往力不从心,如:,例:如题设所示电路图,要求编程控制8个发光二极管按如下方式实现变换闪烁:左移
22、两次、右移两次、向外扩展两次、向内收缩两次、闪烁两次。,左移,右移,向外扩展,向内收缩,闪烁,#includevoiddelay(unsignedcharucData);voidmain()while(1)P2=0 xfe;/点亮D1delay(100);P2=0 xfd;/点亮D2delay(100);;,方法一:,使用移位指令,可以完成左移、右移的控制,但是在完成向外扩展和向内收缩的控制上比较麻烦。,方法二:,查表法的使用,unsignedcharcodeucTable=0 xFF,0 xFE,0 xFD,0 xFB,0 xF7,0 xEF,0 xDF,0 xBF,0 x7F,/左移两次0
23、 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 x0
24、1/结束码;,查表法:预先将复杂而又有规律的控制代码或者数据定义成一个数组,在程序执行过程中依次访问数组中的数据,可以使用简洁的语句实现复杂的控制动作,从而达到节约程序代码空间、增加程序可读性和便于修改的目的。,查表法的使用,#includeunsignedcharcodeucTable;voiddelay(unsignedcharucData);voidmain()unsignedchari;while(1)i=0;/索引值赋初值while(ucTablei!=0 x01)/不是末尾则输出P2=ucTablei;/输出控制代码i+;/索引值加一delay(100);/延迟1秒,按要求编程:,
25、如何判断数组的末尾?1、可以预先定义一个特定数据,用于表示数组的末尾。2、如果已知数组长度,则可以直接使用索引值判断;,查表法的使用,#includeunsignedcharcodeucTable56;voiddelay(unsignedcharucData);voidmain()unsignedchari;while(1)i=0;/索引值赋初值while(i56)/不是末尾则输出P2=ucTablei;/输出控制代码i+;/索引值加一delay(100);/延迟1秒,按要求编程:,如何判断数组的末尾?1、可以预先定义一个特定数据,用于表示数组的末尾。2、如果已知数组长度,则可以直接使用索引值
26、判断;,查表法的使用,查表法应用的要点:1、系统的控制要求可以由一系列控制数据表示出来;2、这些控制数据的使用具有一定规律性,如“依次逐个使用”、或者其他可以用特定的算法表示出来的规律性;3、使用查表法的一半步骤:a.根据设计要求建立控制数据数组b.对数组的索引变量进行编程控制c.通过索引变量引用控制数据,完成控制功能,(控制向量、控制参数),查表法的使用,宏的使用,#define语句的应用,宏的定义此处使用#define语句定义了一个符号常量PI,它的值是3.1415926。宏的使用定义好符号常量PI后,在编程中使用这个符号,它就等价于3.1415926。如:a=PI+2;等价于a=3.14
27、15926+2;,例:#definePI3.1415926,宏的分类:1、固定不变的宏这一类宏所代表的值或表达式在整个C文件中始终保持不变。如:#defineCONST20#defineucharunsignedchar#defineD1_ONP2_1=02、带有参数的宏这一类宏所代表的表达式根据所传递的参数的不同而发生变化。它与函数的形式类似,但有着本质的区别。如:#definesetbit(var,bit)var|=(0 x01(bit),#define语句的应用,宏的使用,2、带有参数的宏#definesetbit(var,bit)var|=(0 x01(bit),setbit(i=1;
28、k,i+1);=i=1;k|=(0 x01(i+1);,宏的使用,宏的意义:,替换,几个常用的宏,#defineucharunsignedchar#defineuintunsignedint#defineulongunsignedlong#define符号常量名常量(数字或字符等),#defineCONST20a=a+CONST;,#definesetbit(var,bit)var|=(0 x01(bit)setbit(P2,1);,P2|=(0 x01(1);,a=a+20;,宏的使用,小结:并行IO的基本应用,1、并行IO的应用概述并行IO的应用领域IO驱动电路和电平转换电路2、LED的编
29、程控制2-1sbit的使用2-2while(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按键松开时,
30、P0.0输入为1,图中,按键和电阻可以交换位置,交换后输入逻辑刚好相反。,例:如题设所示电路图,要求编程对按键次数进行计数,按一下键,计数值加一。,分析电路:1、按键由P2.0控制;2、按键按下时为0,按键松开时为1;因此判断是否按下按键,只要判断P2.0口输入是否为0即可。,单个按键的控制,1,0,未按键,按下,按键松开,1,键按下时P2.0口的逻辑电平变化:,人为按键通常按下时间为几百毫秒。,单个按键的控制,#include#defineucharunsignedcharsbitKEY=P20;voiddelay(ucharucData);voidmain()ucharucCounter;
31、ucCounter=0 x00;/计数初值KEY=1;/准双向口while(1)if(KEY=0)ucCounter+;/计数值加一delay(30);/延迟300ms,按要求编程:,P2口是准双向口,所以用作输入时,应当先向IO口写1;加入延迟,防止对一次短暂按键的多次响应,延迟时间大于等于人的一次正常按键的持续时间。如果按下按键后持续较长时间不松开,会不停计数(每隔0.3秒加一),这与电脑键盘的工作方式相似。如果希望一次按下只加一次,怎么办?,单个按键的控制,#include#defineucharunsignedcharsbitKEY=P20;voidmain()ucharucCount
32、er;ucharucPreKey;ucCounter=0 x00;/计数初值KEY=1;/准双向口ucPreKey=1;while(1)if(KEY=0)/存储前一状态,要求一次按键计数值只加一次。,ucPreKey保存上一次扫描时按键的输入状态(KEY=0)voidmain()ucharucCounter;ucharucPreKey;ucCounter=0 x00;/计数初值KEY=1;/准双向口ucPreKey=1;while(1)if(KEY=0)/存储前一状态,当存在按键抖动时,右侧程序将对抖动时的每一个下降沿进行计数,从而出错。因此应当采取一定的措施消除抖动的影响,断开,按下,单个按
33、键的控制,#include#defineucharunsignedcharsbitKEY=P20;voidmain()ucharucCounter,ucPreKey;ucCounter=0 x00;/计数初值KEY=1;/准双向口ucPreKey=1;while(1)if(KEY=0)/存储前一状态,要求消除按键抖动的影响,实现一次按键计数值只增加一次。,实现方法:1、软件:延迟再扫描2、硬件:外接额外电路(触发器、滤波电路)(略),单个按键的控制,按要求编程:,行列式键盘的控制,键盘是多按键输入设备,键盘输入信息的主要过程如下:1、判断是否有键按下;2、确定按下的是哪一个键;3、把此键代表的
34、信息翻译成计算机所能识别的代码,如ASCII或其他特征代码。,编码键盘和非编码键盘上述2、3步主要由硬件完成,称为编码键盘;单片机完成和键盘的通讯编程;上述2、3步主要由软件完成,成为非编码键盘;单片机完成键盘驱动和编码的编程。(常用),当单片机系统所需的按键数量比较多时,如果继续采用一个IO引脚控制一个按键的接口方式,所需的IO引脚较多;为了节约引脚资源,一般采用行列式键盘的接口方式。,例:如右图,需要控制16个按键。如果采用行列式键盘只需要8个引脚就可以了,按键数量越多,行列式键盘节约引脚的优势就越明显。,行列式键盘的控制,例:如题设所示电路图,要求编写4x4键盘的扫描程序,返回按键代码。
35、,分析电路:当没有按键按下时列信号P1.4P1.5输入均为1当有按键按下时如果行信号P1.0P1.3输出为0,则按键对应的列信号输入为0。,行列式键盘的控制,例:如题设所示电路图,要求编写4x4键盘的扫描程序,返回按键代码。,编程思路:1、判断是否有键按下全扫描,2、确定按下的是哪一个键(确定按键代码)逐行扫描,行列式键盘的控制,按键编码,为了识别按键,必须对键盘中的按键进行编码,每一个按键都有一个确定的按键代码。如果使用非编码键盘,按键的编码方式可以由用户自由定义。,如:,2,1,行列式键盘的控制,按要求编程:,全扫描四行一起扫描,以判断是否有键按下;同时采用了延迟再扫描的方法进行消抖。逐行
36、扫描四行依次扫描,判断按键的行列位置;生成按键代码使用不同的编程语句可以生成不同的按键代码。,ucharkbscan(void)ucharsccode,recode;P1=0 xf0;/低四位输出、高四位输入if(P1/如果没有键按下,返回0 x00,行列式键盘,#include#defineucharunsignedchar#defineuintunsignedintvoiddelay(ucharucData);ucharkbscan();voidmain()ucharkey;while(1)key=kbscan();/扫描按键,获取按键代码switch(key)case0 x00:;/如果
37、不按键,break;case0 x11:;/如果按下键1,break;case0 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、数码管的
38、工作原理,数码管的结构共阳极数码管共阴极数码管数码管的显示段码,数码管显示的内容位码,(即com端)数码管是否点亮,g,1、数码管的工作原理,数码管的段码(以共阴数码管为例),MSB,LSB,1、数码管的工作原理,多个数码管的控制静态显示,每个数码管单独控制,所有数码管同时点亮动态显示,段码共用,位码分别控制,每个数码管循环点亮,段码输入,位码扫描,1、数码管的工作原理,多个数码管的控制静态显示,每个数码管单独控制,所有数码管同时点亮动态显示,段码共用,位码分别控制,每个数码管循环点亮,段码输入,位码扫描,例:如题设所示电路图,控制6个共阴数码管使用动态显示的方式显示“123456”。,2、多
39、位数码管的动态显示,段码,位码,驱动电路(为什么?怎样实现?),#include#defineucharunsignedcharucharcodeLED_seg10=0 x3f,0 x06,0 x5B,0 x4F,0 x66,0 x6D,0 x7D,0 x07,0 x7F,0 x6F;ucharcodeLED_bit6=0 x01,0 x02,0 x04,0 x08,0 x10,0 x20;voiddelay1ms(ucharucData);voidmain()uchari;ucharucData6=1,2,3,4,5,6;while(1)for(i=0;i6;i+)P2=LED_segucD
40、atai;P0=LED_biti;delay1ms(5);,按要求编程:段码和位码输出采用查表法;6个数码管以5ms左右的间隔依次点亮,显示对应的数据。如果数码管亮度太低,或者数码管有明显的闪烁,则通过调节间隔时间,可以使显示稳定。(怎样调节?)显示效果如何?亮度、残影,2、多位数码管的动态显示,while(1)convert(a);for(i=0;i6;i+)P2=LED_segucDatai;P0=LED_biti;delay1ms(5);P0=0 x00;P2=0 x00;P0=0;,按要求编程:段码和位码输出采用查表法;6个数码管以5ms左右的间隔依次点亮,显示对应的数据。如果数码管亮
41、度太低,或者数码管有明显的闪烁,则通过调节间隔时间,可以使显示稳定。(怎样调节?)显示效果如何?亮度、残影(Ghost),2、多位数码管的动态显示,二、MCS-51单片机接口技术,2-0并行IO的基本应用2-1键盘接口2-2显示器接口2-3定时/计数器的使用2-4串行通信接口2-5外部总线接口2-6外部总线接口的应用,数码管显示实验:“实现数值065535的变化显示”,问题:如何使数值变化的速度减慢?(如每隔1秒数值加1),voidmain(void)unsignedchari,j;unsignedintuiTemp=0;while(1)convert(uiTemp);for(i=0;i6;i
42、+)P2=LED_segi;/送段码P0=LED_biti;/送位码delay1ms(5);/5ms延迟j+;if(j=33)/约1秒uiTemp+;j=0;,方法一?方法二?,voidmain(void)unsignedchari,j;gluiTemp=0;TMOD=0 x01;TH0=(6553650000)/256;TL0=(6553650000)%256;ET0=1;EA=1;TR0=1;while(1)convert(gluiTemp);for(i=0;i6;i+)P2=LED_segi;/送段码P0=LED_biti;/送位码delay1ms(5);/5ms延迟P0=0;,例1:实
43、现数值065535的变化显示,每隔50ms数值加1。(设晶振频率为12MHz),#includeunsignedintgluiTemp;voidTimer0()interrupt1using1TH0=(6553650000)/256;TL0=(6553650000)%256;gluiTemp+;,voidmain(void)unsignedchari,j;gluiTemp=0;glucCounter=0;TMOD=0 x01;TH=(6553650000)/256;TL=(6553650000)%256;ET0=1;EA=1;TR0=1;while(1)convert(gluiTemp);fo
44、r(i=0;i6;i+)P2=LED_segi;/送段码P0=LED_biti;/送位码delay1ms(5);/5ms延迟P0=0;,例1:实现数值065535的变化显示,每隔1s数值加1。(设晶振频率为12MHz),#includeunsignedcharglucCounter;unsignedintgluiTemp;voidTimer0()interrupt1using1TH0=(6553650000)/256;TL0=(6553650000)%256;glucCounter+;if(glucCounter=20)gluiTemp+;glucCounter=0;,定义一个全局变量,实现计
45、数功能。,例2:设晶振频率fosc=6MHz,要求在P2.0脚上输出周期为2ms的方波。解:采用定时器T0的方式1进行编程思路:采用定时间隔1ms,每次时间到P2.0取反并且启动下一次定时,从而实现2ms周期的方波。定时所需计数次数n=1000us2us500由于计数器递增计数,为得到500个计数之后的定时器溢出,必须给定时器置初值65536500。,MCU,P2.0,2ms,2-3、定时/计数器的使用,#includesbitP2_0=P20;voidT0_ISR()interrupt1using1/T0中断服务程序入口TH0=(65536500)/256;/计数初值重载TL0=(65536
46、500)256;P2_0=!P2_0;/P2.0取反voidmain(void)TMOD=0 x01;/T0工作在定时器方式lTH0=(65536500)/256;/计数初值TL0=(65536500)256;ET0=1;EA=1;/中断使能TR0=1;/启动T0while(1);,使用中断方式进行编程:,#includesbitP2_0=P20;voidmain(void)TMOD=0 x01;/T0工作在定时器方式lTH0=(65536500)/256;/计数初值TL0=(65536500)256;TR0=1;/启动T0while(1)TH0=(65536500)/256;/计数初值TL0
47、=(65536500)256;while(!TF0);P2_0=!P2_0;TF0=0;,使用查询方式进行编程:,查询TF0是否为1,如果为1则说明溢出(定时时间到),例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为2ms,占空比为75的矩形波。在例2基础上应作何修改?,2ms,占空比50%,2ms,占空比75%,1ms,1ms,1.5ms,0.5ms,2-3、定时/计数器的应用实例,2ms,占空比75%,解:采用定时器T0的方式1进行编程思路:采用定时间隔0.5ms,并设置一个全局变量i对定时器的中断次数进行计数,小于等于3时输出高电平,等于4时输出低电平,以此循环。,2-3
48、、定时/计数器的应用实例,例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为2ms,占空比为75的矩形波。在例2基础上应作何修改?,#includereg51.hsbitP1_0=P10;unsignedchari;voidTIMER0_ISR(void)interrupt1TH0=(65536-250)/256;TL0=(65536-250)%256;i+;if(i=3)P1_0=1;if(I=4)P1_0=0;i=0;,voidmain(void)TMOD=0 x01;TH0=(65536-250)/256;TL0=(65536-250)%256;ET0=1;EA=1;TR0
49、=1;i=0;P1_0=1;while(1);,2-3、定时/计数器的应用实例,例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为2ms,占空比为75的矩形波。在例2基础上应作何修改?,#includereg51.hsbitP1_0=P10;unsignedchari;voidTIMER0_ISR(void)interrupt1TH0=(65536-250)/256;TL0=(65536-250)%256;i+;if(i=3)P1_0=0;if(I=4)P1_0=1;i=0;,voidmain(void)TMOD=0 x01;TH0=(65536-250)/256;TL0=(65
50、536-250)%256;ET0=1;EA=1;TR0=1;i=0;P1_0=1;while(1);,2-3、定时/计数器的应用实例,例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为2ms,占空比为75的矩形波。在例2基础上应作何修改?,思考:如果周期2ms占空比要求是35%,可以采用采用定时间隔0.5ms吗?,(不可以),思路:高电平持续时间35%,低电平持续时间65%,应考虑取其公因数。一般取最大公因数。所以可取时间间隔为0.1ms。高电平持续7个定时间隔,低电平持续13个时间间隔。,#includereg51.hsbitP1_0=P10;unsignedchari;voi
51、dTIMER0_ISR(void)interrupt1TH0=(65536-50)/256;TL0=(65536-50)%256;i+;if(i=7)P1_0=0;if(I=20)P1_0=1;i=0;,voidmain(void)TMOD=0 x01;TH0=(65536-50)/256;TL0=(65536-50)%256;ET0=1;EA=1;TR0=1;i=0;P1_0=1;while(1);,2-3、定时/计数器的应用实例,例3:设单片机fosc=6MHz,要求在P2.0引脚上输出周期为2ms,占空比为65的矩形波。在例2基础上应作何修改?,例4:设晶振频率fosc=6MHz,要求在
52、P2.0脚上输出周期为2s的方波。(同例1)思路:定时间隔为1秒,使用T0无法直接得到1秒的定时。因此,需要使用多次定时复合的方法来得到较长时间的定时。,长定时的实现,2-3、定时/计数器的应用实例,P1.0,T1,P1.7,MCU,200ms,满5次溢出从而实现1秒定时,方法一使用两个定时/计数器实现1秒定时:T0工作在定时方式1,定时100ms,从而控制P1.0输出周期为200ms的方波;将这个方波输入到T1,T1工作在计数方式2,计数5次后溢出,控制P2.0反向,从而实现周期为2秒的方波输出。,#includesbitP1_0=P10;sbitP1_7=P17;voidTimer0()i
53、nterrupt1using1TH0=(6553650000)/256;TL0=(6553650000)%256;P1_0=!P1_0;voidTimer1()interrupt3using2P1_7=!P1_7;voidmain()P1_7=0;P1_0=1;,程序代码:,TMOD=0 x61;TH0=(6553650000)/256;TL0=(6553650000)%256;TH1=2565;TL1=2565;IP=0 x08;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;while(1);,方法二仅使用一个定时/计数器实现使用方法一时需要使用两个定时器和两个IO引脚,资源消耗比较多。如何使用较少的资源实现同样的定时功能?,#includesbitWAVE=P17;unsignedcharglucCou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业员工个人绩效评估表
- 能源投资机会分析师绩效评定表
- 教育课程研发经理绩效衡量表
- 阿坝州12345政务服务热线服务中心招聘(2人)笔试备考试题及答案解析
- 化工企业生产安全管理员工作KPI考核表
- 关于产品推广策略调整的商洽函(4篇)
- 2026年中国烟草总公司云南省公司人员招聘考试模拟试题及答案
- 技术开发工程师绩效评定考核表
- 关于2026年年度报告的邀请函3篇范文
- 2025~2026学年湖南岳阳县第一中学度第二学期期末高一英语试卷
- T∕STACAES 011-2025 自动驾驶环卫保洁作业机具技术要求
- 中国兵器内蒙古第一机械集团有限公司招聘笔试题库2025
- 人教精通版(2024)四年级上册英语全册教案
- 铁路隧道掘进机法技术规程
- DB32∕T 4937-2024 土地征收前社会稳定风险评估规范
- DB32/T 3932-2020“一稻三虾”生态种养技术规程
- 课本剧知识教学课件
- 列车清洗机产品介绍
- 胃排空迟缓的护理
- 《钠离子电池的应用》课件
- 9 短诗三首 繁星(一五九)说课稿-2023-2024学年统编版语文四年级下册
评论
0/150
提交评论