Cx51数据与运算
第3章 Cx51数据与运算

//定义IO线P0.0 //定义IO线P0.1 //定义IO线P0.2 //定义IO线P0.3 //定义IO线P0.4 //定义IO线P0.5 //定义IO线P0.6 //定义IO线P0.7
下列的样例显示如何读和写I/O引脚
端口中的每一个IO口线还可以用sbit来定义其每 一个位:
sbit P00 sbit P01 sbit P02 sbit P03 sbit P04 sbit P05 sbit P06 sbit P07
=P0^0; =P0^1; =P0^2; =P0^3; =P0^4; =P0^5; =P0^6; =P0^7;
C51编程注意事项
(1)采用短变量 能用char型不用int型: 使用C编程时,我们都习惯于对循环控制变量 使用int类型,这对8位的单片机来说是一种极大的 浪费。 很明显,经常使用的变量应该是unsigned char,只占用一个字节: unsigned char data n;
(2)使用无符号类型 能用unsigned 就不用signed 定义变量。
4、存储类型
作用:指定程序变量的存储区:
关键字 code 对应的存储空间及范围 ROM空间,64KB全空间 片内RAM,直接寻址,低128字节 片内RAM,间接寻址,256字节,与 @Ri 对应
data
idata
bdata 片内RAM,位寻址区0x20~0x2f,可字节访问 片外RAM,分页寻址的256字节(P2不变), P2 pdata 改变可寻址64KB全空间,与MOVX @Ri 对应 xdata 片外RAM,64KB全空间 片内RAM位寻址区,位地址0x00~0x7f,128位
4字节 ±1.1755E-38~±3.40E+38
1字节 0~255 2字节 0~65535
第5章 Cx51构造数据类型(4学时)

2 枚举变量的取值 p122
如果有 enum direct {up,down,left=10,right}; 则有
clerk1.birthday.year=1957;
//只能给最后一级的成员赋值
floatsum=clerk1.wages+cle rk2.wages;
5.3.2 结构数组
也可定义为: struct{ struct string{ char char name[8]; name[8]; char sex[2]; char sex[2]; int age; int age; char addr[40]; char }; addr[40]; struct string student[40]; }student[40 ];
1.指针变量定义 类型标识符 *指针名1, *指针名2,…; *表示变量为指针变量;
int a,b,c; int *ap,*bp,*cp; 编译后变量定位
变量赋值
a=6; b=8; c=10; 编译后
2.指针变量的引用(赋值)
ap=&a;
ap=&b;
ap=&c;
例 p110
注意:
1)p109
最后一行应是 *(p+1)+3; 2) p110 第一行应是 *(*(p+1)+3); 3) p110 第3-4行行首都应 加*号;
5.2.4 关于KEIL Cx51的指针 类型 p110-111
1
基于存储器的指针(1-2个字节) char xdata *px; char xdata *data pdx; 上述二者的区别: 1)定义1中指针的存放由编译模式 决定; 2)定义2明确指出指针位于内部存
第三章CX51数据与运算(修改)(1)讲述

用四个字节32位存放,符号位表示正负、阶码和尾数表示大小。
注:第一位均为符号位
第三章 C51数据与运算
6
二进制数的定点和浮点表示
定点表示法 ——小数点位置是“固定的” 符号位: 0—正数 1—负数 定点数可用于表示整数。整数在机器中用补码表示。 对于 int a=8,b=-8; 数值位 符号位 真值 原码 补码 a=810=10002 b=- 810=-10002
一个变量由变量名和变量值组成,变量名是存储单元地址的符号表示, 变量的值是该单元存放的内容。 定义一个变量,编译系统会自动为其安排一个存储单元,具体的地址值 用户不必关心。 无论哪种数据都是存放在存储单元中的,每一个数据究竟占用几个单元 (即数据的长度)都要提供给编译系统,正如汇编语言中存放数据的单 元要提供DB或DW伪指令进行定义,编译系统以此为根据预留存储单元。
Why?!
void main(void) { int data a ;
a=12345; a=? Because: a=1234567; a=? 12345 (3039H)的补码是 0011 0000 0011 1001 } 1234567(12D687H)的补码是 1 0010 1101 0110 1000 0111 截去多余部份(超过2个字节的左边部分)后 其原码为 1010 1001 0111 1001(-10617)
0 0000000 00001000 0 0000000 00001000
1 0000000 00001000 1 1111111 11111000 11110111
正数的原码=正数的补码 负数的原码和补码按以下规则相互转换: 符号位不变,数值位各位取反,末位加1。
第三章 C51数据与运算
单片机C语言(模块一)

