第3章 C51程序设计基础

合集下载

教学课件PPT 89C51单片机的C51程序设计

教学课件PPT 89C51单片机的C51程序设计

程序存储器(64K字节)
对应MOVC @DPTR访问
可位寻址片内数据存储器(16字节,128位) 允许位和字节混合访问
间接寻址片内数据存储器(256字节)
可访问片内全部RAM空间
分页寻址片外数据存储器(256字节)
对应MOVX @R0访问
4.2 C51程序设计基础
C51存储类型定义举例:
unsigned char data x,y,z; /*在内部RAM区定义了3个无符号字节型变量x,y,z*/
40M/80M/100M,而且还有很多是单周期的。
4.2 C51程序设计基础
4.2.1 C51变量/常量存储类型
C51存储类型 对应89C51单片机存储器空间
data
直接寻址片内数据存储器(128字节)
xdata
片外数据存储器(64K字节)
说明 访问速度快 对应MOVX @DPTR访问
code bdata idata pdata
序号 语句
1
=
2
if
3
表达式1 ? 表达式2 : 表达式3
4
switch/case
5
while
6
do-while
7
for
8
函数
含义 赋值语句 条件语句 条件运算符 多分支语句 循环语句 循环语句 循环语句 模块化程序设计
4.2 C51程序设计基础
表4-6 常用语句
序号 语句
1
=
2
if
3
表达式1 ? 表达式2 : 表达式3
4.3 C51程序举例
例4:把外部数据RAM中从地址2000H单元开始的100个有符号 数逐一取出,若为正数则放回原单元,若为负数则求补后放回。

第3章_C51语言编程基础

第3章_C51语言编程基础
例如:
sfr
PSW = 0xd0;
//定义PSW寄存器地址为0xd0
sbit
FO = PSW ^ 5 ; //定义F0位为PSW.5
F0 = 0;
精选2021版课件
12
习题:片内I/O口P1口的P1.0寻址位置成高电平 sfr P1 = 0x90; sbit P1_0 = P1^0; P1_0 = 1;
X = X + 1;
单片机如何执行程序指令?
程序员
X = X + 1; …… ……
高级语言程序
编译器 链接器
10010010 10110010 ……
机器码
精选2021版课件
3
2、Keil C51语言简介
对于51单片机,目前广泛使用的是Keil C51语言,简称C51语言。
Keil C51语言是在标准C的基础上,针对51单片机的硬件特点进行 扩展,并向51单片机上移植的高效、简洁的实用高级语言。
PWORD
以字形式对精选p2d02a1t版a课区件 寻址。
25
【例】片内RAM、片外RAM定义的程序如下:
#include<absacc.h>
#define PORTE XBYTE[0xFFC0] #define NRAM DBYTE[0x40]
/*将PORTE定义为外部I/O, 地址为0xFFC0*/
精选2021版课件
29
【例】使用关键字_at_实现绝对地址的访问。
data unsigned char y1 _at_ 0x50; /*在data 区定义字节变量 y1,地址为50H*/
xdata unsigned int y2 _at_ 0x4000; /*在xdata区定义字变量 y2,地址为4000H*/

单片机c51介绍

单片机c51介绍

3.2 单片机的C51程序设计3.2.1 C51基础知识C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。

用C语言开发系统可以大大缩短开发周期,明显增强程序的可读性,便于改进、扩充和移植。

而针对8051的C语言日趋成熟,成为了专业化的实用高级语言。

一、C51的特点C语言作为一种非常方便的语言而得到广泛的支持,很多硬件开发都用C语言编程,如:各种单片机、DSP、ARM等。

C语言程序本身不依赖于机器硬件系统,基本上不作修改或仅做简单修改就可将程序从不同的单片机中移植过来直接使用。

C语言提供了很多数学函数并支持浮点运算,开发效率高,故可缩短开发时间,增加程序可读性和可维护性。

二. 单片机的C51与汇编ASM—51相比,有如下优点:(1)对单片机的指令系统不要求了解,仅要求对8051的存储器结构有初步了解;(2)寄存器分配、不同存储器的寻址及数据类型等细节可由编译器管理;(3)程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;(4)提供的库包含许多标准子程序,具有较强的数据处理能力;(5)由于具有方便的模块化编程技术,使已编好程序容易移植;3.2.2 C51的基本数据类型当给单片机编程时,单片机也要运算,而在单片机的运算中,这个“变量”数据的大小是有限制的,不能随意给一个变量赋任意的值,因为变量在单片机的内存中是要占据空间的,变量大小不同,所占据的空间就不同。

