51单片机C语言教程-郭天祥-PDF转word版.doc

上传人:聆听****声音 文档编号:3951 上传时间:2023-04-28 格式:DOC 页数:34 大小:3.58MB
下载 相关 举报
51单片机C语言教程-郭天祥-PDF转word版.doc_第1页
第1页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第2页
第2页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第3页
第3页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第4页
第4页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第5页
第5页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第6页
第6页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第7页
第7页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第8页
第8页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第9页
第9页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第10页
第10页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第11页
第11页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第12页
第12页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第13页
第13页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第14页
第14页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第15页
第15页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第16页
第16页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第17页
第17页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第18页
第18页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第19页
第19页 / 共34页
51单片机C语言教程-郭天祥-PDF转word版.doc_第20页
第20页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

51单片机C语言教程-郭天祥-PDF转word版.doc

《51单片机C语言教程-郭天祥-PDF转word版.doc》由会员分享,可在线阅读,更多相关《51单片机C语言教程-郭天祥-PDF转word版.doc(34页珍藏版)》请在冰点文库上搜索。

51单片机C语言教程-郭天祥-PDF转word版.doc

第2章Keil软件使用及流水灯设计

本章详细介绍单片机程序常用编译软件Keil的用法,包括用Kei建立工程、工程配置、C51单片机程序软件仿真、单步、全速、断点设置、变量查看等。

同时还介绍如何使用SST89E516RD单片机进行计算机与TX-IC单片机学习板之间的硬件仿真。

用一个完整的C51程序来操作发光二极管的点亮与熄灭,然后调用C51库函数来方便地实现流水灯,最后为大家补充蜂鸣器与继电器的操作方法及集电极开路与漏极开路的概念。

从这一章开始我们将手把手地讲解单片机C语言编程。

认真学好本章,对于初学者来说将会是一个非常好的开头。

2.1Kell工程建立及常用按钮介绍

在使用Keil软件之前,要保证在用户的计算机上装有一套稳定可靠的软件。

本教材中讲解的Keil版本为V6.12,为了能让大家更方便地学习本软件的用法,建议大家在学习本教材时尽量选择该版本。

在本书中,我们强烈推荐的学习方法是边学边用,所以在这里我们不会像传统专业书籍那样,将某个软件的所有功能事先都讲解得非常仔细,很多不用的地方我们不做说明,需要用到什么,我们就学习什么,这样才能有效地理解它、记忆它,最终达到学以致用的目的。

2.1.1Keil工程的建立

进入Keil后,屏幕知图2.1.1所示,紧接着出现编辑界面,如图2.1.2所示。

图2.1.1启动Keil软件时的屏幕

(1)建立一个新工程单击菜单中的选项,如图2.1.3所示。

图2.1.2进入Keil软件后的编辑界面

图2.1.3新建工程

(2)选择工程要保存的路径,输入工程文件名。

Keil的一个工程里通常含有很多小文件,为了方便管理,通常我们将一个工程放在一个独立文件夹下,比如保存到part2_l文件夹,工程文件的名字为part2_l,如图2.1.4所示,然后单击<保存>按钮。

工程建立后,此工程名变为part2_l.uv2。

图2.1.4保存工程

(3)这时会弹出一个对话框,要求用户选择单片机的型号,可以根据用户使用的单片机来选择。

KeilC51几乎支持所有的51内核的单片机,TX-1C实验板上用的是STC89C52,我

们在对话框中找不到这个型号的单片机。

因为51内核单片机具有通用性,所以我们在这里可以任选一款89C52就行,Keil软件的关键是程序代码的编写,而非用户选择什么硬件,在这里我们选择Atmel的89C52来说明,如图2.1.5所示。

选择89C52之后,右边栏里是对该型号单片机的基本说明,我们可以单击其他型号单片机浏览一下其功能特点,然后单击<确定>按钮。

图2.1.5选择单片机型号

(4)完成上一步骤后,窗口界面如图2.1.6所示。

图2.1.6添加完单片机后的窗口界面

到此为止,我们还没有建立好一个完整的工程,虽然工程名有了,但工程当中还没有任何文件及代码,接下来我们添加文件及代码。

(5)如图2.1.7所示,单击菜单中的菜单项,或单击界面上的快捷图标。

新建文件后窗口界面如图2.1.8所示。

图2.1.7添加文件

图2.1.8添加完文件后的窗口界面

此时光标在编辑窗口中闪烁,可以输入用户的应用程序,但此时这个新建文件与我们刚才建立的工程还没有直接的联系,单击图标H,窗口界面如图2.1.9所示,在<文件名(N)>编辑框中,输入要保存的文件名,同时必须输入正确的扩展名。

