1、嵌入式c语言教程 本文由ufnuelsygm贡献 本文由pansan345贡献 doc文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 单片机 c 语言教程 c 语言是很好用的结构化语言,80 年代后,c 也能用在单片机上 语言是很好用的结构化语言, 年代后, 语言教程, 了。为了方便大家学习制作了一个单片机 c 语言教程,过去长期困扰 人们的所谓“高级语言产生代码太长, 运行效率不高, 人们的所谓 高级语言产生代码太长, 高级语言产生代码太长 运行速度太慢, 运行速度太慢, 运行效率不高, 所以不适合单片机使用”keil 公司出品的单片机 c 语言集成开发环境
2、所以不适合单片机使用 成功的解决了这个难题, 语言的效率大大的提高, 成功的解决了这个难题,使得单片机 c 语言的效率大大的提高,而且 在关键部位还能嵌入汇编语言代码, 从而挖掘程序的最高潜力。 目前, 在关键部位还能嵌入汇编语言代码, 从而挖掘程序的最高潜力。 目前, 8051 上的 C 语言的代码长度,已经做到了汇编水平的 1.21.5 倍。4 语言的代码长度, K 字节以上的程度, 语言的优势更能得到发挥。 字节以上的程度, 语言的优势更能得到发挥。 C 至于运行速度的问 至于运行速度的问 只要有好的仿真器, 找出关键的代码, 再进一步做一下人工优化, 题, 只要有好的仿真器, 找出关键
3、的代码, 再进一步做一下人工优化, 就可很容易达到美满。 语言是高效的单片机开发语言, 就可很容易达到美满。单片机 c 语言是高效的单片机开发语言,本站 课时,由浅入深, 提供的单片机 c 语言教程共 17 课时,由浅入深,看完了这些教程你 语言程序设计了, 就基本了解了 c51,能进行一般的单片机 c 语言程序设计了,现在让 , 我们开始学习吧! 我们开始学习吧! 随着单片机技术的不断发展, 随着单片机技术的不断发展,以单片机 C 语言为主流的高级语言也不断被更多的单片 机爱好者和工程师所喜爱。 肯定要使用到编译器, 机爱好者和工程师所喜爱。使用 C51 肯定要使用到编译器,以便把写好的 C
4、 程序编译为机 器码,这样单片机才能执行编写好的程序。 是众多应用开发软件中优秀 器码,这样单片机才能执行编写好的程序。KEIL uVISION2 是众多应用开发软件中优秀 的软件之一, 架构的芯片,它集编辑,编译, 的软件之一,它支持众多不一样公司的 MCS51 架构的芯片,它集编辑,编译,仿真等于一 语言的程序设计, 体,同时还支持,PLM,汇编和 C 语言的程序设计,它的界面和常用的微软 VC+的界面 同时还支持, , 的界面 相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。 相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。本站提供的 单片机 c
5、语言教程都是基于 keilc51 的。 第一课 建立你的第一个 KeilC51 项目 语言的优越性: 下面结合 8051 介绍单片机 C 语言的优越性: 无须懂得单片机的具体硬件,也能够编出符合硬件实际的专业水平的程序; 无须懂得单片机的具体硬件,也能够编出符合硬件实际的专业水平的程序; 无须懂得单片机的具体硬件 不懂得单片机的指令集,也能够编写完美的单片机程序; 不懂得单片机的指令集,也能够编写完美的单片机程序 不懂得单片机的指令集 不同函数的数据实行覆盖,有效利用片上有限的 RAM 空间; 不同函数的数据实行覆盖, 空间; 不同函数的数据实行覆盖 提供 auto、static、const
6、等存储类型和专门针对 8051 单片机的 data、idata、pdata、x 提供 、 、 、 、 、 data、code 等存储类型,自动为变量合理地分配地址; 、 等存储类型,自动为变量合理地分配地址; C 语言提供复杂的数据类型(数组、结构、联合、枚举、指针等),极大地增强了程 语言提供复杂的数据类型(数组、结构、联合、枚举、指针等), ),极大地增强了程 序处理能力和灵活性; 序处理能力和灵活性; 提供 small、compact、large 等编译模式,以适应片上存储器的大小; 提供 等编译模式,以适应片上存储器的大小; 、 、 中断服务程序的现场保护和恢复,中断向量表的填写,是直
7、接与单片机相关的,都由 中断服务程序的现场保护和恢复,中断向量表的填写,是直接与单片机相关的, 中红血丝 银杏树 日本白光 苏州脱毛 灰指甲治疗 苏州广告公司 徐州搬家公司 苏州抵押贷款 徐州房产 断服务程序的现场保护和恢复 C 编译器代办; 编译器代办; 程序具有坚固性:数据被破坏是导致程序运行异常的重要因素。C 语言对数据进行了 程序具有坚固性:数据被破坏是导致程序运行异常的重要因素。 程序具有坚固性 许多专业性的处理, 许多专业性的处理,避免了运行中间非异步的破坏 提供常用的标准函数库,以供用户直接使用; 提供常用的标准函数库,以供用户直接使用; 提供常用的标准函数库 有严格的句法检查,
8、错误很少,可容易地在高级语言的水平上迅速地被排掉; 有严格的句法检查,错误很少,可容易地在高级语言的水平上迅速地被排掉; 有严格的句法检查 可方便地接受多种实用程序的服务: 可方便地接受多种实用程序的服务: 可方便地接受多种实用程序的服务 如片上资源的初始化有专门的实用程序自动生成; 如片上资源的初始化有专门的实用程序自动生成; 再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。 再如,有实时多任务操作系统可调度多道任务,简化用户编程,提高运行的安全性等等。 头文件中定义宏、说明复杂数据类型和函数原型,有利于程序的移植和支持单片机的 头文件中定义宏、说明复杂数据类型
9、和函数原型, 头文件中定义宏 系列化产品的开发; 系列化产品的开发; 化产品的开发 软件, 软件,必需先要安装它, 以上简单介绍了 KEILC51 软件,要使用 KEILC51 软件,必需先要安装它,这也是学习 单片机编程语言所要求的第一步建立学习环境。 建立学习环境。 单片机编程语言所要求的第一步 建立学习环境 本站提供无限制版的 下载(此处 安装的方法在压缩包内有详细说明, 此处)( 本站提供无限制版的 keil c51 下载 此处 (安装的方法在压缩包内有详细说明,这里就不做 介绍了) 介绍了) 安装好后, 语言程序项目呢? 安装好后,您是不是想建立自己的第一个单片机 C 语言程序项目呢
10、?下面就让我们一起来 建立一个小程序吧,请根据教程一步步的来,你绝对可以在短时间内熟悉 建立一个小程序吧 请根据教程一步步的来,你绝对可以在短时间内熟悉 c51 的。 请根据教程一步步的来 软件,接着按下面的步骤建立您的第一个项目: 首先当然是运行 KEIL 软件,接着按下面的步骤建立您的第一个项目: (1)点击 Project 菜单,选择弹出的下拉式菜单中的 New Project,如图 12。接着弹 ) 菜单, , 。 文件对话窗口, 文件名”中输入您的第一个 出一个标准 Windows 文件对话窗口,如图 13。在“文件名 中输入您的第一个 C 程序 。 文件名 目名称,这里我们用“te
11、st”。“保存 后的文件扩展名为 uv2,这是 KEIL uVision2 项目 保存”后的文件扩展名为 项 目名称,这里我们用 。 保存 , 文件扩展名,以后能直接点击此文件以打开先前做的项目。 文件扩展名,以后能直接点击此文件以打开先前做的项目。 图 12 New Project 菜单 图 13 文件窗口 (2)选择所要的单片机,这里选择常用的 Ateml 公司的 AT89c51。 而且本单片机 c 语言教程里的大部分程序都是基于此芯片的, 此时屏 幕如图 14 所示。AT89c51 有什么功能、特点呢?看图中右边有 简单的介绍。完成上面步骤后,就可 以进行程序的编写了。 (3)首先在项目
12、中创建新的程序文件或加入旧程序文件。如果您没 有现成的程序,那 么就要新建一个程序文件。在 KEIL 中有一些程 序的 Demo, 在这里我们还是以一个 C 程序 为例介绍如何新建一个 C 程序和如何加到您的第一个项目中吧。点击图 15 中 1 的新 建文 件的快捷按钮,在 2 中出现一个新的文字编辑窗口,这个操作 也能通过菜单 FileNew 或 快捷键 Ctrl+N 来实现。好了,现在能 编写程序了。下面是经典的一段程序,呵,如果您看过别的程序书也 许也有类似的程序: #include #include void main(void) SCON = 0x50; /串口方式 1,允许接收 串
13、口方式 允许接收 TMOD = 0x20; /定时器 1 定时方式 2 定时器 TCON = 0x40; /设定时器 1 开始计数 设定时器 TH1 = 0xE8; /11.0592MHz 1200 波特率 TL1 = 0xE8; TI = 1; TR1 = 1; /启动定时器 启动定时器 while(1) printf (Hello World!n); /显示 Hello World 显示 图 14 选取芯片 图 15 新建程序文件 这段程序的功能是不断从串行口输出“Hello World!”字符,先不管程序的语法和意思吧, 字符, 这段程序的功能是不断从串行口输出 字符 先不管程序的语法和
14、意思吧, 看看如何把它加入到项目中和如何编译试运行。 先 看看如何把它加入到项目中和如何编译试运行。 保存新建的程序, (4)点击图 15 中的 3 保存新建的程序,也能用菜单 FileSave 或快捷键 Ctrl+S ) 进行保存。 进行保存。因是新文件所以保存时会弹出类似图 13 的文件操作窗口,把第一个程序命 的文件操作窗口, 名 为 test1.c,保存在项目所在的目录中,这个时候您会发现程序单词有了不一样的颜色,说 ,保存在项目所在的目录中,这个时候您会发现程序单词有了不一样的颜色, 语言语法检查生效了。 明 KEIL 的 C 语言语法检查生效了。如图 16 鼠标在屏幕左边的 Sou
15、rce Group1 文件 菜单,在这里能做在项目中增加减少文件等操作。 夹图标上右击弹出 菜单,在这里能做在项目中增加减少文件等操作。选“Add File to Gro up Source Group 1” 弹出文件窗口, 选择刚刚保存的文件, ADD 按钮, 按 按钮, 关闭文件窗, 出文件窗口, 选择刚刚保存的文件, 关闭文件窗, 程序文件已加到项目中了。 文件夹图标左边出现了一个小+号 程序文件已加到项目中了。这个时候在 Source Group1 文件夹图标左边出现了一个小 号 说明,文件组中有了文件,点击它能展开查看。 说明,文件组中有了文件,点击它能展开查看。 图 16 把文件加
16、入到项目文件组中 (5)C 程序文件已被加到了项目中了,下面就剩下编译运行了。这个项目只是 ) 程序文件已被加到了项目中了,下面就剩下编译运行了。 习新建程序项目和编译运行仿真的基本方法, 用做学 习新建程序项目和编译运行仿真的基本方法,所以使用软件默认的编译 文件。 设置, 设置,它不会生成用 于芯片烧写的 HEX 文件。先来看图 17 吧,图中 1、 、 2、3 都是编译按钮,不一样是 1 是用 于编译单个文件。2 是编译链接当前项 、 都是编译按钮, 于编译单个文件。 目,如果先前编译过一次之后文件没有做动编辑改动, 这个时候再点击是不会 如果先前编译过一次之后文件没有做动编辑改动, 再
17、次重新编译的。 是重新编译,每点击一次均会再次编译链接一次, 再次重新编译的。3 是重新编译,每点击一次均会再次编译链接一次,不 管程 序是否有改动。在 3 右边的是停止编译按钮,只有点击了前三个中的任一个, 序是否有改动。 右边的是停止编译按钮, 只有点击了前三个中的任一个, 才会生效。 是菜单中的它们。 停止按钮 才会生效。5 是菜单中的它们。在 4 中能看到编译的错误信息和使 用的系统资源情况等, 以后我们要查错就靠它了。 是有一个小放大镜的按钮, 6 用的系统资源情况等, 以后我们要查错就靠它了。 是有一个小放大镜的按钮, 这就是开启关闭调试模式的按钮 关闭调试模式的按钮, 这就是开启
18、 关闭调试模式的按钮, 它也存在于菜单 DebugStartStop Debug Session,快捷键为 Ctrl+F5。 , 。 图 17 编译程序 (6)进入调试模式,软件窗口样式大致如图 18 所示。图中 1 为运行,当程序 进入调试模式, 为运行, 进入调试模式 所示。 处于停止 状态时才有效,2 为停止,程序处于运行状态时才有效。3 是复位, 状态时才有效, 为停止,程序处于运行状态时才有效。 是复位, 回到最开头处执行 按 中的串行调试窗口, 模拟芯片的复位, 程序 回到最开头处执行。 4 能打开 5 中的串行调试窗口, 模拟芯片的复位, 行口输入输出的字符, 这个窗口能看到从
19、51 芯片的串 行口输入输出的字符,这里的第一个项目也正 是在这里看运行结果。这些在菜单中也有。 打开串行调试窗口, 是在这里看运行结果。这些在菜单中也有。首 先按 4 打开串行调试窗口,再 按运行键,这个时候就能看到串行调试窗口中不断的打印 按运行键,这个时候就能看到串行调试窗口中不断的打印“Hello World!”。最 ! 。 后要停止程序运行回到文件编辑模式中, 就要先按停止按钮再按开启关闭调试 后要停止程序运行回到文件编辑模式中, 就要先按停止按钮再按开启 关闭调试 模式按钮。 等相关操作了。 模式按钮。然后就能进行关闭 KEIL 等相关操作了。 图 18 调试运行程序 第二课 C5
20、1HEX 文件的生成和单片机最小系统 上一篇建立了第一个单片机 C 语言项目,但为了让编译好的程序能通过编程器写入 51 芯 片中,要先用编译器生成 HEX 文件,下面来看看如何用 KEIL uVISION2 来编译生成用 于烧写 芯片的 HEX 文件。 HEX 文件格式是 Intel 公司提出的按地址排列的数据信息,数据宽 度为字 节,所有数据使用 16 进制数字表示, 常用来保存单片机或其他处理器的目标程序代 码。它保 存物理程序存储区中的目标代码映象。一般的编程器都支持这种格式。我们先来 打开第一个 项目,打开它的所在目录,找到 test.Uv2 的文件就能打开先前的项目了。然后 右击图
21、 21 中的 1 项目文件夹, 弹出项目功能菜单, Options for TargetTarget1,弹出项 选 目选项设置窗口, 同样先选中项目文件夹图标,这个时候在 Project 菜单中也有一样的菜单 可选。打开项目选项窗口, 转到 Output 选项页图 22 所示,图中 1 是选择编译输出的路 径,2 是设置编译输出生成的文件 名,3 则是决定是否要创建 HEX 文件,选中它就能输出 HEX 文件到指定的路径中。选好了? 好,我们再将它重新编译一次,很快在编译信息窗口 中就显示 HEX 文件创建到指定的路径 中了,如图 23。这样我们就可用自己的编程器所 附带的软件去读取并烧到芯片
22、了,再用实 验板看结果,至于编程器或仿真器品种繁多具体 方法就看它的说明书了,这里也不做讨论。 (技巧:一、在图 21 中的 1 里的项目文件树形目录中,先选中对象,再单击它就可对它 进 行重命名操作,双击文件图标便可打开文件。二、在 Project 下拉菜单的最下方有最近编 辑过 的项目路径保存,这里能快速打开最近在编辑的项目。) 图 21 项目功能菜单 图 22 项目选项窗口 图 23 编译信息窗口 或许您已把编译好的文件烧到了芯片上,如果您购买或自制了带串行口输出元件的学习实 验板,那您就能把串行口和 PC 机串行口相联用串行口调试软件或 Windows 的超级终端, 将其波特 率设为
23、1200,就能看到不停输出的“Hello World!”字样。如果您还没有实验板, 那这 里先说说 AT89c51 的最小化系统,再以一实例程序验证最小化系统是否在运行,这 个最小化 系统也易于自制用于实验。图 24 便是 AT89c51 的最小化系统,不过为了让我 们能看出它 是在运行的,加了一个电阻和一个 LED,用以显示它的状态,晶体震荡器能根 据自己的情况使用, 一般实验板上是用 11.0592MHz 或 12MHz,使用前者的好外是能产生 标准的串行口波特率, 者则一个机器周期为 1 微秒, 后 便于做精确定时。 在自己做实验里, 注意的是 VCC 是+5V 的, 不能高于此值,不然
24、将损坏单片机,太低则不能正常工作。在 31 脚要接高电平, 这样我们 才能执行片内的程序, 如接低电平则使用片外的程序存储器。 下面建一个新的项目名为 OneLED 来验证最小化系统是否能工作(所有的例程都可在笔者 的主页下面下载到,网址: 。程序如下: #include /预处理命令 void main(void) /主函数名 /这是第一种注释方式 unsigned int a; /定义变量 a 为 int 类型 /* 这是第二种注释方式 */ do /do while 组成循环 for (a=0; a50000; a+); /这是一个循环 P1_0 = 0; /设 P1.0 口为低电平,
25、点亮 LED for (a=0; a50000; a+); /这是一个循环 P1_0 = 1; /设 P1.0 口为高电平,熄灭 LE D while(1); 图 24 AT89c51 最小化系统 这里先讲讲 KEIL C 编译器所支持的注释语句。一种是以“/”符号开始的语句,符号之后 的语句都被视为注释,直到有回车换行。另一种是在“/*”和“*/”符号之内的为注释。注 释不 会被 C 编译器所编译。一个 C 应用程序中应有一个 main 主函数,main 函数能调用别的 功能函数, 但其它功能函数不允许调用 main 函数。 不论 main 函数放在程序中的那个位置, 总是先被执行。用上面学
26、到的知识编译写好的 OneLED 程序,并把它烧到刚做好的最小 化系 统中。上电,刚开始时 LED 是不亮的(因为上电复位后所有的 IO 口都置 1 引脚为 高电平), 然后延时一段时间(for (a=0; a50000; a+)这句在运行),LED 亮,再延 时,LED 熄灭, 然后交替亮、灭。第一个真正的小实验就做完,如果没有这样的效果那么 您就要认真检查一下电路或编译烧写的步骤了。 第三课 C51 数据类型 每写一个程序, 每写一个程序,总离不开数据的应用, 总离不开数据的应用,在学习 c51 语言的过程中掌 很关键的。 握理解数据类型也是 很关键的。 先看表 31, , 表中列出了 K
27、EIL u Vision2 单片机 c 语言编译器所支持的数据类型。在标准 C 语言中 语言编译器所支持的数据类型。 基本的数据类型为 char,int,short,long,float 和 double,而在 c51 编 , 相同, 相同, 译器中 int 和 short 相同,float 和 double 相同,这里就不列出说 明了。 明了。下面来看看它们的具体定 义: 数据类型 unsigned char signed char unsigned int signed int unsigned long signed long float * bit sfr sfr16 sbit 长 度
28、 值 域 单字节 单字节 双字节 双字节 四字节 四字节 四字节 13 字节 位 单字节 双字节 位 0255 -128+127 065535 -32768+32767 04294967295 -2147483648+2147483647 1.175494E-383.402823E+38 对象的地址 0 或 1 0255 065535 0 或 1 表 31 KEIL uVision2 单片机 c 语言编译器所支持的数据类型 1 char 字符类型 char 类型的长度是一个字节, 通常用于定义处理字符数据的变量或常量。 分无符号字 符类 型 unsigned char 和有符号字符类型 sig
29、ned char,默认值为 signed char 类型。 unsigne d char 类型用字节中所有的位来表示数值,所能表达的数值范围是 0255。 signed char 类型用字节中最高位字节表示数据的符号,“0”表示正数,“1”表示负数, 负数用补码表示。 所能表示的数值范围是-128+127。 unsigned char 常用于处理 ASCII 字符或用于处理小于 或等于 255 的整型数。 正数的补码与原码相同,负二进制数的补码等于它的绝对值按位取反后加 1。 2 int 整型 int 整型长度为两个字节,用于存放一个双字节数据。分有符号 int 整型数 signed int
30、和无 符号整型数 unsigned int,默认值为 signed int 类型。signed int 表示的数值范 围是-3276 8+32767,字节中最高位表示数据的符号,“0”表示正数,“1”表示负数。 unsigned int 表 示的数值范围是 065535。 先停一下来写个小程序看看 unsigned char 和 unsigned int 用于延时的不一样效果,说 明它们的长度是不一样的,学习它们的使用方法。依旧用上一篇的最小化系统做实验,不过 要加多 一个电阻和 LED,如图 31。实验中用 D1 的点亮表明正在用 unsigned int 数 值延时,用 D2 点亮表明正在
31、用 unsigned char 数值延时。 图 31 第 3 课实验用电路 把这个项目称为 TwoLED,实验程序如下: #include /预处理命令 void main(void) /主函数名 unsigned int a; /定义变量 a 为 unsigned int 类型 unsigned char b; /定义变量 b 为 unsigned char 类型 do /do while 组成循环 for (a=0; a65535; a+) P1_0 = 0; /65535 次设 P1.0 口为低电平,点亮 LED P1_0 = 1; /设 P1.0 口为高电 平,熄灭 LED for (a=0; a30000; a+); /空循环 for (b=0; b255; b+) P1_1 = 0; /255 次设 P1.1 口为低电平,点亮 LED P1_1 = 1; /设 P1.1 口为高电平, 熄灭 LED for (a=0; a30000; a+); /空循环 while(1); 同样编译烧写,上电运行您就能看到结果了。很明显 D1 点亮的时间长于 D2 点
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1