《项目2简单IO口控制电路的制作.ppt》由会员分享,可在线阅读,更多相关《项目2简单IO口控制电路的制作.ppt(53页珍藏版)》请在三一办公上搜索。
1、项目二 简单I/O口控制电路设计,单片机的I/O口控制电路是单片机应用系统设计中最基本、最简单的应用。学会制作单片机应用电路是学好单片机的重要一步。在单片机控制系统中,通过I/O口进行开关量的控制占较大的比重,如LED发光二极管的亮灭、电动机的启停控制等。,任务一 闪烁灯的制作任务二 广告灯的制作任务三 花样广告灯的制作任务四 多路开关状态指示 任务五 继电器控制照明设备,任务一 闪烁灯的制作,在日常生活中,有各种各位的闪烁灯,有的应用于娱乐场所,有的应用于店面等的装饰,有的起警示作用。如舞台灯、汽车转向灯、十字路口的黄闪灯等,如图所示。,任务要求:单片机I/O口作输出口,接8个发光二极管,通
2、过编程实现一个或多个发光二极管闪烁效果。常见的发光二极管主要有红色、绿色、黄色等单色发光二极管,另外还有双色的二极管。驱动LED可分为低电平点亮和高电平点亮两种。由于P1P3口的内部上拉电阻较大,为2040k,属于“弱上拉”,因此P1P3口输出高电平电流很小(为3060)。而低电平时,下拉MOS管导通,可吸收1.615mA的灌电流,负载能力强。因此在设计中,一般采用低电平驱动方式。,任务分析,单片机C语言编程的基本方法,例:用C语言编写一个点亮接在P1口的低电平驱动的发光二极管的程序。#include/51系列单片机头文件int main(void)/主程序main函数while(1)/主程序
3、中设置死循环程序,保证周而复始运行/*所有控制程序写在此区域(while循环内)*/P1=0 xfe;/点亮一个发光二极管,相关知识,1、C51中文件包含及常用头文件的说明,(1)文件包含 文件包含是指一个程序文件将另一个指定的文件的全部内容包含进去。文件包含的一般格式为:#include 或#include“文件名”如,#include/引用寄存器文件,(2)头文件 在程序设计中引用头文件,其实际意义就是将这个头文件中的全部内容放到引用头文件的位置处,免去每次编写同类程序都要将头文件中的语句重复编写。C51头文件通常有reg51.h,reg52.h,math.h,ctype.h,stdio.
4、h,intrins.h。,2、主函数main()main函数的基本格式:int main(void)/主程序main函数/单片机复位后总是从这里开始执行 语句1;int表示main函数的返回值是int(整数)型,int可以省略。如果main函数中不加返回语句的话,默认返回0。小括号中的内容表示函数的参数,void表示无参数,即不带任何参数。void可省略。main函数后面的花括号中的内容就是这个函数的所有代码。每条独立语句的末尾都要加上分号,一行可以写多条语句。,3、while循环语句 while循环语句是常用的条件循环语句,可用来做固定次数的循环程序和不定次数的循环程序,其格式如下:whil
5、e(表达式)语句(可为空);/循环体 特点:先判断表达式,后执行内部语句。原则:若表达式不是0,即为真,那么执行语句。否则跳出while语句,执行后面的语句。,需要注意的三点:(1)在C语言中我们一般把“0”认为是“假”,“非0”认为是“真”,也就是说,只要不是0就是真。(2)内部语句可为空,就是说while后面的大括号里什么都不写也是可以的,如“while(1);”既然大括号里什么也没有,那么我们就可以直接将大括号也不写,再如“while(1);”中“;”一定不能少,否则while()会把跟在它后面第一个分号前的语句认为是它的内部语句。(3)表达式可以是一个常数,一个等式,一个不等式,一个运
6、算或一个带返回值的函数。对于while(1)语句,因为while里的表达式是1,永远为真,所以程序将永远循环执行这个大括号中的所有语句。,需要说明的是,while语句还有另一种形式:do语句;/循环体while(循环条件)执行过程是先执行循环体的内容,再进行判断循环条件,如果满足,则返回继续执行循环。在此形式中,循环体的内容至少被执行一次。,4、注释的写法 在c语言中,注释有两种写法:/.,两个斜杠后面跟着的为注释语句。这种写法只能注释一行,当换行时,又必须在新行上重新写两个斜杠。/*.*/,斜杠与星号结合使用,这种写法可以注释任意行,即斜杠星号与星号斜杠之间的所有文字都作为注释。所有注释都不
7、参与程序编译,编译器在编译过程会自动删去注释,注释的目的是为了使人们读程序方便,一般在编写较大的程序时,分段加入注释,因为有了注释,其代码的意义便一目了然了。,硬件电路设计,P1.0口的LED亮只要把P1.0口的电平变成低电平;P1.0口的LED熄灭,就应将P1.0口的电平变成高电平。,1.点亮发光二极管 欲点亮某只发光二极管,只需使与其相连的口线输出低电平即可。如点亮从高位到低位的第1,3,5,7只发光二极管。实现的方法有字节操作和位操作。2.让发光二极管闪烁 闪烁,顾名思义,就是将LED点亮再熄灭,不断反复。,软件设计,(1)main函数拼写错误,CPU无法找到主程序而无法运行;(2)自定
8、义变量,在后面引用时拼写错误;(3)字母大小写错误,如I/O端口P小写;(4)数字“0”写成字母“o”;(5)语句结束少“;”;(6)花括号不配对,漏写或多写。,程序调试中常见的错误,目前广告灯的应用非常广泛,用于装饰、广告等目的,如图所示。其应用场所分布于道路、街道两旁,以及影剧院、展览销会、商业闹市区、车站、机场、码头、公园等公共场所。,任务二 广告灯的制作,实现广告流水灯:即先灭掉前一个灯,然后点亮后一个灯,再延时一段时间,不断循环。,任务分析,相关知识,一、for语句及简单延时语句,for语句格式:for(表达式1;表达式2;表达式3)语句(内部可为空)执行过程:第1步,求解一次表达式
9、1。第2步,求解表达式2,若其值为真(非0即为真),则执行for中语句,然后执行第3步;否则结束for语句,直接跳出,不再执行第3步。第3步,求解表达式3.第4步,跳到第2步重复执行。需要注意的是,三个表达式之间必须用分号隔开。,利用for语句和while语句可以写出简单的延时语句如 unsigned char i;for(i=2;i0;i-);为了写出长时间的延时语句,可以通过嵌套来实现。unsigned char i,j;for(i=100;i0;i-)for(j=200;j0;j-);上面这个例子是for语句的两层嵌套,相当于共执行了100200次for语句。通过这种嵌套便可以写出比较长
10、时间的延时语句,还可以进行3层,4层嵌套来增加时间,或是改变变量类型,将变量初值再增大也可以增加执行时间。,二、延时函数,函数是指能够执行特定功能和任务的程序代码段。一个完整的C51程序是由一个主函数和若干个其他函数组成。主函数是main()函数。有且只有一个main()函数。,1、无参函数的定义形式 类型标识符 函数名()声明部分 语句 类型标识符和函数名称为函数头。类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。函数名是由用户定义的标识符,函数名后有一个空括号,其中无参数,但括号不可少。中的内容称为函数体。在函数体中声明部分,是对函数体内部所用到的变量的类型说明。在很多情
11、况下都不要求无参函数有返回值,此时函数类型符可以写为void。,延时改写成一个函数:void Delay()unsigned char i,j;for(i=100;i0;i-)for(j=200;j0;j-);,2、有参函数定义的一般形式类型标识符 函数名(形式参数表列)声明部分语句有参函数比无参函数多了一个内容,即形式参数表列。在形参表中给出的参数称为形式参数,它们可以是各种类型的变量,各参数之间用逗号间隔。在进行函数调用时,主调函数将赋予这些形式参数实际的值。形参既然是变量,必须在形参表中给出形参的类型说明。,例如,定义一个带参数的延时函数可写为:void Delay(unsigned i
12、nt DT)unsigned int i=0,j=0;for(i=0;iDT;i+)for(j=0;j150;j+);,3、延时函数的调用例:delay();或Delay(30000);,三、流程图,简单的程序可以直接编写源程序,而对于复杂的程序,往往不能直接完成源程序的编写,为了把复杂的工作变得条理化、直观化,通常在编写程序前先设计流程图。所谓流程图,就是用带箭头的线把矩形框、菱形框和圆角矩形框等连接起来,以表示实现这些步骤或过程的顺序。,开始和结束符号,判断分支符号,模块功能符号,程序流向符号,如:闪烁灯程序流程图,硬件电路设计,软件设计,只要将8个发光二极管轮流点亮和熄灭,8个LED就会
13、呈现出一亮一暗地形成流水灯的效果。,一、移位运算符及循环移位函数,(1)移位运算符 移位运算符能够对变量中的数进行移位运算,包括左移位运算符“”,其格式如下:a=a2;/将变量a中的数循环右移2位后赋给a注意:移位后末位补“0”,方法二,相关知识,(2)循环移位函数 循环移位函数能够对变量中的数进行循环移位,属于MCS-51的内部函数,需要包含头文件“intrins.h”。以字符变量的循环移位函数为例来说明循环移位函数的使用,其格式如下:a=_crol_(a,2);/将变量a中的数循环左移1位后赋给a a=_cror_(a,2);/将变量a中的数循环右移1位后赋给a,二、if 条件语句,if语
14、句用来判定所给定的条件是否满足,根据判定结果决定执行给出的两种操作之一。if语句的基本结构如下:if(表达式)语句;括号中的表达式成立时,程序执行大括号内的语句,否则程序跳过大括号中的语句部分而直接执行下面其他语句。,C51语言提供3种形式的if语句:形式一:if(表达式)语句;形式二:if(表达式)语句1;else 语句2;形式三:if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;else if(表达式m)语句m;else 语句n;,软件设计,#include delay()unsigned int i;for(i=0;i30000;i+);main
15、()unsigned char a;P1=0 xfe;while(1)delay();a=P11;P1=a|0 x01;if(P1=0 xff)P1=0 xfe;,main()unsigned char a;P1=0 xfe;while(1)delay();P1=_crol_(P1,1);,任务二中的广告灯的设计中都是有规律的,可以利用左、右移运算符或者左、右移函数就可实现。如果要实现复杂的、没有规律的变换,该如何做呢?,任务三 花样广告灯的制作,数组,C51语言的构造数据类型主要有数组、指针和结构等。在单片机系统中,数组的应用比较广泛,指针则次之,结构用的相对较少。数组是同类型变量的一个有序
16、集合。数组用一个名字来标识,称为数组名。数组中的每个变量称为数组元素。数组有一维、二维、三维和多维数组之分。C51语言中常用的一维、二维数组和字符数组。数组中各元素的顺序用下标表示,下标为n的元素可以表示为数组名n。改变 中的下标就可以访问数组中所有的元素。,相关知识,类型说明符 数组名元素个数;int demo110;初始化:int a5=1,2,3,4,5;int b6=1,2,6;数组的一个非常有用的功能是查表。如:#define uchar unsigned char uchar code SEG11=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,
17、0 x07,0 x7f,0 x6f;/*共阴极LED的显示字符段码表*/,const unsigned char sz25=0 xFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F,0X7F,0XBF,0XDF,0XEF,0XF7,0XFB,0XFD,0XFE,0XFF,0X7E,0XBD,0XDB,0XE7,0XDB,0XBD,0X7E,0XFF;/定义花样数据,软件设计,while(1)for(b=0;b25;b+)P1=szb;delay();/延时一段时间,单片机的P1.0P1.3接四个发光二极管,P2.0P2.3接四开关,编程将开关的状态反映到发光二极管上。开
18、关闭合,对应的灯亮,开关断开,对应的灯灭。,任务四 多路开关状态指示,switch语句,相关知识,当使用条件语句来编写超过3个以上的分支程序,会使程序变得不那么清晰易读。开关语句(switch)既可以实现处理多分支选择的目的,又可以使程序结构清晰。,switch语句是多分支选择语句一般形式如下:switch(表达式)case 常量表达式1:语句1;break;case 常量表达式2:语句2;break;.case 常量表达式n:语句n;break;default:语句n+1;,硬件电路设计,a=P2;/读取开关的状态a=a,软件设计,用单片机实现对照明设备的控制,如白炽灯,即实现用弱电控制强电
19、。通过开关实现对灯的控制。,任务五 开关控制继电器,继电器,继电器是一种电控制器件,具有控制系统(输入回路)和被控制系统(输出回路)之间的互动关系,实际上就是用小电流控制大电流运作的一种“自动开关”,在电路中起着自动调节、安全保护、电路转换等作用。,相关知识,固态继电器内部结构,由于单片机输出的控制信号微弱,所以使用了固态继电器来进行这个信号转换,进而控制外部电路。固态继电器1口和2口外接220V电源。3口接+5V供电,4口接单片机控制端口,硬件电路设计,高电平驱动,低电平驱动,(1)若继电器的工作电压为5V,则两种接法都正确。(2)若继电器的工作电压大于5V,如12V,则电路不能工作,因单片机输出的高电平只有+5V,而继电器的工作电压+12V使三极管发射结处于正偏,继电器不有释放,而这个电压加在单片机输入端可能损坏单片机。(3)单片机驱动继电器时一般使用高电平驱动方式更加安全可靠。(4)1N4148二极管起到保护驱动三极管的作用。因在继电器由吸合到断开的瞬间,将在继电器的线圈上产生上负下正的感应电压,和电源电压一起加在驱动电路上,有可能损坏驱动电路,二极管可以将线圈两端的感应电压钳位在0.7V左右。,软件设计,作业:(1)单片机的P1.0P1.3接四个发光二极管,P2.0P2.1接两个开关,编程实现如下表所示的控制方式。(要求画出硬件原理图),