单片机的 c语言轻松入门.docx

上传人:b****2 文档编号:24518520 上传时间:2023-05-28 格式:DOCX 页数:103 大小:1.23MB
下载 相关 举报
单片机的 c语言轻松入门.docx_第1页
第1页 / 共103页
单片机的 c语言轻松入门.docx_第2页
第2页 / 共103页
单片机的 c语言轻松入门.docx_第3页
第3页 / 共103页
单片机的 c语言轻松入门.docx_第4页
第4页 / 共103页
单片机的 c语言轻松入门.docx_第5页
第5页 / 共103页
点击查看更多>>
下载资源
资源描述

单片机的 c语言轻松入门.docx

《单片机的 c语言轻松入门.docx》由会员分享,可在线阅读,更多相关《单片机的 c语言轻松入门.docx(103页珍藏版)》请在冰豆网上搜索。

单片机的 c语言轻松入门.docx

单片机的c语言轻松入门

 

单片机的C语言轻松入门

 

随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言到逐渐使

用高级语言开发,其中主要是以C语言为主,市场上几种常见的单片机均有其C语言开发

环境。

这里以最为流行的80C51单片机为例来学习单片机的C语言编程技术。

本书共分六章,每章一个专题,以一些待完成的任务为中心,围绕该任务介绍C语言

的一些知识,每一个任务都是可以独立完成的,每完成一个任务,都能掌握一定的知识,等

到所有的任务都完成后,即可以完成C语言的入门工作。

 

第1章

 

C语言概述及其开发环境的建立

 

学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好。

Keil软件是目

前最流行开发80C51系列单片机的软件,Keil提供了包括C编译器、宏汇编、连接器、库

管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境

(µVision)将这些部份组合在一起。

在学会使用汇编语言后,学习C语言编程是一件比较容易的事,我们将通过一系列的

实例介绍C语言编程的方法。

图1-1所示电路图使用89S52单片机作为主芯片,这种单片

机性属于80C51系列,其内部有8K的FLASH

ROM,可以反复擦写,并有ISP功能,支

持在线下载,非常适于做实验。

89S52的P1引脚上接8个发光二极管,P3.2~P3.4引脚上接

4个按钮开关,我们的任务是让接在P1引脚上的发光二极管按要求发光。

 

+5V

 

+5V

 

E1

10U

 

+

PZ11K

D1

P1.0

 

89×××

VCC

 

D8

RST

R1

10K

 

27P

 

27P

 

CY

 

XTAL2

XTAL1

GND

EA/VPP

 

图1-1接有LED的单片机基本电路

 

1.1

简单的C程序介绍

 

例1-1:

让接在P1.0引脚上的LED发光。

/*************************************************

平凡单片机工作室

Copyright2003pingfan'smcustudio

AllrightsReserved

作者:

周坚

dddl.c

单灯点亮程序

*************************************************/

 

#include“reg51.h”

sbitP1_0=P1^0;

voidmain()

{P1_1=0;

}

这个程序的作用是让接在P1.0引脚上的LED点亮。

下面来分析一下这个C语言程序包

含了哪些信息。

1)“文件包含”处理。

程序的第一行是一个“文件包含”处理。

所谓“文件包含”是指一个文件将另外一个文件的内容全部包含进来,所以这里的程序

虽然只有4行,但C编译器在处理的时候却要处理几十或几百行。

这里程序中包含REG51.h

文件的目的是为了要使用P1这个符号,即通知C编译器,程序中所写的P1是指80C51单

片机的P1端口而不是其它变量。

这是如何做到的呢?

打开reg51.h可以看到这样的一些内容:

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

REG51.H

 

Headerfileforgeneric80C51and80C31microcontroller.

Copyright(c)1988-2001KeilElektronikGmbHandKeilSoftware,Inc.

Allrightsreserved.

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

 

