ImageVerifierCode 换一换
格式:PDF , 页数:22 ,大小:278.96KB ,
资源ID:6225767      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-6225767.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(c51单片机C语言入门教程.pdf)为本站会员(HR专家)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

c51单片机C语言入门教程.pdf

1、51单片机C语言入门教程 - 1 - 51单片机C语言学习杂记 学习单片机实在不是件易事,一来要购买高价格的编程器,仿真器,二来要学习编程语言,还有众多种类的单片机选择真是件让人头痛的事。在众多单片机中 51 架构的芯片风行很久,学习资料也相对很多,是初学的较好的选择之一。 51 的编程语言常用的有二种,一种是汇编语言,一种是 C 语言。汇编语言的机器代码生成效率很高但可读性却并不强,复杂一点的程序就更是难读懂,而 C 语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,而且 C 语言还可以嵌入汇编来解决高时效性的代码编写问题。对于开发周期来说,中大型的软

2、件编写用 C 语言的开发周期通常要小于汇编语言很多。综合以上 C 语言的优点,我在学习时选择了 C 语言。以后的教程也只是我在学习过程中的一些学习笔记和随笔,在这里加以整理和修改,希望和大家一起分享,一起交流,一起学习,一起进步。 *注:可以肯定的说这个教程只是为初学或入门者准备的,笔者本人也只是菜鸟一只,有望各位大侠高手指点错误提出建议。 明浩 2003-3-30 第一课 建立您的第一个C项目 使用 C 语言肯定要使用到 C 编译器,以便把写好的 C 程序编译为机器码,这样单片机才能执行编写好的程序。 KEIL uVISION2 是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司

3、的 MCS51 架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和 C 语言的程序设计,它的界面和常用的微软 VC+的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。因此很多开发 51 应用的工程师或普通的单片机爱好者,都对它十分喜欢。 以上简单介绍了 KEIL51 软件,要使用 KEIL51 软件,必需先要安装它。 KEIL51 是一个商业的软件,对于我们这些普通爱好者可以到 KEIL 中国代理周立功公司的网站上下载一份能编译 2K 的 DEMO 版软件,基本可以满足一般的个人学习和小型应用的开发。 (安装的方法和普通软件相当这里就不做介绍了) 安装

4、好后,您是不是迫不及待的想建立自己的第一个 C 程序项目呢?下面就让我们一起来建立一个小程序项目吧。或许您手中还没有一块实验板,甚至没有一块单片机,不过没有关系我们可以通过 KEIL 软件仿真看到程序运行的结果。 首先当然是运行 KEIL51 软件。怎么打开?噢,天!那您要从头学电脑了。呵呵,开个玩笑,这个问题我想读者们也不会提的了: P。运行几秒后,出现如图 1 1 的屏幕。 图 1 1 启动时的屏幕 51单片机C语言入门教程 - 2 - 接着按下面的步骤建立您的第一个项目: ( 1)点击 Project 菜单,选择弹出的下拉式菜单中的 New Project,如图 1 2。接着弹出一个标准

5、 Windows 文件对话窗口,如图 1 3,这个东东想必大家是见了 N 次的了,用法技巧也不是这里要说的,以后的章节中出现类似情况将不再说明。在“文件名”中输入您的第一个 C 程序项目名称,这里我们用“ test” ,这是笔者惯用的名称,大家不必照搬就是了,只要符合 Windows 文件规则的文件名都行。 “保存”后的文件扩展名为 uv2,这是 KEIL uVision2 项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目。 图 1 2 New Project 菜单 图 1 3 文件窗口 ( 2)选择所要的单片机,这里我们选择常用的 Ateml 公司的 AT89C51。此时屏幕如图

6、1 4 所示。 AT89C51 有什么功能、特点呢?不用急,看图中右边有简单的介绍,稍后的章节会作较详细的介绍。完成上面步骤后,我们就可以进行程序的编写了。 ( 3)首先我们要在项目中创建新的程序文件或加入旧程序文件。如果您没有现成的程序,那么就要新建一个程序文件。在 KEIL 中有一些程序的 Demo,在这里我们还是以一个C 程序为例介绍如何新建一个 C 程序和如何加到您的第一个项目中吧。点击图 1 5 中 1 的新建文件的快捷按钮,在 2 中出现一个新的文字编辑窗口,这个操作也可以通过菜单 File New 或快捷键 Ctrl+N 来实现。好了,现在可以编写程序了,光标已出现在文本编辑窗口

