《第周C语言知识与KeilC的使用.pptx》由会员分享,可在线阅读,更多相关《第周C语言知识与KeilC的使用.pptx(54页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、汇编语言:优点:面向机器、目标代码短、占用存储器空间少、运行快。缺点:指令助记符多、编程灵活性差。C语言:优点:具有面向机器和面向用户的特点,良好的可读性易维护性和可移植性,对硬件的控制能力也很强,C语言的数据类型及运算符丰富,具有良好的程序结构。缺点:代码效率稍低(同汇编语言相比),占用存储空间较大。解决方法:单片机内部都嵌入了大容量的Flash ROM,有效的弥补了这个缺陷。第1页/共54页采用Keil C51语言编程的优点:(1)不需要对单片机的汇编语言指令系统有深入的了解;(2)寄存器分配不同存储器的寻址及数据类型等完全由编译器自动管理;(3)程序的结构规范,由一个主函数和不同功能的子
2、函数组成;(4)自带的库中包含许多标准子函数,具有较强的数据处理能力,方便使用;(5)C语言和汇编语言可以联合使用。可用汇编语言编写与硬件有关的程序,用C语言编写与硬件无关的运算部分。第2页/共54页1。C51源程序的基本结构和常用的头文件1.1 C51源程序的基本结构文件的扩展名为“.c”。由主函数和若干子函数组成。预处理命令 /例如:include,define等全局变量说明 /例如:int a,b;main()局部变量说明执行语句(包括子函数的调用语句)第3页/共54页func1(形式参数及说明)/子函数1 局部变量说明执行语句(包括调用其它子函数语句)funcn(形式参数及说明)/子函
3、数n 局部变量说明执行语句第4页/共54页C51编程时应注意的问题:(1)C51源程序是由函数组成的:主函数和子函数。(2)一个函数由两个部分组成,分别是函数说明部分和函数体。函数说明部分包括函数名函数类型函数属性函数参数(形参)名形式参数类型。函数名后面必须跟一对圆括号,函数参数可以没有,如main()。函数体:内的部分。“”必须成对出现,书写位置随意。一般为了层次分明,同一层的大括号对齐,并采用逐层缩进方法书写。(3)每个语句必须以“;”结尾。(4)可以用“/*/”或“/”对程序中的任何部分进行注释。(5)每个语句和数据定义的最后必须有分号。第5页/共54页1.2 C51中常用的头文件 r
4、eg51.h、reg52.h、math.h、ctype.h、stdio.h、stdlib.h、absacc.h和intrins.h。(1)reg51.h和reg52.h (定义51或52子系列单片机特殊功能寄存器和特殊位)reg52.h比reg51.h多了几行定义T2寄存器的内容。第6页/共54页sfr P1=0 x90;/*定义P1口的地址为90H*/sfr TCON=0 x88;sfr TMOD=0 x89;sfr TL0=0 x8A;sfr16 T2=0 xCC;T2L=0CCH,T2H=0CDH*/sbit ET0=IE1;/*指定ET0为中断允许控制寄存器IE的第1位*/sbit E
5、T0=0 xaa;/*指定ET0为可寻址位0AAH,即IE.1。*/第7页/共54页(2)absacc.h访问绝对地址头文件。当用绝对地址访问内部RAM(data)、外部RAM的一页(pdata)、整个外部RAM(xdata)和ROM(code)时,需包含此文件。命令有:CBYTE、CWORD(以字节型、字型访问ROM)DBYTE、DWORD(访问内部RAM)PBYTE、PWORD (外部RAM的一页空间(256B)XBYTE、XWORD(访问外部RAM)第8页/共54页#include main()DBYTE0 x30=0 xff;/*给片内RAM的30H单元赋值0FFH*/XWORD0 x
6、1000=0 x1234;/*给片外RAM的1000H单元赋值12H,1001H单元赋值34H*/第9页/共54页(3)其它头文件math.h:数学运算函数,如求绝对值、平方根、指数、正弦等函数。ctype.h:提供两类重要的函数:字符测试函数和字符大小转化函数。例如,判断一个整型变量是数字、字母、换行符、控制符等。stdio.h:标准输入输出函数头文件,用于从标准输入设备读取字符、数字,或向标准输出设备输出字符、字符串等。第10页/共54页stdlib.h:标准库头文件。说明了用于数值转换、内存分配以及具有其他相似任务的函数,例如求绝对值、把字符串转换成整型、长整型等。intrins.h:字
7、符型、整型和长整型数字的左、右循环移位头文件。例如_cror_、_crol_、_iror_、_irol_分别表示字符型数字右循环、左循环和整型数字的右循环、左循环。例如:_cror_(a,2);/对变量a循环右移2位此处的循环移位和按位操作的左移()实现的功能是不同的。_nop_();第11页/共54页2 C51的基本数据类型、数据存储类型和存储模式2.1 C51的基本数据类型 常量和变量数值型常量:十进制数或十六进制数(用0 x表示)符号型常量:需用宏定义指令(#define)对其进行定义。如:#define PI 3.14159常量第12页/共54页变量:数据类型数据类型长度长度值域值域位
8、型位型bit1bit0或或1字符型字符型signedchar1B-128+127unsignedchar1B0255整型整型signedint2B-32768+32767unsignedint2B065535singedlong4B-2147483648+2147483647unsignedlong4B04,294,967,295实型实型float4B1.176E-3840E+38第13页/共54页数据类型数据类型长度长度值域值域指针型指针型data/idata/pdata1B1字节地址字节地址code/xdata2B2字节地址字节地址通用指针通用指针3B其中其中1字节为存储器类型字节为存储器
9、类型编码,编码,23字节为地址字节为地址偏移量偏移量访问访问SFR的数据类的数据类型型sbit1bit0或或1sfr1B0255sfr162B065535第14页/共54页2.2 C51数据的存储类型3个存储区:内部RAM外部RAM和ROM。存储类型存储类型与硬件存储空间的对应关系与硬件存储空间的对应关系data直接寻址直接寻址内部内部RAM(128B),访问变量速度最快),访问变量速度最快bdata可位寻址可位寻址内部内部RAM(16B),允许位与字节混合访问),允许位与字节混合访问idata间接寻址内部间接寻址内部RAM,可访问内部地址空间(,可访问内部地址空间(256B)pdata外部外
10、部RAM的一页空间(的一页空间(256B),),由由MOVXDPTR指令访问指令访问xdata外部外部RAM(64KB),),由由MOVXDPTR指令访问指令访问code代码存储器(代码存储器(64KB),),由由MOVCA+DPTR指令访问指令访问第15页/共54页2.3 C51数据的存储模式存储模式决定了变量的默认存储类型、参数传递区和无明确存储区类型的说明。(1)small 模式所有参数及局部变量都放在可直接寻址的内部RAM(最大128B),这和用data定义变量所起的作用是相同的。优点:访问速度快;缺点:空间有限,只适用于对RAM需求小的程序。第16页/共54页(2)compact模式
11、所有参数及局部变量都放在外部RAM区的一页(最大256B),这和用pdata定义变量的作用相同。具体哪一页,可由P2口定义,并在STARTUP.A51文件中说明。一般默认的是外部RAM的低256B。特点:存储器空间比small 模式大,但速度较small 模式慢,却比large模式快。(3)large 模式所有参数及局部变量都放在外部RAM区(最大64KB),这和用xdata定义变量的作用是相同的。用数据指针(DPTR)寻址。该模式优点是其空间足够大,可存放变量多,缺点是速度较慢。第17页/共54页2.4 变量声明举例(1)字符型、整型、实型变量的声明声明存储类型和signed/unsigne
12、d属性。char data i;/*字符型变量i定位在内部RAM*/unsigned char code Tab=”key in number”;long xdata array10;float idata m,n;unsigned int pdata j;unsigned char xdata score1044;char bdata flag;第18页/共54页如果在变量说明时略去存储器类型标志符,编译器会自动选择默认的存储器类型。默认的存储器类型由控制指令smallcompact和large限制。第19页/共54页(2)位变量声明指定义的变量为内部RAM中可位寻址的位。普通位:bit f
13、lag;/*位变量flag定位于片内RAM中的可位寻址*/bit flag=0 x40;/*用flag表示内部RAM的40H位,flag bit 40Hbit flag=0 x200;特殊功能寄存器的位:#include sbit led=P10;/*led表示P1.0*/sbit led=0 x900;/*90H是P1口的地址,结果同上*/第20页/共54页(3)指针变量声明指针变量的应用类似于汇编语言中的寄存器间接寻址。指针变量的声明格式为:数据类型 存储器类型1 *存储器类型2 标识符*表示是指针类型,此处*不含取内容之意;数据类型声明指针所指变量的类型;存储器类型1声明指针所指变量的存
14、储类型,若默认则定义为一般指针;存储器类型2声明该指针变量本身的存储类型;标识符声明指针变量本身的数据类型和名称。第21页/共54页例:char xdata*data pd;/*指针pd指向字符型外部RAM区(每个数据1个字节);指针pd定位在片内RAM区(data),默认长度2个字节*/char xdata*pd;/*同上*/data int*pd;/*整型通用指针,指针在内部RAM,长度为3B*/int*data pd/*功能同上*/第22页/共54页注意:指针变量中只能存放地址,不能将一个非地址的数据赋给指针变量。例如:如果通过指针取出RAM中存放的数据100。int m=100;int
15、*pd;int n;*pd=&m;/*&为取地址运算符,将变量m的地址赋给指针pd*/n=*pd;/*使用指针变量进行间接访问,将变量m的值赋给 n,n=100*/第23页/共54页+-*/%(加 减 乘 除 余)=(位右移 位左移)&|(按位与 按位或)(按位异或 按位取反)按位操作运算符与C语言基本相同:算术关系逻辑3 C51的运算符第24页/共54页自增自减运算符:+i、-i、i+、i-。复合赋值运算符:+=,=,*=,/=,%=,=,&=,=,|=对指针操作的运算符:&、*分别表示取地址运算符和间接寻址运算符。例如:*pd=&m;/*将变量m的地址赋给指针pd*/n=*pd;/*使用指
16、针变量进行间接访问,将变量m的值赋给n*/注意:与运算符“&”的两边必须为变量。第25页/共54页4 C51的函数int addfunc(int a,int b)/*加法子函数*/int c;c=a+b;return(c);void delay()/*延时10ms子函数,假设fOSC11.0592MHz*/int ms=10;while(ms-)for(i=0;i115;i+);/*延时1ms*/第26页/共54页void main()/*主函数*/int x=10,y=3,z;z=addfunc(x,y);delay();第27页/共54页4.1 函数的分类从用户使用的角度看,函数有两种:(
17、1)标准函数,即库函数。如“math.h”、“intrins.h”等。(2)用户自己定义的函数。如例6-1中的addfunc和delay。从函数的形式上看,函数分两类:(1)无参函数。(2)有参函数。第28页/共54页4.2 函数的定义int addfunc(int a,int b)int c;c=a+b;return(c);有参函数定义的一般形式:类型标识符 函数名(形式参数列表)函数体语句;无参函数的定义形式:类型标识符 函数名()函数体语句;第29页/共54页4.3 函数的调用三种函数调用方式:(1)函数语句:如“delay();”(2)函数表达式:如z=addfunc(x,y);(3)
18、函数参数:如 m=addfunc(z,addfunc(x,y);此时函数addfunc(x,y)的值作为函数addfunc的另一个形参,m的值为z+(x+y)。第30页/共54页4.4 对被调用函数的说明若被调用函数出现在主调函数之前,可以不对被调用函数说明。若被调用函数出现在主调函数之后,在主调函数前应对被调用函数做出说明,形式为:返回值类型 被调函数名(形参列表);如:void delay();int addfunc(int,int);第31页/共54页int addfunc(int,int)void delay()int ms=10;while(ms-)for(i=0;i115;i+);
19、void main()int x=10,y=3,z;z=addfunc(x,y);delay();int addfunc(int a,int b)int c;c=a+b;return(c);第32页/共54页中断服务程序函数名(void)interrupt n 函数体 n=0:外部0中断;n=1:定时器0中断n=2:外部1中断;n=3:定时器1中断n=4:串口中断;n=5:ADC中断I/O口定义#include /使用系统的头文件#define prot xbyte0 x1000/直接定义或 用指针定义第33页/共54页几个Keil C51的关键字volatile:它是被设计用来修饰被不同线程
20、访问和修改的变量。如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。频繁地使用volatile很可能会增加代码尺寸和降低性能,因此要合理的使用volatile。const=code:它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性,另外,在观看别人代码的时候,清晰理解const所起的作用。第34页/共54页5 单片机的C51语言编程#include void main()char a,b;/*a为高半字节,b为低半字节*/DBYTE0 x40=25;a=DBYTE0 x40&0 xf0;/*分离出高半字节*
21、/a=4;/*右移四位*/b=DBYTE0 x40&0 x0f;/*分离出低半字节*/DBYTE0 x41=a+0 x30;DBYTE0 x42=b+0 x30;例6-2 将40H单元的高、低半字节的两个BCD码拆,转换成相对应的ASCII码后分别存入41H和42H单元。第35页/共54页若在程序开始时对0 x40单元写入0 x19,则程序的运行结果:第36页/共54页例6-2 把外部RAM 2000H201FH单元的内容置为10H。知识回顾:C语言的循环语句的几种形式:(1)while(表达式)语句;当表达式值为真(值为1)时,重复执行循环体。属于当型循环。(2)do 语句;while(表达
22、式)先执行循环体,再判断表达式是否为真,如此循环;直至表达式为假时退出循环。属于直到型循环。(3)for(表达式1;表达式2;表达式3;)语句;第37页/共54页#include void main()char xdata i;for(i=0;i0 x20;i+)XBYTE0 x2000+i=0 x10;C51源程序:第38页/共54页 例6-3 把ROM从2000H单元开始的数据块传送到外部RAM从1000H开始的存储区中,当数据为0时停止传送。#include void main()unsigned char i=0;while(CBYTE0 x2000+i!=0)XBYTE0 x1000
23、+i=CBYTE0 x2000+ii+;第39页/共54页例6-4第40页/共54页void main()while(1)led=0 xfe;for(x=1;x9;x+)delayxms(x);/调用延时子函数,传递参数x led=_crol_(led,1);/循环左移,每次只移1位 第41页/共54页#include#include unsigned int x;unsigned char led;#define led P1delayxms(unsigned int x)/带参数的1s延时子函数 unsigned int i,j,k;for(k=x;k0;k-)for(i=1000;i0;
24、i-)for(j=115;j0;j-);/本句延时1ms 第42页/共54页6 C51和汇编语言的混合编程参数传递的寄存器选择参数类型参数类型charintlong,float一般指针一般指针第1个参数R7R6、R7R4-R7R1、R2、R3第2个参数R5R4、R5R4-R7R1、R2、R3第3个参数R3R2、R3无R1、R2、R3如果定义:char a=10,b=20;则a参数传递给R7,b参数传递给R5。如果传递参数寄存器不够用,可以使用存储器传送,通过指针取得参数。第43页/共54页对于有参函数的参数返回值与寄存器之间的传递规律:表6-4 函数返回值的寄存器返回值返回值寄存器寄存器说明说
25、明bitC进位标志进位标志CY(unsigned)charR7(unsigned)intR6、R7高位在高位在R6,低位在,低位在R7(unsigned)longR4R7高位在高位在R4,低位在,低位在R7floatR4R732位位IEEE格式,指数和符号位格式,指数和符号位在在R7指针指针R1、R2、R3R3放存储器类型,高位在放存储器类型,高位在R2,低位在低位在R1第44页/共54页例6-5 采用混合编程方法实现例6-4的功能。第一步:在keil中编写C51程序,在需要汇编的地方先写两行代码:#pragma asm.汇编程序内容#pragma endasm第45页/共54页#includ
26、e#include unsigned char x;unsigned char led;#define led P1void delayxs(char);/子函数声明void main()while(1)led=0 xfe;for(x=1;x9;x+)delayxs(x);led=_crol_(led,1);/循环左移函数 第46页/共54页void delayxs(char y)#pragma asm DELAY:MOV R6,#10 /1s延时程序 DELAY0:MOV R5,#200 DELAY1:MOV R4,#125 DELAY2:DJNZ R4,DELAY2 DJNZ R5,DEL
27、AY1 DJNZ R6,DELAY0 DJNZ R7,DELAY#pragma endasm第47页/共54页第二步:保存文件名为“*.c”。假设该文件名为“li6-5.c”,在项目中加入含汇编语言的.c文件,鼠标点在“li6-5.c”处后右击,在出现的菜单中选择“options for file*”,在弹出的对话框中将“Generate Assembler SRC File”和“Assemble SRC File”两项选实。第48页/共54页第三步:装入库文件。根据所选择的编译模式,在工程中添加相应的库文件(如small模式下,库文件为C51S.Lib)。该文件在安装盘下:keilC51LI
28、BC51S.Lib。含有汇编语言的.c文件与其它文件的图标不一样。第49页/共54页第50页/共54页最后一步:编译与连接。将程序生成的li6-5.hex文件加载到Proteus中仿真,在软件运行中按“”暂停,然后在“Debug”菜单下点击“8051 CPU registers-U1”,可以查看各个寄存器的参数传递状态。第51页/共54页本章小结 本章介绍了C51的基本结构、基本数据类型、存储类型以及C51的变量定义和对单片机内部功能寄存器及引脚等的定义,并简要介绍了C51语言的运算符号等基础知识,最后通过C51以及C语言与汇编语言的混合编程介绍了C51语言运用的基本方法。除了本章列举的while、for语句外,还有ifelse语句、switch/case语句等,其用法同ANSI C相同。本章的重点:Keil C51的编程方法。ST7920带中文字库液晶,串行方式第52页/共54页第53页/共54页54感谢您的观看!第54页/共54页