计算机软件及应用KeilC软件使用说明

上传人:可**** 文档编号:110720643 上传时间:2022-06-19 格式:PPTX 页数:50 大小:345.11KB
返回 下载 相关 举报
计算机软件及应用KeilC软件使用说明_第1页
第1页 / 共50页
计算机软件及应用KeilC软件使用说明_第2页
第2页 / 共50页
计算机软件及应用KeilC软件使用说明_第3页
第3页 / 共50页
点击查看更多>>
资源描述
会计学1计算机软件及应用计算机软件及应用KeilC软件使用说明软件使用说明2采用Keil C51语言编程的优点:(1) 不需要对单片机的汇编语言指令系统有深入的了解;(2)寄存器分配不同存储器的寻址及数据类型等完全由编译器自动管理;(3) 程序的结构规范,由一个主函数和不同功能的子函数组成;(4) 自带的库中包含许多标准子函数,具有较强的数据处理能力,方便使用;(5) C语言和汇编语言可以联合使用。可用汇编语言编写与硬件有关的程序,用C语言编写与硬件无关的运算部分。第1页/共50页36.1 C51源程序的基本结构和常用的头文件6.1.1 C51源程序的基本结构文件的扩展名为“.c”。由主函数和若干子函数组成。预处理命令 /例如:include, define等全局变量说明 /例如:int a,b;main() 局部变量说明执行语句(包括子函数的调用语句)第2页/共50页4func1(形式参数及说明)/子函数1 局部变量说明执行语句(包括调用其它子函数语句)funcn(形式参数及说明)/子函数n 局部变量说明执行语句第3页/共50页5C51编程时应注意的问题:(1)C51源程序是由函数组成的:主函数和子函数。(2)一个函数由两个部分组成,分别是函数说明部分和函数体。函数说明部分包括函数名函数类型函数属性函数参数(形参)名形式参数类型。函数名后面必须跟一对圆括号,函数参数可以没有,如main()。函数体: 内的部分。 “”必须成对出现,书写位置随意。一般为了层次分明,同一层的大括号对齐,并采用逐层缩进方法书写。(3)每个语句必须以“;”结尾。(4)可以用“/*/”或“/”对程序中的任何部分进行注释。(5)每个语句和数据定义的最后必须有分号。第4页/共50页66.1.2 C51中常用的头文件 reg51.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寄存器的内容。 第5页/共50页7sfr 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 ET0=0 xaa;/*指定ET0为可寻址位0AAH,即IE.1。*/第6页/共50页8(2)absacc.h访问绝对地址头文件。当用绝对地址访问内部RAM(data)、外部RAM的一页(pdata)、整个外部RAM(xdata)和ROM(code)时,需包含此文件。命令有:CBYTE、CWORD (以字节型、字型访问ROM)DBYTE、DWORD (访问内部RAM)PBYTE、PWORD (外部RAM的一页空间(256B)XBYTE、XWORD (访问外部RAM)第7页/共50页9#include main( ) DBYTE0 x30=0 xff; /*给片内RAM的30H单元赋值0FFH*/ XWORD0 x1000=0 x1234; /*给片外RAM的1000H单元赋值12H,1001H单元赋值34H*/第8页/共50页10(3)其它头文件math.h:数学运算函数,如求绝对值、平方根、指数、正弦等函数。ctype.h:提供两类重要的函数:字符测试函数和字符大小转化函数。例如,判断一个整型变量是数字、字母、换行符、控制符等。stdio.h:标准输入输出函数头文件,用于从标准输入设备读取字符、数字,或向标准输出设备输出字符、字符串等。第9页/共50页11stdlib.h:标准库头文件。说明了用于数值转换、内存分配以及具有其他相似任务的函数,例如求绝对值、把字符串转换成整型、长整型等。intrins.h :字符型、整型和长整型数字的左、右循环移位头文件。例如_cror_、_crol_、_iror_、_irol_分别表示字符型数字右循环、左循环和整型数字的右循环、左循环。例如:_cror_(a,2); /对变量a循环右移2位此处的循环移位和按位操作的左移()实现的功能是不同的。第10页/共50页126.2 C51的基本数据类型、数据存储类型和存储模式6.2.1 C51的基本数据类型 常量和变量数值型常量: 十进制数或十六进制数(用0 x表示)符号型常量:需用宏定义指令(#define)对其进行定义。 如:#define PI 3.14159常量第11页/共50页13变量:数据类型数据类型长度长度值域值域位型位型bit1bit0或或1字符型字符型signedchar1B-128+127unsignedchar1B0255整型整型signedint2B-32768+32767unsignedint2B065535singedlong4B-2147483648+2147483647unsignedlong4B04294967295实型实型float4B1.176E-386.40E+38第12页/共50页14数据类型数据类型长度长度值域值域指针型指针型data/idata/pdata1B1字节地址字节地址code/xdata2B2字节地址字节地址通用指针通用指针3B其中其中1字节为存储器类字节为存储器类型编码,型编码,23字节为地字节为地址偏移量址偏移量访问访问SFR的数据类的数据类型型sbit1bit0或或1sfr1B0255sfr162B065535第13页/共50页156.2.2 C51数据的存储类型3个存储区:内部RAM外部RAM和ROM。存储类型存储类型与硬件存储空间的对应关系与硬件存储空间的对应关系data直接寻址直接寻址内部内部RAM(128B),访问变量速度最快),访问变量速度最快bdata可位寻址可位寻址内部内部RAM(16B),允许位与字节混合访问),允许位与字节混合访问idata间接寻址内部间接寻址内部RAM,可访问内部地址空间(,可访问内部地址空间(256B)pdata外部外部RAM的一页空间(的一页空间(256B),),由由MOVXDPTR指令访问指令访问xdata外部外部RAM(64KB),),由由MOVXDPTR指令访问指令访问code代码存储器(代码存储器(64KB),),由由MOVCA+DPTR指令访问指令访问第14页/共50页166.2.3 C51数据的存储模式存储模式决定了变量的默认存储类型、参数传递区和无明确存储区类型的说明。(1)small 模式所有参数及局部变量都放在可直接寻址的内部RAM(最大128B),这和用data定义变量所起的作用是相同的。优点:访问速度快;缺点:空间有限,只适用于对RAM需求小的程序。第15页/共50页17(2)compact模式所有参数及局部变量都放在外部RAM区的一页(最大256B),这和用pdata定义变量的作用相同。具体哪一页,可由P2口定义,并在STARTUP.A51文件中说明。一般默认的是外部RAM的低256B。特点:存储器空间比small 模式大,但速度较small 模式慢,却比large模式快。(3)large 模式所有参数及局部变量都放在外部RAM区(最大64KB),这和用xdata定义变量的作用是相同的。用数据指针(DPTR)寻址。该模式优点是其空间足够大,可存放变量多,缺点是速度较慢。第16页/共50页186.2.4 变量声明举例(1)字符型、整型、实型变量的声明声明存储类型和signed/unsigned属性。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;第17页/共50页19如果在变量说明时略去存储器类型标志符,编译器会自动选择默认的存储器类型。默认的存储器类型由控制指令smallcompact和large限制。 第18页/共50页20(2)位变量声明指定义的变量为内部RAM中可位寻址的位。普通位:bit flag;/*位变量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口的地址,结果同上*/第19页/共50页21(3)指针变量声明指针变量的应用类似于汇编语言中的寄存器间接寻址。指针变量的声明格式为:数据类型 存储器类型1 *存储器类型2 标识符* 表示是指针类型,此处*不含取内容之意;数据类型声明指针所指变量的类型;存储器类型1声明指针所指变量的存储类型,若默认则定义为一般指针;存储器类型2声明该指针变量本身的存储类型;标识符声明指针变量本身的数据类型和名称。第20页/共50页22例:char xdata *data pd;/*指针pd指向字符型外部RAM区(每个数据1个字节);指针pd定位在片内RAM区(data),默认长度2个字节*/char xdata * pd;/*同上*/data int *pd;/*整型通用指针,指针在内部RAM,长度为3B*/int *data pd/*功能同上*/第21页/共50页23注意:指针变量中只能存放地址,不能将一个非地址的数据赋给指针变量。例如:如果通过指针取出RAM中存放的数据100。int m=100;int *pd;int n;*pd=&m;/* &为取地址运算符,将变量m的地址赋给指针pd*/n=*pd; /*使用指针变量进行间接访问,将变量m的值赋给 n,n=100*/第22页/共50页24+ - * / %(加 减 乘 除 余) = (位右移 位左移)& | (按位与 按位或) (按位异或 按位取反)按位操作运算符与C语言基本相同:算术关系逻辑6.3 C51的运算符第23页/共50页25自增自减运算符:+i、-i、i+、i-。复合赋值运算符:+=,=,*=,/=,%=,=,&=,=,|=对指针操作的运算符:&、* 分别表示取地址运算符和间接寻址运算符。例如:*pd=&m;/*将变量m的地址赋给指针pd*/n=*pd; /*使用指针变量进行间接访问,将变量m的值赋给n*/注意:与运算符“&”的两边必须为变量 。第24页/共50页266.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*/第25页/共50页27void main()/*主函数*/ int x=10, y=3, z;z=addfunc(x, y);delay();第26页/共50页286.4.1 函数的分类从用户使用的角度看,函数有两种:(1)标准函数,即库函数。如“math.h”、“intrins.h”等。(2)用户自己定义的函数。如例6-1中的addfunc和delay。从函数的形式上看,函数分两类:(1)无参函数。(2)有参函数。第27页/共50页296.4.2 函数的定义int addfunc(int a, int b) int c; c=a+b; return(c);有参函数定义的一般形式:类型标识符 函数名(形式参数列表) 函数体语句;无参函数的定义形式:类型标识符 函数名()函数体语句;第28页/共50页306.4.3 函数的调用三种函数调用方式:(1)函数语句:如 “delay();” (2)函数表达式:如z=addfunc(x,y);(3)函数参数:如 m= addfunc(z, addfunc(x,y); 此时函数addfunc(x,y)的值作为函数addfunc的另一个形参,m的值为z+(x+y)。第29页/共50页316.4.4 对被调用函数的说明若被调用函数出现在主调函数之前,可以不对被调用函数说明。若被调用函数出现在主调函数之后,在主调函数前应对被调用函数做出说明,形式为:返回值类型 被调函数名(形参列表);如:void delay( ); int addfunc(int, int); 第30页/共50页32int addfunc(int, int)void delay() int ms=10; while (ms-) for (i=0;i115;i+); 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);第31页/共50页336.5 单片机的C51语言编程#include void main () char a,b;/*a为高半字节,b为低半字节*/ DBYTE0 x40=25; a=DBYTE0 x40&0 xf0;/*分离出高半字节*/ a=4;/*右移四位*/ b=DBYTE0 x40&0 x0f;/*分离出低半字节*/ DBYTE0 x41=a+0 x30; DBYTE0 x42=b+0 x30; 例6-2 将40H单元的高、低半字节的两个BCD码拆,转换成相对应的ASCII码后分别存入41H和42H单元。第32页/共50页34若在程序开始时对0 x40单元写入0 x19,则程序的运行结果:第33页/共50页35例6-2 把外部RAM 2000H201FH单元的内容置为10H。知识回顾:C语言的循环语句的几种形式:(1)while(表达式)语句;当表达式值为真(值为1)时,重复执行循环体。 属于当型循环。(2)do 语句; while(表达式)先执行循环体,再判断表达式是否为真,如此循环;直至表达式为假时退出循环。属于直到型循环。(3)for(表达式1;表达式2;表达式3;)语句;第34页/共50页36#include void main() char xdata i; for (i=0; i0 x20; i+) XBYTE0 x2000+i=0 x10; C51源程序:第35页/共50页37 例6-3 把ROM从2000H单元开始的数据块传送到外部RAM从1000H开始的存储区中,当数据为0时停止传送。#include void main() unsigned char i=0; while (CBYTE0 x2000+i!=0) XBYTE0 x1000+i=CBYTE0 x2000+ii+;第36页/共50页38例6-4 如果使LED0LED7依次被点亮,其延时时间分别为1s、2s、8s,LED7点亮之后又从LED0开始循环。试编写C51程序实现此功能,设fOSC=11.0592MHz。0.2kXTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427AT89C5130pf30pf10uf12M10k0.2k0.2k0.2k0.2k0.2k0.2k0.2k第37页/共50页39#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;i-) for(j=115;j0;j-); /本句延时1ms 第38页/共50页40void main() while(1) led=0 xfe; for (x=1;x9;x+) delayxms(x);/调用延时子函数,传递参数x led=_crol_(led,1);/循环左移,每次只移1位 第39页/共50页416.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。如果传递参数寄存器不够用,可以使用存储器传送,通过指针取得参数。第40页/共50页42对于有参函数的参数返回值与寄存器之间的传递规律: 表6-4 函数返回值的寄存器返回值返回值寄存器寄存器说明说明bitC进位标志进位标志CY(unsigned)charR7(unsigned)intR6、R7高位在高位在R6,低位在,低位在R7(unsigned)longR4R7高位在高位在R4,低位在,低位在R7floatR4R732位位IEEE格式,指数和符号位格式,指数和符号位在在R7指针指针R1、R2、R3R3放存储器类型,高位在放存储器类型,高位在R2,低位在低位在R1第41页/共50页43例6-5 采用混合编程方法实现例6-4的功能。第一步:在keil中编写C51程序,在需要汇编的地方先写两行代码:#pragma asm.汇编程序内容#pragma endasm第42页/共50页44#include #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);/循环左移函数 第43页/共50页45void delayxs( char y) #pragma asm DELAY: MOV R6, #10 /1s延时程序 DELAY0: MOV R5, #200 DELAY1: MOV R4, #125 DELAY2: DJNZ R4, DELAY2 DJNZ R5, DELAY1 DJNZ R6, DELAY0 DJNZ R7, DELAY #pragma endasm第44页/共50页46第二步:保存文件名为“*.c”。假设该文件名为“li6-5.c”,在项目中加入含汇编语言的.c文件,鼠标点在“li6-5.c”处后右击,在出现的菜单中选择“options for file *”,在弹出的对话框中将“Generate Assembler SRC File”和“Assemble SRC File”两项选实。第45页/共50页47第三步:装入库文件。根据所选择的编译模式,在工程中添加相应的库文件(如small模式下,库文件为C51S.Lib)。该文件在安装盘下:keilC51LIBC51S.Lib。含有汇编语言的.c文件与其它文件的图标不一样。第46页/共50页48第47页/共50页49最后一步:编译与连接。将程序生成的li6-5.hex文件加载到Proteus中仿真,在软件运行中按“”暂停,然后在“Debug”菜单下点击“8051 CPU registers-U1”,可以查看各个寄存器的参数传递状态。第48页/共50页50本章小结 本章介绍了C51的基本结构、基本数据类型、存储类型以及C51的变量定义和对单片机内部功能寄存器及引脚等的定义,并简要介绍了C51语言的运算符号等基础知识,最后通过C51以及C语言与汇编语言的混合编程介绍了C51语言运用的基本方法。除了本章列举的while、for语句外,还有ifelse语句、switch/case语句等,其用法同ANSI C相同。本章的重点: Keil C51的编程方法。第49页/共50页
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!