7、中,等待我们的输入了。第一程序嘛,写个简单明了的吧。下面是经典的一段程序,呵,如51单片机C语言入门教程 - 3 - 果您看过别的程序书也许也有类似的程序: #include #include void main(void) SCON = 0x50; /串口方式 1,允许接收 TMOD = 0x20; /定时器 1 定时方式 2 TCON = 0x40; /设定时器 1 开始计数 TH1 = 0xE8; /11.0592MHz 1200 波特率 TL1 = 0xE8; TI = 1; TR1 = 1; /启动定时器 while(1) printf (“Hello World!n“); /显示

8、Hello World 图 1 4 选取芯片 51单片机C语言入门教程 - 4 - 图 1 5 新建程序文件 这段程序的功能是不断从串口输出“ Hello World!”字符,我们先不管程序的语法和意思吧,先看看如何把它加入到项目中和如何编译试运行。 ( 4)点击图 1 5 中的 3 保存新建的程序,也可以用菜单 File Save 或快捷键 Ctrl+S进行保存。因是新文件所以保存时会弹出类似图 1 3 的文件操作窗口,我们把第一个程序命名为 test1.c,保存在项目所在的目录中,这时您会发现程序单词有了不同的颜色,说明KEIL 的 C 语法检查生效了。如图 1 6 鼠标在屏幕左边的 So

9、urce Group1 文件夹图标上右击弹出菜单,在这里可以做在项目中增加减少文件等操作。我们选“ Add File to Group Source Group 1”弹出文件窗口,选择刚刚保存的文件,按 ADD 按钮,关闭文件窗,程序文件已加到项目中了。这时在 Source Group1 文件夹图标左边出现了一个小 +号说明,文件组中有了文件,点击它可以展开查看。 图 1 6 把文件加入到项目文件组中 51单片机C语言入门教程 - 5 - ( 5) C 程序文件已被我们加到了项目中了,下面就剩下编译运行了。这个项目我们只是用做学习新建程序项目和编译运行仿真的基本方法,所以使用软件默认的编译设置

10、,它不会生成用于芯片烧写的 HEX 文件,如何设置生成 HEX 文件就请看下面的第三课。我们先来看图 1 7 吧,图中 1、 2、 3 都是编译按钮,不同是 1 是用于编译单个文件。 2 是编译当前项目,如果先前编译过一次之后文件没有做动编辑改动,这时再点击是不会再次重新编译的。 3 是重新编译,每点击一次均会再次编译链接一次,不管程序是否有改动。在 3 右边的是停止编译按钮,只有点击了前三个中的任一个,停止按钮才会生效。 5 是菜单中的它们,我个人就不习惯用它了。嘿嘿,这个项目只有一个文件,您按 123 中的一个都可以编译。按了?好快哦,呵呵。在 4 中可以看到编译的错误信息和使用的系统资源

11、情况等,以后我们要查错就靠它了。 6 是有一个小放大镜的按钮,这就是开启 关闭调试模式的按钮,它也存在于菜单 Debug StartStop Debug Session,快捷键为 Ctrl+F5。 图 1 7 编译程序 (6)进入调试模式,软件窗口样式大致如图 1 8 所示。图中 1 为运行,当程序处于停止状态时才有效, 2 为停止,程序处于运行状态时才有效。 3 是复位,模拟芯片的复位,程序回到最开头处执行。按 4 我们可以打开 5 中的串行调试窗口,这个窗口我们可以看到从 51芯片的串行口输入输出的字符,这里的第一个项目也正是在这里看运行结果。这些在菜单中也有,这里不再一一介绍大家不妨找找