《单片机原理及应用(二)》模块一C51程序设计基础任务1:实例导航第二章C与80512.1 8051的编程语言1、8051的编程语言(四种):(1)BASIC语言(2)PL/M√(3)汇编语言√(4)C语言目前,汇编语言和C语言是广泛使用的两种单片机编程语言。
在未来的一段时间内,汇编语言和C语言还将同时存在,但从发展趋势看,C语言有逐渐取代汇编语言的可能。
最好的单片机编程者应是具有汇编语言基础,又精通C语言的。
2、C语言的优点(与汇编语言相比):(P41)(1)对单片机的指令系统不要求了解,仅要求对8051的存储器结构有所了解(2)寄存器的分配、不同存储器的寻址及数据类型等细节由编译器管理(3)程序有规范的结构,由不同的函数组成,这种方式可使程序结构化(4)编程及程序调试时间显著缩短,从而提高效率(5)提供库函数,具有较强的数据处理能力3、8051单片机C语言(单片机C51语言)了解一下单片机的种类:(查资料)2.2 Cx51编译器编译:C语言源程序转换成机器语言目标程序的过程,叫做编译。
编译器:能自动完成编译过程的一种计算机软件。
(1)C语言编译器(标准C)(2)C51编译器(经典8051单片机)(3)C x51编译器(经典8051单片机及派生产品)Cx51编译器完全遵照ANSI C语言标准,支持C语言的所有标准特征。
另外,还增加了可以直接支持8051结构的特征。
典型产品:KILE套装工具软件----------uVision2 集成开发环境的使用(P 302)例2-1:用uVision2软件编译调试一个C51程序(HELLO.C)基本步骤:(1)创建一个新项目(建在一个新文件夹下)并为项目选择一个CPU(此时会自动加入启动文件)(2)创建新程序文件(或打开旧程序文件)此例中,打开c:\kile\c51\examples\hello(3)将源文件添加到项目中此时还可修改工具选项(4)编译和链接项目(Build Target命令):翻译和链接源文件,并生成一个可以载入到uvision2调试器进行调试的绝对目标模块。
第3章C51运算