所以在设定一个变量之前,必须要给编译器声明这个变量的类型,以便让编译3.2.3 C51的基本运算C语言的运算符分以下几种:1、算术运算符顾名思义,算术运算符就是执行算术运算的操作符号。

除了一般人所熟悉的程序范例:main(){int A,B,C,D,E,x,y;x=8;y=3;A=x+y;B=x-y;C=x*y;D=x/y;E=x%y;}程序结果A=11、B=5、C=24、D=2、E=22、关系运算符程序范例:main(){Int A,B,C,D,E,F,x,y;x=9;y=4;A=(x==y);B=(x!=y);C=(x>y);D=(x<y);E=(x>=y);F=(x<=y);}程序结果:A=0、B=1、C=1、D=0、E=1、F=0 3、逻辑运算符程序范例:main(){int A,B,C,x,y,z;x=9;y=8;z=10;A=(x>y)&&(y<z);B=(x==y)||(y<=z);C=!(x>z);}程序结果:A=0、B=1、C=14、位运算符位运算符与逻辑运算符非常相似,它们之间的差异在于位运算符针对变量中的每一位,逻辑运算符则程序范例:main(){char A,B,C,D,E,F,x,y;x=0x25;/*即0010 0101*/y=0x62; /*即0110 0010*/A=x&y;B=x|y;C=x^y;D=x~E=x<<3;F=x>>2}程序结果:0010 0101x: 0010 0101 x: 0010 0101 x: 0010 0101 x:~y: &0110 0010 y: |0110 0010 y: ^0110 0010 1101 1010 0010 0000 0110 0111 0100 0111即A=0x20 即B=0x67 即C=0x47 即D=0xda将x的值左移三位的结果为:0 0 1 0 0 1 0 10 0 1 0 0 1 0 1 0 0 0移出的三位“001”丢失,后面三位用0填充,因此运算后的结果是00101000B,即E=0x28。

单片机原理与接口技术-C51编程(张毅刚第二版)-习题答案

单片机原理与接口技术-C51编程(张毅刚第二版)-习题答案

单片机原理及接口技术(C51 编程)( 第2 版)- 习题答案汇总23单片机答案第1章单片机概述思考题及习题 1 参考答案一、填空1. 除了单片机这一名称之外,单片机还可称为()或()。

答:微控制器,嵌入式控制器.2. 单片机与普通微型计算机的不同之处在于其将()、()和()三部分,通过内部()连接在一起,集成于一块芯片上。

答:CPU、存储器、I/O 口、总线3. AT89S51 单片机工作频率上限为()MHz。

答:24MHz。

4. 专用单片机已使系统结构最简化、软硬件资源利用最优化,从而大大降低()和提高()。

答:成本,可靠性。

二、单选1. 单片机内部数据之所以用二进制形式表示,主要是A.为了编程方便 B. 受器件的物理性能限制C.为了通用性 D. 为了提高运算数度答:B2. 在家用电器中使用单片机应属于微计算机的。

A.辅助设计应用 B. 测量、控制应用C.数值计算应用 D. 数据处理应用答:B3. 下面的哪一项应用,不属于单片机的应用范围。

A.工业控制B.家用电器的控制C.数据库管理D.汽车电子设备答:C三、判断对错1. STC 系列单片机是8051内核的单片机。

对2. AT89S52 与AT89S51相比,片内多出了4KB的Flash 程序存储器、128B的RAM、1 个中断源、1 个定时器(且具有捕捉功能)。

对3. 单片机是一种CPU。

错4. AT89S52 单片机是微处理器。

错5. AT89S51片内的Flash 程序存储器可在线写入(ISP),而AT89C52则不能。

对6. 为AT89C51单片机设计的应用系统板,可将芯片AT89C51直接用芯片AT89S51替换。

对7. 为AT89S51单片机设计的应用系统板,可将芯片AT89S51直接用芯片AT89S52替换。

对8. 单片机的功能侧重于测量和控制,而复杂的数字信号处理运算及高速的测控功能则是DSP的长处。

对第2 章AT89S51 单片机片内硬件结构思考题及习题 2 参考答案一、填空5. 在AT89S51单片机中,如果采用6MHz晶振,一个机器周期为()。

单片机C51语言及程序设计