/*BYTERegister

sfrP0=0x80;

sfrP1=0x90;

sfrP2=0xA0;

sfrP3=0xB0;

sfrPSW=0xD0;

sfrACC=0xE0;

sfrB=0xF0;

sfrSP=0x81;

sfrDPL=0x82;

sfrDPH=0x83;

sfrPCON=0x87;

sfrTCON=0x88;

sfrTMOD=0x89;

sfrTL0=0x8A;

sfrTL1=0x8B;

sfrTH0=0x8C;

sfrTH1=0x8D;

sfrIE=0xA8;

sfrIP=0xB8;

sfrSCON=0x98;

sfrSBUF=0x99;

*/

 

/*BITRegister*/

/*PSW*/

sbitCY=0xD7;

sbitAC=0xD6;

sbitF0=0xD5;

sbitRS1=0xD4;

sbitRS0=0xD3;

sbitOV=0xD2;

sbitP=0xD0;

 

/*TCON*/

sbitTF1=0x8F;

sbitTR1=0x8E;

sbitTF0=0x8D;

sbitTR0=0x8C;

sbitIE1=0x8B;

sbitIT1=0x8A;

sbitIE0=0x89;

sbitIT0=0x88;

 

/*IE

sbitEA

sbitES

sbitET1

sbitEX1

sbitET0

sbitEX0

 

/*IP

sbitPS

sbitPT1

sbitPX1

sbitPT0

sbitPX0

*/

=0xAF;

=0xAC;

=0xAB;

=0xAA;

=0xA9;

=0xA8;

 

*/

=0xBC;

=0xBB;

=0xBA;

=0xB9;

=0xB8;

 

/*P3*/

sbitRD=0xB7;

sbitWR=0xB6;

sbitT1=0xB5;

sbitT0=0xB4;

sbitINT1=0xB3;

sbitINT0=0xB2;

sbitTXD=0xB1;

 

sbitRXD

 

=0xB0;

 

/*SCON*/

sbitSM0=0x9F;

sbitSM1=0x9E;

sbitSM2=0x9D;

sbitREN=0x9C;

sbitTB8=0x9B;

sbitRB8=0x9A;

sbitTI=0x99;

sbitRI=0x98;

熟悉80C51内部结构的读者不难看出,这里都是一些符号的定义,即规定符号名与地

址的对应关系。

注意其中有

sfrP1=0x90;

这样的一行(上文中用黑体表示),即定义P1与地址0x90对应,P1口的地址就是0x90

(0x90是C语言中十六进制数的写法,相当于汇编语言中写90H)。

从这里还可以看到一个频繁出现的词:

sfr

sfr并标准C语言的关键字,而是Keil为能直接访问80C51中的SFR而提供了一个新

的关键词,其用法是:

sfrt变量名=地址值。

2)符号P1_0来表示P1.0引脚。

在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C

语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0是不是就是P1.0

呢?

你这么认为,C编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil

的关键字sbit来定义,sbit的用法有三种:

第一种方法:

sbit位变量名=地址值

第二种方法:

sbit位变量名=SFR名称^变量位地址值

第三种方法:

sbit位变量名=SFR地址值^变量位地址值

如定义PSW中的OV可以用以下三种方法:

C

sbitOV=0xd2

sbitOV=PSW^2

sbitOV=0xD0^2

(1)说明:

0xd2是OV的位地址值

(2)说明:

其中PSW必须先用sfr定义好

(3)说明:

0xD0就是PSW的地址值

因此这里用sfrP1_0=P1^0;就是定义用符号P1_0来表示P1.0引脚,如果你愿意也可以

起P10一类的名字,只要下面程序中也随之更改就行了。

3)main称为“主函数”。

每一个C语言程序有且只有一个主函数,函数后面一定有一对大括号“{}”,在大括号

里面书写其它程序。

从上面的分析我们了解了部分C语言的特性,下面再看一个稍复杂一点的例子。

例1-2让接在P1.0引脚上的LED闪烁发光