D2 7A 72 6A 62 5A 52 4A 42 3A 32 2A 22 1A 12 0A 02
D1 79 71 69 61 59 51 49 41 39 31 29 21 19 11 09 01
D0 78 70 68 60 58 50 48 40 38 30 28 20 18 10 08 00 2FH 2EH 2DH 2CH 2BH 2AH 29H 28H 27H 26H 25H 24H 23H 22H 21H 20H
基本类型
数据类型
构造类型
指针类型 空类型
2
表3-1 KEILCx51的数据类型 的数据类型 数据类型 Bit unsigned char signed char unsigned int signed int unsigned long signed long float double 一般指针 长度/bit 长度 1 8 8 16 16 32 32 32 64 24 长度/Byte 长度 …. 1 1 2 2 4 4 4 8 3 0,1 , 0~255 -128~127 0~65535 -32768~32767 0~4294967295 -2147483648~2147483647 位数字) ±1.176E-38~ ±3.40E+38(6位数字) ( 位数字 位数字) ±1.176E-38~ ±3.40E+38(10位数字) ( 位数字 存储空间0~65535 存储空间 值域
SFR 可字节或位寻址 字节寻址 可位寻址区(也可字节 可位寻址区 也可字节 寻址)位地址 位地址00H~7FH 寻址 位地址 18H 10H 08H 00H 3区 区 2区 区 1区 区 0区 区
FFH 80H 7FH 30H 2FH 20H 组工作寄 1FH 4组工作寄 存器 17H R0~R7 0FH SP初值 初值 07H 为07H
常见51单片机指令及详解

常见51单片机指令及详解1. 简介单片机是一种集成电路,具备处理和控制功能。
51单片机是指Intel公司推出的一系列8位单片机,常用于嵌入式系统和物联网设备。
本文将介绍一些常见的51单片机指令,并对其进行详解。
2. 数据传送指令2.1 MOV指令MOV指令用于将数据从一个寄存器或内存位置传送到另一个寄存器或内存位置。
例如:MOV A, #10 ;将立即数10传送给累加器AMOV R0, R1 ;将寄存器R1的值传送给R02.2 XCH指令XCH指令用于交换两个寄存器或内存位置中的数据。
例如:XCH A, B ;交换累加器A和B的值3. 算术运算指令3.1 ADD指令ADD指令用于将两个操作数相加,并将结果保存在累加器中。
例如:ADD A, B ;将累加器A和寄存器B的值相加,结果存储在A中3.2 SUBB指令SUBB指令用于将第二个操作数的补码与累加器的值相减,并将结果存储在累加器中。
例如:SUBB A, B ;将B的补码与累加器A的值相减,结果存储在A中4. 逻辑运算指令4.1 ANL指令ANL指令用于对两个操作数进行按位与运算,并将结果存储在目的操作数中。
例如:ANL A, B ;将累加器A和寄存器B的值按位与,结果存储在A 中4.2 ORL指令ORL指令用于对两个操作数进行按位或运算,并将结果存储在目的操作数中。
例如:ORL A, B ;将累加器A和寄存器B的值按位或,结果存储在A 中5. 跳转指令5.1 JMP指令JMP指令用于无条件跳转至指定的目标地址。
例如:JMP 2000H ;跳转至内存地址2000H处执行指令5.2 JZ指令JZ指令用于在累加器为零时跳转至指定的目标地址。
例如:JZ 3000H ;当累加器为零时,跳转至内存地址3000H处执行指令6. 输入输出指令6.1 IN指令IN指令用于将外部设备的数据输入到累加器或指定的寄存器中。
例如:IN A, P1 ;将P1端口的数据输入到累加器A中6.2 OUT指令OUT指令用于将累加器或指定的寄存器中的数据输出到外部设备。
51单片机指令表汇总

51单片机指令表汇总51 单片机是一种广泛应用于电子工程和嵌入式系统开发的微控制器。
要熟练掌握 51 单片机的编程,了解其指令表是至关重要的。
下面就为大家汇总一下 51 单片机的常见指令。
数据传送类指令MOV 指令:这是最基本的数据传送指令,用于在寄存器之间、寄存器与存储器之间传送数据。
例如,“MOV A, 50H”就是将立即数 50H传送到累加器 A 中。
MOVX 指令:用于在片外数据存储器和累加器 A 之间进行数据传送。
比如“MOVX A, @DPTR”,将片外数据存储器中由数据指针 DPTR 所指定单元的内容传送到累加器 A 中。
MOVC 指令:用于访问程序存储器中的数据表格。
“MOVC A, @A+DPTR”是常见的用法。
算术运算类指令ADD 指令:实现加法运算。
像“ADD A, R0”就是将累加器 A 的内容和寄存器 R0 的内容相加,结果存放在累加器 A 中。
ADDC 指令:带进位加法指令。
考虑了上一次运算产生的进位标志。
SUBB 指令:用于减法运算,并且会考虑借位标志。
逻辑运算类指令ANL 指令:进行逻辑与操作。
例如“ANL A, R0”,将累加器 A 和寄存器 R0 的内容进行逻辑与运算,结果存放在累加器 A 中。
ORL 指令:执行逻辑或操作。
XRL 指令:实现逻辑异或运算。
控制转移类指令JC 指令:若进位标志为 1 则跳转。
JZ 指令:若累加器 A 的内容为 0 则跳转。
LJMP 指令:长跳转指令,可以跳转到 64KB 程序存储器空间的任意位置。
位操作类指令SETB 指令:将指定的位设置为 1。
例如“SETB P10”,将 P1 端口的第 0 位置 1。
CLR 指令:把指定的位清零。
这些只是 51 单片机指令的一部分,实际应用中还有更多的指令和组合使用方式。
在编程时,合理选择和运用这些指令能够实现各种复杂的功能。
比如,通过数据传送指令来初始化变量和读取外部数据;利用算术运算指令进行数值计算;借助逻辑运算指令处理逻辑关系;使用控制转移指令实现程序的分支和循环;运用位操作指令控制单个引脚的状态。
单片机运算符及表达式

第三章运算符及表达式说明:Cx51的运算符与普通C语言的几乎完全一样,带复习性质,重点介绍在单片机中应用的特点。
一、运算符及表达式运算符:完成某种特定运算的符号。
运算符按其表达式中与运算符的关系可分为单目运算符,双目运算符和三目运算符。
单目就是指需要有一个运算对象,双目就要求有两个运算对象,三目则要三个运算对象。
运算对象:在程序运行时,有数值或有数值传递给它。
表达式:表达式则是由运算符及运算对象所组成的具有特定含义的式子。
C是一种表达式语言,表达式后面加";"号就构成了一个表达式语句。
例:x=a*(b+c-a);子表达式:成对的括号以及在它们之间的全部符号组成的表达式。
上例中(b+c-a)就是子表达式。
二、运算符1、赋值运算符1) 赋值运算符赋值符号“=”完成的操作即为赋值运算,它是右结合性,且优先级最低。
2) 赋值表达式将一个变量与表达式用赋值号连接起来就构成赋值表达式。
形式如下:变量名=表达式赋值表达式中的表达式包括变量、算术运算表达式、关系运算表达式、逻辑运算表达式等,甚至可以是另一个赋值表达式。
赋值过程是将“=”右边表达式的值赋给“=”左边的一个变量,赋值表达式的值就是被赋值变量的值。
例如:a=(b=4)+(c=6);,该表达式的值为10,变量a 的值为10。
3) 赋值的类型转换规则在赋值运算中,当“=”两侧的类型不一致时,要将数据转换成同一数据类型,转换的方式有两种,一种是系统自动转换,一种是强制转换。
(1)系统自动转换编译时,将右边表达式的值转换成左侧变量的类型,再赋给该变量。
转换规则如下:①实型数据赋给整型变量时,舍弃小数部分。
②整型数据赋给实型变量时,数值不变,但以IEEE 浮点数形式存储在变量中。
③长字节整型数据赋给短字节整型变量时,实行截断处理。
如将long 型数据赋给int型变量时,将long 型数据的低两字节数据赋给int 型变量,而将long 型数据的高两字节的数据丢弃。
第五章 Cx51构造数据类型

如何通过函数调用得到n个要改变的值
• 1.在主调函数中设n个变量,用n个指针变量指向它们; • 2.将指针变量用为实参,将这n个变量的地址传给所调用 函数的形参; • 3.通过形参指针变量,改变该n个变量的值; • 4.主调函数中就可以使用这些改变了值的变量。
指针使用原则:
• 永远要清楚每个指针指向了什么位置 • 永远要清楚每个指针指向的位置中的内容是什么
3. 指针变量作为函数参数 上例: swap(int *p1,*p2) { int temp; temp=*p1;*p1=*p2;*p2=temp; } 5,9 main() a=9,b=5 { int a,b;int *pointer1,*pointer2; scanf(―%d,%d‖,&a,&b); pointer1=&a; pointer2=&b; if (a<b) swap(pointer1, pointer2); printf(―\na=%d,b=%d\n‖,a,b); } 思考:若swap(int x,y){ int temp;temp=x; x=y;y=temp; },主函 数中用swap(a,b);结果如何?
4. 字符串处理函数 puts(字符数组) 作用:将一个字符串(以’\0‘结束的字符序列)输出到终端 例:char str[]={―China\nBeijing‖}; China puts(str); Beijing gets(字符数组) 作用:从终端输入一个字符串到字符数组 • scanf()不能输入带空格的字符串,gets()可以 • scanf()、gets()没有提供限制输入字符串长度的方法,容 易引起缓冲区溢出 在string.h中定义了若干专门的字符串处理函数 strcat(字符数组1,字符数组2):字符串连接 作用:把字符串2接到1的后面,结果放在1中。 例:char str1[30]={―People of Republic of ‖}; char str2[]={―China‖}; printf(―%s‖,strcat(str1,str2));
51单片机数学运算

