最新MCS-51单片机C语言程序设计
MCS51单片机C语言编程

实验二 MCS-51单片机C语言编程练习一. 实验目的1. 了解单片机的C51语言与汇编语言以及标准C语言的异同,掌握C51语言的基本语法知识以及特有的程序设计特点。
2. 掌握使用C51语言进行顺序、分支、循环结构的程序设计方法。
3. 能够使用C51语言,独立设计出具有一定综合性的单片机应用程序,并与汇编语言的相应程序进行比较,加深理解。
4. 对应用问题能抽象出数学模型,绘制软件程序的流程图,并能用C51语言实现。
二.预习与思考1. 预习理论教材中“C51语言程序设计”的相关内容,掌握C51程序设计的基本方法、思路以及设计规范。
2. 预习理论教材中“C51程序设计”的相关例程。
3. 掌握单片机C51语言的调试方法,体会与标准C语言的异同。
4. 思考如何使用C51语言,对顺序、分支、循环结构的单片机应用程序进行设计,重点体会C51语言特有的设计方法与思想。
三. 实验原理1. 单片机的C51语言简介通常,将一些能够对MCS—51系列单片机进行硬件操作的C语言统称为C51语言。
在众多的C51语言中,功能最强、最受用户欢迎的是德国KEIL公司的Keil C51语言。
单片机应用系统的程序设计,既可以采用汇编语言,也可以采用C51语言,两者各具特色。
其中,汇编语言是一种用助记符来代表机器语言的符号语言。
因为它最接近机器语言,所以汇编语言对单片机的操作直接、简捷,编写的程序紧凑、执行效率较高。
但是,不同种类的单片机其汇编语言存在一定的差异。
在一种单片机上开发的应用程序,通常不能直接应用到另一种单片机芯片上,如果进行程序的移植,难度也比较大。
与此同时,汇编语言开发的程序可读性较差,不容易理解,特别是当单片机应用系统的规模比较大时,汇编语言的编程工作量非常大,从而影响应用系统的开发效率。
相对而言,C51语言恰好可以克服汇编语言的一些缺欠。
例如,C51语言可读性好、可移植性高,与自然语言比较接近,并且相同功能的程序使用C51语句的数量要远小于汇编语句。
大学课件MCS51单片机指令系统与汇编语言程序设计

ANL C, P ; (C)← (C)∧(P)
其中:P是PSW的第0位,C是PSW的第7位。
(4)字节符号地址(字节名称)加位序号的形式。对于部分特 殊功能寄存器(如状态标志寄存器PSW),还可以用其字节名 称加位序号形式来访问某一位。AC 如:
定义:操作数存放在MCS-51内部的某个工作寄存器Rn (R0~R7)或部分专用寄存器中,这种寻址方式称为 寄存器寻址。
特点:由指令指出某一个寄存器的内容作为操作数。 存放操作数的寄存器在指令代码中不占据单独的一个 字节,而是嵌入(隐含)到操作码字节中。
寻址范围:四组通用寄存器Rn(R0~R7)、部分专用 寄存器( A, B, DPTR, Cy )。
伪指令只出现在汇编前的源程序中,仅提供汇编用的某些控制 信息,不产生可执行的目标代码,是CPU不能执行的指令。
(1)定位伪指令ORG
格式:ORG n
其中:n通常为绝对地址,可以是十六进制数、标号或表达式。
功能:规定编译后的机器代码存放的起始位置。在一个汇编 语言源程序中允许存在多条定位伪指令,但每一个n值都应和前
2.2.2 直接寻址
定义:将操作数的地址直接存放在指令中,这种寻址方式称为 直接寻址。 特点:指令中含有操作数的地址。该地址指出了参与操作的数 据所在的字节单元地址或位地址。计算机执行它们时便可根据 直接地址找到所需要的操作数。
寻址范围:ROM、片内RAM区、SFR和位地址空间。P42
2.2.3 寄存器寻址
定义:指令中给出的操作数是一个可单独寻址的位地址,这种寻址 方式称为位寻址方式。
特点:位寻址是直接寻址方式的一种,其特点是对8位二进制数中 的某一位的地址进行操作。
寻址范围:片内RAM低128B中位寻址区、部分SFR(其中有83位 可以位寻址)。
单片机C51语言及程序设计