单片机C51语言及程序设计
1)将SFR的绝对位地址定义为位变量名



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
程序语句

第6789次课第3章C51语言编程基础

第6789次课第3章C51语言编程基础
data
※ 重 点 、 记 住
bdata
code xdata
pdata
格式: 数据类型 【存储类型】 变量名; (1)DATA区。
DATA区指片内RAM的低128字节的空间,可直接寻址; 寻址是最快的,应该把经常使用的变量放在DATA区。
例如: unsigned char data system_status=0; unsigned int data unit_id[8];
习题1: 往串行发送数据缓冲寄存器SBUF写入80
sfr
SBUF = 0x99;
SBUF = 80;
※ 难点、掌握
习题2: 从P0口寄存器读取数据,存放到任意一个变量X。
sfr P0 = 0x80;
char
x;
x = P0;
(3)特殊功能寄存器sfr16
“sfr16”数据类型占两个内存单元;
用于操作占两个字节的特殊功能寄存器。
#define PORTE XBYTE[0xFFC0] #define NRAM DBYTE[0x40]
/*将PORTE定义为外部I/O, 地址为0xFFC0*/ /*将NRAM定义为片内RAM, 地址为0x40*/
main( )
{ ※ 难点
PORTE=0x3D;
NRAM=0x01;
}
/*数据3DH写入地址0xFFC0的外部I/O PORTE */
/*将数据01H写入片内RAM的40H单元*/
习题6 使用绝对宏将片内RAM 20H的字节地址单元全部置1。
#include<absacc.h>
#define M DBYTE[0x0020]
main( ) {
M=0xff;

单片机基础与应用(C语言版)第3章 C51程序设计基础

单片机基础与应用(C语言版)第3章 C51程序设计基础

选择语句
多分支选择的switch语句, 其一般形式如下: switch(表达式)
{ case常量表达式1: 语句组1;break; case常量表达式2: 语句组2;break; …… case常量表达式n: 语句组n;break; default : 语句组n+1;
} 该语句的执行过程是:首先计算表达式的值,并逐个与case后的常量表达 式的值相比较,当表达式的值与某个常量表达式的值相等时,则执行对应 该常量表达式后的语句组,再执行break语句,跳出switch语句的执行,继 续执行下一条语句。如果表达式的值与所有case后的常量表达式均不相同, 则执行default后的语句组。
位运算
按位或操作符: |
或操作
格式:x|y
规则:对应位均为0时才为0,否则为1 例如, i=i|0x0f; 等同于
i|=0x0f;
主要用途:将1个数的某(些)位置1,其余各位不变
位运算
异或操作
按位异或操作符:^ 格式:x^y 规则:对应位相同时为0,不同时为1
例如, i=i^0x0f; 等同于 i^=0x0f; 主要用途:使1个数的某(些)位翻转(即原来为1的位 变为0,为0的变为1),其余各位不变。
右移运算符“>>”的功能,是把“>>”左边的操作数 的各二进制位全部右移若干位,移动的位数由“>>” 右边的常数指定。进行右移运算时,如果是无符号数, 则总是在其左端补“0”
练习
1 .若x = 10, 则!X的值为真或假? 2. 若a = 3, b = 2, 则if(a&b)的值为真或假? 3. 5 && 0 ||8的值为?
浮点型 指针型 位类型 特殊功能寄存器 16位特殊功能寄存器 可寻址位

C51程序设计------数组

C51程序设计------数组

while(con_key=='\x20') { printf("输入第%2d个学生的成绩\n", i++); printf("平时 实习 测验 期末成绩\n"); score[4]=0; /* score[4]:存储总评成绩*/\ for(j=0; j<4; j++) {scanf("%f",&score[j]); score[4] += score[j] * ratio[j]; } printf("总评成绩为:%6.1f\n", score[4]); getchar(); } }
for(j=0;j<NUM_course;j++) score[NUM_std][j] /= NUM_std; /*求第j门课的平均成绩*/ /*输出表头*/ printf("学生编号 课程1 课程2 课程3 课程4 个人平均\n"); /*输出每个学生的各科成绩和平均成绩*/ for(i=0;i<NUM_std;i++) { printf("学生%d\t",i+1); for(j=0;j<NUM_course+1;j++) printf("%6.1f\t",score[i][j]); printf("\n"); } /*输出1条短划线*/ for(j=0;j<8*(NUM_course+2);j++) printf("-"); printf("\n课程平均"); /*输出每门课程的平均成绩*/ for(j=0;j<NUM_course;j++) printf("%6.1f\t",score[NUM_std][j]); printf("\n"); }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