12、看,其它的功能也会在后面的课程中慢慢介绍。首先按 4 打开串行调试窗口,再按运行键,这时就可以看到串行调试窗口中不断的打印“ Hello World! ” 。呵呵,是不是不难呀?这样就完成了您的第一个 C 项目。最后我们要停止程序运行回到文件编辑模式中,就要先按停止按钮再按开启 关闭调试模式按钮。然后我们就可以进行关闭 KEIL 等相关操作了。 到此为止,第一课已经完结了,初步学习了一些 KEIL uVision2 的项目文件创建、编译、运行和软件仿真的基本操作方法。其中一直有提到一些功能的快捷键的使用,的确在实际的开发应用中快捷键的运用可以大大提高工作的效率,建议大家多多使用,还有就是对这里

13、所讲的操作方法举一反三用于类似的操作中。 51单片机C语言入门教程 - 6 - 图 1 8 调试运行程序 第二课 初步认识51芯片 上一课我们的第一个项目完成了,可能有懂 C 语言的朋友会说, “这和 PC 机上的 C 语言没有多大的区别呀” 。的确没有太大的区别, C 语言只是一种程序语言的统称,针对不同的处理器相关的 C 语言都会有一些细节的改变。编写 PC 机的 C 程序时,如要对硬件编程您就必须对硬件要有一定的认识, 51 单片机编程就更是如此,因它的开发应用是不可与硬件脱节的,所以我们先要来初步认识一下 51 苾片的结构和引脚功能。 MSC51 架构的芯片种类很多, 具体特点和功能不

14、尽相同 (在以后编写的附录中会加入常用的一些 51 芯片的资料列表) ,在此后的教程中就以 Atmel 公司的 AT89C51 和 AT89C2051 为中心对象来进行学习,两者是AT89 系列的典型代表,在爱好者中使用相当的多,应用资料很多,价格便宜,是初学 51 的首选芯片。嘿嘿,口水多多有点卖广告之嫌了。 : P 图 2 1 AT89C51 和 AT89C2051 引脚功能图 51单片机C语言入门教程 - 7 - AT89C51 AT89C2051 4KB 可编程 Flash 存储器(可擦写 1000 次) 2KB 可编程 Flash 存储器(可擦写 1000 次)三级程序存储器保密 两

15、级程序存储器保密 静态工作频率 :0Hz-24MHz 静态工作频率 :0Hz-24MHz 128 字节内部 RAM 128 字节内部 RAM 2 个 16 位定时 /计数器 2个 16 位定时 /计数器 一个串行通讯口 一个串行通讯口 6 个中断源 6个中断源 32 条 I/O 引线 15 条 I/O 引线 片内时种振荡器 1个片内模拟比较器 表 2 1 AT89C51 和 AT89C2051 主要性能表 图 2 1中是 AT89C51和 AT89C2051的引脚功能图。 而表 2 1中则是它们的主要性能表。以上可以看出它们是大体相同的,由于 AT89C2051 的 IO 线很少,导致它无法外

16、加 RAM 和程序 ROM,片内 Flash 存储器也少,但它的体积比 AT89C51 小很多,以后大家可根据实际需要来选用。它们各有其特点但其核心是一样的,下面就来看看 AT89C51 的引脚具体功能。 1.电源引脚 Vcc 40 电源端 GND 20 接地端 工作电压为 5V,另有 AT89LV51 工作电压则是 2.7-6V, 引脚功能一样。 2.外接晶体引脚 图 2 2 外接晶体引脚 XTAL1 19 XTAL2 18 XTAL1 是片内振荡器的反相放大器输入端, XTAL2 则是输出端,使用外部振荡器时,外部振荡信号应直接加到 XTAL1,而 XTAL2 悬空。内部方式时,时钟发生器

17、对振荡脉冲二分频, 如晶振为 12MHz, 时钟频率就为 6MHz。 晶振的频率可以在 1MHz-24MHz内选择。电容取 30PF 左右。 51单片机C语言入门教程 - 8 - 型号同样为 AT89C51 的芯片, 在其后面还有频率编号, 有 12,16,20,24MHz 可选。大家在购买和选用时要注意了。如 AT89C51 24PC 就是最高振荡频率为 24MHz,40P6 封装的普通商用芯片。 3.复位 RST 9 在振荡器运行时,有两个机器周期( 24 个振荡周期)以上的高电平出现在此引腿时,将使单片机复位,只要这个脚保持高电平, 51 芯片便循环复位。复位后 P0 P3 口均置 1