/*************************************************

平凡单片机工作室

Copyright2003pingfan'smcustudio

AllrightsReserved

 

作者:

周坚

ddss.c

单灯闪烁程序

*************************************************/

#include"reg51.h"

#defineucharunsignedchar

#defineuintunsignedint

sbitP10=P1^0;

/*延时程序

由Delay参数确定延迟时间

*/

voidmDelay(unsignedintDelay)

{unsignedinti;

for(;Delay>0;Delay--)

{for(i=0;i<124;i++)

{;}

}

}

 

voidmain()

{for(;;)

{P10=!

P10;//取反P1.0引脚

mDelay(1000);

}

}

程序分析:

主程序main中的第一行暂且不看,第二行是“P1_0=!

P1_0;”,在P1_0前有

一个符号“!

”,符号“!

”是C语言的一个运算符,就像数学中的“+”、“-”一样,是一种

运算任号,意义是“取反”,即将该符号后面的那个变量的值取反。

注意:

取反运算只是对变量的值而言的,并不会自动改变变量本身。

可以认为C编译

器在处理“!

P1_0”时,将P1_0的值给了一个临时变量,然后对这个临时变量取反,而不

是直接对P1_0取反,因此取反完毕后还要使用赋值符号(“=”)将取反后的值再赋给P1_0,

这样,如果原来P1.0是低电平(LED亮),那么取反后,P1.0就是高电平(LED灭),反之,

如果P1.0是高电平,取反后,P1.0就是低电平,这条指令被反复地执行,接在P1.0上灯就

会不断“亮”、“灭”。

该条指令会被反复执行的关键就在于main中的第一行程序:

for(;;),这里不对此作详细

的介绍,读者暂时只要知道,这行程序连同其后的一对大括号“{}”构成了一个无限循环语

句,该大括号内的语句会被反复执行。

第三行程序是:

“mDelay(1000);”,这行程序的用途是延时1s时间,由于单片机执行指

令的速度很快,如果不进行延时,灯亮之后马上就灭,灭了之后马上就亮,速度太快,人眼

根本无法分辨。

这里mDelay(1000)并不是由KeilC提供的库函数,即你不能在任何情况下写这样一行

程序以实现延时。

如果在编写其它程序时写上这么一行,会发现编译通不过。

那么这里为什

么又是正确的呢?

注意观察,可以发现这个程序中有voidmDelay(…)这样一行,可见,

 

mDelay这个词是我们自己起的名字,并且为此编写了一些程序行,如果你的程序中没有这

么一段程序行,那就不能使用mDelay(1000)了。

有人脑子快,可能马上想到,我可不可

以把这段程序也复制到我其它程序中,然后就可以用mDelay(1000)了呢?

回答是,那当然

就可以了。

还有一点需要说明,mDelay这个名称是由编程者自己命名的,可自行更改,但

一旦更改了名称,main()函数中的名字也要作相应的更改。

mDelay后面有一个小括号,小括号里有数据(1000),这个1000被称之“参数”,用它

可以在一定范围内调整延时时间的长短,这里用1000来要求延时时间为1000毫秒,要做到

这一点,必须由我们自己编写的mDelay那段程序决定的,详细情况在后面循环程序中再作

分析,这里就不介绍了。

 

1.2

Keil工程的建立

 

要使用Keil软件,首先要正确安装Keil软件,该软件的Eval版本可以直接去

下载,安装时选择EvalVision,其它步骤与一般Windows程序安装类似,

这里就不再赘述了。

安装完成后,将Ledkey.dll文件复制到Keil安装目录下的C51\BIN文

件夹下,这是作者提供的键盘与LED实验仿真板,可与Keil软件配合,在计算机上模拟LED

和按键的功能。

启动µVison,点击“FileNew…”在工程管理器的右侧打开一个新的文件输入窗口,

在这个窗口里输入例1-2中的源程序,注意大小写及每行后的分号,不要错输及漏输。

输入完毕之后,选择“FileSave”,给这个文件取名保存,取名字的时候必须要加上扩

