任务21点亮发光二极管分解.docx
《任务21点亮发光二极管分解.docx》由会员分享,可在线阅读,更多相关《任务21点亮发光二极管分解.docx(43页珍藏版)》请在冰豆网上搜索。
任务21点亮发光二极管分解
项目2
发光二极管的闪烁
大多数单片机初学者都是从点亮一个发光二极管开始单片机学习之路的。
在项目2中我们安排了3个简单的任务,分别是点亮一个发光二极管、发光二极管闪烁和8位流水灯。
通过这三个任务,让初学者初步了解51单片机IO口控制外围器件的原理,激发初学者学习单片机的兴趣。
在完成这三个任务之外,教程中穿插讲述了51单片机编程软件KeilC51以及STC烧录软件的使用、C语言入门基础、模拟电路基本元件的特点等入门知识,为今后的学习打下良好的基础。
【内容安排】
2.1点亮一个发光二极管
2.2发光二极管的闪烁
2.38位流水灯
任务2.1点亮一个发光二极管
2.1.1任务要求
使用单片机的两个I/O口,其中一个I/O口作为输入引脚,接开发板上的高电平(或低电平),另外一个I/O口作为输出引脚,控制开发板上的一个发光二极管亮灭。
当输入I/O接高电平时,发光二极管点亮,反之当输入I/O接低电平时,发光二极管熄灭。
2.1.2知识准备
1、发光二极管
LED(light-emittingdiode),即发光二极管,有贴片的,也有直插的,如图2.1.1所示,常见的颜色有红、绿、黄、蓝、白等。
从发光二极管的字面上我们可以看出它的一些特性:
首先它能发出可见光,另外这种器件具有普通二极管的特性,即单向导电性,具有阴极和阳极之分。
图2.1.1直插发光二极管和贴片发光二极管
开发板上的发光二极管发出的光是红颜色,0805贴片封装。
这种二极管的正向导通电压在1.8V到2.2V之间,工作电流在1mA~20mA之间。
当导通电流大约1mA时,人的眼睛就可以明显地观察到二极管的发光,导通电流越大,亮度越高,超过10mA,亮度变化就不明显了,当电流超过20mA时,发光二极管就会有烧坏的危险。
在设计发光二极管驱动电路时,要在发光二极管电路中串接一个限流电阻,调节阻值的大小可以控制发光二极管的发光亮度。
导通电流与限流电阻的关系为Iled=(VCC-Vled)/R,Iled是流过发光二极管的电流,Vled是发光二极管两端电压,电阻R是限流电阻。
电流3-10mA,电源电压5V,Vled在2V左右,则限流电阻的取值在300-1KΩ之间。
图2.1.2发光二极管驱动电路
2、单片机I/O口如何控制发光二极管亮灭
图2.1.3(a)中是一个通过开关控制发光二极管亮灭的电路。
开关S1断开,电源上的电流经过限流电阻R1,流向发光二极管,发光二极管被点亮。
开关S1闭合,电源上的电流经过限流电阻R1流向地,发光二极管没有电流流过,发光二极管熄灭。
在单片机的I/O内部,实际上也存在这样一个开关。
图2.1.3(b)是通过单片机I/O口控制发光二极管亮灭的等效电路图。
与图(a)不同的地方在于,开关S1不是通过手动控制的,而是通过单片机的I/O控制的。
我们通过程序控制P17引脚连接的开关S1闭合,则P17引脚为低电平,发光二极管熄灭,相反通过程序控制开关打开,则P17引脚呈现高电平,发光二极管被点亮。
(a)开关控制发光二极管(b)I/O控制发光二极管
图2.1.3I/O控制发光二极管亮灭的原理解释
另外需要说明的,对于51单片机而言,如果按照图2.1.3(b)中的接法来驱动发光二极管,并不能点亮发光管,本单元的任务3中会详细解释I/O口高电平驱动不了发光二极管的原因。
3、编程语言的选择和C语言的简单介绍
单片机控制发光二极管亮灭是通过编写程序来实现的,那么我们用什么语言来编写程序呢?
单片机编程语言有汇编语言和C语言。
相比较来说,汇编语言比较接近单片机的底层,使用汇编语言有助于理解单片机内部结构。
简单的程序,用汇编语言,程序效率也可能比较高,但是当程序容量达到几千上万行以后,汇编语言在组织结构、修改维护等方面就会成为你的噩梦了。
C语言具有通用性,51单片机用可以用C语言编程,其它单片机(AVR、STM32等)也可以用C语言编程,而汇编则不具备通用性,每一类型的单片机的汇编指令不尽相同,初学者绕不过学习汇编指令的烦扰。
另外C语言的可移植性好,用51单片机写的程序只要稍加修改,就可以在别的单片机中使用。
所以目前实际开发过程中,大部分工程师都在用C语言做单片机开发,只有在很低端的应用中或者是特殊要求的场合,才会用汇编语言开发,所以这里建议大家还是用C语言开发比较好一些。
4、特殊功能寄存器(SFR)
学过C语言的人肯定会有这样一个问题:
编写单片机程序用C语言,那么在C语言中怎样来描述单片机的资源呢?
在单片机内部有一个重要的资源叫特殊功能寄存器,简称SFR。
SFR是单片机中各功能部件对应的寄存器,用于存放相应功能部件的控制命令、状态或数据。
举个例子来讲,SFR可以看成是一栋宿舍楼,里面有很多房间,这些房间存放P0、P1、P2、P3这些I/O的控制命令,也存放着定时器、中断、串口等资源的控制命令,房间号对应命令的地址。
我们要操控这些资源,只需要向房间号(命令的存放地址)写命令就可以了。
表2.1.1是STC89C52单片机的SFR地址表,共有21个特殊功能寄存器。
我们可以看到P0口的地址为0x80,我们要操控P0口,只需要对0x80这个地址写数据就可以了。
在C51中,相比于普通C语言,多了两个特殊的变量声明,sfr和是sbit。
表2.1.1STC89C52的特殊功能寄存器
符号
地址
功能介绍
符号
地址
功能介绍
B
F0H
B寄存器
TH1
8DH
定时/计数器1(高8位)
ACC
E0H
累加器
TH0
8CH
定时/计数器0(低8位)
PSW
D0H
程序状态字
TL1
8BH
定时/计数器1(高8位)
IP
B8H
中断优先级控制寄存器
TL0
8AH
定时/计数器0(低8位)
P3
B0H
P3口锁存器
TMOD
89H
定时/计数器方式控制寄存器
IE
A8H
中断允许控制寄存器
TCON
88H
定时/计数器控制寄存器
P2
A0H
P2口锁存器
DPH
83H
数据地址指针(高8位)
SBUF
99H
串口缓冲器
DPL
82H
数据地址指针(低8位)
SCON
98H
串口控制寄存器
SP
81H
堆栈指针
P1
90H
P1口锁存器
P0
80H
P0口锁存器
PCON
87H
电源控制寄存器
sfr:
在声明变量的同时为其指定特殊功能寄存器作为存储地址。
例如:
sfrP0=0x80,此处声明一个变量P0,并指定其存储地址为特殊功能寄存器P0对应的地址(0x80)。
编写应用程序时直接对变量P0赋值就可以了。
举例:
P0口的8个位分别10101010,则在软件里直接写语句P0=0xAA(0B10101010)就可以了。
sbit:
同样是声明一个变量,和SFR使用方法类似,但是sbit是用来声明一个位变量。
P0口共有8个位,我们想单独控制第2个位,可以通过这样的定义:
sbitP11=P1^1,这样我们就可以在程序中使用P11表示P1口的第二个位。
是不是我们每一次编写程序的时候都需要用sfr和sibt来定义寄存器变量呢?
实际上C51编译器已经做好了一个文件,里面已经存放了些定义。
这个文件的名字叫做reg52.h(头文件),文件存放的路径是Keil\C51\INC,在Keil软件的安装文件夹中。
我们在编写程序的时候,只需要在程序的开头加上这样一个语句#include,就可以把这些寄存器变量定义加载到当前的程序中直接使用了。
2.1.3任务实施
1、KeilC51的安装
KeilC51是美国KeilSoftware公司(ARM公司之一)出品的51系列兼容单片机C语言软件开发系统。
下面是KeilC51编译器的安装步骤。
(1)双击KeilC51安装文件夹中的文件,弹出如图2.1.4所示的对话框。
图2.1.4双击安装文件界面
(2)点击“Next”按钮,弹出“LicenseAgreement”对话框,如图2.1.5所示。
文本框中显示的是安装许可协议,需要在“IagreetoallthetermsoftheprecedingLicenseAgreement”前面的的小框中打勾。
图2.1.5许可协议界面
(3)点击“Next”按钮,弹出“FolderSelection”对话框,如图2.1.6所示。
这里可以设置安装路径,默认安装路径在“C:
\Keil”文件夹下。
点击“Browse...”按钮,可以修改安装路径,应用程序尽量不要安装在C盘,建议选用别的盘符,安装路径不能出现中文字符。
2.1.6选择安装路径界面
(4)点击“Next”按钮,弹出“CustomerInformation”对话框,如图2.1.7所示。
输入用户名、公司名称以及E-mail地址即可。
图2.1.7输入用户名等信息界面
(5)单击“Next”,自动安装软件,进度条一点一点增大,如图2.1.8所示。
图2.1.8文件安装界面
(6)安装完成后,弹出来安装完成对话框,如图2.1.9所示,有几个打钩的选项,把这些勾都去掉,点击“Finish”按钮,KeilC51安装完成。
图2.1.9安装完成后界面
2、工程的建立
(1)在编写应用程序之前,需先建立一个工程,应用程序和其它文件放在工程中。
打开Keil软件后,点击:
Project-->NewuVisionProject...,如图2.1.10所示。
图2.1.10新建一个工程
(2)在弹出的窗口中,选择工程保存的位置,并给工程起一个名字,我们给工程起名LED,软件会自动添加扩展名.uvproj。
如图2.1.11所示
图2.1.11工程命名
(3)点击“保存”按钮后,弹出如图2.1.12的对话框。
图2.1.12选择CPU型号
在这个对话中,要为我们的工程选择CPU类型。
在Database列表框中,拖动滚动条,有很多生产厂商的名称,但找不到我们开发板上STC89C52的生产厂商宏晶科技。
KeilC51的设计者并没有把STC单片机加入到Keil中。
STC89C52和Amel公司的51单片机同属一个系列,在选择CPU时,我们可以选择Atmel公司,单击Atmel前面的‘+’,展开后,有很多Atmel公司的单片机,我们选择AT89C52就可以了。
(4)选定CPU型号后,点击”OK”按钮,会弹出一个对话图,让你选择在工程中加入一段启动代码,初学者可以不理会,点击”否”就可以了,工程创建完毕,界面如图2.1.13所示。
2.1.13工程创建后界面
(5)工程创建后,下一步的工作就是建立编写代码的文件。
点击菜单File-->New,新建一个文件,然后点击File-->Save,保存文件,弹出如图2.1.14所示的窗口。
图2.1.14新建一个.c文件
我们把文件放在LED工程下,同时给文件起个名字:
LED.c,
(6)建立了工程和C文件之后,两者还是分离的,下一步的工作是把C文件加入到工程中。
鼠标右键单击Project栏中的Target1下的文件夹SourceGroup1,弹出一个菜单,选择AddFilesto“SourceGroup1”...,如图2.1.15所示。
图2.1.15C文件加载到工程中
点击AddFilesto“SourceGroup1”...后,弹出如图2.1.16所示的对话框,我们选中刚才建立的LED.c文件,然后点击按钮Add,再点击按钮Close,关闭对话框。
图2.1.16加载LED.c界面
把文件加入到工程中后,可以看到在左侧SourceGroup1下多了一个新的文件:
LED.C,如图2.1.17所示。
图2.1.7加入.c文件后工程界面
3、程序的编写
#include<.h>
sbitLED=P1^0;//LED输出接口定义
sbitInput=P1^1;//外接电平输入接口定义
voidmain(void)
{
while
(1)//大循环
{
if(Input==1)//如果输入电平为高电平,则点亮LED
LED=0;//低电平点亮LED
else
LED=1;//否则,熄灭LED
}
}
我们把C文件加入到工程后,就可以编写应用程序了。
应用程序的编写在LED.c窗口中,当前行有光标在闪烁,而且当前行的颜色为淡紫色。
如果对编程的字体大小不满意,可以点击菜单栏Edit->Configuration,里面有一个选项卡Colors&Fonts,可以修改字体大小和颜色等。
程序清单如下:
程序解释如下:
(1)在介绍特殊功能寄存器SFR时,我们提到过功能寄存器的定义已经被包含在reg52.h这个文件中,#include<>是预处理命令,在这里是文件包含的意思。
就是把<>中的文件包含到本程序中,成为当前程序的一部分。
有了#include这个语句,我们可以直接使用那些寄存器了。
(2)打开reg52.h这个头文件,我们可以看到既有寄存器定义,也有部分寄存器中每个位的定义,但是我们在这个文件中找不到I/O的位定义,所以我们需要在我们的程序中加上单个IO的位定义:
sbitLED=P1^0;sbitInput=P1^1;。
(3)日常生活中,要完成一件复杂的功能,我们总是习惯把“大功能”分解为多个“小功能”来实现。
这些功能在C语言中我们称之为“函数”。
大功能我们称之为主函数,函数名为main,小功能为子函数。
一个程序,无论复杂或简单,都是由主函数开始的。
函数的格式为:
返回类型函数名称(参数列表,....),在main函数中,返回类型和参数列表都是空的,所以都用void来表示。
main函数中的内容放大{}中。
(4)我们在学习C语言课程时,课本中的例程执行一次,输出结果就可以了。
但是在C51中,主程序中的任务大多数是循环运行的,不能执行一次就结束了,举个例子,温度采集器采集环境温度,需要程序不停的执行温度采集任务,不能只采集一次,程序就不运行了。
C51中,循环执行的任务放到大循环中。
大循环的格式为:
while
(1)
{
任务A;
任务B;
任务C;
......
}
while语句是循环语句的一种,后面的()的内容为循环条件,如果条件为‘真’,则执行{}中循环体的内容,如果不为‘真’,则不执行{}中循环体的内容。
本例程中,while语句的条件为‘1’,永远为‘真’,则不停执行{}中循环体的任务。
(5)在本任务的硬件电路设计中,发光二极管正极接电源,负极连接单片机PI0引脚,电路如图2.1.18所示。
所以要点亮发光二极管,P10引脚需置低电平,程序中对应的语句:
led=0;,发光二极管灭,P10引脚需置高电平,则程序中对应的语句:
led=1;。
至于为什么用低电平点亮发光二极管,而不是用高电平来点亮发光二极管,本单元的任务3会解释低电平点亮的原因。
图2.1.18发光二极管硬件电路
(6)程序中的任务是不停的检测输入I/O口(P11)外接电平是高电平还是低电平,如果是高电平,则发光二极管熄灭,如果为低电平,则发光二极管点亮。
程序中判断输入I/O是高电平还是低电平,用到了C语言中的if语句,其格式为:
if(条件)
{
执行动作A
}
else
{
执行动作B
}
如果条件满足,则执行动作A,否则执行动作B。
在本程序中,如果P11口外接输入电平为高电平‘1’(if(Input==1)),则点亮发光二极管(LED=0),否则则熄灭发光二极管(LED=1)。
开发板上留有高电平(5V)和低电平(0V)接口,用杜邦线把P11口和高电平或者低电平相连就可以了。
细心的读者会发现,如果P11口不用杜邦线连接高电平,发光二极管也点亮,其中的原因我们会在本单元的任务3中,给予解释。
4、程序的编译
程序编好了,我们要对程序进行编译,生成可以下载到单片机里的文件,在编译之前,我们先要勾选一个选项,Project-->OptionsforTarget‘Target1’...,或者直接点图2.1.19图中红框内的快捷图标。
图2.1.19点击魔术棒
在弹出的对话框中,点击Output选项页,勾选其中的“CreateHEXFile”复选框,然后点OK,如图2.1.20所示。
图2.1.20勾选复选框
设置好以后,点击“Project-->rebuildalltargetfiles”,或者鼠标点击图2.1.21中红框内的快捷图标,就可以对程序进行编译了。
图2.1.21点击编译按钮
编译完后,Keil界面的下方BuildOutput窗口出现了如图2.1.22的信息。
这些信息告诉我们编译后的情况,data=9.0,指的是我们的程序使用了单片机内部的256字节RAM资源中的9个字节,code=19的意思是使用了8KFlash资源中的19个字节。
“creatinghexfilefrom“LED”..说明系统生成了当前程序的烧录文件。
最后一行0Error(s),0Warning(s)。
提示我们的程序没有错误,也没有警告。
如果程序程序语法有错误,会出现有几个错误和几个警告,并提示错误的位置,我们可以改根据提示去发现错误。
图2.1.22编译后的信息
5、程序的烧录
USB线的一头连接开发板的USB口,两外一端连接电脑上的USB口,如果硬件没有错误,点击计算机->属性->设备管理器->端口,可以看到在端口下有一个“USB-SERIALCH340(COM4)”,其中COM4就是我们的开发板当前所使用的COM端口号。
如图2.1.23所示。
图2.1.23查看COM口
打开STC下载软件STC—ISP,界面如图2.1.24所示。
分5步完成程序的下载
(1)选择单片机型号,我们选择STC89C52。
(2)点击”打开程序文件”,加载我们编译好的“LED.Hex”文件。
(3)选择下载口,之前我们在设备管理器中已经查看过是COM5,选择COM5。
(4)其它的都保持默认,
(5)STC下载方式是冷启动,需要先关闭开发板电源,再点击“Download/下载”,然
后再给开发板上电,程序才能下载。
下载的过程当中,下载软件的小窗口会显示当前下载的进度,并提示下载成功与否。
图2.1.25STC-ISP软件的配置