注意,如果用c语言编写程序,则扩展名必须为.c;如果用汇编语言编写程序,则扩展名必须为.asm。

这里的文件名不一定要和工程名相同,用户可以随意填写文件名,然后单击<保存>按钮。

图2.1.9保存文件

(6)回到编辑界面,单击前面的“+”号,然后在选项上

(7)单击右键,弹出如图2.1.10所示菜单。

然后选择KAddFilestoGroup'SourceGroupF3菜单项,对话框如图2.1.11所示。

图2.1.10将文件加入工程的菜单

图2.1.11选中文件后的对话框

选中,单击,再单击按钮,然后我们再单击左侧前面的“+”号,屏幕窗口如图2.1.12所示。

图2.1.12将文件加入工程后的屏幕窗口

这时我们注意到文件夹中多了一个子项,当一个工程中有多个代码文件时,都要加在这个文件夹下,这时源代码文件就与工程关联起来了。

通过以上

(1)〜(6)步我们学习了如何在Keil编译环境下建立一个工程,在开始编写程序之前,我们有必要先学习编辑界面上一些常用的按钮功能与用法。

2.1.2常用按钮介绍

按钮用于显示或隐藏项目窗口,我们可单击该按钮观察其现象,项目窗口如图2.1.13所示。

按钮一用于显示或隐藏输出信息窗口,当我们进行程序编译时可查看输出信息窗口,查看程序代码是否有错误,是否成功编译,是否生成单片机程序文件等。

我们可单击该按钮观察其现象,输出信息窗口如图2.1.14所示。

按钮用于编译我们正在操作的文件。

按钮用于编译修改过的文件,并生成应用程序供单片机直接下载。

按钮用于重新编译当前工程中的所有文件,并生成应用程序供单片机直接下载。

因为很多工程有不止一个文件,当有多个文件时,我们可使用此按钮进行编译。

按钮用于打开《OprionsforTarget》对话框,也就是为当前工程设置选项。

使用该对话框可以对当前工程进行详细设置,关于该对话框的设置方法将在使用时再做详细讲解。

以上是使用频率最多的几个按钮的功能,大家千万不要被一打开软件时呈现在眼前令人的眼花缭乱的众多按钮所吓着哟。

其他一些调试时用到的按钮等我们具体用到时再做介绍。

2.2点亮第一个发光二极管

大家是不是已经迫不及待地想编写程序了,接下来我们就用C语言编写一个点亮TX-1C实验板上第一个发光二极管的程序。

由于这是本书的第一个程序,看懂了它,也就意味着你已经踏入了单片机C语言编程的第一道门槛,因此我们在这里要花些时间讲解它,大家一定要有耐心,认真地弄明白它。

我们先回到2.1节最后的编辑界面“part2一l.c”下,在当前编辑框中输入如下的C语言源程序,注意:

在输入源代码时务必将输入法切换成英文半角状态。

----------------------------------------------------------------------------------------------------------------------

例2.2.1编写程序,点亮第一个发光二极管(part2_1.cP27)

#include//52系列单片机头文件

sbitled1=P1^0; //声明单片机P1口的第一位

voidmain() //主函数

{

led1=0;/*点亮第一个发光二极管*/

}

----------------------------------------------------------------------------------------------------------------------

在输入上述程序时,Keil会自动识别关键字,并以不同的颜色提示用户加以注意,这样会使用户少犯错误,有利于提高编程效率。

若新建立的文件没有事先保存的话,Keil是不会自动识别关键字的,也不会有不同颜色出现。

程序输入完毕后,如图2.2.1所示。

我们暂且不要管这几句程序表示什么意思,先学会编译及错误处理,然后我再详细介绍代码的含义。

接下来我们编译此工程,看看程序代码是否有错误。

先保存文件,再单击K全部编译〗快捷图标圖。

建议大家每次在执行编译之前都先保存一次文件,从一开始就养成良好的习惯对你将来写程序有很大好处,因为进行编译时,Keil软件有时会导致计算机死机,使你不得不重启计算机,若你在编写一个很大的工程文件时没有及时保存,那么重启后你将找不到它的任何踪影,只得重写。

虽然这种情况极少发生,但出于安全考虑,建议大家及时

保存。

编译后的屏幕如图2.2.2所示,我们重点观察信息输出窗口。

在图2.2.2中,我们看到信息输出窗口中显示的是编译过程及编译结果。

其过程含义如下:

