




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、项目2发光二极管的闪烁大多数单片机初学者都是从点亮一个发光二极管开始单片机学习 之路的。在项目2中我们安排了 3个简单的任务,分别是点亮一个发 光二极管、发光二极管闪烁和 8位流水灯。通过这三个任务,让初学者初步了解 51单片机10 口控制外围器 件的原理,激发初学者学习单片机的兴趣。在完成这三个任务之外, 教程中穿插讲述了 51单片机编程软件KeilC51以及STC烧录软件的使 用、C语言入门基础、模拟电路基本元件的特点等入门知识,为今后的学习打下良好的基础。【内容安排】2.1点亮一个发光二极管2.2发光二极管的闪烁2.3 8位流水灯任务2.1点亮一个发光二极管任务要求使用单片机的两个I/O
2、 口,其中一个I/O 口作为输入引脚,接开发板上的高电平(或低电平),另外一个I/O 口作为输出引脚,控制开发板上的一个发光二极管亮灭。当输入I/O接高电平时,发光二极管点亮,反之当输入I/O接低电平时,发光二极管熄灭。知识准备1、发光二极管LED(light-emittingdiode),即发光二极管,有贴片的,也有直插的,如图所示,常见的颜色有红、绿、黄、蓝、白等。从发光二极管的字面上我们可以看出它的一些特性:首 先它能发出可见光,另外这种器件具有普通二极管的特性,即单向导电性,具有阴极和阳极之图2.1.1直插发光二极管和贴片发光二极管分。开发板上的发光二极管发出的光是红颜色,0805贴片
3、封装。这种二极管的正向导通电压在1.8V到2.2V之间,工作电流在 1mA-20mA之间。当导通电流大约1mA时,人的眼睛就可以明显地观察到二极管的发光,导通电流越大,亮度越高,超过10mA亮度变化就不明显了,当电流超过20mA时,发光二极管就会有烧坏的危险。DI在设计发光二极管驱动电路时,要在发光二极管 电路中串接一个限流电阻,调节阻值的大小可以控制 发光二极管的发光亮度。导通电流与限流电阻的关系 为lled=(VCC-Vled)/R , lied是流过发光二极管的电 流,Vied是发光二极管两端电压,电阻R是限流电阻。电流 3-10mA,电源电压 5V, Vied在2V左右, 则限流电阻的
4、取值在 300-1K Q之间。-2 -图发光二极管驱动电路2、单片机I/O 口如何控制发光二极管亮灭图( a)中是一个通过开关控制发光二极管亮灭的电路。开关S1断开,电源上的电流经过限流电阻 R1,流向发光二极管,发光二极管被点亮。开关S1闭合,电源上的电流经过限流电阻R1流向地,发光二极管没有电流流过,发光二极管熄灭。在单片机的I/O内部,实际上也存在这样一个开关。图(b)是通过单片机I/O 口控制发光二极管亮灭的等效电路图。与图(a )不同的地方在于,开关S1不是通过手动控制的,而是通过单片机的I/O控制的。我们通过程序控制P17引脚连接的开关 S1闭合,则P17引脚为低电平,发光二极管熄
5、灭,相反通过程序控制开关打开,则P17引脚呈现高电平,发光二极管被点亮。VCCRI壬亠4-豈1 誓lr=wPIJ T2EXPi.2JI -lPiJko E-tFl,4IJ阴PI.5FI.6孵Tpj.ci 口 xnE-AillP1.? rMTO SI PSTN3 INTI 1P2_7Pl.4 mPXbPKXU肥MWR? 1PJ.7 RDP2.3*JtTALIn.iXTAUP2.IP2.DSTB样贰(a)开关控制发光二极管(b) I/O控制发光二极管图控制发光二极管亮灭的原理解释另外需要说明的,对于 51单片机而言,如果按照图 ( b)中的接法来驱动发光二极 管,并不能点亮发光管,本单元的任务3中
6、会详细解释I/O 口高电平驱动不了发光二极管的原 因。3、编程语言的选择和 C语言的简单介绍单片机控制发光二极管亮灭是通过编写程序来实现的,那么我们用什么语言来编写程序呢?单片机编程语言有汇编语言和C语言。相比较来说,汇编语言比较接近单片机的底层,使用汇编语言有助于理解单片机内部结构。简单的程序,用汇编语言,程序效率也可能比较高, 但是当程序容量达到几千上万行以后,汇编语言在组织结构、修改维护等方面就会成为你的噩梦了。C语言具有通用性,51单片机用可以用 C语言编程,其它单片机(AVR STM32等)也 可以用C语言编程,而汇编则不具备通用性,每一类型的单片机的汇编指令不尽相同,初学者绕不过学
7、习汇编指令的烦扰。另外C语言的可移植性好,用51单片机写的程序只要稍加修改,就可以在别的单片机中使用。所以目前实际开发过程中,大部分工程师都在用C语言做单片机开发,只有在很低端的应用中或者是特殊要求的场合,才会用汇编语言开发,所以这里建议大家还是用C语言开发比较好一些。4、特殊功能寄存器(SFR学过C语言的人肯定会有这样一个问题:编写单片机程序用 C语言,那么在C语言中怎样来描述单片机的资源呢?在单片机内部有一个重要的资源叫特殊功能寄存器,简称SFR SFR是单片机中各功能部件对应的寄存器,用于存放相应功能部件的控制命令、状态或数据。举个例子来讲,SFR可以看成是一栋宿舍楼,里面有很多房间,这
8、些房间存放PO、P1、P2、P3这些I/O的控制命令,也存放着定时器、中断、串口等资源的控制命令,房间号对应命令的地址。我们要操控这些资源,只需要向房间号(命令的存放地址) 写命令就可以了。表是STC89C52单片机的SFR 地址表,共有21个特殊功能寄存器。我们可以看到 P0 口的地址为0x80,我们要操控P0 口, 只需要对0x80这个地址写数据就可以了。在C51中,相比于普通 C语言,多了两个特殊的变量声明,sfr和是sbit。表的特殊功能寄存器符号地址功能介绍符号地址功能介绍BF0HB寄存器TH18DH定时/计数器1(高8位)ACCEOH累加器TH08CH定时/计数器0(低8位)PSW
9、DOH程序状态字TL18BH定时/计数器1(高8位)IPB8H中断优先级控制寄存器TL08AH定时/计数器0(低8位)P3B0HP3 口锁存器TMOD89H定时/计数器方式控制寄存器IEA8H中断允许控制寄存器TCON88H定时/计数器控制寄存器P2A0HP2 口锁存器DPH83H数据地址指针(高8位)SBUF99H串口缓冲器DPL82H数据地址指针(低8位)SCON98H串口控制寄存器SP81H堆栈指针P190HP1 口锁存器P080HP0 口锁存器PCON87H电源控制寄存器sfr :在声明变量的同时为其指定特殊功能寄存器作为存储地址。例如:sfr P0=0x80 ,此处声明一个变量 P0
10、,并指定其存储地址为特殊功能寄存器P0对应的地址(0x80)。编写应用程序时直接对变量 PC赋值就可以了。举例:P0口的8个位分别10101010,则在软件里直接写语 句 P0=0xAA(0B10101010)就可以了。sbit :同样是声明一个变量,和SFR使用方法类似,但是 sbit是用来声明一个位变量。P0口共有8个位,我们想单独控制第 2个位,可以通过这样的定义:sbit P1仁P1A1 ,这样我们就可以在程序中使用 P11表示P1 口的第二个位。是不是我们每一次编写程序的时候都需要用sfr和sibt来定义寄存器变量呢?实际上 C51编译器已经做好了一个文件,里面已经存放了些定义。这个
11、文件的名字叫做 reg52.h (头文件),文件存放的路径是 KeilC51INC ,在Keil软件的安装文件夹中。我们在编写程序的时候,只 需要在程序的开头加上这样一个语句#in clude,就可以把这些寄存器变量定义加载到当前的程序中直接使用了。任务实施1、KeilC51的安装KeilC51是美国Keil Software公司(ARM公司之一)出品的51系列兼容单片机 C语言软 件开发系统。下面是 Keil C51编译器的安装步骤。(1)双击KeilC51安装文件夹中的文件,弹出如图2.1.4所示的对话框。图双击安装文件界面(2) 点击Next”按钮,弹出License Agreement
12、 ”对话框,如图所示。文本框 中显示的是安装许可协议,需要在I agree to all the terms of the precedi ng Lice nseAgreeme nt ”前面的的小框中打勾。r Endl-User License Agreement for ARM Kell SoftwareDevelopment ToolsTHIS tND USER UCtFKb AGitfcMtM LlCt+ICfj IS A lEAL U址f+lbrUT jjfYOU(ErTHE a smakE ewividul, oh sinsije lcsal ewTiT* aw arm limite
13、dforTHE U&C or the SOFTWAKE ACCOMPAMYPJG THIS UCENCE, ARM 国 ONLY WHJJNG TQ JCE1M尝 THE SOfTWARE TO YOU ON CCM?Dmati THAT YOU ACCEPT ALL OF T底 TERMS INTHIS LiCfeNCe. err CUCXCHG 1OK BY INSTALlJftia OH QaTMtfeK*i,tfe USIMG C?K CWYWGTHF RHIFTW4HF VFM I rNOTraTF TIHftT VnBI 巧砂尺齐 Tfl RF HTWNew uVision Pro
14、ject.,如图 所示。Hello - pVision4File Edit ViewProject Flash Debug Peripherals Tools SVCS Window 旦沖J -诵New piyision Pnqjed-,.New Multi-Project Workspace.Open Project.1056 Project:a削掙鱼e S Simulate白-召Sourc女pertManage图新建一个工程选择工程保存的位置,并给工程起一个名字, 我们给工程起名LED,(2) 在弹出的窗口中,软件会自动添加扩展名.uvproj 。如图所示 计机 丰曲歳盘 C51 LED图
15、工程命名(3) 点击“保存”按钮后,弹出如图的对话框。CFffVairfor用ffi 瑕DeriEeTh olast血 ect De-flcp lor Target Targel lrent: li ixiUsd Eifta 心 Lirfoar LXStlJir ed BL51It图选择CPU型号在这个对话中,要为我们的工程选择CPU类型。在Data base列表框中,拖动滚动条,有很多生产厂商的名称,但找不到我们开发板上STC89C52的生产厂商宏晶科技。Keil C51的设计者并没有把STC单片机加入到Keil中。STC89C52和Amel公司的51单片机同属一个系列, 在选择CPU时,我
16、们可以选择 Atmel公司,单击 Atmel前面的+,展开后,有很多 Atmel 公司的单片机,我们选择AT89C52就可以了。(4)选定CPU型号后,点击” 0K按钮,会弹出一个对话图,让你选择在工程中加入一段启动代码,初学者可以不理会,点击”否”就可以了,工程创建完毕,界面如图所示。日 id Target 1B Source Group 1工程创建后界面(5) 工程创建后,下一步的工作就是建立编写代码的文件。点击菜单File-New,新建一个文件,然后点击 File-Save,保存文件,弹出如图所示的窗口。、_ ,?*C51 led - I +t I;严图2.1.14新建一个.c文件我们把
17、文件放在 LED工程下,同时给文件起个名字:LED.c,(6) 建立了工程和C文件之后,两者还是分离的,下一步的工作是把 C文件加入到工 程中。鼠标右键单击 Project栏中的Target 1下的文件夹 Source Group 1,弹出一个菜单, 选择 Add Files to “ Source Group 1 ” .,如图 所示。因 LED - uVisiorvPrajftaGroup-Add Film 诂 Group Source1.-Target 1 习Translate Rle 益甲buildgw 旦pipGroup Scuftt Groups L- and ies Fite厶 M
18、arage Compcinents.33Prnjtc iBaok t)”4*Add Files* to currenl Projecl GroupSimulatDA图文件加载到工程中点击Add Files to Source Group 1 ” .后,弹出如图所示的对话框,我们选中刚才建立的LED.c文件,然后点击按钮Add,再点击按钮 Close,关闭对话框。图加载LED.c界面把文件加入到工程中后,可以看到在左侧Source Group 1下多了一个新的文件:LED.C,如图所示。图加入.c文件后工程界面3、程序的编写我们把C文件加入到工程后,就可以编写应用程序了。应用程序的编写在LED.
19、c窗口中,当前行有光标在闪烁,而且当前行的颜色为淡紫色。如果对编程的字体大小不满意,可以点击菜单栏Edit-Configuration,里面有一个选项卡Colors & Fonts,可以修改字体大小和颜色等。程序清单如下:#in cludesbit LED=P1A0;sbit In put=P1Al; void mai n(void)while(1)if(I nput=1) LED=0;elseLED=1; /LED输出接口定义/外接电平输入接口定义/大循环/如果输入电平为高电平,则点亮LED低电平点亮LED/否则,熄灭LED程序解释如下:(1 )在介绍特殊功能寄存器 SFR时,我们提到过功能
20、寄存器的定义已经被包含在reg52.h这个文件中,#include是预处理命令,在这里是文件包含的意思。就是把 中的文件包含到 本程序中,成为当前程序的一部分。有了#in clude 这个语句,我们可以直接使用那些寄存器了。(2)打开reg52.h这个头文件,我们可以看到既有寄存器定义,也有部分寄存器中每个位的定义,但是我们在这个文件中找不到I/O的位定义,所以我们需要在我们的程序中加上单个 IO 的位定义:sbit LED=P1A0;sbit Input=P1A1;。(3)日常生活中,要完成一件复杂的功能,我们总是习惯把“大功能”分解为多个“小功能”来实现。这些功能在 C语言中我们称之为“函
21、数”。大功能我们称之为主函数,函数名 为main,小功能为子函数。 一个程序,无论复杂或简单,都是由主函数开始的。函数的格式 为:返回类型 函数名称(参数列表,.),在main函数中,返回类型和参数列表都是空的,|所以都用void来表示。main函数中的内容放大中。(4) 我们在学习C语言课程时,课本中的例程执行一次,输出结果就可以了。 但是在C51中,主程序中的任务大多数是循环运行的,不能执行一次就结束了,举个例子,温度采集器采集环境温度,需要程序不停的执行温度采集任务,不能只采集一次,程序就不运行了。 C51中,循环执行的任务放到大循环中。大循环的格式为:while(1)任务A;任务B;任
22、务C;while语句是循环语句的一种,后面的 ()的内容为循环条件,如果条件为真 ,则执行 中循环体的内容,如果不为真,则不执行中循环体的内容。本例程中, while语句的条 件为 1,永远为真,则不停执行中循环体的任务。(5)在本任务的硬件电路设计中,发光二极管正极接电源,负极连接单片机PIO引脚,电路如图所示。所以要点亮发光二极管,P10引脚需置低电平,程序中对应的语句:led=0 ;,发光二极管灭,P10引脚需置高电平,则程序中对应的语句:led=1 ;。至于为什么用低电平点亮发光二极管,而不是用高电平来点亮发光二极管,本单元的任务3会解释低电平点亮的原因。图发光二极管硬件电路(6)程序
23、中的任务是不停的检测输入 I/O 口( P11)外接电平是高电平还是低电平, 如果 是高电平,则发光二极管熄灭, 如果为低电平,则发光二极管点亮。 程序中判断输入I/O是高 电平还是低电平,用到了 C语言中的if语句,其格式为:if(条件)执行动作Aelse- 14 -执行动作B如果条件满足,则执行动作A,否则执行动作B。在本程序中,如果 P11 口外接输入电平为高电平 1( if(lnput=1),则点亮发光二极管(LED=O),否则则熄灭发光二极管(LED=1)。 开发板上留有高电平(5V)和低电平(0V)接口,用杜邦线把 P11 口和高电平或者低电平相连 就可以了。细心的读者会发现,如果
24、P11 口不用杜邦线连接高电平,发光二极管也点亮,其中的原因我们会在本单元的任务3中,给予解释。4、程序的编译程序编好了,我们要对程序进行编译,生成可以下载到单片机里的文件,在编译之前,我们先要勾选一个选项, Project-Options for Target Targetl .,或者直接点图 图中红框内的快捷图标。Q LED -讥 is arA图2.1.19点击魔术棒在弹出的对话框中,点击Output选项页,勾选其中的“ Create HEX File ”复选框,然后点OK,如图所示。Qpticimi tor Target Target laILilingCSl ASl | fiLSl D
25、lu Stkig |Sefed FqberfcrOtseas厂 Oeet电 Ub阿 SLED .UBZ BfDwie Horr-aflion:和: 15 -图勾选复选框,或者鼠标点击图2.1.21设置好以后,点击Project-rebuild all target files中红框内的快捷图标,就可以对程序进行编译了。图点击编译按钮编译完后,Keil界面的下方Build Output 窗口出现了如图的信息。这些信息告诉我们编译后的情况,data=9.0,指的是我们的程序使用了单片机内部的256字节RAM资源中的9个字节,code=19的意思是使用了 8KFIash资源中的19个字节。“crea
26、ting hex file from LED. 说明系统生成了当前程序的烧录文件。最后一行0 Error(s) , 0 Warning(s)。提示我们的程序没有错误,也没有警告。如果程序程序语法有错误,会出现有几个错误和几个警告,并提示错误的位置,我们可以改根据提示去发现错误。liTl Project轉 Be c FunctionsOTerr platesE口zld target *Taiger 1 * linking -Program Size; data=9,CQ 属性-设备管理器- 端口,可以看到在端口下有一个 “ USB-SERIALCH340(COM4”, 其中COM就是我们的开发板
27、当前所使用的COM端口号。如图所示。厂:设备管理養文件(F)操柞(A)査看(V)帮助(H)O畛丨囲丨日囲丨肉J201220140702KBIP占DVD/CD-ROM驱动器”匚.IDE AT A/AT A PI 控制器IP 口妲里器I 雄盘驱动器$ 写端口 (COM 和 LPT)Ij-1聲 USB-SERIAL CH340 (COM4)I专通信端口 (COMI)I”鼻计茸机|”卑监视器图 查看 COM口打开STC下载软件STC-ISP,界面如图所示。分5步完成程序的下载(1 )选择单片机型号,我们选择STC89C52(2) 点击”打开程序文件”,加载我们编译好的“ LED.Hex”文件。(3) 选择下载口,之前我们在设备管理器中已经查看过是CO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论