版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022-4-211第第9 9章章 80C5180C51的的C C语言程序设计语言程序设计单片机单片机C语言概述语言概述9.1C51的的数据类型数据类型与运算与运算9.2C51流程流程控制语句控制语句9.3C51的的指针类型指针类型9.4C51的的函数函数9.5C51编程编程实例实例9.62022-4-2129.1 单片机单片机C语言概述语言概述 9.1.1 C519.1.1 C51程序开发过程程序开发过程 编译器能自动完成变量的存储单元的分配编译器能自动完成变量的存储单元的分配 对常用功能模块和算法编制相应的函数,方便移植对常用功能模块和算法编制相应的函数,方便移植 采用采用C51C51的优
2、点的优点 C C语言具有良好的可读性、可移植性和基本的硬件操作能力语言具有良好的可读性、可移植性和基本的硬件操作能力 。 C51C51程序开发过程程序开发过程 编写源程序编写源程序 建立工程,加入源程序建立工程,加入源程序 编译生产目标程序编译生产目标程序 仿真调试、写存储器仿真调试、写存储器2022-4-2132022-4-2149.1.2 C519.1.2 C51程序结构程序结构#include #include #include #include void void delaymsdelayms(unsigned(unsigned) );void void main(voidmain(v
3、oid) ) unsigned char i unsigned char i; P1=0 x01P1=0 x01; dodo for (i=0for (i=0;i=7i=7;i+)i+) delaymsdelayms(5000)(5000); P1=P1=P1P111; if(P1=0 x0)P1=0 x01if(P1=0 x0)P1=0 x01; while(1) while(1); void void delaymsdelayms(unsigned(unsigned x) x) unsigned char j unsigned char j; while(xwhile(x-)-) for(
4、jfor(j=0=0;j123j123;j+)j+); 2022-4-2159.2.1 C519.2.1 C51的数据类型的数据类型9.2 C51的数据类型与运算的数据类型与运算 数据类型决定其数据类型决定其取值范围取值范围、占用、占用存储器的大小存储器的大小及可参与及可参与哪种运算。哪种运算。 数据类型数据类型长度长度(位位)取值范围取值范围字符型字符型signed char8-128127unsigned char80255整整 型型signed int16-3276832767unsigned int16065535长整型长整型signed long32-2147488364821474
5、883647unsigned long3204294967295浮点型浮点型float321.75494E-383.402823E+38位位 型型bit10,1sbit10,1访问访问SFRsfr80255sfr16160655352022-4-216尽可能采用无符号格式尽可能采用无符号格式bitbit用于定义位变量的名字,编译器会对其分用于定义位变量的名字,编译器会对其分配地址(配地址(RAMRAM的的20H20H2FH 2FH 区域区域)sbitsbit用于定义位变量的名字和地址,地址是确用于定义位变量的名字和地址,地址是确定的且不用编译器分配(定的且不用编译器分配(SFRSFR及及RAM
6、RAM的的20H20H2FH 2FH 区区域域)C51C51编译器在编译时会自动进行类型转换编译器在编译时会自动进行类型转换 几点说明:几点说明:2022-4-2179.2.2 C519.2.2 C51数据的存储类型数据的存储类型C51C51的存储的存储器器类型类型存储器类型存储器类型长度(位)长度(位)对应单片机存储器对应单片机存储器bdata1片内片内RAM位寻址区,共位寻址区,共128位。(亦能字节访问)位。(亦能字节访问)data8直接寻址,共直接寻址,共128字节。字节。idata8间接寻址,共间接寻址,共256字节。字节。pdata8片外片外 RAM分页间址,共分页间址,共256字
7、节。(字节。(MOVX Ri)xdata16间接寻址,共间接寻址,共64k字节。(字节。(MOVX DPTR)code16ROM间接寻址,共间接寻址,共64k字节。(字节。(MOVC A,A+DPTR)2022-4-218经常使用的变量应该置于片内经常使用的变量应该置于片内RAMRAM中,要用中,要用bdatabdata、datadata、idataidata来定义来定义不经常使用的变量或规模较大的变量应该置于片外不经常使用的变量或规模较大的变量应该置于片外RAMRAM中,中,要用要用pdatapdata、xdataxdata来定义来定义默认存储器类型由编译控制命令的存储模式指令限制默认存储器
8、类型由编译控制命令的存储模式指令限制 存储模式存储模式默认默认存储类型存储类型特特 点点SMALL data小模式。小模式。 变量默认在片内变量默认在片内RAM。空间小,速度块。空间小,速度块。COMPACTpdata紧凑模式。变量默认在片外紧凑模式。变量默认在片外RAM的页(的页(256字节,页号由字节,页号由P2口决定)。口决定)。LARGExdata大模式。大模式。 变量默认在片外变量默认在片外RAM的的64KB范围。空间大,速度慢。范围。空间大,速度慢。2022-4-2199.2.3 80C519.2.3 80C51硬件结构的硬件结构的C51C51定义定义特殊功能寄存器的声明特殊功能寄
9、存器的声明 sfrsfr 特殊功能寄存器名特殊功能寄存器名 = = 地址常数;地址常数;格式:格式:例如:例如:sfrsfr SCON = 0 x90 SCON = 0 x90;sfrsfr P0 = 0 x80 P0 = 0 x80; 2022-4-2110特殊功能寄存器中特殊功能寄存器中特定位特定位的声明的声明 sbitsbit 位变量名位变量名= =特殊功能寄存器名特殊功能寄存器名 位的位置(位的位置(0 07 7) 例如:例如: sfrsfr PSW=0 xD0 PSW=0 xD0; sbitsbit OV=PSW2 OV=PSW2; sbitsbit 位变量名位变量名 = = 字节地
10、址字节地址 位的位置(位的位置(0 07 7) 例如:例如: sbitsbit OV=0 xD02 OV=0 xD02; sbitsbit CY=0 xD07 CY=0 xD07; sbitsbit 位变量名位变量名 = = 位地址位地址 例如:例如: sbitsbit OV=0 xD2 OV=0 xD2; sbitsbit CY=0 xD7 CY=0 xD7; 2022-4-2111内部内部RAMRAM中可位寻址对象的定义中可位寻址对象的定义 先先定义变量的数据类型和存储类型定义变量的数据类型和存储类型 例如:例如: intint bdatabdata ibaseibase; char ch
11、ar bdatabdata array4 array4; 再再利用利用sbitsbit进行声明进行声明 例如:例如: sbitsbit mybit0 = ibase0 mybit0 = ibase0; sbitsbit mybit15 = ibase15 mybit15 = ibase15; sbitsbit ary07 = array07 ary07 = array07; 访问示例:访问示例:ibaseibase = -1 = -1;array2 = aarray2 = a; 2022-4-2112算术运算符和算术表达式算术运算符和算术表达式 9.2.4 C519.2.4 C51的运算符和表
12、达式的运算符和表达式 基本算术运算符基本算术运算符 例如:例如: + + 加法运算符;加法运算符; - - 减法(取负)运算符;减法(取负)运算符; * * 乘法运算符;乘法运算符; / / 除法运算符;除法运算符; % % 取余数运算符取余数运算符。 示例:示例:25.0/20.0=1.25 25.0/20.0=1.25 25/20=125/20=125%20=5 25%20=5 取负运算优先级最高。取负运算优先级最高。 2022-4-2113自增、自减运算符(自增、自减运算符(仅能用于变量仅能用于变量) 例如:例如: + + 自增运算符;自增运算符; - - 自减运算符;自减运算符;类型转
13、换运算符类型转换运算符 自动转换,顺序:自动转换,顺序:bitcharintlongfloatbitcharintlongfloat 强制类型转换,如:(强制类型转换,如:(doubledouble)a a 2022-4-2114关系运算符关系运算符和和关系表达式关系表达式 关系运算符关系运算符 小于;小于; = 大于;大于; = = 大于等于;大于等于; = = = = 等于;等于; != = 不等于。不等于。关系表达式关系表达式关系表达式的值为逻辑值:真(关系表达式的值为逻辑值:真(1 1)和假()和假(0 0)2022-4-2115逻辑运算符逻辑运算符和和逻辑表达式逻辑表达式 逻辑运算符
14、逻辑运算符 & & 逻辑与;逻辑与; | | 逻辑或;逻辑或; ! 逻辑非。逻辑非。 逻辑表达式逻辑表达式逻辑表达式的值为逻辑值:真(逻辑表达式的值为逻辑值:真(1 1)和假()和假(0 0)例:例:5| | 05| | 0结果为结果为1 1,2&02&0结果为结果为0 0 2022-4-2116位运算符位运算符 & & 按位与;按位与; | | 按位或;按位或; 按位异或;按位异或; 按位取反;按位取反; 右移。右移。 例:例:P1=P1=P1P111表示对表示对P1P1口的所有位左移口的所有位左移1 1位位 2022-4-2117赋值和复合赋
15、值运算符赋值和复合赋值运算符 复合赋值运算符复合赋值运算符 += += 加法赋值;加法赋值; -= -= 减法赋值;减法赋值; * *= = 乘法赋值;乘法赋值; /= /= 除法赋值;除法赋值; %= %= 取模赋值;取模赋值; 符号符号“=”=”称为赋值运算称为赋值运算符符 = = = 右移位赋值;右移位赋值; &= &= 逻辑与赋值;逻辑与赋值; |= |= 逻辑或赋值;逻辑或赋值; = = 逻辑异或赋值;逻辑异或赋值; = = 逻辑非赋值逻辑非赋值 例:例:a a* *=5=5相当于相当于a=aa=a* *5 5;b&=0 x80b&=0 x80相当于相
16、当于b=b&0 x80b=b&0 x80。2022-4-21189.3 C51流程控制语句流程控制语句 9.3.1 C519.3.1 C51选择语句选择语句 条件语句条件语句ifif(条件表达式)语句(条件表达式)语句 例如:例如: if if(p1p1!= 0= 0) c=20 c=20; ifif(条件表达式)语句(条件表达式)语句1 1 else else 语句语句2 2 例如:例如: if if(p1p1!= 0= 0) c=20 c=20; else c=0 else c=0; 2022-4-2119ifif(条件表达式(条件表达式1 1)语句)语句1 1 else
17、if else if (条件表达式(条件表达式2 2)语句)语句2 2 else if else if (条件表达式(条件表达式3 3)语句)语句3 3 else if else if (条件表达式(条件表达式n n)语句)语句n n else else 语句语句n+1 n+1 2022-4-2120开关语句开关语句switch switch (表达式)(表达式) case case 常量表达式常量表达式1 1:语句:语句1 1;breakbreak; case case 常量表达式常量表达式2 2:语句:语句2 2;breakbreak; case case 常量表达式常量表达式n n:语句
18、:语句n n;breakbreak; default default :语句:语句n+1n+1; 2022-4-21219.3.2 C519.3.2 C51循环语句循环语句 whilewhile语句语句 一般形式为:一般形式为: whilewhile(条件表达式)语句;(条件表达式)语句;如果条件表达式的结果一开始就为假,则后面的语句一如果条件表达式的结果一开始就为假,则后面的语句一次也不能执行。次也不能执行。 do-whiledo-while语句语句 一般形式为:一般形式为: dodo语句语句 whilewhile(条件表达式);(条件表达式);任何条件下,循环体语句至少会被执行一次。任何条
19、件下,循环体语句至少会被执行一次。 2022-4-2122forfor语句语句 一般形式为:一般形式为: forfor( 初值表达式初值表达式;条件表达式条件表达式;更新表达式更新表达式 )语)语句句ifif语句与语句与gotogoto语句结合语句结合 当型循环当型循环 形式为:形式为: looploop:ifif(表达式)(表达式) 语句语句 gotogoto loop loop; 2022-4-2123 直到型循环直到型循环 形式为:形式为: looploop: 语句语句 ifif(表达式)(表达式) gotogoto loop loop; continuecontinue是一种循环中断语
20、句,它并不跳出循环体;是一种循环中断语句,它并不跳出循环体;breakbreak语句只能跳出它所处的那一层循环;语句只能跳出它所处的那一层循环;gotogoto语句可以用于跳出多重循环(从内层到外层)。语句可以用于跳出多重循环(从内层到外层)。注意:注意:2022-4-21249.4 C51的指针类型的指针类型 有一个变量有一个变量a a,利用,利用&a&a表示变量表示变量a a的地址的地址 。则语句。则语句 p=&a p=&a; 把把a a的地址赋给了指针变量的地址赋给了指针变量p p,则,则“p p指向了变量指向了变量a a”。 * *P P表示变量表示变量
21、a a的内容的内容指针变量的定义指针变量的定义 char data char data * *p /p /* * 定义指针变量定义指针变量 * */ / p = 30H / p = 30H /* * 为指针变量赋值,为指针变量赋值,30H30H为片内为片内RAMRAM地址地址 * */ / x = x = * *p /p /* * 30H 30H单元的内容送给变量单元的内容送给变量x x * */ /2022-4-2125定义时定义时未指定未指定它所指向的它所指向的对象的存储器对象的存储器类型类型 9.4.1 9.4.1 一般指针一般指针 一般指针占一般指针占3 3个字节个字节第一字节存放该指
22、针的第一字节存放该指针的默认默认存储器类型编码(存储器类型编码(见表见表)第二字节存放该指针的第二字节存放该指针的高高位地址偏移量位地址偏移量第三字节存放该指针的第三字节存放该指针的低低位地址偏移量位地址偏移量 存储器类型编码存储器类型编码 存储器类型存储器类型bdata/ data / idataxdatapdatacode编码编码0 x000 x010 xfe0 xff2022-4-2126一般指针定义示例:一般指针定义示例:charchar * *xdataxdata strptrstrptr; / /* * 指针本身存于指针本身存于xdataxdata 空间,它指向空间,它指向char
23、char型数据型数据 * */ /intint * *data numberdata number; / /* * 指针本身存于指针本身存于data data 空间,它指向空间,它指向intint型数据型数据 * */ / 由于指向对象的存储空间在编译时无法确定(由于指向对象的存储空间在编译时无法确定(运行时确运行时确定定),因此必须生成一般代码以保证对任意空间的对象进),因此必须生成一般代码以保证对任意空间的对象进行存取。所以行存取。所以一般指针所产生的代码速度较慢一般指针所产生的代码速度较慢。2022-4-21279.4.2 9.4.2 基于存储器的指针基于存储器的指针定义时就定义时就指定
24、指定它所指向的它所指向的对象的存储器对象的存储器类型类型 指针占指针占1 1个字节(个字节(idataidata * *,data data * *,pdatapdata * *)或)或2 2个个字节(字节(code code * *,xdataxdata * *) 基于存储器指针定义示例:基于存储器指针定义示例:charchar data data * *strstr; / /* * 指针指向的指针指向的charchar型数据存于型数据存于data data 空间空间 * */ /intint xdataxdata * *numnum; / /* * 指针指向的指针指向的intint型数据存
25、于型数据存于xdataxdata 空间空间 * */ / 基于存储器的指针长度比一般指针短,可以节省存储基于存储器的指针长度比一般指针短,可以节省存储器空间,器空间,运行速度快运行速度快,但它所指对象具有确定的存储器,但它所指对象具有确定的存储器空间,空间,兼容性不好兼容性不好。2022-4-21289.5 C51的函数的函数 9.5.1 C519.5.1 C51函数的定义函数的定义一般形式一般形式: :返回值类型返回值类型 函数名(形式参数列表)函数名(形式参数列表) 编译模式编译模式reentrantinterruptreentrantinterrupt nusingnusing n n
26、函数体函数体 编译模式为编译模式为SMALLSMALL、COPACTCOPACT或或LARGELARGEreentrantreentrant用于定义可重入函数用于定义可重入函数interrupt n interrupt n 用于定义中断函数用于定义中断函数,n,n为中断号为中断号, ,可以为可以为0 03131using n using n 确定工作寄存器组,取值为确定工作寄存器组,取值为0 03 3 2022-4-21299.5.2 C519.5.2 C51函数的调用与参数传递函数的调用与参数传递 主调函数要向被调函数传递所需的参数主调函数要向被调函数传递所需的参数传递给被调函数的数据称为实
27、际参数,即实参传递给被调函数的数据称为实际参数,即实参实参向形参的传递是单向的实参向形参的传递是单向的参数传递可以参数传递可以采用寄存器采用寄存器、固定存储器位置方式、固定存储器位置方式 参数传递参数传递寄存器参数传递寄存器参数传递传递的参数传递的参数char、1字节指针字节指针int、2字节指针字节指针long、float一般指针一般指针参数参数1R7R6、R7R4R7R1、R2、R3参数参数2R5R4、R5R4R7R1、R2、R3参数参数3R3R2、R3R1、R2、R32022-4-2130SMALLSMALL模式下,在内部模式下,在内部RAMRAM中完成中完成 COMPACTCOMPAC
28、T模式下,在外部模式下,在外部RAMRAM中完成中完成LARGERLARGER模式下,在外部模式下,在外部RAMRAM中完成中完成固定存储器位置固定存储器位置参数传递参数传递 80C51单片机不采用堆栈传递参数。但C51提供一种模拟堆栈,从而支持可重入函数的递归调用。 9.5.3 C519.5.3 C51的库函数的库函数常用的C51库函数参见附录B.2 2022-4-21319.6 C51编程实例编程实例 9.6.1 80C519.6.1 80C51内部资源的编程内部资源的编程 中断服务函数示例中断服务函数示例中断函数的定义形式中断函数的定义形式void void 函数名(函数名(voidvo
29、id)interrupt interrupt n n using m using m 函数体函数体 中断源中断源外中断外中断0定时器定时器0外中断外中断1定时器定时器1串行口串行口中断号中断号012342022-4-2132【例例10-110-1】单片机应用系统中,外中断单片机应用系统中,外中断0 0引脚接一个开关,并引脚接一个开关,并行口线行口线P1.0P1.0接一个发光二级管。要求:开关闭合一次,发光二接一个发光二级管。要求:开关闭合一次,发光二极管的状态改变一次。试编写程序极管的状态改变一次。试编写程序 #include “reg51.h”#include “intrins.h” sbi
30、t P10=P10; void delay(void)int a = 5000; while(a - - )_nop_( );void int_srv(void)interrupt 0 delay( ); if(INT0 = =0)P10 = ! P10;while(INT0 = =0); void mainvoid main()() P10 = 0 P10 = 0; EA = 1EA = 1; EX0 = 1EX0 = 1;whilewhile(1 1);); 2022-4-2133定时计数器编程示例定时计数器编程示例【例例10-210-2】 利用定时利用定时/ /计数器计数器T0T0的方式
31、的方式1 1,产生,产生10ms10ms的定时,的定时,并使并使P1.0P1.0引脚上输出周期为引脚上输出周期为20ms20ms的方波,采用中断方式,设系的方波,采用中断方式,设系统时钟频率为统时钟频率为12 MHz12 MHz。1 1、计算计数初值、计算计数初值X X: N Nt/ t/ TcyTcy 101010-3/110-3/110-610-61000010000计数器初值应为计数器初值应为-10000-10000。即应将。即应将 - -(10000/25610000/256)送入)送入TH0TH0中,中,- -(10000%25610000%256)送入)送入TL0TL0中。中。 2
32、 2、求、求T0T0的方式控制字的方式控制字TMODTMOD:M1M0=01M1M0=01,GATE=0GATE=0,C/T=0C/T=0,可取方式控制字为,可取方式控制字为01H01H 3 3、程序清单(见下页)、程序清单(见下页) 2022-4-2134#include “reg51.h”#include “reg51.h”sbitsbit P10 = P10 P10 = P10;void timer0(void)interrupt void timer0(void)interrupt 1 1 P10 = ! P10 P10 = ! P10; TH0 = -TH0 = -(10000/25
33、610000/256);); TL0 = -TL0 = -(10000%25610000%256);); void mainvoid main(voidvoid) TMOD = 0 x01TMOD = 0 x01;P10 = 0P10 = 0;TH0 = -TH0 = -(10000/25610000/256););TL0 = -TL0 = -(10000%25610000%256););EA = 1EA = 1;ET0 = 1ET0 = 1;TR0 = 1TR0 = 1;whilewhile(1 1);); 2022-4-21359.6.2 80C519.6.2 80C51扩展资源的编程扩展
34、资源的编程 通用并行口编程示例通用并行口编程示例 【例例10-310-3】用用81C5581C55作为微型打印机与单片机间的接口电路。作为微型打印机与单片机间的接口电路。 2022-4-2136#include “reg51.h”#include “reg51.h”#include “#include “absacc.habsacc.h” ” / /* *含有对含有对XBYTEXBYTE等绝对地址访问宏的定义等绝对地址访问宏的定义* */ /#define #define ucharuchar unsigned char unsigned char#define COMD8155 XBYTE0
35、 x7f00#define COMD8155 XBYTE0 x7f00#define PA8155 XBYTE0 x7f01#define PA8155 XBYTE0 x7f01#define PB8155 XBYTE0 x7f02#define PB8155 XBYTE0 x7f02#define PC8155 XBYTE0 x7f03#define PC8155 XBYTE0 x7f03sbitsbit BUSY = P33 BUSY = P33; 2022-4-2137uchar code tab17 = 0 xb80 xb8,0 xdf0 xdf,0 xbd0 xbd,0 xcc0 x
36、cc,0 x200 x20, 0 xb30 xb3,0 xf60 xf6,0 xb00 xb0,0 xe60 xe6,0 xc90 xc9,0 xe70 xe7,0 x200 x20, 0 x320 x32,0 x300 x30,0 x300 x30,0 x380 x38,0 x0a0 x0a ;/ /* *高教高教 出版社出版社 20082008* */ / uchar t1 = 17;void void ptrptr(ucharuchar d d) / /* *打印字符函数打印字符函数* */ / PA8155 = d PA8155 = d; PC8155 = 0 x00PC8155 = 0 x00; / /* *产生选通脉冲产生选通脉冲* */ / PC8155 = 0 x01 PC8155 = 0 x01; whilewhile(BUSYBUSY);); 2022-4-2138void mainvoid main(voidvoid) COMD8155 = 0 x0f COMD8155
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 门架式履带作业车液压行驶系统设计与试验
- 2025年北京电子科技职业学院高职单招高职单招英语2016-2024历年频考点试题含答案解析
- 2025年佛山职业技术学院高职单招数学历年(2016-2024)频考点试题含答案解析
- 2025年云南工程职业学院高职单招语文2018-2024历年参考题库频考点含答案解析
- 鱼池生态循环系统构建-洞察分析
- 2025年云南交通运输职业学院高职单招职业适应性测试近5年常考版参考题库含答案解析
- 宇宙学中的黑洞-洞察分析
- 糖尿病足创面修复新技术-洞察分析
- 现代汉语语法发展趋势分析-洞察分析
- 隐私同态加密算法设计-洞察分析
- 无人化农场项目可行性研究报告
- 《如何存款最合算》课件
- 社区团支部工作计划
- 拖欠工程款上访信范文
- 《wifi协议文库》课件
- 中华人民共和国职业分类大典是(专业职业分类明细)
- 2025年新高考语文复习 文言文速读技巧 考情分析及备考策略
- 2024年海口市选调生考试(行政职业能力测验)综合能力测试题及答案1套
- 一年级下册数学口算题卡打印
- 2024年中科院心理咨询师新教材各单元考试题库大全-下(多选题部分)
- 真人cs基于信号发射的激光武器设计
评论
0/150
提交评论