51单片机数学运算51单片机是一种常用的微控制器,具有广泛的应用领域。
在数学运算方面,51单片机可以进行基本的算术运算、逻辑运算和位运算等。
本文将介绍51单片机在数学运算方面的应用。
一、算术运算51单片机可以进行加法、减法、乘法和除法等基本的算术运算。
通过使用相关的指令,可以将数值存储在寄存器中,并进行各种算术运算。
例如,可以使用ADD指令将两个数相加,并将结果保存在某个寄存器中。
类似地,可以使用SUB指令进行减法运算,MUL指令进行乘法运算,DIV指令进行除法运算。
二、逻辑运算51单片机可以进行与、或、非和异或等逻辑运算。
逻辑运算常用于判断条件、控制程序流程和实现逻辑控制等。
通过使用相关的指令,可以将两个数进行逻辑运算,并根据结果进行相应的处理。
例如,可以使用AND指令进行与运算,OR指令进行或运算,NOT指令进行非运算,XOR指令进行异或运算。
三、位运算51单片机可以进行位移、与、或、非和异或等位运算。
位运算常用于处理二进制数据和位控制等。
通过使用相关的指令,可以对数据进行位运算,并根据需要进行相应的处理。
例如,可以使用MOV指令将数据移动到某个寄存器中,使用AND指令进行与运算,使用OR指令进行或运算,使用NOT指令进行非运算,使用XOR指令进行异或运算。
四、数值转换51单片机可以进行十进制和二进制、十六进制之间的转换。
通过使用相关的指令和算法,可以将不同进制的数值进行转换,并进行相应的处理。
例如,可以使用MOV指令将十进制数值转换为二进制或十六进制数值,使用CLR指令清除数据,使用INC指令增加数据,使用DEC指令减少数据。
五、数学函数除了基本的算术运算和逻辑运算,51单片机还可以进行一些常用的数学函数计算。
通过使用相关的库函数和算法,可以进行数值的平方、开方、对数、三角函数等计算。
例如,可以使用库函数sqrt计算一个数的平方根,使用库函数log计算一个数的自然对数,使用库函数sin计算一个角度的正弦值。
单片机的C51语言

C51变量定义的四个要素:
【存储种类】 数据类型 【存储类型】 变量名
存储地址(标准C) 存储空间 (C51特有) 数据格式 (C51扩充) 作用范围(标准C)
* 方括号项——可以缺省
存储种类
【存储种类】 数据类型 【存储类型】 变量名
① 自动变量(auto)——在函数内部定义的变量,退出函 数后,分配给该变量的存储单元即自行消失(局部变量)。
因为Cx51使用默认的寄存器组来传递参数,1 个工作寄存器组就是8个单元字节。你至少失去了8 个字节。另外要定义足够大的堆栈空间。当你的内 部堆栈溢出的时候,你的程序会莫名其妙地复位, 实际原因是8051系列微处理器没有硬件报错机制, 堆栈溢出只能以这种方式表示出来。
(2)bdata区
可以在data区的位寻址区定义变量,这个变量 的每个位就可进行位寻址。
序号 特殊功能寄存器名称
符号 字节地址
位地址
3)sbit bit_name = sfr字节地址 ^ 位位置; 将SFR字节地址的相对位地址定义为位变量名。 例如: sbit CY = 0xD0^7;
序号 特殊功能寄存器名称
符号 字节地址
位地址
C51编译器在头文件“reg51.h”中定义了全部sfr/sfr16和sbit变量。
这对状态寄存器来说是十分有用的,因为它需 要单独地使用变量的每一位。
不一定要用位变量名来引用位变量,下面是一 些在bdata段中声明变量和使用位变量的例子:
unsigned char bdata status_byte; unsigned int bdata status_word; unsigned long bdata status_dword; sbit stat_flag=status_byte^4;
第3章 Cx51数据与运算

(2)使用无符号类型 为什么要使用无符号类型呢? 原因是8051不支持符号运算,程序中也不要使 用含有带符号变量的外部代码。除了根据变量长度 来选择变量类型之外,你还要考虑变量是否会用于 负数的场合,如果你的程序中可以不需要负数,那 么把变量都定义成无符号类型的变量: unsigned int data n1,n2;
3、用户 (RAM)区 内部低128字节的地址 30~7FH作为用户存取临时数据 区。 许多单片机的高128字节除 了直接寻址的SFR外还有128字 节间接寻址区RAM,它们也作为 用户区。 通常堆栈区就设在这里,堆 栈指针SP可以设置这个区域。
4、存储类型
Keil允许使用者指定程序变量的存储区,这使使用 者可以控制存储区的使用。编译器可识别以下存储区:
#include <reg51.h>
//系统头文件
/*------------------------------------------------------------------------REG51.H
Header file for generic 80C51 and 80C31 microcontroller. Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc. All rights reserved. -------------------------------------------------------------------------*/
4、浮点变量
浮点变量(float)的类型是4字节共32位,其 +1
+2
+3
SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
第3章 Cx51数据与运算

