粤嵌单片机与C语言入门学习.docx
- 文档编号:4122682
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:66
- 大小:59.76KB
粤嵌单片机与C语言入门学习.docx
《粤嵌单片机与C语言入门学习.docx》由会员分享,可在线阅读,更多相关《粤嵌单片机与C语言入门学习.docx(66页珍藏版)》请在冰豆网上搜索。
粤嵌单片机与C语言入门学习
单片机的C语言轻松入门
随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言到逐渐使
用高级语言开发,其中主要是以C语言为主,市场上几种常见的单片机均有其C语言开发
环境。
这里以最为流行的80C51单片机为例来学习单片机的C语言编程技术。
本书共分六章,每章一个专题,以一些待完成的任务为中心,围绕该任务介绍C语言
的一些知识,每一个任务都是可以独立完成的,每完成一个任务,都能掌握一定的知识,等
到所有的任务都完成后,即可以完成C语言的入门工作。
第1章C语言概述及其开发环境的建立
学习一种编程语言,最重要的是建立一个练习环境,边学边练才能学好。
Keil软件是目
前最流行开发80C51系列单片机的软件,Keil提供了包括C编译器、宏汇编、连接器、库
管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境
(µVision)将这些部份组合在一起。
在学会使用汇编语言后,学习C语言编程是一件比较容易的事,我们将通过一系列的
实例介绍C语言编程的方法。
图1-1所示电路图使用89S52单片机作为主芯片,这种单片
机性属于80C51系列,其内部有8K的FLASHROM,可以反复擦写,并有ISP功能,支
持在线下载,非常适于做实验。
89S52的P1引脚上接8个发光二极管,P3.2~P3.4引脚上接
4个按钮开关,我们的任务是让接在P1引脚上的发光二极管按要求发光。
1.1简单的C程序介绍
例1-1:
让接在P1.0引脚上的LED发光。
/*************************************************
平凡单片机工作室
Copyright2003pingfan'smcustudio
AllrightsReserved
作者:
周坚
dddl.c
单灯点亮程序
*************************************************/
图1-1接有LED的单片机基本电路
P1.0
EA/VPP
VCC
XTAL2
XTAL1
GND
RST
+5V+5V
+
R1
E1
10K
10U
CY27P
27P
1KPZ1
D8
D1
89×××#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=0xAF;
sbitES=0xAC;
sbitET1=0xAB;
sbitEX1=0xAA;
sbitET0=0xA9;
sbitEX0=0xA8;
/*IP*/
sbitPS=0xBC;
sbitPT1=0xBB;
sbitPX1=0xBA;
sbitPT0=0xB9;
sbitPX0=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编译器可不这么认为,所以必须给它们建立联系,这里使用了KeilC
的关键字sbit来定义,sbit的用法有三种:
第一种方法:
sbit位变量名=地址值
第二种方法:
sbit位变量名=SFR名称^变量位地址值
第三种方法:
sbit位变量名=SFR地址值^变量位地址值
如定义PSW中的OV可以用以下三种方法:
sbitOV=0xd2
(1)说明:
0xd2是OV的位地址值
sbitOV=PSW^2
(2)说明:
其中PSW必须先用sfr定义好
sbitOV=0xD0^2(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.2Keil工程的建立
要使用Keil软件,首先要正确安装Keil软件,该软件的Eval版本可以直接去
下载,安装时选择EvalVision,其它步骤与一般Windows程序安装类似,
这里就不再赘述了。
安装完成后,将Ledkey.dll文件复制到Keil安装目录下的C51\BIN文
件夹下,这是作者提供的键盘与LED实验仿真板,可与Keil软件配合,在计算机上模拟LED
和按键的功能。
启动µVison,点击“FileÆNew…”在工程管理器的右侧打开一个新的文件输入窗口,
在这个窗口里输入例1-2中的源程序,注意大小写及每行后的分号,不要错输及漏输。
输入完毕之后,选择“FileÆSave”,给这个文件取名保存,取名字的时候必须要加上扩
展名,一般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.3工程的详细设置
工程建立好以后,还要对工程进行进一步的设置,以满足要求。
首先点击左边Project窗口的Target1,然后使用菜单“Project->Optionfortarget‘target1’”
即出现对工程设置的对话框,这个对话框共有8个页面,大部份设置项取默认值就行了。
Target页
图1-2选择单片机型号
图1-3加入文件如图1-5所示,Xtal后面的数值是晶振频率值,默认值是所选目标CPU的最高可用频
率值,该值与最终产生的目标代码无关,仅用于软件模拟调试时显示程序执行时间。
正确设
置该数值可使显示时间与实际所用时间一致,一般将其设置成与你的硬件所用晶振频率相
同,如果没必要了解程序执行的时间,也可以不设。
MemoryModel用于设置RAM使用情况,有三个选择项:
Small:
所有变量都在单片机的内部RAM中;
Compact:
可以使用一页(256字节)外部扩展RAM;
Larget:
可以使用全部外部的扩展RAM。
CodeModel用于设置ROM空间的使用,同样也有三个选择项:
Small:
只用低于2K的程序空间;
Compact:
单个函数的代码量不能超过2K,整个程序可以使用64K程序空间;
Larget:
可用全部64K空间;
这些选择项必须根据所用硬件来决定,由于本例是单片应用,所以均不重新选择,按默
认值设置。
Operating:
选择是否使用操作系统,可以选择Keil提供了两种操作系统:
Rtxtiny和
Rtxfull,也可以不用操作系统(None),这里使用默认项None,即不用操作系统。
图1-5设置目标
图1-4重复加入源程序得到的提示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.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-7C51编译器选项;作者:
周坚
;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(;;)
{
图1-8Debug选项设置P1=OutData;
OutData=_crol_(OutData,1);//循环左移
mDelay(1000);/*延时1000毫秒*/
}
}
设置好工程后,即可进行编译、连接。
选择菜单Project->Buildtarget,对当前工程进行
连接,如果当前文件已修改,将先对该文件进行编译,然后再连接以产生目标代码;如果选
择RebuildAlltargetfiles将会对当前工程中的所有文件重新进行编译然后再连接,确保最终
生产的目标代码是最新的,而Translate….项则仅对当前文件进行编译,不进行连接。
以上
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言 入门 学习