单片机c 语言教程.pdf

上传人:文*** 文档编号:88051738 上传时间:2023-04-20 格式:PDF 页数:72 大小:10.46MB
返回 下载 相关 举报
单片机c 语言教程.pdf_第1页
第1页 / 共72页
单片机c 语言教程.pdf_第2页
第2页 / 共72页
点击查看更多>>
资源描述

《单片机c 语言教程.pdf》由会员分享,可在线阅读,更多相关《单片机c 语言教程.pdf(72页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、单片机c语言教程第一课 建立你的第一个KeilC51项目随着里2也技术的不断发展,以单片机C 语言为主流的高级语言也不断被更多的单片机爱好者和工程师所喜爱。使用C51肯定要使用到编译器,以便把写好的C 程序编译为机器码,这样单片机才能执行编写好的程序。KEIL UVISI0N2是众多单片机应用开发软件中优秀的软件之一,它支持众多不一样公司的MCS51架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C 语言的程序设计,它的界面和常用的微软VC+的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。本站提供的单片机c 语言教程都是基于keilc51的。下面结

2、合8051介绍单片机C 语言的优越性:无须懂得单片机的具体硬件,也能够编出符合硬件实际的专业水平的程序;不懂得单片机的指令集,也能够编写完美的单片机程序;不同函数的数据实行覆盖,有效利用片上有限的RAM空间;,提供auto、static、const等存储类型和专门针对8051单片机的data、idata、pdata、xdata、code等存储类型,自动为变量合理地分配地址;C 语言提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程序处理能力和灵活性;,提供small、compact、large等编译模式,以适应片上存储器的大小;,中断服务程序的现场保护和恢复,中断向量表的填写

3、,是直接与单片机相关的,都由C 编译器代办;,程序具有坚固性:数据被破坏是导致程序运行异常的重耍因素。C 语言对数据进行了许多专业性的处理,避免了运行中间非异步的破坏 提供常用的标准函数库,以供用户直接使用;有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉:可方便地接受多种实用程序的服务:如片上资源的初始化有专门的实用程序自动生成;再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。头文件中定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的系列化产品的开发;以上简单介绍了 KEILC51软件,要使用KEILC51软件,必需先要安装它,

4、这也是学习单片机编程语言所要求的第一步一一建立学习环境。本站提供无限制版的keil c51下载(此处)(安装的方法在压缩包内有详细说明,这里就不做介绍了)安装好后,您是不是想建立自己的第一个单片机C 语言程序项目呢?下面就让我们一起来建立一个小程序吧,请根据教程一步步的来,你绝对可以在短时间内熟悉c51的。本教程所涉及C51源代码请点此下载首先当然是运行KEIL软件,接着按下面的步骤建立您的第一个项目:(1)点 击 Project菜单,选择弹出的下拉式菜单中的New Project,如 图 12。接着弹出一个标准Windows文件对话窗口,如 图 13。在 文 件名 中输入您的第一个C 程序项

5、目名称,这里我们用test。保存 后的文件扩展名为uv2,这 是 KEIL uVision2项目文件扩展名,以后能直接点击此文件以打开先前做的项目。pVision2File Edit View Project Debug Peripherals Tools SVCS?窗 百 P。New Project.森 圜 倒 后Targets Groups,Files.Select Device for Targ法.,1 picavr.co mI mport pVision 1 Project.Open ProjectClose ProjectFile Extensions Books and Envir

6、onment图 1一2 New Project 菜单图 1-3 文件窗口(2)选择所要的单片机,这里选择常用的Atem l公司的AT89C51.而且本单片机c 语言教程里的大部分程序都是基于此芯片的,此时屏幕如图14 所示。AT89C51有什么功能、特点呢?看图中右边有简单的介绍。完成上面步骤后,就可以进行程序的编写了。(3)首先在项目中创建新的程序文件或加入I日程序文件。如果您没有现成的程序,那么就要新建一个程序文件。在 KEIL 中有一些程序的Dem。,在这里我们还是以一个C 程序为例介绍如何新建个C 程序和如何加到您的第 个项目中吧。点 击 图 15 中 1 的新建文件的快捷按钮,在 2

7、 中出现一个新的文字编辑窗口,这个操作也能通过菜单File-New 或 快 捷 键 Ctrl+N来实现。好了,现在能编写程序了。下面是经典的一段程序,呵,如果您看过别的程序书也许也有类似的程序:#include#include void main(void)(SCON=0 x50;串口方式1,允许接收TMOD=0 x20;定时器1 定时方式2TCON=0 x40;设定时器1 开始计数TH1=0 xE8;/11.0592MHz 1200 波特率TL1=0 xE8;TI=1;TRI=1;启动定时器while(l)printf(Hello World!n);显示 Hello World图 1-4 选

8、取芯片图 15 新建程序文件这段程序的功能是不断从串行口输出Hell。World!”字符,先不管程序的语法和意思吧,先看看如何把它加入到项目中和如何编译试运行。(4)点 击 图 15 中 的 3 保存新建的程序,也能用菜单File-Save或快捷键Ctrl+S进行保存。因是新文件所以保存时会弹出类似图13 的文件操作窗口,把第一个程序命名为 testl.c,保存在项目所在的目录中,这个时候您会发现程序单词有了不样的颜色,说 明 KEIL的 C 语言语法检查生效了。如 图 1一6 鼠标在屏幕左边的Source G roupl文件夹图标上右击弹出菜单,在这里能做在项目中增加减少文件等操作。选Add

9、 File to Group Source Group lm弹出文件窗口,选择刚刚保存的文件,按 AD D 按钮,关闭文件窗,程序文件已加到项目中了。这个时候在Source G roupl文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它能展开查看。遇 test-Usion2File Edit View Project Debug Peripherals Tools SVCS Window Help窗总i s解 /至亳 au 率率力,茏力遂聃j日 日 Target 1Sourci6 D:MyData其它 我的文章在51cSelect Device for Target Target

10、1*Options for Group Source Group 1Open Filei蔡I Rebuild targetiX l Build target F7Translate File鬲 Stop buildAdd Files to Group Source Group 1,Targets Groups,Files.Remove Group Source Group 1 and it u-Z-r-r,1-p-5IpiC3 匚 口 m图 16 把文件加入到项目文件组中(5)C 程序文件已被加到了项目中了,下面就剩下编译运行了。这个项目只是用做学习新建程序项目和编译运行仿真的基本方法,所以使

11、用软件默认的编译设置,它不会生成用于芯片烧写的H EX文件。先来看图17 吧,图 中 1、2、3都是编译按钮,不一样是1 是用于编译单个文件。2 是编译链接当前项目,如果先前编译过一次之后文件没有做动编辑改动,这个时候再点击是不会再次重新编译的。3 是重新编译,每点击一次均会再次编译链接一次,不 管程序是否有改动。在 3 右边的是停止编译按钮,只有点击了前三个中的任一个,停止按钮才会生效。5 是菜单中的它们。在 4 中能看到编译的错误信息和使用的系统资源情况等,以后我们要查错就靠它了。6 是有一个小放大镜的按钮,这就是开启 关闭调试模式的按钮,它也存在于菜单Debug-StartStop De

12、bug Session,快捷键为Ctrl+F5,PD:test-Wision2File Edit View Project Debug Peripheral6怎 国 阿 后1 2用一New Project.I mport pVisionl ProjectOpen ProjectClose ProjectFile Extensions Books.Target 1S -Q l 5our(.tTargets Groups,Files.Select Device for TargeRemove I temOptions for Target TarClear Group and File OfHBu

13、ild tarecompilinglinking.Program S:test-(i:X j Build target倒 Rebuild all target files害 Translate D:MyDataJ通 Stop build 图 1 7 编译程序(6)进入调试模式,软件窗口样式大致如图18 所示。图 中 1 为运行,当程序处于停止状态时才有效,2 为停止,程序处于运行状态时才有效。3 是复位,模拟芯片的复位,程序回到最开头处执行。按 4 能打开5 中的串行调试窗口,这个窗口能看到从5 1 芯片的串行口输入输出的字符,这里的第一个项目也正是在这里看运行结果。这些在菜单中也有。首 先

14、按 4 打开串行调试窗口,再按运行键,这个时候就能看到串行调试窗口中不断的打印Hello World!最后要停止程序运行回到文件编辑模式中,就要先按停止按钮再按开启 关闭调试模式按钮。然后就能进行关闭KEIL等相关操作了。File Edit View Project Debug Peripherals Tools SVCS Window Help道 总:口 廓/电 亳|夕 a率 隼4%斑 哂 图 三I腌旗离。厄 国|对 瞰 曲 则瑞|助 暮 眄 济 华 彳|中 盛 送 儆 忘1歹 皆 盲 片 不自 D:MyD.,1 1 x#include AT89X51.H:#include void mai

15、n(void)SCON=0 x50;/串一TMOD=nv?n-/市M Serial#1Hello World!Hello World!-Hello World!Hello World!Hello World!Hello World!U c 1 1 c U”1 A I昌 Files 苧.g.=1 testl.c a Serial#1图 18 调试运行程序5 单片机c语言教程第二课C 51 H E X文件的生成和单片机最小系统上一篇建立了第一个单片机C 语言项目,但为了让编译好的程序能通过编程器写入51芯 片 中,要先用编译器生成HEX文件,下面来看看如何用KEI L UVI SI 0N2来编译生

16、成用于烧写 芯片的HEX文件。HEX文件格式是I ntel公司提出的按地址排列的数据信息,数据宽度为字节,所有数据使用16进制数字表示,常用来保存单片机或其他处理器的目标程序代码。它保存物理程序存储区中的目标代码映象。一般的编程器都支持这种格式。我们先来打开第一个项目,打开它的所在目录,找到test.Uv2的文件就能打开先前的项目了。然后右击图21 中的1项目文件夹,弹出项目功能菜单,选 Optionsfor TargetTargetl,弹出项目选项设置窗口,同样先选中项目文件夹图标,这个时候在Project菜单中也有一样的菜单可选。打开项目选项窗口,转到Output选项页图22 所示,图中1

17、 是选择编译输出的路径,2 是设置编译输出生成的文件 名,3 则是决定是否要创建HEX文件,选中它就能输出HEX文件到指定的路径中。选好了?好,我们再将它重新编译一次,很快在编译信息窗口中就显示HEX文件创建到指定的路径中了,如图23。这样我们就可用自己的编程器所附带的软件去读取并烧到芯片了,再用实验板看结果,至于编程器或仿真器品种繁多具体方法就看它的说明书了,这里也不做讨论。(技巧:一、在图21 中的1 里的项目文件树形目录中,先选中对象,再单击它就可对它进行重命名操作,双击文件图标便可打开文件。二、在 Project卜拉菜单的最下方有最近编辑过的项目路径保存,这里能快速打开最近在编辑的项目

18、。)图 21项目功能菜单图 22 项目选项窗口B Files 于 心BB uild ta rg e t T arget 1com piling te s t 1.c.lin k in g.Program S iz e:data=30 1 xdata=0 code=llQ。c re atin q hex i 1e from te s t”te st -0 E rro r(s),0 W arning(s).-I _ I _ I _R Build Command 入 Find in Files/-51 图 23 编译信息窗口或许您已把编译好的文件烧到了芯片上,如果您购买或自制了带串行口输出兀件的学习

19、实验板,那您就能把串行口和PC机串行口相联用串行口调试软件或Windows的超级终端,将 其 波 特 率 设 为 1200,就能看到不停输出的Hello World!字样。如果您还没有实验板,那这里先说说AT89C51的最小化系统,再以一实例程序验证最小化系统是否在运行,这个最小化系统也易于自制用于实验。图 24 便 是 AT89C51的最小化系统,不过为了让我们能看出它是在运行的,加了一个电阻和一个LED,用以显示它的状态,晶体震荡器能根据自己的情况使用,一般实验板上.是用1L0592MHz或 12MHz,使用前者的好外是能产生标准的串行口波特率,后者则个机器周期为1 微秒,便于做精确定时。

20、在自己做实验里,注意的是V C C是+5V的,不能高于此值,不然将损坏单片机,太低则不能正常工作。在 3 1 脚要接高电平,这样我们才能执行片内的程序,如接低电平则使用片外的程序存储器。下面建一个新的项目名为OneLED来验证最小化系统是否能工作(所有的例程都可在笔者的主页下面下载到,网址:httD:。程序如下:#include 预处理命令void main(void)主函数名这是第一种注释方式unsigned int a;定义变量a 为 in t类型/*这是第二种注释方式*/do/do while组成循环for(a=0;a50000;a+);这是一个循环 Pl_0=0;设 P1.0 口为低电

21、平,点亮 LED for(a=0;a50000;a+);这是一个 循 环 Pl_0=1;设 P1.0 口为高电平,熄 灭 LED)while(l);INT1(P3.3)INT0(P3.2)T1(P3.5)T0(P3.4)EAATXTAL1XTAL2RESETRD(P3.7)WR(P3.6)RI S.2K 17 C3 16ATS9c51.0J.2.3.4.5.6.711111111PPPPPPPPPO,0(ADO)PO.1(AD1)P0.2(AD2)P0.3(AD3)P0.4(AD4)PO.5(AD5)P0.6(AD6)P0.7(AD7)P2.0(A8)P2.1(AP)P2.2(A10)P2.3

22、(AU)P2,(A12)P2.5(A13)P2.6(A14)P2.7(A15)vccGNDBXD(P3.0)TXD(P3.1)A L E T GPSEN39宠373?亘豆亘322122更更25262728402010豆3029ovccGNBOVCC5 图 2-4 AT89C51最小化系统这里先讲讲KEIL C 编译器所支持的注释语句。一种是以 符 号开始的语句,符号之后的语句都被视为注释,直到有回车换行。另一种是在7*和 */符号之内的为注释。注 释 不 会 被 C 编译器所编译。一 个 C 应用程序中应有一个main主函数,m ain函数能调用别的功能函数,但其它功能函数不允许调用m ain

23、函数。不 论 m ain函数放在程序中的那个位置,总是先被执行。用上面学到的知识编译写好的OneLED程序,并把它烧到刚做好的最小化系统中。上电,刚开始时LED 是不亮的(因为上电复位后所有的10 口都置1 引脚为高电平),然后延时一段时间(for(a=0;a50000;a+)这句在运行),LED亮,再延时,LED 熄灭,然后交替亮、灭。第一个真正的小实验就做完,如果没有这样的效果那么您就要认真检查一下电路或编译烧写的步骤了。单片机c语言教程第三课C51数据类型每写一个程序,总离不开数据的应用,在学习c5 1语言的过程中掌握理解数据类型也是很关键的。先看表3-1,表中列出了 KEIL uVis

24、ion2单片机c 语言编译器所支持的数据类型。在标准C 语言中基本的数据类型为char,int,short,long,float和 double,而在c51编译器中in t和 short相同,float和 double相同,这里就不列出说明了。下面亲看看它们的具体定义:数据类型长 度值 域unsigned char单字节0-255signed char单字节-128 +127表 31 KEIL uVision2单片机c 语言编译器所支持的数据类型(unsigned int双字节0-65535Isigned int双字节-32768 +32767(unsigned long四字节0-429496

25、7295(signed long四字节-2147483648+2147483647|float四字节1.175494E-38-3.402823E+381*1 3 字节对象的地址|bit位0 或 1|sfr单字节0-255|sfrl6双字节|-65535|sbit位1|0或 11.char字符类型c h a r类型的长度是一个字节,通常用于定义处理字符数据的变量或常量。分无符号字符类型unsigned char和有符号字符类型signed char,默认值为signed char类型。unsigned char类型用字节中所有的位来表示数值,所能表达的数值范围是0-255,signed char

26、类型用字节中最高位字节表示数据的符号,0表示正数,T 表示负数,负数用补码表示。所能表示的数值范围是-128+127。unsigned char常用于处理ASCII字符或用于处理小于或等于255的整型数。*正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加1。2.in t整型in t整型长度为两个字节,用于存放一个双字节数据。分有符号in t整型数signed in t和无符号整型数unsigned in t,默认值为signed in t类型。signed in t表示的数值范围是-32768+32767,字节中最高位表示数据的符号,、0”表示正数,表示负数。unsigned

27、in t表示的数值范围是。65535。先停一下来写个小程序看看unsigned char和 unsigned in t用于延时的不一样效果,说明它们的长度是不一样的,学习它们的使用方法。依旧用上一篇的最小化系统做实验,不过要加多一个电阻和LE D,如 图 3-1 实验中用D 1 的点亮表明正在用unsigned in t数值延时,用D 2 点亮表明正在用unsigned char数值延时。图 3-1 第 3 课实验用电路把这个项目称为TwoLED,实验程序如下:#include 预处理命令void main(void)主函数名(unsigned int a;定义变量 a 为 unsigned

28、int 类型unsigned char b;定义变量 b 为 unsigned char 类型do/do while组成循环for(a=0;a65535;a+)Pl_0=0;/65535次 设 P1.0 口为低电平,点 亮 LED Pl_0=1;设P1.0 口为高电平,熄 灭 LEDfor(a=0;a30000;a+);空循环for(b=0;b255;b+)Pl_l=0;/255次 设 P l.l 口为低电平,点 亮 LED P l_ l=1;设 P l.l 口为高电平,熄 灭 LEDfor(a=0;a30000;a+);空循环)while(l);同样编译烧写,上电运行您就能看到结果了。很 明

29、 显 D 1 点亮的时间长于D 2 点亮的时间。这里必须要讲的是,当定义个变量为特定的数据类型时,在程序使用该变量不应使它的值超过数据类型的值域。如本例中的变量b 不能赋超出0 255的值,如 for(b=0;b255;b+)改 为 for(b=0;b256;b+),编译是能通过的,但运行时就会有问题出现,就 是 说 b 的值永远都是小于25 6的,所以无法跳出循环执行下一句Pl_l=1,从而造成死循环。同 理 a 的值不应超出。65535。3.long长整型long长整型长度为四个字节,用于存放一个四字节数据。分有符号long长整型signed long和无符号长整型unsignedlong

30、,默认值为signed long类型。signed in t表示的数值范围是-2147483648+2147483647,字节中最高位表示数据的符号,、0”表示正数,、1”表示负数。unsigned long表示的数值范围是0-4294967295。4.float浮点型float浮点型在十进制中具有7 位有效数字,是符合IEEE-754标准的单精度浮点型数据,占用四个字节。因浮点数的结构较复杂在以后的章节中再做详细的讨论。5.*指针型指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这个指针变量要占据一定的内存单元,对不一样的处理器长度也不尽相同,在 C51中它的长度一般为13

31、个字节。指针变量也具有类型,在以后的课程中有专门一课做探讨,这里就不多说了。6.b it位标量b it位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不 是。就 是 1,类似一些高级语言中的Boolean类型中的True和 False。7.s fr特殊功能寄存器s fr也是一种扩充数据类型,点用一个内存单元,值域为。255。利用它能访问5 1 史 i 机内部的所有特殊功能寄存器。如 用 sfr Pl=0 x90这一句定P 1 为 P 1 端口在片内的寄存器,在后面的语句中用以用P1=255(对 P 1 端口的所有引脚置高

32、电平)之类的语句来操作特殊功能寄存器。8.sfrl6 1 6 位特殊功能寄存器s frl6 占用两个内存单元,值 域 为 0-65535。s frl6 和 sfr 一样用于操作特殊功能寄存器,所不一样的是它用于操作占两个字节的寄存器,如定时器T 0 和 T1。9.sb it可录址位sb it同样是单片机c 语言中的一种扩充数据类型,利用它能访问芯片内部的RAM 中的可寻址位或特殊功能寄存器中的可寻址位。如先前定义了sfr Pl=0 x90;因P l 端口的寄存器是可位寻址的,所以能定义sbit Pl_l=P l;/Pl_l 为 Pl 中的 P l.l 引脚同样我们能用P1.1的地址去写,如 s

33、bit Pl_l=0 x91;这样在以后的程序语句中就能用P l_ l来 对 P1.1引脚进行读写操作了。通常这些能直接使用系统供给的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引用能省去一点时间,我自己是一直用的。当然您也能自己写自己的定义文件,用您认为好记的名字。单片机c语言教程第四课C51常量上一篇学习了 KEIL c 单片机c 语言编译器所支持的数据类型。而这些C51数据类型又是怎么用在常量和变量的定义中的呢?又有什么要注意的吗?常量就是在程序运行过程中不能改变值的量,而变量是能在程序运行过程中不断变化的量。变量的定义能使用所有C51编译器支持的数据类型,而常量的数据类型只

34、有整型、浮点型、字符型、字符串型和位标量。这一篇学习常量定义和使用方法,而下 篇则学习单片机c 语言的变量。常量的数据类型说明是这样的1.整型常量能表示为十进制如123,0,-8 9 等。十六进制则以O x开头如0 x34,-0 x3B等。长整型就在数字后面加字母 L,如 104L,034L,0 xF340 等。2.浮点型常量可分为十进制和指数表示形式。十进制由数字和小数点组成,如 0.888,3345.345,0.0等,整数或小数部分为0,能省略但必须有小数点。指数表示形式为 士 数字.数字 e 士 数字,口中的内容为可选项,其中内容根据具体情况可有可无,但其余部分必须有,如 125e3,7

35、e9,-3.0e-33.字符型常量是单引号内的字符,如a,d等,不能显示的控制字符,能在该字符前面加一个反斜杠、”组成专用转义字符。常用转义字符表请看表41。4.字符串型常量由双引号内的字符组成,如test,、OK等。当引号内的没有字符时,为空字符串。在使用特殊字符时同样要使用转义字符如双引号。在 C 中字符串常量是做为字符类型数组来处理的,在存储字符串时系统会在字符串尾部加上。转义字符以作为该字符串的结束符。字符串常量A和字符常量A是不一样的,前者在存储时多占用一个字节的字间。5.位标量,它的值是一个二进制。应|转义字符|ASCn 码(16/10 进制)0空字符(NULL)00H/0n换行符

36、(LF)0AH/10r回车符(CR)ODH/13t水平制表符(HT)09H/9b退格符(BS)08H/8f换页符(FF)OCH/12单引号27H/39双引号22H/34反斜杠5CH/92表 4-1 常用转义字符表常量可用在不必改变值的场合,如固定的数据表,字库等。常量的定义方式有几种,下面来加以说明。#difine False 0 x0;用预定义语句能定义常量#difine True 0 x1;这里定义 False 为 0,True 为 1在程序中用到False编译时自动用0 替换,同 理 True替 换 为 1unsigned int code a=100;这一句用code把 a 定义在程序

37、存储器中并赋值const unsigned int c=100;用const定 义 c 为无符号in t常量并赋值以上两句它们的值都保存在程序存储器中,而程序存储器在运行中是不允许被修改的,所以如果在这两句后面用了类似a=110,a+这样的赋值语句,编译时将会出错。下面写个跑马灯程序来实验一下典型的常量使用方法。先来看看电路图吧。它是在上一篇的实验电路的基础上增加几个LED 组成的,也就是用P1 口的全部引脚分别驱动一个L E D,电 路 如 图 4-1 所示。新建一个RunLED的项目,主程序如下:#include 预处理文件里面定义了特殊寄存器的名称如P1 口定义为P1void main(

38、void)定义花样数据const unsigned char design32=0 xFF,0 xFE,0 xFD,0 xFB,0 xF7,0 xEF,0 xDF,0 xBF,0 x7F,0 x7F,0 xBF,0 xDF,0 xEF,0 xF7,0 xFB,0 xFD,0 xFE,0 xFF,0 xFF,0 xFE,0 xFC,0 xF8,0 xF0,0 xE0,0 xC0,0 x80,0 x0,0 xE7,0 xDB,0 xBD,0 x7E,0 xFF;unsigned int a;定义循环用的变量unsigned char b;在c51编程中因内存有限尽可能注意变量类型的使用尽可能使用少

39、字节的类型,在大型的程序中很受用dofor(b=0;b32;b+)while(l);)for(a=0;a(P 3 O)T X D(P 3.1)R D(P 3.7)A L E 7 P R 0 GWR(P3J6)P S E N3 923 833 743 653 563 473 383 21 32 11 22 21 52 32 41 42 53 12 62 71 92 84 01 892 01 01 71 13 01 62 9Q U C CG N D5 图 4-1 八路跑马灯电路编译运行上面的程序,然后按外部设备菜单Peripherals-I/O P o rts-P o rtl就打开P o rtl的

40、调试窗口了,如 图 4-3 中 的 2。这个时候程序运行了,但我们并不能在P o rtl调试窗口上看到有会什么效果,这个时候能用鼠标左击图4-3 中 1 旁边绿色的方条,点一下就有一个小红方格再点一下又没有了,哪一句语句前有小方格程序运行到那一句时就停止了,就是设置调试断点,同样图4-2 中 的 1 也是同样功能,分别是增加/移除断点、移除所有断点、允许/禁止断点、禁止所有断点,菜单也有一样的功能,另外菜单中还有Breakpoints可打开断点设置窗口它的功能更强大,不过这里先不用它。在、P1=design;这一句设置一个断点这个时候程序运行到这里就停住了,再留意一下P o rtl调试窗口,再

41、按图5-2 中 的 2 的运行键,程序又运行到设置断点的地方停住了,这个时候Portl调试窗口的状态又不一样了。也就是说P o rtl调试窗口模拟了 P1 口的电平状态,打勾为高电平,不打勾则为低电平,窗口中P1为 P 1 寄存器的状态,Pins为引脚的状态,注意的是如果是读引脚值之前必须把引脚对应的寄存器置1 才能正确读取。图 4-2 中 2 旁边的。样的按钮分别为单步入,步越,步出和执行到当前行。图 中 3 为显示下句将要执行的语句。图 4-3 中 的 3 是 Watches窗口可查看各变量的当前值,数组和字串是显示其头一个地址,如本例中的design数组是保存在code存储区的首地址为D

42、:0 x08,能在图中4 Memory存储器查看窗口中的Address地址中打入D:0 x08就能查看到design各数据和存放地址了。如果你的uVision2没有显示这些窗口,能 在 View 菜单中打开在图4-2 中3 后面一栏的查看窗口快捷栏中打开。於 RunlED-WisionZFile R&groject Qebug Peripherals look$VCS Window tidp窗畸跑4 为 以近聃国一 5A恒 昌 四 西 区 i t s 瞰 i s 眄篇|日 和小件十居0 赫 碓|隙 丽V*旗 三)|5gCaVFCH图 4-2 调试用快捷菜单栏&F:M yO alaE 我的文4.

43、C5Ido(for/尽 可 能 使 用 少 字 节 的 类 鼓,在 大 型 的 程 序 中 很 受 用(bs0;b 35;b+)1for(a0;a50000;a+);/超 时 一 段 时 间P l desxgn b ;“读 已 定 义 的 花 样 数 据 并 不 花 样 数 据 到 Pl口)vhile(l);)g)R u n U E D.c图 4-3 各调试窗口 d d r s s:|D:0 x 0 8 4D 0 x 0 8D:OxOD:D:0 xl2;D:0 xl7D OxlC8o4/vr08093Ic4o8aIo801p200n5o41occ1o11022080002201404mO单片机

44、C语言教程第五课C51变量上课所提到变量就是一种在程序执行过程中其值能不断变化的量。要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。定 义 一 个变量的格式如下:存储种类 数 据 类 型 存储器类型 变量名表在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外 部(extern),静 态(static)和寄存器(register),缺省类型为自动(auto)。这些存储种类的具体含义和使用方法,将在第七课 变量的存储中进一步进行学习。而这里的数据类型则是和我们在第四课中学习到的名种数

45、据类型的定义是一样的。说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。存储器类型的说明就是指定该变量在型U iL c 语言硬件系统中所使用的存储区域,并在编译时准确的定位。表 6-1 中是KEIL uVision2所能认别的存储器类型。注意的是在AT89c51芯片中RAM只有低128位,位于80H到 FFH的高128位则在52芯片中才有用,并利特殊寄存器地址重叠。特殊寄存器(SFR)的地址表请看附录二AT89C51特殊功能寄存器列表表 61存储器类型存储器类型说 明data直接访问内部数据存储器(128字节),访问速度最快bdata可位寻址内部数据存储器(16字节),允许位与字节混

46、合访问idata卜 诃 接 访问内部数据存储器(256字节),允许访问全部内部地址|pdata分页访问外部数据存储器(256字节),用 MOVX Ri指令访问xdata|外部数据存储器(64KB),用 MOVX DPTR指令访问code|程序存储器(64KB),用 MOVC A+DPTR指令访问如果省略存储器类型,系统则会按编译模式SMALL,COMPACT或 LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都能声明变量在任何的8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区能显著的提高系统性能。还有要指出的就是变量的存储种类与存储器类型是完全无

47、关的。.数据存储模式存储模式决定了没有明确指定存储类型的变量,函数参数等的缺省存储区域,共三种:1.1.Small 模式所有缺省变量参数均装入内部RAM,优点是访问速度快,缺点是空间有限,只适用于小程序。2.2.Compact 模式所有缺省变量均位于外部RAM区的一页(256Bytes),具体哪一页可由P2 口指定,在 STARTUP.A51文件中说明,也可用pdata指定,优点是空间较Small为宽裕施度较Small慢,较 large要快,是一种中间状态。3.3.grge 模式所有缺省变量可放在多达64KB的外部RAM区,优点是空间大,可存变量多,缺点是速度较慢。提示:存储模式在单片机C语言

48、编译器选项中选择。之前提到简单提到sfr,sfrl6,sbit定义变量的方法,下面我们再来仔细看看。sfr和 sfrl6能直接对51单片机的特殊寄存器进行定义,定义方法如下:s fr特殊功能寄存器名=特殊功能寄存器地址常数;s frl6 特殊功能寄存器名=特殊功能寄存器地址常数;我们能这样定义AT89c51的 Pl 口sfr Pl=0 x90;定义 Pl I/O 口,其地址 90Hsfr关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1 口能用P1为名,这样程序会变的好读好多。等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存

49、器的地址范围之内(80H FFH),具体可查看附录中的相关表。sfr是定义8 位的特殊功能寄存器而sfrl6则是用来定义16 位特殊功能寄存器,如 8052的T2定时器,能定义为:Sfrl6 T2=OxCC;这里定义 8052 定时器 2,地址为 T2L=CCH,T2H=CDH用 sfrl6定义16位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物现低位地址之上。注意的是不能用于定时器0 和 1 的定义。sbit可定义可位寻址对象。如访问特殊功能寄存器中的某位。其实这样应用是经常要用的如要访问P1 口中的第2 个引脚P1.1。我们能照以下的方法去定义:(l)sbit位变量名=位地

50、址sbit P l_ l=0 x91;这样是把砒J绝对地址赋给位变量。同 sfr 一 样 sbit的位地址必须位于80H-FFH之间。(2)Sbit位变量名=特殊功能寄存器名八位位置sft Pl=0 x90;sbit P l_ l=P l 八 1;先定义一个特殊功能寄存器名再指定位变量名所在的位置当可寻址位位于特殊功能寄存器中时可采用这种方法(3)sbit位变量名=字节地址八位位置sbit Pl_l=0 x90 A 1;这种方法其实和2 是 样 的,只是把特殊功能寄存器的位址直接用常数表示。在单片机c 语言存储器类型中供给有一个bdata的存储器类型,这个是指可位寻址的数据存储器,位于单片机的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