18、引脚表现为高电平,程序计数器和特殊功能寄存器 SFR 全部清零。当复位脚由高电平变为低电平时,芯片为 ROM 的 00H 处开始运行程序。常用的复位电路如图 23 所示。 复位操作不会对内部 RAM 有所影响。 图 2 3 常用复位电路 4.输入输出引脚 (1) P0 端口 P0.0-P0.7 P0 是一个 8 位漏极开路型双向 I/O 端口,端口置 1(对端口写 1)时作高阻抗输入端。作为输出口时能驱动 8 个 TTL。 对内部 Flash 程序存储器编程时,接收指令字节 ;校验程序时输出指令字节,要求外接上拉电阻。 在访问外部程序和外部数据存储器时, P0 口是分时转换的地址 (低 8 位

19、 )/数据总线,访问期间内部的上拉电阻起作用。 (2) P1 端口 P1.0 P1.7 P1 是一个带有内部上拉电阻的 8 位双向 I/0 端口。输出时可驱动 4 个 TTL。端口置 1 时,内部上拉电阻将端口拉到高电平,作输入用。 对内部 Flash 程序存储器编程时,接收低 8 位地址信息。 (3) P2 端口 P2.0 P2.7 P2 是一个带有内部上拉电阻的 8 位双向 I/0 端口。输出时可驱动 4 个 TTL。端口置 1 时,内部上拉电阻将端口拉到高电平,作输入用。对内部 Flash 程序存储器编程时,接收高 8 位地址和控制信息。 在访问外部程序和 16 位外部数据存储器时, P

20、2 口送出高 8 位地址。而在访问 8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。 51单片机C语言入门教程 - 9 - (4) P3 端口 P3.0 P3.7 P2 是一个带有内部上拉电阻的 8 位双向 I/0 端口。输出时可驱动 4 个 TTL。端口置 1 时,内部上拉电阻将端口拉到高电平,作输入用。 对内部 Flash 程序存储器编程时,接控制信息。除此之外 P3 端口还用于一些专门功能,具体请看 表 2 2.。 P1 3 端口在做输入使用时,因内部有上接电阻,被外部拉低的引脚会输出一定的电流。 P3 引脚 兼用功能 P3.0 串行通讯输入( RXD) P3.1 串行通讯输出

21、( TXD) P3.2 外部中断 0( INT0) P3.3 外部中断 1( INT1) P3.4 定时器 0 输入 (T0) P3.5 定时器 1 输入 (T1) P3.6 外部数据存储器写选通 WR P3.7 外部数据存储器写选通 RD 表 2 2 P3 端口引脚兼用功能表 呼!一口气说了那么多,停一下吧。嗯,什么?什么叫上拉电阻?上拉电阻简单来说就是把电平拉高,通常用 4.7 10K 的电阻接到 Vcc 电源,下拉电阻则是把电平拉低,电阻接到 GND 地线上。具体说明也不是这里要讨论的,接下来还是接着看其它的引脚功能吧。 5.其它的控制或复用引脚 (1) ALE/PROG 30 访问外部

22、存储器时, ALE(地址锁存允许)的输出用于锁存地址的低位字节。即使不访问外部存储器, ALE 端仍以不变的频率输出脉冲信号 (此频率是振荡器频率的 1/6)。在访问外部数据存储器时,出现一个 ALE 脉冲。对Flash 存储器编程时,这个引脚用于输入编程脉冲 PROG (2) PSEN 29 该引是外部程序存储器的选通信号输出端。当 AT89C51 由外部程序存储器取指令或常数时,每个机器周期输出 2 个脉冲即两次有效。但访问外部数据存储器时,将不会有脉冲输出。 (3) EA/Vpp 31 外部访问允许端。当该引脚访问外部程序存储器时,应输入低电平。要使 AT89C51 只访问外部程序存储器