可以一行书写多条语句。
认识C语言
结构化语言 丰富的数据类型 便于维护管理 与汇编语言相比,C语言的优点如下: 不要求编程者详细了解单片机的指令系统,但需了 解单片机的存储器结构; 寄存器分配、不同存储器的寻址及数据类型等细节 可由编译器管理; 结构清晰,程序可读性强; 编译器提供了很多标准库函数,具有较强的数据处 理能力。
逻辑运算符及其优先级
逻辑运算符 ! (逻辑非) 优先级
&& (逻辑与) || (逻辑或)
注意:逻辑运算符与位操作运算符的区别。
逻辑表达式
用逻辑运算符将一个或多个表达式连接起来, 进行逻辑运算的式子。 逻辑量的真判断——非0 逻辑量的假判断——0

若a=1,b=2,c=3,x=4,y=3,写出下各个表达式的值: (1)a+b>c&&b==c (2)!a<b&&b!=c||x+y<=3 (3)!(x=a)&&(y=b)&&0
0
0
运算类型
括号运算符 逻辑非和按位取反 算术运算 *
运算符
() ! / + >> > >= ~ %
优先级
1 2 3 4 5 6
结合性
从左至右 从右至左 从左至右 从左至右 从左至右 从左至右
左移、右移运算 关系运算 <
<< <=
==
位运算 & ^
!=
7
8 9 10 11
从左至右
从左至右 从左至右 从左至右 从左至右
表达式语句和复合语句
表达式语句是最基本的C语言语句。表达式语句由表 达式加上分号“;”组成,其一般形式如下: 表达式; 执行表达式语句就是计算表达式的值。 在 C 语言中有一个特殊的表达式语句,称为空语句。 空语句中只有一个分号“;”,程序执行空语句时需要 占用一条指令的执行时间,但是什么也不做。在C51程 序中常常把空语句作为循环体,用于消耗CPU时间等待 事件发生的场合。
表达式语句和复合语句
把多个语句用大括号{}括起来,组合在一起形成具有 一定功能的模块,这种由若干条语句组合而成的语句块 称为复合语句。在程序中应把复合语句看成是单条语句, 而不是多条语句。 复合语句在程序运行时,{}中的各行单语句是依次顺 序执行的。在C语言的函数中,函数体就是一个复合语 句。
赋值语句的作用是把某个常量或变量或 表达式的值赋值给另一个变量。
符号为‘=’。这里并不是等于的意思, 只是赋值,等于用‘==’表示。 赋值语句左边必须是变量或寄存器,且 必须先定义。 常量不能出现左边。



赋值运算符和赋值表达式
简单的赋值运算符:
=
复合的赋值运算符
i+=2 等价于 i = i + 2 a-= *= b*= + 5 等价于 a = a * (b + 5) + =、 、 x% 等价于 x = x%3 、%= 、= /=3
自增、自减运算
自增运算符(++)和自减运算符(--): (1)前置运算──++变量、--变量 即先增减、后运算。 (2)后置运算──变量++、变量-- 即先运算、后增减。
实战演练:请说明程序运行完后x,y,z,m,n的值分别是多 少? main() { int x=6,y,z,m,n; y=++x; z=x--; m=y/z; n=y%z; }
关系运算符
关系运算符 优先级

<
<=
>
>=
== !=