展名,一般C语言程序均以“.C”为扩展名,这里将其命名为exam2.c,保存完毕后可以将

该文件关闭。

Keil不能直接对单个的C语言源程序进行处理,还必须选择单片机型号;确定编译、汇

编、连接的参数;指定调试的方式;而且一些项目中往往有多个文件,为管理和使用方便,

Keil使用工程(Project)这一概念,将这些参数设置和所需的所有文件都加在一个工程中,

只能对工程而不能对单一的源程序进行编译和连接等操作。

点击“Project->NewProject…”菜单,出现对话框,要求给将要建立的工程起一个名字,

这里起名为exam2,不需要输入扩展名。

点击“保存”按钮,出现第二个对话框,如图1-2

所示,这个对话框要求选择目标CPU(即你所用芯片的型号),Keil支持的CPU很多,这

里选择Atmel公司的89S52芯片。

点击ATMEL前面的“+”号,展开该层,点击其中的89S52,

然后再点击“确定”按钮,回到主窗口,此时,在工程窗口的文件页中,出现了“Target1”,

前面有“+”号,点击“+”号展开,可以看到下一层的“SourceGroup1”,这时的工程还是

一个空的工程,里面什么文件也没有,需要手动把刚才编写好的源程序加入,点击“Source

Group1”使其反白显示,然后,点击鼠标右键,出现一个下拉菜单,如图1-3所示,选中其

中的“AddfiletoGroup”SourceGroup1”,出现一个对话框,要求寻找源文件。

 

双击exam2.c文件,将文件加入项目,注意,在文件加入项目后,该对话框并不消失,

等待继续加入其它文件,但初学时常会误认为操作没有成功而再次双击同一文件,这时会出

现如图1-4所示的对话框,提示你所选文件已在列表中,此时应点击“确定”,返回前一对

话框,然后点击“Close”即可返回主接口,返回后,点击“SourceGroup1”前的加号,exam3.c

文件已在其中。

双击文件名,即打开该源程序。

 

图1-2选择单片机型号

 

1.3

工程的详细设置

 

工程建立好以后,还要对工程进行进一步的设置,以满足要求。

首先点击左边Project窗口的Target1,然后使用菜单“Project->Optionfortarget‘target1’”

即出现对工程设置的对话框,这个对话框共有8个页面,大部份设置项取默认值就行了。

Target页

 

图1-3加入文件

 

如图1-5所示,Xtal后面的数值是晶振频率值,默认值是所选目标CPU的最高可用频

率值,该值与最终产生的目标代码无关,仅用于软件模拟调试时显示程序执行时间。

正确设

置该数值可使显示时间与实际所用时间一致,一般将其设置成与你的硬件所用晶振频率相

同,如果没必要了解程序执行的时间,也可以不设。

 

图1-4重复加入源程序得到的提示

MemoryModel用于设置RAM使用情况,有三个选择项:

Small:

所有变量都在单片机的内部RAM中;

Compact:

可以使用一页(256字节)外部扩展RAM;

Larget:

可以使用全部外部的扩展RAM。

CodeModel用于设置ROM空间的使用,同样也有三个选择项:

Small:

只用低于2K的程序空间;

Compact:

单个函数的代码量不能超过2K,整个程序可以使用64K程序空间;

Larget:

可用全部64K空间;

这些选择项必须根据所用硬件来决定,由于本例是单片应用,所以均不重新选择,按默

认值设置。

Operating:

选择是否使用操作系统,可以选择Keil提供了两种操作系统:

Rtxtiny和

 

图1-5设置目标

Rtxfull,也可以不用操作系统(None),这里使用默认项None,即不用操作系统。

 

OutPut页

如图1-6所示,这里面也有多个选择项,其中CreatHexfile用于生成可执行代码文件,

该文件可以用编程器写入单片机芯片,其格式为intelHEX格式,文件的扩展名为.HEX,默