23、(地址为 0000H-FFFFH) ,这时该引脚必须保持低电平。对 Flash 存储器编程时,用于施加 Vpp 编程电压。 Vpp 电压有两种,类似芯片最大频率值要根据附加的编号或芯片内的特征字决定。具体如表2 3 所列。 Vpp = 12V Vpp = 5V 印刷在芯片面上的型号 AT89C51 xxxx YYWW AT89LV51 xxxx YYWW AT89C51 xxxx-5 YYWW AT89LV51 xxxx-5 YYWW 030H=1EH 030H=1EH 030H=1EH 030H=1EH 031H=51H 031H=61H 031H=51H 031H=61H 片内特征字 03

24、2H=FFH 032H=FFH 032H=05H 032H=05H 表 2 3 Vpp 与芯片型号和片内特征字的关系 51单片机C语言入门教程 - 10 - 看到这您对 AT89C51 引脚的功能应该有了一定的了解了, 引脚在编程和校验时的时序我们在这里就不做详细的探讨,通常情况下我们也没有必要去撑握它,除非您想自己开发编程器。下来的课程我们要开始以一些简单的实例来讲述 C 程序的语法和编写方法技巧,中间穿插相关的硬件知识如串口,中断的用法等等。 第三课 生成HEX文件和最小化系统 在开始 C语言的主要内容时,我们先来看看如何用 KEIL uVISION2来编译生成用于烧写芯片的 HEX文件。

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

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

27、打开最近在编辑的项目。 ) 。 图 3 1项目功能菜单 51单片机C语言入门教程 - 11 - 图 3 2 项目选项窗口 图 3 3 编译信息窗口 或许您已把编译好的文件烧到了芯片上, 如果您购买或自制了带串口输出元件的学习实验板, 那您就可以把串口和 PC 机串口相联用串口调试软件或 Windows 的超级终端 ,将其波特率设为 1200,就可以看到不停输出的“ Hello World!”字样。也许您还没有实验板,那这里先说说 AT89C51 的最小化系统,再以一实例程序验证最小化系统是否在运行,这个最小化系统也易于自制用于实验。 图 3 4 便是 AT89C51 的最小化系统 ,不过为了让

28、我们可以看出它是在运行的,我加了一个电阻和一个 LED,用以显示它的状态,晶振可以根据自己的情况使用, 一般实验板上是用 11.0592MHz或 12MHz,使用前者的好外是可以产生标准的串口波特率,后者则一个机器周期为 1 微秒,便于做精确定时。在自己做实验里,注意的是 VCC 是 +5V 的,不能高于此值,否则将损坏单片机,太低则不能正常工作。在 31 脚要接高电平,这样我们才能执行片内的程序,如接低电平则使用片外的程序存储器。下面,我们建一个新的项目名为 OneLED 来验证最小化系统是否可以工作(所有的例程都可在我的主页下面下载到,网址:http:/ 或 http:/ ) 。程序如下:

29、 51单片机C语言入门教程 - 12 - #include /预处理命令 void main(void) /主函数名 /这是第一种注释方式 unsigned int a; /定义变量 a 为 int 类型 /* 这是第二种注释方式 */ do /do while 组成循环 for (a=0; a /预处理命令 51单片机C语言入门教程 - 15 - void main(void) /主函数名 unsigned int a; /定义变量 a 为 unsigned int 类型 unsigned char b; /定义变量 b 为 unsigned char 类型 do /do while 组成循