创建目标“Target1”

以上信息表示此工程成功编译通过。

当然,并不是每个用户第一次都能很顺利地编译成功,下面我们再故意改错一处,然后再编译一次,来观察它的编译错误信息,并教大家如何查找错误。

我们将程序中“ledl=0;/*点亮第一个发光二极管*/”一行中的“;”删掉,然后将输入法切换成中文输入,在中文输入状态下重新输入一个“;”,保存它,然后编译,如图2.2.3所示。

从图2.2.3看出,编译过程出现了错误,错误信息有三处,分别为part2一l.c的第5,5,6行,在一个比较大的程序中,如果某处出现了错误,编译后会发现有很多个错误信息,其实这些错误并非真正的错误,而是当编译器发现有一个错误时,编译器自身已经无法完整编译

完后续的代码而引发出更多的错误。

解决办法如下:

我们须将错误信息窗口右侧的滚动条拖到最上面,双击第一条错误信息,可以看到Keil软件自动将错误定位,并且在代码行前面出现一个蓝色的箭头。

需要说明的是,有些错误连Keil软件自身也不能准确显示错误信息,更不能准确定位,它只能定位到错误出现的大概位置,我们根据这个大概位置和错误提示信息自己再查找和修改错误。

双击图2.2.3中第一条错误信息后,显示如图2.2.4所示。

可见在中文状态下,Keil软件代码区输入符号会出现错误,我们改正错误后再编译一次,成功通过。

现在我们回到Keil编辑界面,开始分析代码含义。

知识点:

reg52.h头文件的作用

在代码中引用头文件,其实际意义就是将这个头文件中的全部内容放到引用头文件的位置处,免去我们每次编写同类程序都要将头文件中的语句重复编写。

在代码中加入头文件有两种书写方法,分别#include和#includen”reg52.h”,包含头文件时都不需要在后面加分号。

两种写法区别如下:

当使用◊包含头文件时,编译器先进入到软件安装文件夹处开始搜索这个头文件,也就是Keil\C51\INC这个文件夹下,如果这个文件夹下没有引用的头文件,编译器将会报错。

当使用双撇号””包含头文件时,编译器先进入到当前工程所在文件夹处开始搜索该头文件,如果当前工程所在文件夹下没有该头文件,编译器将继续回到软件安装文件夹处搜索这个头文件,若找不到该头文件,编译器将报错。

reg52.h在软件安装文件夹处存在,所以我们一般写成#include

打开该头文件查看其内容,将鼠标移动到reg52.h上,单击右键,选择HOpendocument3,即可打开该头文件,如图2.2.5所示。

以后若需打开工程中的其他头文件,也可采用这种方式。

或者手动定位到头文件所在的文件夹也可。

其全部内容如下:

/*--------------------------------------------------------------------------

REG52.H

Headergeneric80C52and80C32microcontroller.

Copyright(c)1988-2001KeilElektronikGmbHandKeilSoftware,Inc.Allrightsreserved.

--------------------------------------------------------------------------*/

/*BYTERegisters*/

sfrP0 =0x80;

sfrPI =0x90;

sfrP2 =OxAO;

sfrP3 =OxBO;sfrPSW=OxDO;

sfrACC =OxEO;

sfrB =OxFO;

sfrSP =0x81;

sfrDPL =0x82;

sfrDPH =0x83;

sfrPCON =0x87;

sfrTCON =0x88;

sfrTMOD =0x89;

sfrTLO =0x8A;

sfrTLl =0x8B;

sfrTHO =0x8C;

sfrTHl =0x8D;

sfrIE =0xA8;

sfrIP= =0xB8;

sfrSCON =0x98;

sfrSBUF=0x99;

/*8052Extensions*/

sfrT2CON=0xC8;

sfrRCAP2L=OxCA;

sfrRCAP2H=OxCB;

sfrTL2 =OxCC;

sfrTH2 =OxCD;

/*BITRegisters*/

/*PSW */

sbitCY =PSW^7;

sbitAC =PSW^6;

sbitFO =PSW^5;

sbitRSI =PSW^4;

sbitRSO =PSW^3;

sbitOV =PSW^2;

sbitP =PSWA0;"8052only

/*TCON */

sbitTF1 =TCON^7;

sbitTR1 =TCON^6;

sbitTFO =TCON^5;

sbitTRO =TCON^4;

sbitIE1 =TCON^3;

sbitIT1 =TCON^2;

sbitIEO =TCON^1;

sbitITO =TCON^0;

/*IE*/

sbitEA =IE^7;

