版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章 单片机C51程序设计基础,1,第五章 单片机C51程序设计基础,0、标准C语言 一、C51变量定义格式 二、 C51 运算符、表达式及其规则 三、 C51 流程控制语句 四、C51构造数据类型 五、函数 六、 C51库函数 七、C51模块化程序设计,标准C语言,1、C语言程序的基本结构 #include 预处理命令 char fun1( ); 函数说明 float fun2( ); int x; 全局变量说明 Viod main( ) 主函数 声明部分 函数体 执行部分 char fun1( ) 功能函数1 声明部分 函数体 执行部分 float fun2( ) 功能函数2 函数体,特
2、点: C语言是函数式语言,函数是程序基本组成 C程序必须,且只有一个main 不论位置,程序总从主程序开始 所有变量必须先定义(规定数据类型),再使用 每个语句必须用分号“;”结束 使用库函数,必须使用“文件包含”,、函数定义 函数返回值类型 函数名(形式参数) 形式参数说明 局部变量说明 函数体语句 ,一、标准C语言,1、keil C 和 ANSI C 的异同 2、变量定义格式 3、单片机特有的数据类型,一、C51变量定义格式,1、keil C 和 ANSI C 的异同 C51主要针对51系列单片机的结构进行程序设计 2、变量定义格式 C语言: 存储属性 数据类型 变量名表 (普林斯顿型存储
3、结构) C51: 存储属性 数据类型 存储类型 变量名表(哈佛型存储结构) 例: static unsigned char data x 1)存储属性指定变量存放区域的属性。(确定生命周期) 内部变量 (auto) 堆栈中。仅在函数调用时存在,退出消失(默认值) (static) 固定地址。始终存在,函数体内可访问。 (register) 直接使用硬件寄存器,效率高 外部变量 (global) 固定地址,始终存在,并可访问(默认值) (extern) (static) 固定地址。始终存在,若为多文件程序,仅在 所定义的模块文件可访问,一、C51变量定义格式,C51: 存储属性 数据类型 存储类
4、型 变量名表 2)存储类型确定变量存储区 显式声明 unsigned char data x 默认存储类型,一、C51变量定义格式,C51: 存储属性 数据类型 存储类型 变量名表 2)存储类型确定变量存储区 显式声明: auto unsigned char data x; unsigned char data x; unsigned char x; 默认存储类型:由Cx51编译器存储模式决定 SMALL模式:默认存储类型为 data. 快速、高效 COMPACT模式:默认存储类型为 pdata. 片外RAM256B,通过R0/R1间接寻址。 LARGE模式:默认存储类型为 xdata. 空间
5、64KB,通过数据指针DPTR间接寻址。,一、C51变量定义格式,C51: 存储属性 数据类型 存储类型 变量名表 3)数据类型确定存储单元长度,一、C51变量定义格式,单片机特有的数据类型: bit位变量,值为0或1 sbit声明可位寻址空间的一个位 sfr特殊功能寄存器,8位 sfr16特殊功能寄存器,16位,C语言已有基本数据类型: Char: 单字节,可以存放一个字符。 Int: 整数,对大多数单片机开发软件而言是双字节大小 float: 单精度浮点数。 double:双精度浮点数。 Signed、unsigned限定:char、int类型 Short、long限定:int类型,C51
6、: 存储属性 数据类型 存储类型 变量名表 3)数据类型确定存储单元长度,一、C51变量定义格式,3、单片机特殊功能寄存器的C51定义,(1)sfr:声明字节寻址的特殊功能寄存器。 例如:sfr P0 = 0 x80;,(2)sfr16:该关键字对于一些8051派生系列单片机, 可以声明其内两个连续地址的特殊功能寄存器(SFR)。 例如:sfr16 T2 = 0 xCC;,(3)sbit:声明可位寻址的特殊功能寄存器标志位。 “=”号后将绝对地址赋给变量名,声明形式有以下3种:, 用已声明的sfr寄存器名 指定位;例如: sbit KEY_UP = P0 1;/ 指定P0的第1位连接UP按键。
7、, 用寄存器地址 指定位; 例如: sbit KEY_UP=0 x801;, 直接用寄存器标志位地址 。 例如: sbit KEY_UP=0 x81;,一、C51变量定义格式,3、单片机特殊功能寄存器的C51定义,(4) 8051并行接口及位变量的C51定义,REG51.h和REG52.h这两个头文件,sfr P0 = 0 x80; sfr P1 = 0 x90; sfr P2 = 0 xA0; sfr P3 = 0 xB0;,AT89X51.H头文件,sbit P0_0 = 0 x80; sbit P0_1 = 0 x81; sbit P0_2 = 0 x82;,sfr SEGDATA =
8、P0;/* 数码管数据端口 */ sbit SEL0 = P1 0;/* 数码管0片选端口 */ sbit SEL1 = P1 1;/* 数码管1片选端口 */ sbit KEY_SET = P1 7;/* 设置按键 */,程序头包含定义SFR的头文件后,可直接使用,为提高程序可读性,可重定义,一、C51变量定义格式,1、算术运算符: * / % 2、自增减运算符: + - - 例:若 int x=3, y;求 y=x+ - 1,y=+x-1,y=x-+1后的(x,y) 结果:(4,2) (4,3) (2,4) 3、复合赋值运算符: += -= *= /= %= 4、关系运算 = (位右移)例
9、:char c=c | 0 x0f; 置位 c=c a左移2位并赋值给b,二、C51运算符、表达式及规则,先计算再自+,先自+再计算,7、条件运算符 ?: if 为真,则返回表达式2的值; 为假,则返回表达式3的值 例:a=(b0) ? b : -b;if b0,then a=b ;if b=0,a=-b 8、指针和地址运算符,二、C51运算符、表达式及规则,8、指针和地址运算符,指针数据类型是一种存放指向另一个数据的地址的变量类型。,变量 = * 指针变量 (将指针变量所指向的目标变量的值赋给等号左边的变量) 指针变量 = / 变量A存放在地址0 x28 unsigned char data
10、 B _at_ 0 x29;/ 变量B存放在地址0 x29 unsigned char data *P _at_ 0 x2A;/ 指针变量P存放在地址0 x2A;/关键字_at_ 用于指定变量存放的绝对地址 A = 10;/ 变量A初值为10 B = 20;/ 变量B初值为20 P = / 变量B的值现在更改为10,二、C51运算符、表达式及规则,8、指针和地址运算符 (举例),10 20 29h,A B P,28h 29h 2ah,100,28 h,10,二、keil-C51语言,9、运算符优先级和结合性,9、运算符优先级和结合性,单目运算符高于双目运算符 算术运算符高于关系运算符 关系运算
11、符高于逻辑运算符 * 尽可能加括号明确指定操作优先级,二、C51运算符、表达式及规则,三、C51流程控制语句语言,一、C51程序的基本结构及其流程图 三种基本结构:顺序结构、选择结构和循环结构 顺序结构 选择结构及其流程图 (1)串行多分支结构流程图 (2)并行多分支结构,三、C51流程控制语句语言,一、C51程序的基本结构及其流程图 三种基本结构:顺序结构、选择结构和循环结构 顺序结构 选择结构及其流程图 循环结构及其流程图,(1)while型循环结构 (当量型),(2)do while型循环结构 (直到型),二、选择语句 选择语句有三种:if语句、switch/case语句和条件表达式 I
12、f 语句 三种形式:1、 if (表达式) 语句1;/if 表达式true,执行语句1 2、 if (表达式) 语句1; else 语句2; 3、 if(表达式1) 语句1;/级联选择 else if (表达式2) 语句2; else if (表达式3) 语句3; else 语句 n+1; /所有表达式均不满足时,三、C51流程控制语句语言,三、C51流程控制语句语言,#include /*abs()函数原型包含在该库中*/ int y; int ynumber (int x) if(x=0) y=100; else if (x0) y=x+2; else y=abs(x); return (
13、y); ,二、选择语句 选择语句有三种:if语句、switch/case语句和条件表达式 Switch/case 语句 switch ( x ) case c1: 语句组1;break;/if x=c1,执行语句组1后退出 case c2: 语句组2; break; default: 语句组 n+1; break; 条件表达式 ?:,三、C51流程控制语句语言,二、循环语句 循环语句有三种:for语句、while语句和do-while语句 for 语句 一般形式: for (初始化;条件表达式;表达式3) 循环语句(组);/循环体 用于构成当型循环:先判断后执行,条件为真继续循环,假结束 fo
14、r()中初始化及表达式可缺省,但两个分号“;”不可缺 例:求i=1+2+3+99+100 (i=0100) main () unsignde int data i, sum=0 for (i=1; i=100; i+) sum=sum+i; /循环100次 ,三、C51流程控制语句语言,二、循环语句 循环语句有三种:for语句、while语句和do-while语句 while 循环语句 一般形式: while (条件表达式) 循环语句(组);/循环体 用于构成当型循环:先判断后执行,条件为真继续循环,假结束 do-while 循环语句 一般形式: do 循环语句(组);/循环体 while (
15、条件表达式); 用于构成直到型循环:先执行循环体,再判断条件为真继续循环,假结束,三、C51流程控制语句语言,main ( ) unsignde int data i, sum; i=sum=0; while ( i+100) sum+ = i; ,main ( ) int a i, sum; i=1; sum=0; do sum+ = i ; while ( i+100) ; ,四、C51构造数据类型,1 数组,2 指针,3 结构体,4 共用体,5 枚举,1、数组 一维数组和多维数组 unsignde char data a5; unsignde char data b23; 数组的初始化,
16、例:在LED中循环显示09。 #include sfr segcon=P1; sbit bitcon = P20; void main() unsigned char code led10= 0 xc0, 0 xf9, 0 xa4, 0 xb0, 0 x99, 0 x92, 0 x82 , 0 xf8,0 x80, 0 x90; unsigned int x; /*x=09*/ while(1) for(x=0; x=9;x+) segcon=ledx; bitcon=1; /* 共阳LED*/ delay(2); ,四、C51构造数据类型,五、函数,include / 预处理命令 longf
17、un1( );/ 函数说明 floatfun2( ); int x,y;/ 全局变量说明,作用域为整个源程序 float z; func1( )/ 功能函数1 局部变量说明; /作用域限于函数体内 函数体; Main( )/主函数 局部变量说明; /主程序内部定义的变量也为局部变量 主函数体; func2( )/功能函数2 局部变量说明; 函数体; ,一、C语言程序的一般组成结构,五、函数,一、C语言程序的一般组成结构,函数定义 函数返回值类型 函数名(形式参数)/形参作用域限于调用期间 形式参数说明 局部变量说明 函数体语句 ,五、函数,二、C51中断服务程序,1.中断服务函数的定义,返回值
18、类型标识符 函数名( ) interrupt 中断号 using 寄存器组号 函数体语句; , 中断函数不能进行参数传递; 中断函数没有返回值;建议定义为void类型 在任何情况下都不能直接调用中断函数,否则会产生编译错误。 C51编译器对中断函数自动的现场保护和恢复。(ACC、B、DPH/L、PSW) using 修饰符,用于指定中断函数内部使用的工作寄存器组取值为03 interrupt修饰符,指明函数为中断函数。MCS51对应的中断号为05。 该向量包含一个到中断函数入口地址的绝对跳转。,void int1( ) interrupt 2 using 1 count +; / count为
19、全局变量,例:统计外中断1的中断次数的中断服务程序,五、函数,三、局部变量和全局变量,按作用域范围可分为两种:即局部变量和全局变量。,1.局部变量,局部变量也称为内部变量。作用域仅限与函数内 。,局部变量是在函数内作定义说明的。,int f1(int a) /a为形参, 函数调用期间有效 int b,c; /b,c局部变量 ,main() int m, n; /m,n局部变量,作用域限于main函数内 ,五、函数,三、局部变量和全局变量,按作用域范围可分为两种:即局部变量和全局变量。,2.全局变量,全局变量也称为外部变量,函数外部定义的变量。 其作用域是整个源程序。 并遵循先定义后使用的原则,
20、int a, b;/ 外部变量,作用域整个程序 void f1( )/ 函数f1 float x, y;/ 外部变量,作用域f2之后。若f1对x,y说明,则可用 int f2( )/ 函数f2 main()/ 主函数 ,五、函数,举例:输入正方体的长宽高l,w,h。 求体积及三个面x*y,x*z,y*z的面积。,int s1, s2, s3; int vs( int a,int b,int c) int v; v = a * b * c; s1 = a * b; s2 = b * c; s3 = a * c; return v; main() int v, l, w, h; printf(ni
21、nput length,width and heightn); scanf(%d%d%d, ,六、C51库函数 1、一般I/O函数stdio.h,六、C51库函数 2、字符函数库string.h,六、C51库函数 3、 标准函数库stdlib.h及其它头文件,(1)标准函数库(STDLIB.H)头文件中包含类型转换和 存储器分配函数的原型和定义,如下所列:,atof atoi atolcalloc init_ mempool malloc rand realloc strtod strtol strtoulfreerand,(2)数学函数库(math.h)头文件中包含所有浮点运算函数 的定义和
22、原型,其它的数学运算函数也包含在该文件中, 所有的数学运算函数如下:,absacosasinstanstan2cabscoscoshexp fabsfloorfmodfprestore fpsaavelabslog log10modfpowsinsinhsqrttantanh,六、C51库函数 3、 标准函数库stdlib.h及其它头文件,(3)绝对地址访问(absacc.h)头文件中包含的宏定义允许 用户直接访问8051单片机的不同存储区,所有的宏定义 如下:,CBYTE CWORD DBYTE DWORD FARRAY FCARRAY FCVAR FVAR PBYTEPWORD XBYTE
23、 XWORD,(4)内部函数库(intrins.h)包含有诸如_nop_一类的单片 机内部操作函数:,_chkfloat_crol_ _cror_irol_ _iror_ _lrol_ _lror_nop_ _testbit_,六、C51库函数 3、 标准函数库stdlib.h及其它头文件,(5)访问SFR和SFR_bit地址头文件(reg.h),C51库提供了一些头文件reg.h, 在8051系列单片机中,这些头文件用来定义一些指向 特殊功能寄存器常量。这些文件列表如下:,reg151s.h reg152.h reg320.h reg410.h reg451.h reg452.h reg50
24、9.h reg51.h reg515.h reg515a.h reg515c.h reg517.h reg517a.h reg51f.h reg51g.h reg51gb.h reg52.h reg552.h reg592.h reg781.h,七、C51模块化程序设计,一、基本概念,程序的组成 程序有数据说明和数据操作两部分组成。 从结构化角度看,程序应由模块化函数组成。,七、C51模块化程序设计,一、基本概念,2. 常用名词,(1)文件,C51文件扩展名如下: .ASM或.A51 汇编语言源文件 .C或.C51 C51语言源文件 .H 编译时源文件中的头文件 .LST 汇编/编译的程序和错
25、误列表文件 .ERR 错误报告文件 .OBJ 可重定位的目标模块文件 .LIB 库文件 .LNK 连接/定位器使用的文件 .MAP或.MAP 连接/定位后产生的映像文件 .HEX 连接/定位后产生的目标文件,七、C51模块化程序设计,一、基本概念,2. 常用名词,(2)源程序文件,源程序文件是由用户编制的由一个或多个函数组成的 完成特定功能的程序代码。,(3)目标文件,目标文件是单片机可执行的程序文件,它包含着用户 开发的运行在单片机上的机器代码。,(4)汇编器/编译器,汇编器是针对汇编语言程序的,而编译器是针对高级语言 (如C语言)程序的。它们被用来将源程序翻译成单片机 可执行的目标代码,从
26、而产生一个目标文件。,七、C51模块化程序设计,一、基本概念,2. 常用名词,(5)段,段与数据或者程序存储器有关,即程序段和数据段。 一个段有段名、类型以及属性,它们在存储器中的位置由 用户指定或者由连接器/定位器确定。,(6)模块,模块是包含一个或多个段的文件。一个模块通常为显示、 计算或与下层接口有关的函数或子程序,能够单独完成 一定的功能。,(7)库,库是包含一个或者多个模块的文件。库中的这些模块通常 是由编译或者汇编得到的可重定位的目标模块。 连接器仅从库中选取与其他模块相关的模块进行连接。,七、C51模块化程序设计,一、基本概念,2. 常用名词,(8)连接/定位器,连接器将一个程序
27、的多个源文件产生的各个目标文件按照 一定规则与用户自定义库文件和标准库文件连接起来。 定位器将地址分配给程序中的各个段。经过连接、定位后, 生成绝对目标文件(单片机可执行的文件)和映像文件 (提供给程序员的最终个空间映像表)。,(9)应用程序,应用程序是整个开发过程的最终结果,并最终在单片机 用户系统中运行,完成设计功能。,七、C51模块化程序设计,二、 模块化程序开发过程,项目规划,汇编源文件,汇编Ax51,C源文件,编译Cx51,库文件,链接/定位,目标文件,固化到单片机/或下载,调试通过,项目完成,修改,N,七、C51模块化程序设计,二、 模块化程序开发过程, 每一个C源文件都建立一个与
28、之名字一样的H文件 (头文件),其中仅包括该C文件中的函数的声明。 建立一个所有的文件都要共同使用的头文件(文件名可取 为common.h),该头文件可以包含单片机管脚使用的定义, 还有那些必需的编译器系统头文件 (如reg52.h,absacc.h等等)。 每个C源文件应该包含自己的头文件以及common.h, C文件内可以定义该文件内部使用的全局变量,如果在其他 文件中还要访问这个全局变量,可以在其头文件中以extern 再次定义该全局变量。,七、C51模块化程序设计,二、 模块化程序开发过程, 主文件main.c里面包含所有C源文件对应的头文件和 common.h,main.c中的函数可
29、以再建一个头文件main.h声明, 也可以直接放在main.c文件的开头部分声明,中断服务程序 一般也放在main.c文件中。 对于那些贯穿整个工程的变量,可以先在main.c文件中定义, 然后在common.h文件中用extern关键字再次声明一遍,哪个 文件要使用就只需包含common.h文件即可。 建立工程的时候,只要把C源文件加到工程中,把H文件直接 放到相应的工程目录下,不需要加到工程里面。,例1:延时程序 void delay(unsigned int x) unsigned char j; while (x-) for(j=0;j125;j+) /*fosc=12MHz,T=1u
30、s*/ ; ,八、keil-C51应用实例,#include /*abs()函数原型包含在该库中*/ int y; int ynumber (int x) if(x=0) y=100; else if (x0) y=x+2; else y=abs(x); return (y); ,八、keil-C51应用实例,第10章 Keil C51软件使用简介,软件开发流程 创建一个项目 从器件数据库中选择目标器件,并配置工具软件的设置 用C或汇编创建源程序 编译程序,生成HEX可执行程序 调试程序,纠正源文件中的错误 固化程序,软件设置Target对话框选项,Vision3集成开发环境,【例3】设MCS
31、-51单片机系统时钟频率fosc为6MHz,请编出利用定时/计数器T0在P1.0引脚上产生周期为2s,占空比为20%的方波信号的程序,C程序: #include #define uchar unsigned char uchar time; uchar period=20; uchar high=4; sbit p1_0=P10; void timer0() interrupt 1 using 1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; if (+ time=high) p1_0=0; if (time=period) time=0; p1_
32、0=1; main() TMOD=0 x01; /*T0,方式1*/ TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; time=0; while(1) ; ,中断定时程序设计:,解:取定时值100ms 则需定时器计数次数=100*103*6/12=50000,C显示程序: #define uchar unsigned char #define PA XBYTE 0 x0000 /定义A口 #define PC XBYTE 0 x0002 /定义C口 uchar data dispbuff4; /显示缓存 uch
33、ar code ledtab10=0 x3f, 0 x06, 0 x5b, 0 x4f, 0 x 66,0 x6d, 0 x7d, 0 x07H, 0 x7f, 0 x6f; /定义LED字形码 void display ( ) uchar i, x; uchar disnum=4; /显示位数 uchar bitcom=0 x10; /显示位控码 for ( i=0; idisnum; i+) x=disbuffi; /取显示数据 PA = ledtabx; /取字形码送PA口 PC = bitcom; /取位控码送PC口 bitcom=bitcom1; /位控码左移1位 delay(2);
34、 ,例4LED动态显示方式 用8255A控制键盘及4位LED,实现动态显示,5DAC的应用,C语言程序设计 设计锯齿波发生器。幅值-5V 0,频率500Hz,fosc=12MHz 分析:1)设计单缓冲控制电路 2)利用阶梯波近似实现 3)T=1/500=0.002s=2ms 设:阶梯数=256,增幅=28/256 则:阶梯步距(延时)=2ms/256= 7. 8 = 8us,故阶梯数=2000/8=250,Vout,t,2ms,锯齿波发生器C程序设计 #include #include #define DA0832 XBYTE0 xfffe /DAC地址 #define uchar unsig
35、ned char void stair(void) uchar i; while (1) for(i=0; i=250; i+) /形成锯齿波输出值 DA0832=i; /D/A转换输出 _nop_; /空操作 ,6DAC的应用 DAC双缓冲方式应用同步波形输出同时输出X和Y波形到示波器,C程序设计: #include #include #define INPUTR1 XBYTE0 xfffd /定义 #define INPUTR2 XBYTE0 xfffe /端口 #define DACR XBYTE0 xffff #define uchar unsigned uchar void dac2b (data1,data2) uchar data1,data2; INPUTR1=data1; /送数据到1#0832 INPUT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 运城幼儿师范高等专科学校《交互书籍设计》2024-2025学年第二学期期末试卷
- 兰州博文科技学院《地质学与矿物学》2024-2025学年第二学期期末试卷
- 四川应用技术职业学院《高聚物合成工艺学》2024-2025学年第二学期期末试卷
- 湖南财政经济学院《生物化学1》2024-2025学年第二学期期末试卷
- 辽宁传媒学院《推拿手法学实践》2024-2025学年第二学期期末试卷
- 企业会议管理制度
- 培训营上课制度
- 南昌大学科学技术学院《原理与触摸屏应用》2024-2025学年第二学期期末试卷
- 长春健康职业学院《影视音乐赏析》2024-2025学年第二学期期末试卷
- 四川西南航空职业学院《灾害统计学》2024-2025学年第二学期期末试卷
- 农网考评员考试题及答案
- 2026年长沙职业技术学院单招职业倾向性测试必刷测试卷附答案
- 煤矿开采合规性自查报告
- 2026年中级注册安全工程师之安全生产法及相关法律知识考试题库500道附答案【能力提升】
- 旅游美学课件
- 地质灾害治理工程监理安全管理制度
- 圆弧夹芯板施工方案
- 《反窃电电子数据提取与固定技术规范》
- 2025至2030中国光电子行业发展趋势分析与未来投资战略咨询研究报告
- 垃圾填埋操作工技师考试试卷与答案
- 电梯安装维修安全培训课件
评论
0/150
提交评论