3.4 8051特殊功能寄存器(SFR)及其Cx51定义
• 特殊功能寄存器变量 C51中,允许用户对这些特殊功能寄存器进行访问,访 问时须通过sfr或sfr16类型说明符进行定义,定义时须指 明它们所对应的片内RAM单元的地址。格式如下: sfr或sfr16 特殊功能寄存器名 地址; 或 特殊功能寄存器名=地址 地址; sfr用于对MCS-51单片机中单字节的特殊功能寄存器 进行定义,sfr16用于对双字节特殊功能寄存器进行定义。 【例3-2】特殊功能寄存器的定义。 】 sfr PSW=0xd0; sfr SCON=0x98; sfr TMOD=0x89; sfr P1=0x90; sfr16 DPTR=0x82; sfr16 T0=0x8A;
Cx51数据的存储类型与8051存储器结构 数据的存储类型与8051 3.3 Cx51数据的存储类型与8051存储器结构
存储器结构(见教材第59~60 59~60页 3.3.1 存储器结构(见教材第59~60页) 3.3.2 存储器类型
是用于指明变量所处的单片机的存储器区域情况。存储器类型与存储 种类完全不同。C51编译器能识别的存储器类型有以下几种,见表所示。
存储器类型 data bdata idata pdata xdata code 描 述 直接寻址的片内RAM低128B,访问速度快 片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问 间接寻址访问的片内RAM,允许访问全部片内RAM 用Ri间接访问的片外RAM的低256B 用DPTR间接访问的片外RAM,允许访问全部64k片外RAM 程序存储器ROM64k空间
三.long长整型 长整型
分singed long和unsigned long。默认为signed long。它们的长度均为四 个字节,用于存放一个四字节数据。对于signed long,用于存放四字节带符号 数,补码表示,数的范畴为:-2147483648~+2147483647。对于unsigned long, 用于存放四字节无符号数,数的范围为0~4294967295。
C51介绍

六、 逗号运算符
0.3 C51流程控制语句
0.3.1 C51选择语句 一、条件语句 条件语句由关键字if构成。有3种条件语句: 1、if(条件表达式)语句 若条件表达式的结果为真(非0值),则执行后面的 语句;反之若条件表达式的结果为假(0值),则不 执行后面的语句。 例如: if(p1!= 0){ c=20;}
本章共六节,主要介绍:
0.1 单片机的C语言 0.2 C51的数据类型与运算 0.3 C51流程控制语句 0.4 C51的指针类型 0.5 C51的函数 0.6 C51编程实例
0.1 单片机的C语言
0.1.1 C51程序开发概述 一、采用C51的优点
编译器能自动完成变量的存储单元的分配,编程者可 以专注于应用软件的设计,可以对常用的接口芯片编制通 用的驱动函数,对常用的功能模块和算法编制相应的函数, 可以方便地进行信号处理算法和程序的移植,从而加快单 片机应用系统的开发速度。 当代码长度超过4KB以上时,C51比汇编语言更具有 明显的优势。
访问SFR
说明:
• Float:浮点型
Float (1)s 2E 127 (1.M )
•Sfr: 可以定义8051单片机的所有内部8位特殊功能 寄存器 •Sfr16: 可以定义8051单片机内部16位特殊功能寄 存器 •bit: 可以定义位量
•sbit: 可以定义8051内部RAM中的可寻址位或特殊 功能寄存器中的可寻址位.
2、sbit 位变量名 = 字节地址^位的位置(0~7),如: sbit OV=0xD0^2; /* 定义OV位地址为0xD2 */ sbit CY=0xD0^7; /* 定义CY位地址为0xD7 */ 注:字节地址作为基地址,必须位于0x80~0xFF之 间。 3、sbit 位变量名 = 位地址,如: sbit OV=0xD2; /* 定义OV位地址为0xD2 */ sbit CY=0xD7; /* 定义CY位地址为0xD7 */ 注:位地址必须位于0x80~0xFF之间。
Cx51函数

例:将数组a中n个整数按逆序存放 将数组 中 个整数按逆序存放
2、用户自定义函数 、用户自定义函数 用户自定义函数是用户根据任务编写的函数。 用户自定义函数是用户根据任务编写的函数。 是用户根据任务编写的函数 从函数定义的形式上分为:无参函数、有参函数和空函数。 从函数定义的形式上分为:无参函数、有参函数和空函数。 无参函数——在调用此种函数时,既无参数输入,也不 在调用此种函数时,既无参数输入, 无参函数 在调用此种函数时 返回结果给调用函数。 返回结果给调用函数。 有参函数——在调用此种函数时,用实际参数代替形式 在调用此种函数时 有参函数 参数,调用完返回结果给调用函数。 参数,调用完返回结果给调用函数。 空函数——此种函数内没有语句,是空白。 此种函数内没有语句,是空白。 空函数 此种函数内没有语句
6.4.4 函数的嵌套调用
嵌套调用——指一个函数调用 函数,A函数的函数体中 指一个函数调用A函数 嵌套调用 指一个函数调用 函数, 函数的函数体中 又调用B函数 函数。 又调用 函数。
6.4.5 函数的递归调用
1、递归调用的定义 、
函数的递归调用是指一个函数直接或间接地调用自己。 函数的递归调用是指一个函数直接或间接地调用自己。 中又有调用f1 的语句, 例:在函数f1( )中又有调用 )的语句,这称为直接递归调用。 在函数 中又有调用 的语句 这称为直接递归调用。
2、函数指针变量的定义 、 定义格式为: 定义格式为: 函数值类型 指针变量)( ( *指针变量)( ); 指针变量
如 float (*pf) ( ); 则标识符pf是一个指针变量 它可以指向函数值为float类 是一个指针变量, 则标识符 是一个指针变量,它可以指向函数值为 类 型的任何一个函数, 的值可以是函数值为float类型的 型的任何一个函数,即pf的值可以是函数值为 的值可以是函数值为 类型的 任何一个函数在内存的入口地址。 任何一个函数在内存的入口地址。 下面有三个函数: 下面有三个函数: float f1( float x, float y) { . . . } float f2( float x) { . . . } long f3( int x, int y) { . . . } 都是正确的赋值语句, 那么 pf=f1; pf=f2; 都是正确的赋值语句, 则是不正确的。 但 pf=f3; 则是不正确的。
第4章 单片机Cx51编程基础

DATE: 2021/3/15
PAGE: 21
三、Cx51变量和运算符-存储类型
➢ idata将变量存储在片内间接寻址的数据存储区IDATA区 中。IDATA区使用指针来进行寻址和访问。
51内核单片机RAM仅有128个字节,因此无间接寻址 数据存储器区,idata与data无区别。52内核单片机RAM 有256个字节,当片内128字节的直接寻址数据存储区不 够用时,可以使用128字节间接寻址数据存储区,访问速 度较data慢一些。
DATE: 2021/3/15
PAGE: 7
二、数制与编码
十进制数转换为非十进制数
对于整数部分采用“除基取余,先低后高”的方法, 对小数部分采用“乘基取整,先高后低”的方法,可 将十进制数转换为非十进制数。
例4:将50.75转换为二进制数
因此可得:50.75=110010.11B
DATE: 2021/3/15
(2)sfr用于定义特殊功能寄存器变量。该变量存储 在片内的特殊功能寄存器存储区中,用来对特殊功能 寄存器进行读写操作。
例如:51头文件中有定义sfr P0=0x90,这一语句 定义了P0端口在片内的寄存器,在程序中可以使用P0 对该端口寄存器进行操作。
DATE: 2021/3/15
PAGE: 16
PAGE: 8
二、数制与编码
例5 将十进制数500.03125转换为十六进制数 解:
因此可得: 500.03125=1F4.08H
DATE: 2021/3/15
PAGE: 9
二、数制与编码
十六进制数与二进制数之间的转换
➢整数部分由小数点向左每4位一组,若整数最高位的 一组不足4位,则在其左边加0补足4位;
DATE: 2021/3/15
Cx51程序设计的堆栈空间计算方法

Cx51程序设计的堆栈空间计算方法技术分类:嵌入式系统 | 2010-12-1421ic引言用C语言进行MCS51系列单片机程序设计是单片机开发和应用的必然趋势。
Keil公司的C51编译器支持经典8051和8051派生产品的版本,通称为Cx51。
应该说,Cx51是C语言在MCS51单片机上的扩展,既有C语言的共性,又有它自己的特点。
本文介绍的是Cx51程序设计时堆栈的计算方法。
1堆栈的溢出问题MCS51系列单片机将堆栈设置在片内RAM中,由于片内RAM资源有限,堆栈区的范围也是有限的。
堆栈区留得太大,会减少其他数据的存放空间,留得太少则很容易溢出。
所谓堆栈溢出,是指在堆栈区已经满了的时候还要进行新的压栈操作,这时只好将压栈的内容存放到非堆栈区的特殊功能寄存器(SFR)中或者堆栈外的数据区中。
特殊功能寄存器的内容影响系统的状态,数据区的内容又很容易被程序修改,这样一来,之后进行出栈操作(如子程序返回)时内容已变样,程序也就乱套了。
因此,堆栈区必须留够,宁可大一些。
要在Cx51程序设计中防止堆栈的溢出,要解决两个问题:第一,精确计算系统分配给用户的堆栈大小,假设是M;第二,精确计算用户需要堆栈的大小,假设是N。
要求M≥N,下面分别分析这两个问题。
2计算系统分配给用户的堆栈大小Cx51程序设计中,因为动态局部变量是长驻内存中的,实际上相当于局部静态变量,即使在函数调用结束时也不释放空间(这一点不同于标准C语言)。
Cx51编译器按照用户的设置,将所有的变量存放在片内和片外的RAM中。
片内变量分配好空间后,将剩下的空间全部作为堆栈空间,这个空间是最大可能的堆栈空间。
当然,因为Cx51是一种可以访问寄存器的C语言(特殊功能寄存器),因此可在程序中访问SP,将堆栈空间设置得小一点。
不过,一般没有人这么做。
本文只是讨论放在片内RAM的变量。
我们把变量分为两种情况:①用作函数的参数和函数返回值的局部变量。
这种变量尽量在寄存器组中存放。
第5章_Cx51构造数据类型

(2)只能给元素逐个赋值,不能给数组整体赋值。 )只能给元素逐个赋值,不能给数组整体赋值。 例如:给十个元素全部赋 值 只能写为: 例如:给十个元素全部赋1值,只能写为: int a[10]={1,1,1,1,1,1,1,1,1,1}; 而不能写为: 而不能写为: int a[10]=1; (3)不给可初始化的数组赋初值,则全部元素均为 值。 )不给可初始化的数组赋初值,则全部元素均为0值 (4)如给全部元素赋值,则在数组说明中, 可以不给出数组 )如给全部元素赋值,则在数组说明中, 元素的个数。 元素的个数。 例如: 可写为: 例如: int a[5]={1,2,3,4,5}; 可写为: int a[]={1,2,3,4,5};
常量表达式——数据元素的个数,也称为数组的长度。 数据元素的个数,也称为数组的长度。 常量表达式 数据元素的个数
例如: 例如:
int data a[10]; 说明整型数组 ,有10个元素。 说明整型数组a, 个元素。 个元素 float xdata b[10], c[20]; 说明实型数组 ,有10个元素,实型 说明实型数组b, 个元素, 个元素 数组c, 个元素。 数组 ,有20个元素。 个元素 char data ch[20]; 说明字符数组 ,有20个元素。 说明字符数组ch, 个元素。 个元素 对于数组类型说明应注意以下几点: 对于数组类型说明应注意以下几点:
2、字符数组的初始化 、
char c[10]={`c`,` `,`p`,`r`,o`,g`,r`,`a`,`m`};
C语言允许用字符串的方式对数组作初始化赋值。 语言允许用字符串的方式对数组作初始化赋值。 例如: 例如: char c[ ]={'c', ' ','p','r','o','g','r','a','m'}; 可写为: 可写为: char c[ ]={"C program"}; 或去掉{ }写为: 或去掉 写为: 写为 char c[ ]="C program"; 字符串总是以'\0'作为串的结束符 作为串的结束符。 字符串总是以 作为串的结束符。因此当把一个字符 串存入一个数组时, 也把结束符'\0'存入数组 存入数组, 串存入一个数组时, 也把结束符 存入数组,并以此作 为该字符串是否结束的标志。 为该字符串是否结束的标志。 用字符串方式赋值比用字符逐个赋值要多占一个字节, 用字符串方式赋值比用字符逐个赋值要多占一个字节, 用于存放字符串结束标志'\0'。 用于存放字符串结束标志 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[存储种类] 数据类型 [存储器类型]
变量名表
存储种类:自动(auto)、外部(extern)、静 态(static)和寄存器(register)
数据类型
位变量(bit): 变量的类型是位,其值可以是1(true) 或 0(false)。 字符变量(char):长度为8位,占用1字节。 整型变量(int):长度为16位,占用2字节。 长整型变量(long int):长度为32位,占用4字节。 浮点型变量(float):长度为32位,占用4字节。
是C51编译器的一种扩充数据类型,利用它可 以访问芯片内部的RAM中的可寻址位或特殊功 能寄存器中的可寻址位。
sfr P1=0x90; /*P1口地址为90H*/ sbit P1_1=P1^1; /*P1_1为P1中的P1.1引脚*/ 或 sbit P1_1=0x91;
3.2 常量与变量
常量:在程序运行过程中,其值不能改变的量。
code:存放指令代码和其他非易失信息。用“MOVC @A+DPTR” 指令访问。
访问片内数据存储器(data,bdata,idata)比访问片外 数据存储器(xdata,pdata)相对要快一些。
经常使用的变量置于片内数据存储器, 规模较大的、不常使用的数据置于片外数据存储器。
Cx51存储类型及其大小和值域
在固定的存储器地址上进行变量的传递,是Cx51的 标准特征之一。 在SMALL模式下,参数传递是在片内数据存储区中 完成的。 LARGE和COMPACT模式允许参数在外部存储器中 传递。 Cx51同时支持混合模式。如在LARGE模式下,生成 的程序可将一些函数放入SMALL模式中,从而加快 执行速度。
signed int 类型表示的数值范围-32768~+ 32767。字节中最高位表示数据的符号,“0” 表示正数,“1”表示负数。
3 long长整型
长度为四个字节,用于存放一个四字节数据。 分为unsigned long 和signed long 两种。默 认值为signed long类型 。
程序存储器(ROM)
FFFFH
片外ROM
1000H
0FFFH
片内ROM
0FFFH
片外ROM
0000H
EA=1
0000H
EA=0
• 用于存放程序和表格常数。
• 最大空间64KB:0000H~FFFFH。片内、片外程 序存储器地址空间有地址重叠区。 • 对于8051,有4KB地址重叠区,0000H~0FFFH 。
式指令限制。 若声明char var1,则 在使用SMALL存储模式下,var1被定位在DATA存储区中;
在使用COMPACT存储模式下,var1被定位在IDATA存储区中;
在使用LARGE存储模式下,var1被定位在XDATA存储区中。
存储模式决定了变量的默认存储类型、参数传递区 和无明确存储类型说明变量的存储类型。
C51的标识符与关键字
标识符是用来标识源程序中某个对象的名字, 这些对象可以是语句、数据类型、函数、变量、 数组等等。
C语言是大小写敏感的一种高级语言。 标识符由字符串、数字和下划线等组成,第一 个字符必须是字母或下划线。 在C51编辑器中,只支持标识符的前32位为有效 标识。
关键字是编程语言保留的特殊标识符,具有固 定名称和含义,在程序编写中不允许标识符与 关键字相同。 Keil uVision2 中的关键字除了有ANSI C标准 的32个关键字以外,还根据51单片机的特点扩 展了相关的关键字。
数据存储器(RAM)
FFH
80H
SFR RAM 位寻址区
FFFFH
30H
20H 00H
片外 RAM
工作寄存器 0~3组
片内数据存储器
数据在计算机内存中的存放情况由数据结构 决定。C语言的数据结构由数据类型决定。
标准C语言中基本的数据类型为 char,int,short,long,float和double。 C51编译器中int和short相同,
float和double相同。
Cx51的数据类型
位型 bit 字符型 char 基本类型 整型 int 长整型 long 单精度float 浮点型 双精度double 数据类型 构造类型 数组类型 array 结构体类型 struct 共用体 union
COMPACT
LARGE
3.3 8051存储器结构
ROM (Read Only Memory) 程序存储器
RAM (Random Access Memory) 数据存储器 ROM和RAM分开,并有各自的寻址机构和寻址方式。 8051--哈佛型 8051系列单片机在物理上有四个存储空间: 片内程序存储器空间;片外程序存储器空间; 片内数据存储器空间;片外数据存储器空间。
第三章 Cx51数据与运算
本章内容
1、数据与数据类型 2、常量与变量 3、Cx51数据的存储类型与8051存储器结 构 4、8051特殊功能寄存器及其Cx51定义 5、8051并行接口及其Cx51定义 6、位变量及其Cx51定义 7、Cx51运算符、表达式及其规则
C51程序的基本结构
#include <reg51.h>
}
C51源程序的编程要点如下:
1 C语言是由函数构成的。一个C51源程序至少 包含一个main()函数,也可以包含一个main() 函数和若干其他函数。 2 被调用的函数可以是编译器提供的库函数, 也可以是用户根据需要自己编制设计的函数。 3 一个C51源程序总是从main()函数开始执行的, 不论main()函数在整个程序中的位置如何。
ANSI C 标准的关键字
auto break case do char double const else
continue default
enum
if short switch
extern
int signed typedef
float
long sizeof union
for
register static unsigned
将把该变量定位在8051片内数据存储区中。
float idata x,y,z;
浮点变量x,y,z被定义为idata存储类型,Cx51编译器将 把该变量定位在8051片内数据存储区中,并只能用间接 寻址的方法进行访问。
如果在变量定义时略去存储类型标志符,则编译器会自动 选择默认的存储类型。
默认的存储类型进一步由SMALL、COMPACT和LARGE存储模
7 sfr16 16位特殊功能寄存器
占用两个内存单元,值域为0~65535。 与sfr的区别在于:sfr16用于操作占两个字节 的寄存器。
sfr16也可以像sfr一样用一个字的方式访问。
sfr16 T2=0xCC; /*定时器2: T2低8位地址=0CCH T2高8位地址=0CDH */
8 sbit可寻址位
存储模式及说明
存储模式
SMALL
说明
所有缺省变量参数均装入片内RAM。(最大128字节,默认 存储类型是DATA)。访问速度快,但空间有限。只适用于 小程序。 所有缺省变量均位于外部RAM区的一页(最大256字节,默 认存储类型是PDATA),是一种中间状态。通过寄存器R0和 R1间接寻址,栈空间位于8051系统内部数据存储区中。 所有缺省变量可放在多达64KB的外部RAM区(默认存储类型 为XDATA),均使用数据指针DPTR来寻址。空间大,可存储 变量多,但速度慢,尤其对于2个以上的多字节变量。
[±]数字[.数字]e[±]数字
[]中的内容为可选项,内容可有可无,但其余部分必 须有。如125e3、-3.0e-3
字符型常量
单引号内的字符,如‘a’ 转义字符,如\n 表示换行符
字符串型常量
双引号内的字符,如“ok”
位标量
值是一个二进制,只能取0或1两种值。
变量:在程序运行过程中,其值可以改变的量。
存储类型 长度/bit 长度/Byte 值域
data
idata pdata code xdata
8
8 8 16 16
1
1 1 2 2
0~255
0~255 0~255 0~65535 0~65535
8bit
8bit 8bit 16bit 16bit
char data var1;
字符变量char var1被定义为data存储类型,Cx51编译器
goto
return struct void
volatile
while
共32个
C51编译器的扩展关键字
3.1 数据与数据类型
数据:具有一定格式的数字或数值,是计算 机操作的对象。 数据类型:数据的不同格式。分为基本数据 类型和复杂数据类型。 数据结构:数据按一定的数据类型进行的排 列、组合及架构。
void Test(void)
/*C编译器内部自带的H文件*/
/*C函数声明*/ /*调用函数Test()*/ k; /*C变量声明*/
void main(void) { Test(); unsigned char while(1){ k++; } }
void {
Test(void) unsigned char j++; j;
signed char 类型用字节中最高位字节表示数 据的符号。范围-128~+127。“0”表示正 数,“1”表示负数,负数用补码表示。 注意:正数的补码与原码相同,负二进制数的 补码等于它的绝对值按位取反后加1。
2 int整型
长度为两个字节,用于存放一个双字节数据。 分为unsigned int 和signed int 两种。默认 值为signed int 类型。 unsigned int类型表示的数值范围0~65535。