sbitET2 =IE^5;//8052only

sbitES =IE^4;

sbitET1 =IE^3;

sbitEX1 =IE^2;

sbitETO =IE^1;

sbitEXO =IE^0;

/*IP*/

sbitPT2 =IP^5;

sbitPS =IP^4;

sbitPT1 =IP^3;

sbitPX1 =IP^;

sbitPTO =IP^1;

sbitPXO =IP^0;

/*P3*/

sbitRD =P3^7;

sbitWR =P3^6;

sbitTI =P3^5;

sbitTO =P3^4;

sbitINTI =P3^3;

sbitINTO=P3^2;

sbitTXD =P3^1;

sbitRXD =P3^0;

/*SCON*/

sbitSMO =SCON^7;

sbitSMI =SCON^6;

sbitSM2 =SCON^5;

sbitREN =SCON^4;

sbitTB8 =SCON^3;

sbitRB8 =SCON^2;

sbitTI =SCON^1;

sbitRI =SCON^0;

/*PI*/

sbitT2EX=P1^1;//8052only

sbitT2=P1^0;//8052only

/*T2CON*/

sbitTF2=T2CON^7;

sbitEXF2=T2CON^6;

sbitRCLK=T2CON^5;

sbitTCLK=T2CON^4;

sbitEXEN2=T2CON^3;

sbitTR2=T2CON^2;

sbitC_T2=T2CON^1;

sbitCP_RL2=T2CON^0;

----------------------------------------------------------------------------------------------------------------

从上面代码中可以看到,该头文件中定义了52系列单片机内部所有的功能寄存器,用到了前面讲到的sfr和sbit这两个关键字,“sfrP0=0x80;”语句的意义是,把单片机内部地址0x80处的这个寄存器重新起名叫P0,以后我们在程序中可直接操作P0,就相当于直接对单片机内部的0x80地址处的寄存器进行操作。

说通俗点,也就是说,通过sfr这个关键字,让Keil编译器在单片机与人之间搭建一条可以进行沟通的桥梁,我们操作的是POP,而单片机本身并不知道什么是P0口,但是它知道它的内部地址0x80是什么东西。

说到这里我想大家应该已经明白了,以后凡是编写51内核单片机程序时,我们在源代码的第一行就可直接包含该头文件。

在上面我们还看到,“sbitCY=PSW^7;”语句的意思是,将PSW这个寄存器的最高位,

重新命名为CY,以后我们要单独操作PSW寄存器的最高位时,便可直接操作CY,其他类同。

讲完了头文件,接下来我们再回到编辑界面,紧接着头文件后面有“//.....”,请看知识点。

知识点:

C语言中注释的写法

在C语言中,注释有两种写法:

(1) //......,两个斜杠后面跟着的为注释语句。

这种写法只能注释一行,当换行时,又必须在新行上重新写两个斜扛。

(2) /*•••*/,斜扛与星号结合使用,这种写法可以注释任意行,即斜扛星号与星号斜扛之间的所有文字都作为注释。

.

所有注释都不参与程序编译,编译器在编译过程会自动删去注释,注释的目的是为了我们读程序方便,一般在编写较大的程序时,分段加入注释,这样当我们回过头来再次读程序时,因为有了注释,其代码的意义便一目了然了。

若无注释,我们不得不特别费力地将程序重新阅读一遍方可知道代码含义。

养成良好的书写代码格式的习惯,经常为自己编写的代码加入注释,以后定能方便许多。

例2.2.1程序中接着往下看,“sbitledl=Pl^0;”语句的含义是,将单片机P0口的最低位定义为ledl。

在TX-1C实验板上,8个发光二极管的阴极通过一个74HC573锁存器分别连接至单片机的POD,若要控制某一个发光二极管,也就是要控制单片机P0口的某一位,必定要声明这一位,否则单片机肯定不知道我们要操作的是什么东东。

需要注意的是,这里的P1不可随意写,P是大写,若写成p,编译程序时将报错,因为编译器并不认识pl,而它只认识P1,这是因为我们在头文件中定义的是“sfrPl=0x90;”。

这也是大多初学者编写第一个程序时常犯的错误。

例2.2.1程序中再往下就到了主函数mainO,无论一个单片机程序有多大,或多小,所有的单片机在运行程序时,总是从主函数开始运行,关于主函数的写法,我们看下一个知识点。

知识点:

main()主函数的写法

格式:

voidmain()注意:

后面没有分号。

特点:

无返回值,无参数。