30、环 for (a=0; a /预处理文件里面定义了特殊寄存器的名称如 P1 口定义为 P1 void main(void) /定义花样数据 cons tunsigned char design32=0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 51单片机C语言入门教程 - 18 - 0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF, 0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0, 0xE7,0xDB,0xBD,0x7E,0xFF; unsigned int a; /定

31、义循环用的变量 unsigned char b; /在 C51 编程中因内存有限尽可能注意变量类型的使用 /尽可能使用少字节的类型,在大型的程序中很受用 do for (b=0; b32; b+) for(a=0; a30000; a+); /延时一段时间 P1 = designb; /读已定义的花样数据并写花样数据到 P1 口 while(1); 程序中的花样数据可以自以去定义 ,因这里我们的 LED要 AT89C51的 P1引脚为低电平才会点亮,所以我们要向 P1 口的各引脚写数据 O 对应连接的 LED 才会被点亮, P1 口的八个引脚刚好对应 P1 口特殊寄存器的八个二进位,如向 P1

32、 口定数据 0xFE,转成二进制就是11111110,最低位 D0 为 0 这里 P1.0 引脚输出低电平, LED1 被点亮。如此类推,大家不难算出自己想要做的效果了。大家编译烧写看看,效果就出来,显示的速度您可以根据需要调整延时 a 的值,不要超过变量类型的值域就很行了。哦,您还没有实验板?那如何可以知道程序运行的结果呢?呵,不用急,这就来说说用 KEIL uVision2 的软件仿真来调试 IO 口输出输入程序。 图 5 1 八路跑马灯电路 51单片机C语言入门教程 - 19 - 编译运行上面的程序,然后按外部设备菜单 Peripherals I/O Ports Port1 就打开Por

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

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

35、是保存在 code 存储区的首地址为 D:0x08,可以在图中 4 Memory 存储器查看窗口中的 Address 地址中打入 D:0x08 就可以查看到 design 各数据和存放地址了。如果你的 uVision2 没有显示这些窗口,可以在 View 菜单中打开在图 5 2 中 3 后面一栏的查看窗口快捷栏中打开。 图 5 2 调试用快捷菜单栏 图 5 3 各调试窗口 51单片机C语言入门教程 - 20 - 第六课 变量 上课所提到变量就是一种在程序执行过程中其值能不断变化的量。 要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存

36、储空间。定义一个变量的格式如下: 存储种类 数据类型 存储器类型 变量名表 在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动 ( auto) ,外部 ( extern) ,静态 ( static) 和寄存器 ( register) , 缺省类型为自动 (auto)。这些存储种类的具体含义和用法,将在第七课变量的存储中进一步进行学习。 而这里的数据类型则是和我们在第四课中学习到的名种数据类型的定义是一样的。 说明了一个变量的数据类型后,还可选择说明该变量的存储器类型。存储器类型的说明就是指定该变量在 C51 硬件系统中所使用的存储区域,并在编译时准确的定位。表 6

37、 1 中是 KEIL uVision2 所能认别的存储器类型。注意的是在 AT89C51 芯片中 RAM 只有低 128 位,位于 80H到 FFH 的高 128 位则在 52 芯片中才有用,并和特殊寄存器地址重叠。特殊寄存器( SFR)的地址表请看附录二 AT89C51 特殊功能寄存器列表 存储器类型 说 明 data 直接访问内部数据存储器( 128 字节 ),访问速度最快 bdata 可位寻址内部数据存储器( 16 字节) ,允许位与字节混合访问 idata 间接访问内部数据存储器( 256 字节) ,允许访问全部内部地址pdata 分页访问外部数据存储器( 256 字节) ,用 MOV

38、X Ri 指令访问 xdata 外部数据存储器 (64KB),用 MOVX DPTR 指令访问 code 程序存储器( 64KB) ,用 MOVC A+DPTR 指令访问 表 6 1 存储器类型 如果省略存储器类型, 系统则会按编译模式 SMALL,COMPACT或 LARGE所规定的默认存储器类型去指定变量的存储区域。无论什么存储模式都可以声明变量在任何的 8051存储区范围,然而把最常用的命令如循环计数器和队列索引放在内部数据区可以显著的提高系统性能。 还有要指出的就是变量的存储种类与存储器类型是完全无关的。 SMALL存储模式把所有函数变量和局部数据段放在 8051系统的内部数据存储区这

39、使访问数据非常快,但 SMALL存储模式的地址空间受限。在写小型的 应用程序时,变量和数据放在data内部数据存储器中是很好的因为访问速度快, 但在较大的应用程序中 data区最好只存放小的变量、数据或常用的变量(如循环计数、数据索引),而大的数据则放置在别的存储区域。 COMPACT存储模式中所有的函数和程序变量和局部数据段定位在 8051系统的外部数据存储区。外部数据存储区可有最多 256字节(一页),在本模式 中外部数据存储区的短地址用R0/R1。 LARGE存储模式所有函数和过程的变量和局部数据段都定位在 8051系统的外部数据区外部数据区最多可有 64KB,这要求用 DPTR数据指针

40、访问数据。 之前提到简单提到 sfr,sfr16,sbit定义变量的方法,下面我们再来仔细看看。 sfr和 sfr16可以直接对 51单片机的特殊寄存器进行定义,定义方法如下: sfr 特殊功能寄存器名 = 特殊功能寄存器地址常数 ; sfr16 特殊功能寄存器名 = 特殊功能寄存器地址常数 ; 我们可以这样定义 AT89C51的 P1口 sfr P1 = 0x90; /定义 P1 I/O口,其地址 90H 51单片机C语言入门教程 - 21 - sfr关键定后面是一个要定义的名字,可任意选取,但要符合 标识符的命名规则,名字最好有一定的含义如 P1口可以用 P1为名,这样程序会变的好读好多。

41、等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内( 80H FFH),具体可查看附录中的相关表。 sfr是定义 8位的特殊功能寄存器而 sfr16则是用来定义 16位特殊功能寄存器,如 8052的 T2定时器,可以定义为: sfr16 T2 = 0xCC; /这里定义 8052定时器 2,地址为 T2L=CCH,T2H=CDH 用 sfr16 定义 16 位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上。注意的是不能用于定时器 0 和 1 的定义。 sbit 可定义可位寻址对象。如访问特殊功能寄存器中的某位。其实这样应用是

42、经常要用的如要访问 P1 口中的第 2 个引脚 P1.1。我们可以照以下的方法去定义 : (1)sbit 位变量名位地址 sbit P1_1 = Ox91; 这样是把位的绝对地址赋给位变量。 同 sfr 一样 sbit 的位地址必须位于 80H-FFH 之间。 (2)Sbit 位变量名特殊功能寄存器名 位位置 sft P1 = 0x90; sbit P1_1 = P1 1; /先定义一个特殊功能寄存器名再指定位变量名所在的位置 当可寻址位位于特殊功能寄存器中时可采用这种方法 (3)sbit 位变量名字节地址 位位置 sbit P1_1 = 0x90 1; 这种方法其实和 2 是一样的,只是把特

43、殊功能寄存器的位址直接用常数表示。 在 C51 存储器类型中提供有一个 bdata 的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为 bdata,如 : unsigned char bdata ib; /在可位录址区定义 ucsigned char 类型的变量 ib int bdata ab2; /在可位寻址区定义数组 ab2,这些也称为可寻址位对象 sbit ib7=ib7 /用关键字 sbit 定义位变量来独立访问可寻址位对象的其中一位 sbit ab12=ab112; 操作符“”后面的位位置的最大值取决于指定的基址类型, char0-7

44、,int0-15,long0-31。 下面我们用上一课的电路来实践一下这一课的知识。同样是做一下简单的跑马灯实验,项目名为 RunLED2。程序如下 : sfr P1 = 0x90; /这里没有使用预定义文件, sbit P1_0 = P1 0; /而是自己定义特殊寄存器 sbit P1_7 = 0x90 7; /之前我们使用的预定义文件其实就是这个作用 sbit P1_1 = 0x91; /这里分别定义 P1 端口和 P10,P11,P17 引脚 void main(void) unsigned int a; unsigned char b; do for (a=0;a50000;a+) P1_0 = 0; /点亮 P1_0 for (a=0;a50000;a+) P1_7 = 0; /点亮 P1_7 51单片机C语言入门教程 - 22 - for (b=0;b255;b+) for (a=0;a10000;a+) P1 = b; /用 b 的值来做跑马灯的花样 P1 = 255; /熄灭 P1 上的 LED for (b=0;b255;b+) for (a=0;a10000;a+) /P1_1 闪烁 P1_1 = 0; for (a=0;a10000;a+) P1_1 = 1; while(1);

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报