贰
壹
叁
C51编译器在头文件“REG51.H”中定义了全部sfr/sfr16和sbit变量。 用一条预处理命令#include <REG51.H>把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。
应用举例:
片内数据存储器,片外数据存储器和程序存储器。
通常下划线开头的标识符是编译系统专用的,因此在编写C语言源程序时一般不使用以下划线开头的标识符,而将下划线用作分段符。C51编译器规定标识符最长可达255个字符,但只有前32个字符在编译时有效,因此标识符的长度一般不要超过32个字符。
关键字是一种已被系统使用过的具有特定含义的标识符。用户不得再用关键字给变量等命名。C语言关键字较少,ANSI C标准一共规定了32个关键字,见表
变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。
【存储类别】 数据类型 【存储器类型】 变量名
变量名不得使用标准C语言和C51语言的关键字。
unsigned char data system_status = 0;
//定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。
sfr或sfr16型 51MCU中有21个SFR,如何定义与这些单元相关的变量?
例如,sfr P0 = 0x80; //定义P0口地址80H sfr PCON = 0x87; //定义PCON地址87H sfr16 DPTR=0x82; //定义DPTR的低端地址82H
单精度浮点数
for
程序语句
构成for循环结构
goto
程序语句
构成goto转移结构
if
程序语句
mcs51单片机c语言程序设计

MCS51单片机的中断系统
MCS51单片机的中断系统是其处理突发事件的重要机制。
MCS51单片机支持多个中断源,包括外部中断、定时器中断等。当某个中断源触发时,单片机可以 暂停当前的任务,转而处理该中断事件,处理完毕后再回到原来的任务继续执行。这使得单片机能够 快速响应突发事件,提高系统的实时性。
通过ADC0809芯片实现 模拟信号到数字信号的 转换,并将结果输出到 LED显示。
04
MCS51单片机的硬件资源与编 程
MCS51单片机的IO端口
MCS51单片机的IO端口是其与外部设备交互的重要接口。
MCS51单片机拥有多个IO端口,每个端口都有一组引脚与之对应,可以用于输 入和输出操作。这些端口可以配置为输入模式或输出模式,以便读取外部设备的 状态或控制外部设备。
MCS51单片机的定时器/计数器
MCS51单片机的定时器/计数器用于产生定时信号和控制时 间间隔。
MCS51单片机内部有多个定时器/计数器,可以用于产生精 确的定时信号或者对外部事件进行计数。这些定时器/计数器 可以独立配置,以适应不同的应用需求。通过定时器/计数器 ,单片机可以实现定时操作、延时操作等功能。
MCS51单片机的串行通信接口
MCS51单片机的串行通信接口是其 与其他设备进行数据交换的重要通道 。
VS
MCS51单片机支持多种串行通信协 议,如UART、SPI等。通过串行通信 接口,单片机可以与其他设备进行数 据交换,实现远程控制、数据采集等 功能。在串行通信过程中,单片机需 要对数据进行格式化、校验等处理, 以确保数据的正确性和可靠性。
MCS51单片机C语言程序的调试方法
仿真调试
使用仿真器进行程序调试,观察程序 运行状态和变量值的变化。
第3章51系列单片机程序设计(C语言部分)

idata
间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节)
pdata
分页寻址片外数据存储区(256字节)由MOV @Ri访问(i=0,1)
xdata
片外数据存储区(64 KB)由MOVX @DPTR访问
code
程序存储器64 KB空间,由MOVC @DPTR访问
第3章 51系列单片机程序设计(C部分)
/* Ary37定义为abry[3]的第7位 */
第3章 51系列单片机程序设计(C部分)
3.5 数 组
数组:数组是一组类型相同 有序数据的集合。用数组名 和下标来唯一确定数组中的 元素。
第3章 51系列单片机程序设计(C部分)
3.5.1 一维数组
一、一维数组的定义 形式:类型说明符 数组名 [常量表达式]
使用C51进行编程时,MCS-51片内的I/O口与片外扩展的I/O可以统一在一个头文 件中定义,也可以在程序中(一般在开始的位置)进行定义。
对于MCS-51片内I/O口按特殊功能寄存器方法定义。 例如:
sfr P0=0x80 ; /* 定义P0口,地址为80H */ sfr P1=0x90 ; /* 定义P1口,地址为90H */
第3章 51系列单片机程序设计(C部分)
3.4.3 C51数据的存储类型与MCS-51存储结构
表 3.4.2 C51存储类型与MCS-51存储空间的对应关系
存储类型 与存储空间的对应关系
data
直接寻址片内数据存储区,访问速度快(128字节)
bdata
可位寻址片内数据存储区,允许位与字节混合访问(16字节)
据 浮点型(float) 类
型 指针类型
详细见表3.4.1
MCS51单片机的C程序设计