无返回值表示该函数执行冗后不返回任何值,上面main前面的void表示“空”,即不返回值的意思,后面我们会讲到有返回值的函数,到时大家一对比便会更加明白。

无参数表示该函数不带任何参数,即main后面的括号中没有任何参数,我们只写“()”就可以了,也可以在括号里写上void,表示“空”的意思,如voidmain(void)。

任何一个单片机C程序有且仅有一个main函数,它是整个程序开始执行的入口。

大家注意看,在写完main()之后,在下面有两个花括号,这是C语言中函数写法的基本要求之一,即在一个函数中,所有的代码都写在这个函数的两个大括号内,每条语句结束后都要加上分号,语句与语言之间可以用空格或回车隔开。

例如:

voidmain(){

总程序从这里开始执行;

其他语句;

……

}

例2.2.1程序中接下来我们看“ledl=0;”语句,也就是该程序中最核心的语句。

在数字电路中,电平只有两种状态:

高电平,1;低电平,0。

显然,该语句的意思是,让P1口的最低位清0。

由于没有操作其他口,所以其余口均保持原来状态不变。

那么为什么P1口的最低位清0,板上的第一个发光二极管就会亮呢?

接下来我们再来讲解电路知识,TX-1C单片机实验板上流水灯与单片机连接方法如图2.2.6所示。

图2.2.6电路中,除单片机外,主要元件有三类:

P2(lkQ排阻)、D(1〜8)(发光二极管)、U3(74HC573锁存器),下面分别介绍。

(1)排阻。

通俗地讲,它就是一排电阻,图2.2.6中一共有8个发光二极管,每个管子上串连一个电阻,然后在电阻的另一端接电源,因为8个管子接法相同,所以我们把8个电阻的另一端全部连接在一起,这样一来,便共有9个引脚,其中一个称为公共端。

图2.2.7和图2.2.8是直插式和贴片式排阻的实物图。

知识点:

由电阻标号认知阻值

一般在排阻上都标有阻值号,其公共端附近也有明显标记。

如图2.2.7和图2.2.8中分别为103和150,103表示其阻值大小为10x103Q,即10k欧,若是102其阻值大小为10x102Q,即1k欧,150为15X10°欧,即15欧,其他读法都相同。

我们有时也会看到标号为1002,1001等。

1002表示100x102欧,即10k欧,1001表示100xlO1欧,即lk欧。

3位数表示与4位数表示的阻值读法我们都要会,标号位数不同,其电阻的精度不同,一般地,3位数表示5%精度,4位数表示1%精度。

TX-1C实验板上与发光二极管连接的是102阻值的9引脚直插排阻。

还有的标号如3R0,表示阻值为3欧,4K7表示阻值为4.7k欧,R002表示阻值为0.002欧。

(2)发光二极管。

它具有单向导电性,通过5mA左右电流即可发光,电流越大,其亮度越强,但若电流过大,会烧毁二极管,一般我们控制在3〜20mA之间。

在这里,给发光二极管串联一个电阻的目的就是为了限制通过发光二极管的电流不要太大,因此这个电阻又称为“限流电阻”。

当发光二极管发光时,测量它两端电压约为1.7V,这个电压又叫做发光二极管的“导通压降”。

图2.2.9和图2.2.10分别为直插式发光二极管和贴片式发光二极管实物图。

发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极。

直插式发光二极管长脚为阳极,短脚为阴极。

仔细观察贴片式发光二极管正面的一端有彩色标记,通常有标记的一端为阴极。

大家可观察TX-1C实验板上贴片发光二极管有一端有绿色标记,此标记即标识它是管子的阴极。

关于排阻大小的选择:

欧姆定律想必大家都清楚,U=IR,当发光二极管正常导通时,其

两端电压约为1.7V,发光管的阴极为低电平,即0V,阳极串接一电阻,电阻的另一端为Vcc,

为5V,因此加在电阻两端的电压为5V-1.7V=3.3V,计算穿过电阻的电流,3.3V/1000Q=3.3mA。

即穿过发光管的电流也为3.3mA,若想让发光管再亮一些,我们可以适当减小该电阻。

(3) 74HC573锁存器。

它是一种数字芯片,由于数字芯片种类成千上万,我们不可能将其全部记住,所以只能用一个学一个,然后弄明白它,日积月累,大家必将能灵活地设计出各种电路。

关于锁存器我们作为一个知识点来讲解。

其直插式和贴片式实物图分别如图2.2.11和2.2.12所示。

知识点•.锁存器

图2.2.13为74HC573的引脚分布图,先对照引脚图分别介绍各个引脚的作用

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2