版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、8051单片机支持的编程语言:l 汇编语言l PL/M语言l BASIC语言l C语言l C+语言 MCS-51单片机的C语言编程对单片机的指令系统不要求了解,仅要求对对单片机的指令系统不要求了解,仅要求对80518051的存的存储器结构有一定了解;储器结构有一定了解;程序有规范的结构,可分成不同的函数,这种方式可程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;使程序结构化;具有将可变的选择与特殊操作组合在一起的能力,改具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性;善了程序的可读性;提供的库包含许多标准子程序,具有较强的数据处理提供的库包含许多标准子程序,具有较强
2、的数据处理能力;能力;由于具有方便的模块化编程技术,使已编好程序可容由于具有方便的模块化编程技术,使已编好程序可容易地移植;易地移植;:由源代码文件生成目标文件由源代码文件生成目标文件:包含了编译器、链接器等开发工具的组合包包含了编译器、链接器等开发工具的组合包 将项目管理、源代码编辑和程序编译、链接、调试等各种工具组合在一将项目管理、源代码编辑和程序编译、链接、调试等各种工具组合在一个功能强大的环境中,具有良好人机界面。个功能强大的环境中,具有良好人机界面。8051单片机所使用的单片机所使用的C语言编译器简称为语言编译器简称为 Cx51例如包含例如包含Cx51、Ax51、BL51、LIB51
3、、OH51、RTX51等等KEIL C51 Cx51.exe(一个或若干个)(一个或若干个)n 程序的入口程序的入口 函数名固定,且与书写的位置无关函数名固定,且与书写的位置无关n 有且仅有一个有且仅有一个n 库函数或用户自定义的函数库函数或用户自定义的函数n 可以有若干个可以有若干个C51程序大体上是若干函数的集合C语言编程的三大要素l 数据 数据类型、数据结构、存储类型l 运算 算术运算、关系运算、逻辑运算、位操作l 控制 顺序结构、选择结构、循环结构、函数数据类型数据类型长度长度值域值域 bit1 bit0,1 unsigned char8 bit0 255 (signed) char8
4、 bit-128 127 unsigned int16 bit0 65535 (signed) int16 bit-32768 32767 unsigned long32 bit0 4294967295 (signed) long32 bit-21474836482147483647 float32 bit1.7e-38 3.40e+38 (6位) double64 bit1.7e-38 3.40e+38 (10位) * (一般指针)13字节存储空间地址 又称为标量,常量的值在程序执行过程中不能改变。又称为标量,常量的值在程序执行过程中不能改变。q 常量和变量q 常量和变量 9:P0 = co
5、nstA; C:0 x008F758014MOVP0(0 x80),#0 x14 10: P1 = constB; C:0 x00929000A2MOVDPTR,#constB(0 x00A2)C:0 x0095E4CLRAC:0 x009693MOVCA,A+DPTRC:0 x0097F590MOVP1(0 x90),A 11:P2 = constC; C:0 x00998508A0MOVP2(0 xA0),constC(0 x08) #include constA 20unsigned char constB = 20;unsigned char constC = 20;q 常量和变量是一
6、个宏,在编译时被当作指令的立即数。存放在ROM中,掉电不丢失,访问需要MOVC指令,和16位地址,访问速度较慢。(常用于查表法)存放在RAM中,访问较快,但占用RAM资源,掉电丢失,需要在单片机上电时进行初始化(占用代码)。 #include constA 20unsigned char constB = 20;unsigned char constC = 20; 在程序执行过程中,其值可以改变的量称为变量。变量只能存放在中。q 常量和变量存储类型存储类型说明说明直接寻址的片内数据存储器(128B),访问速度最快可位寻址的片内数据存储器(16B),允许位和字节混合访问间接访问的片内数据存储器(
7、256B),全部片内RAM空间分页访问的片外数据存储器(256B)片外数据存储器(64KB),访问速度相对比较慢程序存储器(64KB),只读n C51数据的存储类型数据的存储类型 在讨论在讨论C51的数据类型的时候,必须理解数据的的数据类型的时候,必须理解数据的存储类型存储类型和它与和它与8051单片机单片机存储器结构存储器结构的关系的关系.l访问片内访问片内RAM(data,bdata,idata)比访问片外比访问片外RAM(xdata,pdata)要快,因此可将常用变量置于片内要快,因此可将常用变量置于片内RAM,而将规模较,而将规模较大,或不常用数据置于片外大,或不常用数据置于片外RAM
8、。lunsigned char idata step_13=0 x04,0 x02,0 x01; lunsigned char code step_26=0 x04,0 x06,0 x02,0 x03,0 x01,0 x05; l定义变量时如果省略定义变量时如果省略“存储器类型存储器类型”选项,则按编译时使用的选项,则按编译时使用的存储器模式存储器模式来使用默认的存来使用默认的存储器类型。储器类型。默认存储类型为默认存储类型为data,访问速度最快,容量小,访问速度最快,容量小默认存储类型为默认存储类型为pdata默认存储类型为默认存储类型为xdata,访问效率最低,代码长,访问效率最低,代码
9、长,容量大容量大n C51数据的存储模式数据的存储模式lsfr my_sfr = location; location 范围从范围从 0 x80 0 xFFlsfr P0 = 0 x80; l8051片内片内RAM有有21个个 SFR(地址(地址80H0FFH)。对)。对SFR只能用直只能用直接寻址方式;接寻址方式;lC51提供了对提供了对SFR直接寻址的定义方法。该方法与标淮直接寻址的定义方法。该方法与标淮C语言不兼容,语言不兼容,只适用只适用C51;lsfr定义:特殊功能寄存器字节寻址定义:特殊功能寄存器字节寻址lsfr SCON=0 x98;lsfr TMOD=0 x89;lsfr16
10、T2=0 xCC;805l特殊功能寄存特殊功能寄存器器(SFR)及其及其C5l定义定义lsbit :绝对定址的位元:绝对定址的位元lsbit my_flag = location; llocation 范围从范围从 0 x00 0 x7F ,0 x800 xFFlsbit定义:定义:l应用应用1 (SFR)lsfr PSW=0 xD0; sbit OV=PSW2; sbit CY=PSW7;l sbit OV=0 xD02; sbit CY=0 xD07;l sbit OV=0 xD2; sbit CY=0 xD7;lsfr P1=0 x90; sbit P1_0=P10; lP1_0=0;
11、P1_0=1; P1_0=P1_0; P1_0=P1_0;() lsbit EA = 0 xAF; l应用应用2 (位寻址区)(位寻址区)lchar bdata my_flags; /配合配合 bdata 使用使用lsbit flag0 = my_flags 0; n位变量(位变量(BIT)及其)及其C51定义定义l算术运算:、算术运算:、*、/、l关系运算:关系运算:、=、= 、!=l逻辑运算:逻辑运算:&、|、!、!l位运算:位运算:&、|、l805l运算器具有位处理能力(布尔处理)运算器具有位处理能力(布尔处理),可以提高硬可以提高硬件处理速度件处理速度l自增、减:自增、
12、减:+、- -l算术运算:、算术运算:、*、/、l#define N 4lunsigned char LEDBufNlunsigned long a;lunsigned char i;la=1234;lfor(i=0;i4;i+)ll LEDBufi=a%10;l a/=10;ll程序的不足:程序的不足:l1、变量、变量a的值发生了变化的值发生了变化l2、程序不通用,需修改、程序不通用,需修改#define N实现实现l0&0=0l0&1=0l1&0=0l1&1=1l3&8=0(why?)l位复位lunsigned char a;la&=0 xF
13、E;( &运运算)算)l0|0=0l0|1=1l1|0=1l1|1=1l位置位lunsigned char a;la|=0 x01;(|运运算)算)l00=0l01=1l10=1l11=0l位取反lunsigned char a;la=0 x01;lunsigned char a=0 xAA,b=0 x55,c,d;lc=aba;ld=bab;( 运算 )l0=1l1=0( 运算 )la=15;a=2;则a3(?) a=a/4l程序的结果是:13 lvoid main(void)l unsigned int a=3,b=10;l printf(%dn,a1);l(右移)q 宏的使用 此
14、处使用# define语句定义了一个符号常量PI,它的值是3.1415926。 定义好符号常量PI后,在编程中使用这个符号,它就等价于3.1415926。如: 例: # define PI 3.1415926n 宏的分类:宏的分类: 这一类宏所代表的值或表达式在整个这一类宏所代表的值或表达式在整个C文件中始终保文件中始终保持不变。持不变。 如如: # define CONST 20 # define uchar unsigned char # define D1_ON P2_1 = 0 这一类宏所代表的表达式根据所传递的参数的不同而这一类宏所代表的表达式根据所传递的参数的不同而发生变化。它与函
15、数的形式类似,但有着本质的区别。发生变化。它与函数的形式类似,但有着本质的区别。 如如: # define setbit(var,bit) var|=(0 x01(bit)q 宏的使用 # define setbit(var,bit) var|=(0 x01 i=1;k|=(0 x01(i+1);q 宏的使用n 宏的意义:宏的意义:n 几个常用的宏几个常用的宏# define uchar unsigned char# define uint unsigned int# define ulong unsigned long# define 符号常量名 常量(数字或字符等) # define CO
16、NST 20a = a + CONST ; # define setbit(var,bit) var|=(0 x01(bit)setbit(P2,1);q 宏的使用位运算符综合应用位运算符综合应用#define setbit(var,bit) (var|=(0 x01(bit) /定义置位函数#define clrbit(var,bit) (var&=(0 x01(bit) /定义位清零函数#define checkbit(var,bit) (var& (0 x01(bit) /定义位查询函数#define xorbit(var,bit) (var=(0 x01(bit) /定
17、义位取反函数(略)2、LED的控制实例的控制实例q sbit的使用n 分析电路:1、由图,D3由IO引脚P2.2控制;2、由硬件电路可知,当IO口输出逻辑电平0时对应的LED点亮,当IO口输出逻辑电平1时LED熄灭。 例:如上图所示电路图,要求编程控制发光二极管D3点亮。普通发光二极管只需要几个mA的电流就可以点亮#include sbit D3 = P22;void main() D3 = 0 ; /点亮LED while(1) /循环,挂起 ; n 按要求编程:按要求编程:_ _ _ 引用含有引用含有SFRSFR符号定义的头文件符号定义的头文件 定义符号定义符号D3D3为为P2P2口的第口
18、的第2 2位位 D3D3可以换为其他自定义符号,作可以换为其他自定义符号,作用相同,如:用相同,如: sbit P2_2 = P22;sbit P2_2 = P22; 点亮发光二极管的功能语句点亮发光二极管的功能语句 while(1) while(1)无限循环,用于程序的无限循环,用于程序的反复执行或者程序挂起,很重要!反复执行或者程序挂起,很重要! 使用使用tabtab或者空格,使程序结构或者空格,使程序结构清晰,便于阅读清晰,便于阅读 适当加入注释,使编程思路清晰,适当加入注释,使编程思路清晰,便于阅读和后期的修改便于阅读和后期的修改q sbit的使用q while(1)循环#includ
19、e sbit D3 = P22;void main() D3 = 0 ; /点亮LED while(1) /循环,挂起 ; while(1) D3 = 0 ;可以实现相同的功能q while(1)循环n 如果主函数中没有如果主函数中没有while(1)循环会出现怎么样的情况?循环会出现怎么样的情况?0000H 0200H0201H 02FFH0300H0301H 0FFFH#include ;void main() ; ; ;空闲区域,可能存在随机代码没有while(1)有while(1)q while(1)循环根据按键代码执行相应操作根据按键代码执行相应操作 例:使用单片机作为控制器,设计一
20、个数学计算器。 例:使用单片机作为控制器,设计一个数学计算器。void main() ; while(1) ;q while(1)循环读取按读取按键代码键代码根据按键代码执行相应操作根据按键代码执行相应操作 获取传感器获取传感器信号信号根据传感器状态执行根据传感器状态执行相应操作相应操作计算器、或其它基于按键操作的设备自动测量仪器、工业自动化控制等设备q while(1)循环while(1) ;do ;While(1)q while(1)循环 例:如题设所示电路图,要求编程控制发光例:如题设所示电路图,要求编程控制发光二极管二极管D1实现闪烁变化。实现闪烁变化。n 分析电路:1、由图,D1由I
21、O引脚P2.0控制;2、由硬件电路可知,当IO口输出逻辑电平0时对应的LED点亮,当IO口输出逻辑电平1时LED熄灭。q while(1)循环n 按要求编程:按要求编程:#include sbit D1 = P20;void main() while(1) /无限循环 D1 = 0; /点亮 D1 = 1; /熄灭 问题:n 闪烁频率有多快? 人眼能分辨出来吗?n 如何降低频率?比如说使闪烁频率变为每秒闪烁1次。q while(1)循环q 延时的设计 要求要求 :实现发光二极管每秒钟闪烁:实现发光二极管每秒钟闪烁1次次 。n 分析设计要求:分析设计要求:1、每秒钟闪烁、每秒钟闪烁1次,即亮次,
22、即亮0.5秒,灭秒,灭0.5秒,如此循环;秒,如此循环;2、设计难点:如何实现、设计难点:如何实现0.5秒的计时(延迟、延时)?秒的计时(延迟、延时)?l 单片机执行语句需要时间; 单片机每条语句执行所需的时间是确定的(指令周期); 通过编程使单片机执行一些指令,可以实现延时;晶振为晶振为12MHz12MHz时,时,1 1个机器周期为个机器周期为1us1us,单周期指令的指令周期为单周期指令的指令周期为1us1us双周期指令的指令周期为双周期指令的指令周期为2us2us,依此类推,依此类推设计目标:设计目标:0.5s = 500ms = 500000us0.5s = 500ms = 50000
23、0us,考虑使用循环语句,考虑使用循环语句unsigned char i,j;for(i=20;i0;i- -)for(j=248;j0;j- -) ; MOVR6,#20D1: MOVR7,#248 DJNZR7,$ DJNZR6,D1q 延时的设计 MOVR6,#20D1: MOVR7,#248 DJNZR7,$ DJNZR6,D1单周期指令,1us单周期指令,1us双周期指令,2us双周期指令,2usq 延时的设计n 10ms延迟的编程实现延迟的编程实现unsigned char i ,j;for ( i = 20 ; i0 ; i- -)for ( j=248 ; j0 ; j- -)
24、 ;unsigned char i ,j;for ( i = 10 ; i0 ; i- -)for ( j=248 ; j0 ; j- -) ;q 延时的设计n 500ms延迟的编程实现延迟的编程实现uchar i,j,k;for(k=50;k0;k- -)for(i=20;i0;i- -) for(j=248;j0;j- -) ; MOVR5,#50D1:MOVR6,#20D2:MOVR7,#248DJNZR7,$DJNZR6,D2DJNZR5,D1q 延时的设计n 500ms延迟的编程实现延迟的编程实现uchar i,j,k;for(k=50;k0;k- -)for(i=20;i0;i-
25、-) for(j=248;j0;j- -) ; q 延时的设计l通常设计一个任意通常设计一个任意ms延迟的延迟函数延迟的延迟函数 (自定义函数)(自定义函数)void delay ( unsigned char ucData) unsigned char i, j, k; for ( k= ucData; k0; k- -) for ( i=20; i0; i- -) for ( j=248; j0; j- -) ; q 延时的设计 例:如题设所示电路图,要求编程控制发光二极管D1实现闪烁变化,闪烁频率1Hz。n 分析电路分析电路 (略)(略)n 按要求编程:按要求编程:#include sb
26、it D1 = P20;void delay(unsigned char ucData) unsigned char i,j,k; for(k= ucData;k0;k- -) for(i=20;i0;i- -) for(j=248;j0;j- -) ; void main() while(1) /无限循环无限循环 D1 = 0; /点亮点亮delay(50); /0.5秒延迟秒延迟 D1 = 1; /熄灭熄灭delay(50); q 延时的设计q 多个LED的控制,巧用移位指令 n 分析电路:1、由图,D1D8分别由IO引脚P2.0P2.7控制;2、依次循环点亮即:P2.0 = P2.1 =
27、 P2.2 = P2.7 = P2.0 3、考虑以为单位控制IO口状态。例:如题设所示电路图,要求编程控制例:如题设所示电路图,要求编程控制8个个发光二极管以发光二极管以1s的间隔依次循环点亮。的间隔依次循环点亮。#include void delay(unsigned char ucData);void main() while(1) P2 = 0 xfe; /点亮D1delay(100);P2 = 0 xfd; /点亮D2delay(100);P2 = 0 xfb; /点亮D3delay(100);P2 = 0 xf7; /点亮D4delay(100);P2 = 0 xef; /点亮D5d
28、elay(100); P2 = 0 xdf; /点亮D6delay(100); P2 = 0 xbf; /点亮D7 delay(100); P2 = 0 x7f; /点亮D8 delay(100); void delay(unsigned char ucData) unsigned char i,j,k; for(k= ucData;k0;k- -) for(i=20;i0;i- -) for(j=248;j0;j- -) ; n 按要求编程:q 多个LED的控制,巧用移位指令11111011111101111110111111011111111111101111110110111111011
29、11111D1点亮点亮D2点亮点亮D3点亮点亮D4点亮点亮D5点亮点亮D6点亮点亮D7点亮点亮D8点亮点亮考虑使用位左移指令q 多个LED的控制,巧用移位指令#include void delay(unsigned char ucData);void main() unsigned char i,ucTemp; while(1) ucTemp = 0 x01; for ( i= 8; i0; i- -) P2 = ucTemp; delay(100); ucTemp = ucTemp 1; n 使用移位指令和流程控制语句简化编程 赋初值赋初值 P2 P2口输出、口输出、延时、移位延时、移位00
30、00 00011111 11100000 00101111 1101q 多个LED的控制,巧用移位指令q 查表法的使用n 如上题,适当使用移位指令可以简化位操作编程,但如上题,适当使用移位指令可以简化位操作编程,但移位指令不是万能的,有些情况下使用移位指令往往力移位指令不是万能的,有些情况下使用移位指令往往力不从心,如:不从心,如: 例:如题设所示电路图,要求编程控制例:如题设所示电路图,要求编程控制8个发光二个发光二极管按如下方式实现变换闪烁:左移两次、右移两极管按如下方式实现变换闪烁:左移两次、右移两次、向外扩展两次、向内收缩两次、闪烁两次。次、向外扩展两次、向内收缩两次、闪烁两次。#in
31、clude void delay(unsigned char ucData);void main() while(1) P2 = 0 xfe; /点亮D1delay(100);P2 = 0 xfd; /点亮D2delay(100);;方法一: 使用移位指令,可以完成左移、右移的控制,但是在完成向外扩展和向内收缩的控制上比较麻烦。方法二:q 查表法的使用unsigned char code ucTable = 0 xFF, 0 xFE, 0 xFD, 0 xFB, 0 xF7, 0 xEF, 0 xDF, 0 xBF, 0 x7F,/左移两次 0 xFF, 0 xFE, 0 xFD, 0 xFB
32、, 0 xF7, 0 xEF, 0 xDF, 0 xBF, 0 x7F, 0 xFF, 0 x7F, 0 xBF, 0 xDF, 0 xEF, 0 xF7, 0 xFB, 0 xFD, 0 xFE,/右移两次 0 xFF, 0 x7F, 0 xBF, 0 xDF, 0 xEF, 0 xF7, 0 xFB, 0 xFD, 0 xFE, 0 xFF, 0 x18, 0 x24, 0 x42, 0 x81, 0 x42, 0 x24, 0 x18,/扩展两次 0 xFF, 0 x18, 0 x24, 0 x42, 0 x81, 0 x42, 0 x24, 0 x18, 0 x00, 0 xFF, /
33、闪烁两次 0 x00, 0 xFF, 0 x01 /结束码;q 查表法的使用#include unsigned char code ucTable ;void delay( unsigned char ucData );void main( ) unsigned char i; while(1) i=0; /索引值赋初值while(ucTable i != 0 x01) /不是末尾则输出 P2 = ucTable i ; /输出控制代码 i+; /索引值加一 delay(100); /延迟1秒 n 按要求编程:n 如何判断数组的如何判断数组的末尾?末尾?1、 可以预先定义可以预先定义一个特定数
34、据,用一个特定数据,用于表示数组的末尾。于表示数组的末尾。 2、 如果已知数组如果已知数组长度,则可以直接长度,则可以直接使用索引值判断;使用索引值判断;q 查表法的使用#include unsigned char code ucTable 56 ;void delay( unsigned char ucData );void main( ) unsigned char i; while(1) i=0; /索引值赋初值while( i 56 ) /不是末尾则输出 P2 = ucTable i ; /输出控制代码 i+; /索引值加一 delay(100); /延迟1秒 n 按要求编程:n 如何
35、判断数组的如何判断数组的末尾?末尾?1、 可以预先定义可以预先定义一个特定数据,用一个特定数据,用于表示数组的末尾。于表示数组的末尾。 2、 如果已知数组如果已知数组长度,则可以直接长度,则可以直接使用索引值判断;使用索引值判断;q 查表法的使用n 查表法应用的要点:查表法应用的要点:1 1、系统的控制要求可以由一系列、系统的控制要求可以由一系列表示出来;表示出来;2 2、这些控制数据的、这些控制数据的具有一定具有一定,如,如“依次逐个依次逐个使用使用”、或者其他可以用特定的算法表示出来的规律性;、或者其他可以用特定的算法表示出来的规律性;3 3、使用查表法的一半步骤:、使用查表法的一半步骤:a.a.根据设计要求建立控制数据数组根据设计要求建立控制数据数组b.b.对数组的索引变量进行编程控制对数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 浙江横店影视职业学院《原理及现代电子系统含实验》2023-2024学年第一学期期末试卷
- 中国科学技术大学《制冷工程》2023-2024学年第一学期期末试卷
- 郑州工业安全职业学院《理论力学5》2023-2024学年第一学期期末试卷
- 肇庆医学高等专科学校《传统中国画研习》2023-2024学年第一学期期末试卷
- 企业员工职业装着装规范与要求
- DB2201T 66.2-2024 肉牛牛舍建设规范 第2部分:种公牛
- 专业案例(动力专业)-注册公用设备工程师(动力专业)《专业案例》真题汇编2
- 房地产经纪操作实务-2020年房地产经纪人协理《房地产经纪操作实务》真题汇编
- 七夕保险新品推广模板
- 下基层调研须注重实效
- 情侣分手经济协议书范本
- 定位合作协议范本
- 家庭成员及主要社会关系情况表
- 护理质量反馈内容
- 高效协同-培训课件
- 舆情员年度述职报告
- 20XX年市场洞察模板
- 遥感技术在地表水源地水体监测中的应用研究
- 医院投诉整治总结汇报
- 核电经验反馈培训课件
- 急诊科护士的病人投诉处理与纠纷解决
评论
0/150
提交评论