能够进行直接访问,C51编译器利用扩充的关键字sfr和sfr16对 这些特殊功能寄存器进行定义。sfr的定义方法为:
sfr 特殊功能寄存器名 = 地址常数;
例如:
sfr SCON = 0x90;/*定义串行口控制寄存器,地址为0x90 */ sfr P0 = 0x80; /*定义P0口,地址为0x80 */ sfr16 T2 = 0xCC;/*定义80C52的T2L地址为0xCC,T2H地址为0xCD*/
0,1
1
0,1
8
0~255
16
0~65535
二、C51数据的存储器类型
应用程序中使用的任何数据(变量和常量)必须以 一定的存储器类型定位于单片机的相应的存储区域中。
存储器类型 长度(位) 对应单片机存储器
bdata data idata pdata xdata code
Copyright ©2010 CUGB 2020年2月24日星期一
main() { 局部变量说明; 执行语句; 函数调用(实际参数表); }
Copyright ©2010 CUGB 2020年2月24日星期一
函数1(形式参数说明) { 局部变量说明; 执行语句; 函数调用(实际参数 表);
}
…… …… 函数n(形式参数说明) { 局部变量说明; 执行语句; 函数调用(实际参数 表);
访问片内RAM比访问片外RAM的速度要 快得多,所以对于经常使用的变量应该置于片 内RAM中,即用bdata、data、idata来定义; 对于不经常使用的变量或规模较大的变量应该 置于片外RAM中,即用pdata、xdata来定义。
例如: bit bdata flags; /* 位变量flags定位在片内RAM的位寻址区 */ char data var; /* 字符变量var定位在片内RAM区 */ float idata x,y,z; /* 实型变量x,y,z定位在片内间址RAM区 */ sfr P1=0x90; /* 定义P1口地址为90H */
MCS-51单片机C51程序设计
19:04
张兴忠制作:
返回目录
14
5.2.2 数据类型
-----C51的数据类型
除此之外,为了更加有利地利用MCS-51的结构,C51还增 加了一些特殊的数据类型,包括bit、sbit、sfr、sfr16。 数据类型如表5-2所示。
C51编译器针对MCS-51单片机硬件在下列几方面 对ANSI C进行了扩展。 1) 扩展了专门访问MCS-51单片机硬件的数据类型;
2) 存储类型按MCS-51单片机存储空间分类;
3) 存储模式遵循存储空间选定编译器模式;
4) 指针分为通用指针和存储器指针; 5) 函数增加了中断函数和再入函数。
19:04
19:04
张兴忠制作:
返回目录
16
5.2.2 数据类型
2.int整型
-----int整型
int整型长度为2B,用于存放一个双字节数据。
signed int表示的数值范围是-32768~+32767,字 节中最高位表示数据的符号,0表示正数,1表示负 数。
unsigned int表示的数值范围是0~65535。
第5章 MCS-51单片机C51程序设计
5.5.3 循环结构程序
5.5.4 查表程序
5.6 C51程序设计实例 5.6.1 单片机内/外部资源应用 程序设计 5.6.2 C51语言和MCS-51汇编语 言混合编程 5.6.3 编程优化的概念 习题与思考题
返回目录
5.4.4 对被调函数的说明
5.4.5 中断函数
标识符用来标识源程序中某个对象的名字,这些对
象可以是语句、数据类型、函数、变量、数组等。
第三章 MCS51系列单片机的C语言及其编程
位型(bit)
1. 程序的基本构成
数据结构 算法
基本类型
字符型(char) 整型(int) 长整型(long) 浮点型(float) 双精度浮点型(double) 数组(array) 构造类型 结构体(struct) 共用体(union) 枚举型(enum) 指针类型 双精度浮点型
2. C51的数据结构 C51的数据结构
• 循环控制
先判断后执行:for(;;), while… 先判断后执行:for(;;), while… 先执行后判断:do…while… 先执行后判断:do…while…
第三节 函数和指针
• 指针是C语言的一个重要概念,使用指针可以使程 指针是C
序简洁、紧凑、高效。
变量名和变量值 内存单元地址和内存单元内容 变量的指针和指向变量的指针变量
第一节
MCS51的系统开发流程及 MCS51的系统开发流程及 KeilC简介 KeilC简介
目标分析 硬件设计 软件设计
仿真与调试 开发完成
1、单片机系统及的开发流程 • 单片机系统是软硬件综合体
• 开发工具的选择
(1) 开发软件的选择 (2) 仿真器的选择
2、KeilC集成开发环境简介
第二节 C51编程及其使用 C51编程及其使用
• C51中,各个函数的地位是平等的,在定义函数时,不 C51中 各个函数的地位是平等的,在定义函数时, 能堪套定义
MCS-51单片机的C语言程序设计基础
上例的枚举就使week值从1到7,这样的赋值也符合我们日常生活中对周次时序关系的定义。使 用枚举就如变量一样,但在程序中不能为其赋值。 定义类型在某种程度上同枚举类型相似,因为定义允许用一个文本串代替另一个文本串,例如 :
表3-1 C51语言所支持的数据类型
注:(1)Bit:位标量。 Bit位标量是C51语言的一种扩充数据类型,利用它可定义一个位标量,但不能定:义位指针,也不能定 义位数组。它的值是一个二进制数,不是0就是1,类似一些高级语言中的Boolean类型中的TRUE和FALSE 。 (2)SFR:特殊功能寄存器。 SFR也是一种扩充数据类型,占用一个内存单元(8位),值域为O~255。利用它可以访问MCS-51单 片机内部的所有特殊功能寄存器。如用SFR Pl=O*90这一条语句定义PI(T作寄存器),则其为P1端口在片 内的寄存器,在后面的语句中我们可以用P1= 255(对Pl端口的所有引脚置高电平)之类的语句来操作特殊 功能寄存器。 (3)SFR16: 16位特殊功能寄存器。 SFR16占用两个内存单元(1 6位),值域为0~65 535。SFR16和SFR -样用于操作特殊功能寄存器,所 不同的是它用于操作占两个字节的寄存器,如定时器TO和Tl。 (4)Sbit:可寻址位。 Sbit是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中 的可寻址位,如先前定义:
看了上面的例子,就会发现枚举值不用赋值就能使用,这是因为在枚举列表中,每一项名称代 表一个整数值,在默认的情况下,编译器会自动为每一项赋值,第一项赋值为0,第二项为1……如w 色ek中的Sun为0,Fri为5。C语言也允许对各项值作初始化赋值,要注意的是在对某项值初始化后, 它的后续各项值也随之递增,如:
MCS51单片机C语言程序设计基础
本章主要内容
• C51变量声明
• C51的IO口操作
• C51的中断响应方法
• C51的定时器操作
• C51的串行口操作
• C51的外部总线扩展操作
2.1 C51语言变量声明
但在C语言编程中,对数据类型与变量的定义必须 要与单片机的存储结构相关联,否则编译器就不能正 确的映射。 所以用C语言编写单片机应用程序是要根据单片机 的结构及内部资源定义相应的C语言中的数据类型和 变量。 用C语言编写的应用程序必须经单片机的C语言编 译器,将源代码转换成单片机的可执行程序。支持 MCS-51系列单片机的编译器有很多,比较著名也是 实际应用最多的是KEIL/Franklin编译器。这也是这门 课使用的编译器。
;双字节无符号数加法 程序 (R3R4+R6R7)=(R3R4) ;入口 :R3,R4,R6,R7 NADD :MOV A,R4 ADD A,R7 MOV R4,A MOV A,R3 ADDC A,R6 MOV R3,A RET unsigned int val_1, val_2; unsigned int val_add; val_add = val_1 + val_2;
第二章 MCS51单片机C语言程序设计
C语言具有很强的表达能力,并具 有较高的可移植性,提供了种类丰富的 运算符和数据类型,可以直接实现对系 统硬件的控制。 相对于汇编语言,使用C语言进行 系统开发可以大大缩短开发周期,明显 增强程序的可读性,便于改进和扩充。
本章就介绍使用C语言开发8051系 列单片机程序的方法。
三、C51存储模式
表2.4 存储模式说明 存储模式 说明
SMALL
参数及局部变量放入可直接寻址的片内存储区 (最大128个字节),默认存储类型是data,访 问方便。所有对象都嵌入片内RAM中。