配色: 字号:
LED循环点亮
2013-01-08 | 阅:  转:  |  分享 
  
陳慶逸、林柏辰編著---文魁資訊ARM嵌入式系统项目二LED循环点亮LED控制电路控制八只发光二极管按一定的规律循环点亮工作过程
P1口接发光二极管(LED)的阴极,P1口的管脚输出低电平时对应的发光二极管点亮。问题:LED采用的
是共阴极接法还是共阳极接法?为什么P1口的管脚输出低电平,对应的发光二极管点亮?通过程序按一定的规律向P
1口的管脚输出低电平和高电平,控制八只发光二极管循环点亮。问题:程序怎么使P1口的管脚循环输出低电平和高
电平?LED循环点亮功能实现分析由于LED循环点亮电路的LED是采用共阳极接法,这样我们就可以通过“0”和“1”来控制LED
的亮和灭。例如:在P1口输出十六进制数0xfe(二进制11111110B),D1被点亮。LED循环点亮功能实现过程如下:8个
LED全灭,控制码为0xff;D1点亮,P1口输出0xfe,取反为0x01(二进制00000001B),初始控制码为0x01;
D2点亮,P1口输出0xfd,取反为0x02(二进制00000010B),控制码为0x02;D3点亮,P1口输出0xfb,取反
为0x04(二进制00000100B),控制码为0x04;……D8点亮,P1口输出0x7f,取反为0x80(二进制10000
000B),控制码为0x80;重复第二步,这样就可以实现LED循环点亮。LED控制程序(C语言)Voidmain()
{unsignedchari;unsignedchartemp;P1=0xff;
//十六进制全1,熄灭所有LEDwhile(1){temp=0x01;
//第一位为1for(i=0;i<8;i++){P1
=~temp;//temp值取反送P1口Delay();
temp=temp<<1;//temp值左移一位}}思考如何改
变循环点亮的方向?并行I/O端口电路单片机有4组8位并行I/O端口,称为P0口、P1口、P2口和P3口;每个端口都各有8条
I/O口线,每条I/O口线都能独立地用作输入或输出;P0口负载能力为8个TTL门电路,P1口、P2口和P3口负载能力为4个TTL
门电路;归入特殊功能寄存器之列,具有字节寻址和位寻址功能。P0口的结构由1个数据输出锁存器(D触发器)、2个三态数据输入缓冲
器、1个输出控制电路和1个输出驱动电路组成。输出控制电路由1个转换开关MUX、1个与门及1个非门组成;输出驱动电路由一对场效应
管(V1和V2)组成,其工作状态受输出控制端的控制。P0口有两种功能通用I/O口地址/数据分时复用总线P0口
作通用I/O口使用作为通用的I/O口使用时,内部的控制信号为低电平,封锁与门,将输出驱动电路的上拉场效应管(V1)截止,同时使多
路转接电路MUX接通锁存器Q端的输出通路。注意当P0口进行一般的I/O输出时,由于输出电路是漏极开路电路,因此必须外接上拉电
阻才能有高电平输出;当P0口进行一般的I/O输入时,必须先向电路中的锁存器写入“1”,使场效应管(V2)截止,以避免锁存器为“0
”状态时对引脚读入的干扰,因为如果V2管是导通的,不论P0.X引脚上的状态如何,输入都会是低电平,将导致输入错误。P0口作地址
/数据分时复用总线使用当输出地址或数据时,由内部发出控制信号,打开上面的与门,并使多路转接电路MUX将内部地址/数据线与驱动场
效应管(V2)接通。若地址/数据线为1,则V1导通,V2截止,P0口输出为1;反之V1截止,V2导通,P0口输出为0。而当输入数
据时,读引脚使三态数据输入缓冲器打开,数据信号则直接从引脚通过数据输入缓冲器进入内部总线。P1口的结构P1口通常作为通用I/
O口使用的,在电路结构上与P0口有一些不同之处:首先它不再需要多路转接电路MUX;其次是电路的内部有上拉电阻,与场效应管共同组
成输出驱动电路。P1口工作过程当作为输出口时,1写入锁存器,Q(非)=0,场效应管截止,内部上拉电阻将电位拉至“1”,此时该
口输出为1,当0写入锁存器,Q(非)=1,场效应管导通,输出则为0。当作为输入口时,必须先向锁存器写1,Q(非)=0,场效应管截
止,此时该位既可以把外部电路拉成低电平,也可由内部上拉电阻拉成高电平。P2口的结构它由一个数据输出锁存器(D触发器)、两个三
态数据输入缓冲器、一个转换开关MUX、一个数据输出驱动电路和控制电路组成。P3口当作为I/O使用时,第二功能信号引线应保持高
电平,与非门开通,以维持从锁存器到输出端数据输出通路的畅通。当输出第二功能信号时,该位的锁存器应置“1”,使与非门对第二功能信
号的输出是畅通的,从而实现第二功能信号的输出。【技能训练2-1】P0口外接上拉电阻本电路设计和模块三LED循环点亮电路基本
一样,差别是:使用了排阻、P0口接LED的阴极以及在P0口和LED阴极之间外接了上拉电阻排阻八个电阻的功能是完全一样的,加
工到一个器件里面,这个器件通常称之为排阻。为了在电路板上占很小的地方,方便安装和生产,在电路设计时常常选择排阻。PR1和PR2都
是排阻,阻值分别为4.7K8和220Ω8。PR1排阻是上拉电阻,其功能是在这个引脚没有信号的时候,起到电位上拉的作用。PR2和
普通的电阻用途没有任何不同,在这里面起到限流作用,使通过LED的电流被限制在十几个毫安左右。AT89C51内存空间内部程
序存储器(FLASH)4K字节外部程序存储器(ROM)64K字节内部数据存储器(RAM)256字节外部数据存储
器(RAM)64K字节低128个字节寄存器区(单元地址为00H~1FH)共有4组寄存器,每组8个寄存单元,
各组都以R0~R7作寄存单元编号。位寻址区(单元地址为20H~2FH)既可作为一般RAM单元使用,进行字节操作,也可
以对单元中每一位进行位操作。用户区(单元地址为30H~7FH)供用户使用的一般RAM区,没有任何规定或限制,一般应用
中常把堆栈开辟在此区中。高128个字节高128单元是供给专用寄存器使用的,也称为特殊功能寄存器,单元地址为80H~FFH。
特殊功能寄存器位地址空间复位后内部各寄存器的数据值PSW程序状态字用于存放程序运行中的各种状态信息。CY(PSW
.7):高位进位标志位。常用“C”表示。AC(PSW.6):辅助进位标志位。F0(PSW.5):用户标志
位。RS1(PSW.4):寄存器组选择位1。RS0(PSW.3):寄存器组选择位0。OV(PSW.2):溢出
标志位。-(PSW.1):保留位,无定义。P(PSW.0):奇偶校验位,若累加器(A)中的“1”的
位个数是奇数个则P=1,偶数个则P=0。寄存器组的选择ACC累加器8位寄存器,是最常用的专用寄存器,功能较多,地位重要。
既可用于存放操作数,也可用来存放运算的中间结果。MCS-51单片机中大部分单操作数指令的操作数就取自累加器,许多双操作数指令中
的一个操作数也取自累加器。。B寄存器B寄存器是一个8位寄存器,主要用于乘除运算。乘法运算时,B存乘数。乘法操作后,乘积的高8
位存于B中。除法运算时,B存除数。除法操作后,余数存于B中。此外,B寄存器也可作为一般数据寄存器使用。PC程序计数器作用是
控制程序的执行顺序。其内容为将要执行指令的地址,寻址范围达64KB。PC有自动加1功能,从而实现程序的顺序执行。PC没有地
址,是不可寻址的,因此用户无法对它进行读写,但可以通过转移、调用、返回等指令改变其内容,以实现程序的转移。地址不在SFR(专用寄
存器)之内,一般不计作专用寄存器。DPTR数据指针数据指针为16位寄存器。编程时,DPTR既可以按16位寄存器使用,也可以
按两个8位寄存器分开使用,即:DPH:DPTR高位字节
DPLDPTR低位字节SP堆栈指针堆栈是一个特殊的存储区,用来暂存数据和地址,它是按“先进后出”的原则存取
数据的。堆栈共有两种操作:进栈和出栈。问题:复位后,SP的值是多少?为什么,堆栈通常设在
用户区(30H~7FH)?中断源向量地址“头文件包含”处理所谓“头文件”是指一个文件将另外一个文件的内容全部包含进来。
头文件一般在C:\KELL\C51\INC下,INC文件夹里面有不少头文件,并且里面还有很多以公司分类的文件夹,里面也都是相关产品
的头文件。在单片机中用C语言编程时,往往第一行就是头文件或者其它的自定义头文件。特殊功能寄存器在AT89X52.H中定义符
号P1_0表示P1.0引脚程序存储器程序存储器是用于存放用户程序、数据和表格等。它是以程序计数器PC作为地址指针,
MCS-51的程序计数器PC是16位的,所以MCS-51具有64KB程序存储器寻址空间。对于内部无ROM的8031单片机,它的程
序存储器必须外接,空间地址为64kB,此时单片机的EA端必须接地,强制CPU从外部程序存储器读取程序。对于内部有ROM的单片机,
正常运行时,则需接高电平,使CPU先从内部的程序存储中读取程序,当PC值超过内部ROM的容量时,才会转向外部的程序存储器读取程序。
MCS-51ROM配置图当EA=1时,程序从内部ROM开始执行,当PC值超过内部ROM容量时会自动转向外部ROM空间。
当EA=0时,程序从外部存储器开始执行。51子系列ROM配置图52子系列ROM配置图具有特殊功能的地
址启动地址单片机启动复位后,程序计数器的内容为0000H,所以系统必须从0000H单元开始执行程序。因而0000H是启动地址
,也称为系统程序的复位入口地址。中断服务程序入口地址是专门用于存放中断服务程序的地址单元,中断响应后,按中断的类型,自动转到
各自的入口地址去执行程序。工作模块4开关控制LED循环点亮用P3.0作输入接开关SW,P1口作输出接8个LED,通过开
关SW控制LED循环点亮。开关SW打开,LED循环点亮,开关SW合上,LED停止循环点亮。开关控制LED循环点亮程序#in
clude//包含AT89X52.H头文件sbitSW=P3^0;
//定义SW是P3.0位对应的变量名voidmain(){unsignedchari;unsi
gnedchartemp;P1=0xff;//十六进制
全1,熄灭所有LEDwhile(1){temp=0x01;//第一位为
1for(i=0;i<8;i++){while(SW!=0);P1
=~temp;//temp值取反送P1口Delay();
temp=temp<<1;//temp值左移一位}}}C51数据类型C51定义了标准C语
言的所有数据类型;同时对标准C语言进行了扩展,更加注意对系统资源的合理利用,如表所示。C51基本数据类型char字符类型
长度是一个字节(8位)int整型长度为两个字节(16位)long长整型长度为四个字节(32位)float浮
点型长度为四个字节(32位)指针型指针型本身就是一个变量,在这个变量中存放的是指向另一个数据的地址。这个指针变量要
占据一定的内存单元,在C51中它的长度一般为1~3个字节。C51扩展的数据类型bit位变量sfr特殊功能寄存器s
fr1616位特殊功能寄存器sbit可寻址位bit位变量bit位变量可以将与MCS-51硬件特性操作有关的定义成位变
量。位变量必须定位在MCS-51单片机内部RAM的位寻址空间中。但不能定义位指针,也不能定义位数组。bit位变量的值就是一个二进制
位,不是0就是1,类似True和False。例如:bitflag;//flag为bit
位变量,其值是0或1sfr特殊功能寄存器这种定义方法与标准C语言不兼容,只适用于对MCS-51系列单片机进行C语言编程。S
fr占用一个字节,数值范围为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。特殊功能寄存器C51定义的一般语法格式
如下:sfr?特殊功能寄存器名=特殊功能寄存器的字节地址;例如:sfrP1=0x90;
这一句定义了P1为P1端口在内部的寄存器。又如:sfr?SCON=0x98;?//串口控制寄存器,地址为0x
98sfr?TMOD=0x89;?//定时器/计数器方式控制寄存器sfr1616位特殊功能寄存器sfr1
6占用两个字节。在许多新的MCS-51系列单片机中,有时会使用两个连续地址的特殊功能寄存器来指定一个16位的值。如52子系列的定
时器/计数器2。为了有效地访问这类SFR,可使用关键字“sfr16”来定义,16位SFR定义语句的语法格式与8位SFR相同,只是
“=”后面的地址必须用16位SFR的低字节地址,即低字节地址作为“sfr16”的定义地址。例如:sfr
16?T2=0xCC?//定时器/计数器2:T2低8位地址为0xCC,T2高8位地址为0xCD注意:这种定义适用于所有新
的16位SFR,不能用于定时器/计数器0和1。sbit可寻址位C51的扩充功能支持特殊位的定义,与SFR定义一样,关键字“s
bit”用于定义某些特殊位,利用它可以访问芯内部部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。如先前我们定义:
sfrP1=0x90;因P1端口的寄存器是可位寻址的,所以我们可以定义:sbitP1_1
=P1^1;//P1_1为P1中的P1.1引脚这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。
在C语言里,由于P1.1不是一个合法的C语言变量名,得给它另起一个名字,这里起的名为P1_1,所以必须给它们建立联系,这里使用了
C51的关键字sbit来定义sbit的用法有三种格式第一种格式sbit?bit-name=sfr-name^in
tconstant;其中“bit-name”是一个寻址位符号名,该位符号名必须是MCS-51单片机中规定的位名称;“sfr
-name”必须是已定义过的SFR的名字;“^”后的整常数是寻址位在特殊功能寄存器“sfr-name”中的位号,必须是0~7范围
中的数。例如:sfr??PSW=0xD0;???//定义PSW寄存器地址为0xD0sbit?OV=PSW^2
;????//定义OV位为PSW.2,地址为0xD2sbit?CY=PSW^7;???//定义CY位为PSW.7
,地址为0xD7sbit的用法有三种格式第二种格式:sbit?bit-name=intconstant^int
constant;其中“=”后的intconstant为寻址地址位所在的特殊功能寄存器的字节地址;“^”符号后的intco
nstant为寻址位在特殊功能寄存器中的位号。例如:sbit?OV=0xD0^2;???//定义OV位地址是0xD0字节中的
第2位sbit?CY=0xD0^7;???//定义CY位地址是0xD0字节中的第7位sbit的用法有三种格式第三种格式
:sbit?bit-name=intconstant;其中“=”后的intconstant为寻址位的绝对位地址。例
如:sbit?OV=0xD2;????//定义OV位地址为0xD2sbit?CY=0xD7;????//定义C
Y位地址为0xD7C语言常量与变量常量是在程序运行过程中不能改变的,而变量是可以在程序运行过程中不断变化的。变量的定义可
以使用所有C51编译器支持的数据类型,而常量的数据类型只有整型、浮点型、字符型、字符串型和位变量。常量常量可用在不必改变值
的场合,如固定的数据表,字库等。常量的定义方式有几种,下面来加以说明。#difineFalse0x0;/
/用预定义语句可以定义常量#difineTrue0x1;//这里定义False为0,True为1
程序中用到False和True,在编译时,False替换为0,True替换为1。unsignedintcodea=100;
//用code把a定义在程序存储器中并赋值constunsignedintc=100;//用const定义c为无符号
int常量并赋值以上两句它们的值都保存在程序存储器中,而程序存储器在运行中是不允许被修改的,所以如果在这两句后面用了类似
a=110,a++这样的赋值语句,编译时将会出错。变量变量就是一种在程序执行过程中其值能不断变化的。要在程序中使用变量必
须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定义一个变量的格式如下:
[存储种类]数据类型[存储器类型]变量名表在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类存储
种类有四种自动(auto),缺省类型为自动(auto)外部(extern)静态(static)寄存器(register)
存储器类型存储器类型的说明就是指定该变量在C51硬件系统中所使用的存储区域,并在编译时准确的定位。存储模式SMALL
存储模式把所有函数变量和局部数据段放在8051系统的内部数据存储区,这使访问数据非常快。在写小型的应用程序时,变量和数据放在da
ta内部数据存储器中是很好的,因为访问速度快;但在较大的应用程序中data区最好只存放小的变量、数据或常用的变量(如循环计数、数
据索引),而大的数据则放置在别的存储区域。COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存
储区,最多可有256字节。LARGE存储模式所有函数和过程的变量和局部数据段都定位在8051系统的外部数据区,最多可有64KB。
工作模块5步进电机控制工作任务使用AT89S52单片机,由P1口的P1.0、P1.1、P1.2和P1.
3四个引脚通过步进电机驱动电路分别接在四相步进电机的四相绕组,步进电机的励磁方式采用四相双四拍,通过程序控制步进电机正转。步进
电机线圈励磁的方式DC电流通过定子线圈建立磁场,称为励磁。步进电机励磁顺序:1相励磁顺序;2相励磁顺序;1-2相励磁顺序
。步进电机控制电路设计步进电机驱动电路由ULN2003A和74LS04构成,其中ULN2003A驱动器是一个高电压、大电流
的达灵顿对数组。由于ULN2003A的输入与TTL电平兼容,所以一般能直接连接到驱动组件或是负载上,例如:继电器、电机或是LED
显示器等。电机正转功能实现分析步进电机控制程序设计#include//由delay参数确定延迟
时间voidmDelay(unsignedintdelay){unsignedinti;for(;
delay>0;delay--)for(i=0;i<124;i++);}voidmain(){w
hile(1){P1=0x03;//A、B绕组励磁mDelay(50);
P1=0x06;//B、C绕组励磁mDelay(50);P1=0x0C;
//C、D绕组励磁mDelay(50);P1=0x09;//D、A绕组励磁
mDelay(50);}}技能拓展—ULN2003A驱动器应用在电子电路应用上,大多要求具有大电流输
出的能力,以便驱动各种类型的负载,驱动电路是电子设备输出电路中一个重要的组成部分。在大型仪器系统中,经常要用到伺服马达、步进马达
、各种电磁阀等驱动电压高和功率较大的组件。因此,像这种ULN2000和ULN2800等高电压、大电流的达灵顿晶体管数组的产品就被
开发出来,从而控制大功率组件。由于这类组件功能强大、应用范围广。UN2000系列能够同时驱动7组负载,向ULN2800系列则能够
同时驱动8组负载。ULN2003A特点一般市面上较为常见的是ULN2003A。ULN2003A组件是一个高电压、大电流的达灵
顿对数组,其中包含7个具备共射极的开集极达灵顿对。ULN2003A具有以下特点:电流增益高(大于1000mA);带负载能力强(
输出电流大干500mA);温度范围宽(-40o~85o);工作电压高(大于50V)。ULN2003A引脚功能由于ULN
2003A的输入与TTL电平兼容。所以一般能直接连接到驱动组件或是负载上。例如,继电器、DC马达或是LED显示器等。对于每一个
驱动器来说,都包含了一个二极管,其阳极连接到输出端,而阴极连接到7个二极管的共通点上。外部的负载连接到电源供应点和驱动器的输出端
之间。该电源供应为小于+50V的正电压。【技能训练2-2】单片机驱动继电器电路设计通过ULN2003A的3个驱动器输出直接
驱动3个继电器。每一个继电器线圈的端子连接到驱动器输出,另一端则涟接到供应电压上。连接多大的电压依赖继电器的规格。002BH
定时器2溢出或T2EX(P1.1)端负跳0023H串行中断001BH定时/计数器10013H外部中断1000BH
定时/计数器00003H外部中断0入口地址中断源0或1位sbit0~655352字节sfr160~2551
字节sfr0或1位bit对象的地址1~3字节±1.175494E-38~±3.402823E+384字节fl
oat-2147483648~+21474836474字节long0~42949672954字节unsignedlo
ng-32768~+327672字节int0~655352字节unsignedint-128~+1271字节c
har0~2551字节unsignedchar数值范围长度数据类型程序存储器(64KB),用MOVC@A+DP
TR指令访问code外部数据存储器(64KB),用MOVX@DPTR指令访问xdata分页访问外部数据存储器(256字节
),用MOVX@Ri指令访问pdata间接访问内部数据存储器(256字节),允许访问全部内部地址idata可位寻址内部数
据存储器(16字节),允许位与字节混合访问bdata直接访问内部数据存储器(128字节),访问速度最快data说明存储
器类型认识步进电机步进电动机是“一步一步”的转动的一种电动机。电源输入的电信号是脉冲信号(脉冲电压),每输入一个电脉冲,电
动机就转过一个固定角度。故而,也称为脉冲电动机。步进电机的结构步进电机是利用输入数字信号转换成机械能量的电气设备。以内部线圈绕线来区分步进电机,有4相和5相两种,使用5V及12V电源控制。一般来说,4相步进电机又称为2相双绕组步进电机,是最常用的一种电机。步进电机的工作过程每输入一个脉冲信号,步进电机固定旋转一个步进角。例如:若步进角为1.8?的步进电机,如果输入200个脉冲信号,步进电机就会旋转200个步进角,且刚好转一圈(200?1.8?=360?)。由于步进电机旋转角度与输入脉冲数目成正比,只要控制输入的脉冲数目便可控制步进电机转动角度。因此,合适的回路控制常用于精确定位和精确定速。2相励磁顺序4相:表示电动机有四相绕组,分别为A、B、/A、/B绕组。2相励磁:表示每一种励磁状态都有两相绕组励磁。2相励磁顺序:四种励磁状态为一个循环。只要改变励磁顺序,就可以改变步进电机旋转方向。正转:(A、B)→(B,/A)→(/A,/B)→(/B,A)→(A,B)反转:(A、B)→(/B,A)→(/A,/B)→(B,/A)→(A,B)100109HD相、A相绕组通电00110CHC相、D相绕组通电011006HB相、C相绕组通电110003HA相、B相绕组通电A相B相C相D相P1.0P1.1P1.2P1.3P1口控制码控制状态单片机应用技术项目教程(C语言版)计算机科学系项目二LED循环点亮教学目的掌握P0、P1、P2和P3功能及应用技能;掌握内部数据存储器的地址分配及特殊功能寄存器;掌握C语言数据类型、常量和变量;会利用单片机I/O口实现开关控制LED循环点亮和步进电机控制。
献花(0)
+1
(本文系草戒指工作...首藏)