关系表达式
用关系运算符将两个表达式(可以是算术表达 式、关系表达式、赋值表达式或逻辑表达式) 连接起来的式子,称为关系表达式。 关系表达式的值为逻辑值“真”或“假”,以 1代表“真”,以0代表“假”。 例如: (1)关系表达式“8==4”的值为 ,表达式的 值为 。 (2) 关系表达式“5>0”的值为 ,表达式的 值为 。
选择语句
表达式1 真(非0) 假(0) 表达式2 真(非0) 假(0) 表达式„ 真(非0) 假(0) 表达式n 真(非0)
语句组1
语句组2
语句组„
语句组n
语句组n+1
选择语句
多分支选择的switch语句, 其一般形式如下: switch(表达式) { case常量表达式1: 语句组1;break; case常量表达式2: 语句组2;break; …… case常量表达式n: 语句组n;break; default : 语句组n+1; } 该语句的执行过程是:首先计算表达式的值,并逐个与case后的常量表达 式的值相比较,当表达式的值与某个常量表达式的值相等时,则执行对应 该常量表达式后的语句组,再执行break语句,跳出switch语句的执行,继 续执行下一条语句。如果表达式的值与所有case后的常量表达式均不相同, 则执行default后的语句组。
八进制数以字母o开头,如o14、o17等。
浮点型常量可分为十进制表示形式和指数表示形式两种,如0.888、 3345.345、125e3、-3.0e-3。 字符型常量是用单引号括起来的单一字符,如‘a’、‘9’等。 字符串型常量是用双引号括起来的一串字符,如“test”、“OK”等。 位类型的值是一个二进制数。如1或0。
变量
变量是一种在程序执行过程中其值能不断变化的量。 一个变量由变量名和变量值组成,变量名是存储单元 地址的符号表示,而变量的值就是该单元存放的内容。 变量必须先定义后使用,用标识符作为变量名,并指 出所用的数据类型和存储模式,这样编译系统才能为变 量分配相应的存储空间。
变量
void delay(unsigned char i) //延时函数1 { unsigned char j,k; for(k=0;k<i;k++) for(j=0;j<255;j++); } =================================================
练习
1 .若x = 10, 则!X的值为真或假? 2. 若a = 3, b = 2, 则if(a&b)的值为真或假? 3. 5 && 0 ||8的值为?
4. 5 > 3 && 4 || 8 < 4 的结果为?
C51程序结构
C语言程序的执行部分由语句组成。C语言提供了丰富 的程序控制语句,按照结构化程序设计的基本结构:顺 序结构、选择结构和循环结构,组成各种复杂程序。这 些语句主要包括表达式语句、复合语句、选择语句和循 环语句等。
例如: 逻辑与 (1) x<y&& m<n 逻辑或 (2) a= =b || c= =d 赋值运算与复合赋 值运算 (3) !a && b>c
| &&
等效于 (x<y) 12 && (m<n) || 从左至右 (a= =b)14 || (c= 从右至左 =d) = 等效于 +=、-=、 *=、/=、%=、&=、 等效于 (!a) ^=、 |=、<<=、 >>= && (b>c)
选择语句
if-else语句的一般格式如下: if (表达式) { 语句组1; } else { 语句组2; } if-else语句执行过程:当“表达式”的结果为“真”时,执行其后的“语 句组1”,否则执行“语句组2”
真(非0)
表达式
假(0)
语句组1
语句组2
选择语句
if-else-if语句是由 if else 语句组成的嵌套,用来实现多个条件分支的选择, 其一般格式如下: if (表达式1) { 语句组1; } else if (表达式2) { 语句组2; } … else if (表达式n) { 语句组n; } else { 语句组n+1; }
算术运算符
+(加法运算) -(减法运算) * (乘法运算符) /(除法运算符) % (求余运算符,或称模运算符)如: ++ (变量自加1) -- (变量自减1)
4 % 2 =0


两个整数相除结果为整数,如8/5的结果为1,舍去小数部分。 如果参加运算的两个数中有一个数为实数,则结果是实型。 求余运算要求%两侧都是整型数据。
C程序基本结构
认识C语言
一个C语言源程序是由一个或若干个函数组成,每一个函数完成相对独 立的功能。每个C程序都必须有(且仅有)一个主函数main(),程序的执行 总是从主函数开始,调用其他函数后返回主函数main(),不管函数的排列 顺序如何,最后在主函数中结束整个程序。 C语言程序中可以有预处理命令,预处理命令通常放在源程序的最前面。 C语言程序使用“;”作为语句的结束符,一条语句可以多行书写,也
-32768~+32767 0~4294967295
signed long
float * Bit sfr sfr16
有符号长整型
浮点型 指针型
四字节
四字节 1~3字节
-2147483648~+2147483647
±1.175494E-38~±3.402823E+38 对象的地址 0或1 0~255 0~65535
位运算
与操作
按位与操作符 :& 格式:x&y 规则:对应位均为1时才为1,否则为0 例如, i=i&0x0f; 等同于 i&=0x0f; 主要用途:取(或保留)1个数的某(些)位,其余各位 置0。
位运算
或操作
按位或操作符: | 格式:x|y 规则:对应位均为0时才为0,否则为1 例如, i=i|0x0f; 等同于 i|=0x0f; 主要用途:将1个数的某(些)位置1,其余各位不变
相关文档
最新文档