商品详情
前 言在人工智能蓬勃发展的时代, 嵌入式技术凭借其独特的优势, 在各行各业中得到了前所未有的广泛应用。 新型51 系列的微控制器 (MCU) 产品, 还集成了模数转换器(ADC) 等高级功能, 成为众多工业及智能控制设备的首选。在51系列MCU开发的过程中, 初学者往往面临一个问题对于专为51系列设计的C51语言知之甚少, 这种知识缺口导致他们难以处理寄存器及内存等底层细节, 使用C51 语言来实现队列、 链表等数据结构算法时感到力不从心。 即使现有的C51用户手册,也仅提供基础的语法规则, 缺乏完整且可参考的代码示例, 这无疑增加了学习的难度。C51 语言是标准C编译器的扩展, 增加了8051处理器的指令功能。 本书旨在为读者提供一个全面而实用的学习平台, 采用嵌入式开发中的实例作为程序案例, 实现硬件设备的程序控制流程, 同时展示出C51语言在算法设计中的强大功能。 本书共分为三篇。 第一篇为程序设计入门。 介绍了C51语言的关键字、 模块化的程序结构和三种典型的程序流程, 紧密结合实际应用场景, 提供了丰富的实例代码, 应用C51语言实现各类数据运算。 其中, 详细介绍了51芯片的功能寄存器和存储器结构及特点, 使读者能合理选择数据存储的位置。 第二篇为模块化程序设计, 介绍了函数和数组、 结构体等复杂数据类型,其中包括C51语言特有的中断函数和可重入函数。 通常在嵌入式开发中, 每个硬件都会被处理成模块文件, 因此, 对于外部函数的设计、 参数的作用域, 以及应用指针来传递复杂类型参数等, 本书都给出了实例代码。 通过学生管理系统实例, 读者可以直观地理解指针在模块化编程中的应用。 第三篇为工程管理与算法, 主要介绍了程序预处理、 编译以及工程管理, 并使用C51语言实现了队列和链表的操作算法。 嵌入式开发中硬件资源的配置实质是对寄存器或内存地址的读写操作。 大量的内存地址指针, 只有通过宏定义和条件编译转换成有意义的字符信息, 程序才具有可读性和可维护性。 第三篇通过调光系统实例, 介绍了头文件和源文件的包含关系; 通过智能密码锁管理系统, 实现链表创建、 增加和删除等操作。 最后, 本书附录C中简要介绍了程序调试运行方法, 展示了硬件设备的仿真窗口、 变量窗口和内存窗口等。 调试运行和仿真是嵌入式开发过程中不可或缺的一环, 能帮助开发人员更好地理解程序与硬件之间的交互过程。 本书附录D提供了系统输入/输出函数的重定向代码, 方便读者将Keil平台的案例程序移植到其他C语言编译环境中。 希望分享的这些案例, 能够起到抛砖引玉的作用, 激发更多关于C51语言程序设计的优秀书籍问世。
本书由李云编写第1章、 第8章、 第9章并统稿全书, 娄明山编写第2章、 第3章,陈玉仙编写?4章, 程秀玲编写第5章, 钟平编写第6章, 黄婕编写第7章, 吕新伟作为行业专家, 对本书案例的应用价值提供了指导性意见。 在本书编写过程中, 得到了吴进、黄荻、 谢佳君等老师的大力支持和帮助, 在此表示衷心感谢。 感谢网友jxlxh翻译的 《Keil SoftwareCx51编译器用户手册》, 同时也感谢威胜集团对本书的关心和支持。由于时间仓促以及编者水平有限, 书中难免有不完善的地方, 恳请广大读者和专家批评指正。
本书提供实例程序下载, 扫描下面的二维码, 可获得教材配套资源。
编 者
《C51语言程序设计》系统介绍了C51程序语言的基础知识与程序设计方法,依托KEIL硬件仿真与软件调试平台,培养硬件控制逻辑与编程实践能力。全书分为三个部分:第一部分为编程基础,介绍程序流程设计和函数结构,以及数据类型、表达式运算及数据存储;第二部分为模块化编程,包括函数类型、调用方式与参数传递机制,介绍了利用指针传递数组与结构体,以及内存访问方法;第三部分为工程管理和算法设计,介绍预处理与编译过程、头文件组织、变量与函数的管理,并结合综合案例,实现队列、链表等典型数据结构的应用。《C51语言程序设计》有配套的电子课件、实例演示视频和工程代码,除了包含C51关键字的程序外,其余的程序代码可直接移植到其他C语言平台运行。因此,本书可作为通用程序设计教程,也可以作为嵌入式开发的参考用书。
《C51语言程序设计》共分为三篇。 第一篇为程序设计入门。 介绍了C51语言的关键字、 模块化的程序结构和三种典型的程序流程, 紧密结合实际应用场景, 提供了丰富的实例代码, 应用C51语言实现各类数据运算。 其中, 详细介绍了51芯片的功能寄存器和存储器结构及特点, 使读者能合理选择数据存储的位置。 第二篇为模块化程序设计, 介绍了函数和数组、 结构体等复杂数据类型,其中包括C51语言特有的中断函数和可重入函数。 通常在嵌入式开发中, 每个硬件都会被处理成模块文件, 因此, 对于外部函数的设计、 参数的作用域, 以及应用指针来传递复杂类型参数等, 本书都给出了实例代码。 通过学生管理系统实例, 读者可以直观地理解指针在模块化编程中的应用。 第三篇为工程管理与算法, 主要介绍了程序预处理、 编译以及工程管理, 并使用C51语言实现了队列和链表的操作算法。 嵌入式开发中硬件资源的配置实质是对寄存器或内存地址的读写操作。 大量的内存地址指针, 只有通过宏定义和条件编译转换成有意义的字符信息, 程序才具有可读性和可维护性。 第三篇通过调光系统实例, 介绍了头文件和源文件的包含关系; 通过智能密码锁管理系统, 实现链表创建、 增加和删除等操作。 最后, 本书附录C中简要介绍了程序调试运行方法, 展示了硬件设备的仿真窗口、 变量窗口和内存窗口等。 调试运行和仿真是嵌入式开发过程中不可或缺的一环, 能帮助开发人员更好地理解程序与硬件之间的交互过程。 本书附录D提供了系统输入/输出函数的重定向代码, 方便读者将Keil平台的案例程序移植到其他C语言编译环境中。
李云,副教授,主要从事与计算机软件开发相关的教学和科研工作。近年来,主要承担《C语言程序设计》、《单片机应用与实践》等课程的教学和教育研究。2023年主持院级课题;融合嵌入式技术的《C语言程序设计》课程建设的教学研究,2022年参加湖南省职业院校教师职业能力竞赛教学能力比赛获二等奖,发表《混合式教学模式下复合型能力培养的探索与实践》、《智能制造视角下程序设计课程教学模式重构》等教学论文。
目 录第一篇 程序设计入门2第一章 程序设计基础21.1 嵌入式开发和C51语言21.1.1 什么是C51语言51.1.2 嵌入式系统架构81.1.3 开发工具Keil12 1.2 模块化程序结构12 1.2.1 工程和文件12 1.2.2 函数和语句15 1.2.3 标准库函数17 1.3 程序控制流程21 1.3.1 顺序流程21 1.3.2 循环流程22 1.3.3 分支流程24 1.4 总结27 1.5 习题27第二章 数据类型和表达式28 2.1 浮点型28 2.2 整型29 2.2.1 整型的表示形式29 2.2.2 功能寄存器类型32 2.2.3 位类型33 2.3 字符型36 2.4 void类型39 2.5 变量40 2.6 运算符及表达式运算41 2.6.1 算术表达式41 2.6.2 关系表达式44 2.6.3 位运算表达式45 2.6.4 赋值表达式48 2.6.5 三元运算式49 2.6.6 运算符优先级和类型转换49 2.7 数组和字符串51 2.8 数据存储区53 2.9 总结57 2.10 习题57第三章 程序流程控制59 3.1 for和do_while语句59 3.2 break和continue语句61 3.3 循环嵌套63 3.4 if_else嵌套65 3.5 多重分支switch语句68 3.6 总结70 3.7 习题70第二篇 模块化程序设计第四章 函数72 4.1 内部函数72 4.2 外部函数76 4.3 函数的参数传递79 4.4 变量和函数的作用域82 4.5 中断函数85 4.6 可重入函数88 4.7 总结89 4.8 习题89第五章 数组91 5.1 一维数组91 5.1.1 数组的声明和初始化91 5.1.2 一维数组的存储91 5.1.3 数组元素的引用93 5.1.4 数组长度和下标94 5.2 字符串和字符数组95 5.2.1 字符数组和字符串的定义95 5.2.2 字符数组和字符串的引用97 5.2.3 字符串库函数及应用98 5.3 多维数组99 5.3.1 二维数组99 5.3.2 字符串数组102 5.4 总结104 5.5 习题104第六章 指针105 6.1 指针和地址105 6.1.1 指针的声明和定义105 6.1.2 指针引用106 6.2 指针和函数108 6.2.1 指针作为函数参数108 6.2.2 使用无类型指针传递参数110 6.2.3 指针作为返回值111 6.2.4 指向函数的指针112 6.3 指针和数组113 6.3.1 指向数组元素的指针113 6.3.2 指向字符串的指针115 6.3.3 指向二维数组的指针116 6.4 总结118 6.5 习题118第七章 结构体和枚举类型120 7.1 结构体类型120 7.1.1 结构体类型的定义120 7.1.2 声明结构体变量121 7.1.3 初始化结构体成员121 7.1.4 引用结构体成员122 7.1.5 使用typedef定义结构体类型的别名124 7.2 结构体和函数125 7.2.1 结构体类型的指针变量作为函数形参125 7.2.2 结构体的函数指针成员126 7.3 枚举类型127 7.3.1 枚举类型的定义127 7.3.2 声明和引用枚举变量128 7.3.3 使用typedef定义枚举别名129 7.3.4 枚举类型和结构体130 7.4 综合实例:学生信息管理系统131 7.5 总结135 7.6 习题136第三篇 工程管理与算法第八章 预处理和工程组织138 8.1 预处理138 8.1.1 宏定义139 8.1.2 条件编译142 8.1.3 文件包含146 8.2 工程组织148 8.2.1 函数和变量的组织148 8.2.2 头文件的组织151 8.3 总结154 8.4 习题154第九章 数据结构的应用155 9.1 队列排序155 9.2 建立链表156 9.3 综合实例:智能密码锁管理系统159 9.4 总结170 9.5 习题170附录A ASCII码表、运算符171附录B C51语言的关键字与库函数173附录C Keil集成开发平台仿真调试178附录D 串口输出uart.c文件182参考文献184
第一章 程序设计基础1. 1 嵌入式开发和C51语言1. 1. 1 什么是C51语言C 语言于20 世纪70 年代诞生于美国的贝尔实验室。 1983年, 美国国家标准协会(ANSI) 正式通过ANSIC语言标准, 即C89 版本。 随后, 国际标准化组织 (ISO) 批准了ANSIC成为国际标准并于1989年颁布, 称为ISOC, 也就是C90。 1999年, ANSI和ISO 在C90 基础上制定了最新版本的C语言标准, 即C99。 C99扩展了新特性, 如增加了longlong 类型, 可支持更大的整数, 增加了单行注释, 允许在任意位置声明变量等。 为了方便在常用操作系统下应用, C语言提供了大量标准库函数, 例如, 输入和输出、 字符转换等操作函数。 由于C语言既具有高级语言的特点又具有低级语言的特点, 不受限于任何操作系统或特殊应用领域, 因此, C语言在嵌入式开发中也占有重要的位置。 例如, 在基于ARM (高级精简指令集) 内核的嵌入式开发中, Keil公司的MDKARM集成开发环境所采用的ARMCC编译器就支持C和C十十语言。MCS_51 是Intel 公司于1981 年研制的8 位微处理器架构。 除了Intel 公司的8051 之外, Atmel 等公司也开发了许多增强型51处理芯片, 这些芯片都可以认为是基于MCS 51 架构的单片机产品。 基于MCS_51 架构的微处理器系统, 是应用最广泛的芯片之一。为了支持MCS_51系列的嵌入式系统开发, 充分利用8051的结构特性, Keil公司在C语言基础上做了扩展, 增加了与特定存储区域和类型等相关的关键字, 制定了C51语言标准, 并设计了Cx51编译系统。
与C语言相比, C51语言具有一些专有的特性。 例如, C51语言派生出bit、 sfr等专用数据类型, 增加了idata、 code等存储区修饰符, 声明变量时可以指定存储位置和存储方式, 修改或增加了C语言的系统库函数等, 提高了系统开发和运行效率。C51 语言继承了C语言的特点, 采用结构化的设计流程、 模块化的函数结构, 以及丰富的操作符, 可以提供清晰的代码逻辑, 实现高效的算法设计。 此外, C51语言继承了C语言丰富的指针操作, 能够直接访问微处理的寄存器、 ROM (只读存储器) 和RAM (随机存储器), 为嵌入式开发提供了高效而简洁的代码支持。
本书主要讨论MCS_51系列微处理器的程序设计, 使用C51语言进行数据运算和算法设计; 使用指针访问寄存器和存储区, 实现中断流程控制; 使用队列、 链表等数据结构, 解决复杂的数据存储和处理问题; 构建合理的工程组织和多外设的函数模块。 抛开C51 语言的关键字, 这些编程技术和方法同样适用于ARM内核的嵌入式系统开发。下面分别介绍标准C语言和C51语言的关键字。标准C语言定义了32个关键字, 用来表示C语言中具有特定意义的标识符。 这些关键字不能用作变量名、 函数名或其他标识符的命名。 由于在程序中会经常用到这些关键字, 下面对其进行简单描述。
(1) 基本数据类型①void: 声明函数无返回值或无参数。②float: 单精度浮点型数据, 属于浮点数据的一种。③double: 双精度浮点型数据, 属于浮点数据的一种。④int: 整型数据, 包括十进制、 十六进制和八进制整型。⑤char: 字符型数据, 属于整型数据的一种。(2) 数据类型修饰①short: 短整型数据, 可省略被修饰的int。②long: 长整形数据, 可省略被修饰的int。③signed: 有符号数据类型。④unsigned: 无符号数据类型。(3) 复杂数据类型①struct: 结构体类型。②union: 共用体类型。③enum: 枚举类型。(4) 类型限制符①auto: 自动存储类型, 由编译器自动分配及释放, 通常在栈上分配。②static: 声明静态变量或函数, 限定作用域为文件或函数内部。③register: 寄存器变量, 适合使用频率高, 执行速度快的变量。④extern: 声明外部变量, 即在另外的目标文件中被定义的变量。⑤const: 声明变量存放在只读存储器中。⑥volatile: 限制指针变量的优化编译, 强制编译器每次从内存中取得该变量的值。(5) 数据类型操作①typedef: 声明类型的别名。②sizeof: 得到数据类型或变量的大小。(6) 跳转流程①return: 用在函数体中, 返回特定值。②continue: 跳出当前循环, 开始下一轮循环。③break: 结束当前循环或switch结构。④goto: 无条件跳转语句。(7) 分支流程①if: 条件语句。②else: 条件语句的否定分支, 与if连用。③switch: 多重分支语句。④case: 多重分支中的分支标记。⑤default: 多重分支中的其他分支。
- 新华一城书集 (微信公众号认证)
- 上海新华书店官方微信书店
- 扫描二维码,访问我们的微信店铺
- 随时随地的购物、客服咨询、查询订单和物流...