认情况下该项未被选中,如果要写片做硬件实验,就必须选中该项。

工程设置对话框中的其它各页面与C51编译选项、A51的汇编选项、BL51连接器的连

接选项等用法有关,这里均取默认值,不作任何修改。

以下仅对一些有关页面中常用的选项

作一个简单介绍。

Listing页

该页用于调整生成的列表文件选项。

在汇编或编译完成后将产生(*.lst)的列表文件,

在连接完成后也将产生(*.m51)的列表文件,该页用于对列表文件的内容和形式进行细致

的调节,其中比较常用的选项是“CCompileListing”下的“AssambleCode”项,选中该项

可以在列表文件中生成C语言源程序所对应的汇编代码,建议会使用汇编语言的C初学者

选中该项,在编译完成后多观察相应的List文件,查看C源代码与对应汇编代码,对于提

高C语言编程能力大有好处。

C51页

该页用于对Keil的C51编译器的编译过程进行控制,其中比较常用的是“Code

Optimization”组,如图1.7所示,该组中Level是优化等级,C51在对源程序进行编译时,

可以对代码多至9级优化,默认使用第8级,一般不必修改,如果在编译中出现一些问题,

可以降低优化级别试一试。

Emphasis是选择编译优先方式,第一项是代码量优化(最终生

 

图1-6设置输出文件

成的代码量小);第二项是速度优先(最终生成的代码速度快);第三项是缺省。

默认采用速

度优先,可根据需要更改。

 

Debug页

该页用于设置调试器,Keil提供了仿真器和一些硬件调试方法,如果没有相应的硬件调

试器,应选择UseSimulator,其余设置一般不必更改,有关该页的详细情况将在程序调试部

 

图1-7C51编译器选项

分再详细介绍。

至此,设置完成,下面介绍如何编译、连接程序以获得目标代码,以及如何进行程序的

调试工作。

 

1.4

编译、连接

 

下面我们通过一个例子来介绍C程序编译、连接的过程。

这个例子使P1口所接LED

以流水灯状态显示。

将下面的源程序输入,命名为exam3.c,并建立名为exam3的工程文件,将exam3.c文

件加入该工程中,设置工程,在Target页将Xtal后的值由24.0改为12.0,以便后面调试时

观察延时时间是否正确,本项目中还要用到我们所提供的实验仿真板,为此需在Debug页

对DialogDLL对话框作一个设置,在进行项目设置时点击Debug,打开Debug页,可以看

到DialogDLL对话框后的Parmeter:

输入框中已有默认值-pAT52,在其后键入空格后再输入

-dledkey,如图1-8所示。

例1-3

使P1口所接LED以流水灯状态显示

/**************************************************

;

;

平凡单片机工作室

;Copyright2003pingfan'sMcuStudio

;AllrightsReserved

 

图1-8Debug选项设置

;作者:

周坚

;lsd.c

;流水灯程序

**************************************************/

#include"reg51.h"

#include"intrins.h"

#defineucharunsignedchar

#defineuintunsignedint

/*延时程序

由Delay参数确定延迟时间

*/

voidmDelay(unsignedintDelay)

{unsignedinti;

for(;Delay>0;Delay--)

{for(i=0;i<124;i++)

{;}

}

}

 

voidmain()

{unsignedcharOutData=0xfe;

for(;;)

{

 

P1=OutData;

OutData=_crol_(OutData,1);//循环左移

mDelay(1000);/*延时1000毫秒*/

}

}

设置好工程后,即可进行编译、连接。

选择菜单Project->Buildtarget,对当前工程进行

连接,如果当前文件已修改,将先对该文件进行编译,然后再连接以产生目标代码;如果选

择RebuildAlltargetfiles将会对当前工程中的所有文件重新进行编译然后再连接,确保最终

生产的目标代码是最新的,而Translate….项则仅对当前文件进行编译,不进行连接。

以上

操作也可以通过工具栏按钮直接

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

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1