单片机C51程序设计基础-201Xppt课件_第1页
单片机C51程序设计基础-201Xppt课件_第2页
单片机C51程序设计基础-201Xppt课件_第3页
单片机C51程序设计基础-201Xppt课件_第4页
单片机C51程序设计基础-201Xppt课件_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,第五章单片机C51程序设计基础,第五章单片机C51程序设计基础,0、标准C语言一、C51变量定义格式二、C51运算符、表达式及其规则三、C51流程控制语句四、C51构造数据类型五、函数六、C51库函数七、C51模块化程序设计,标准C语言,1、C语言程序的基本结构#include预处理命令charfun1();函数说明floatfun2();intx;全局变量说明Viodmain()主函数声明部分函数体执行部分charfun1()功能函数1声明部分函数体执行部分floatfun2()功能函数2函数体,特点:C语言是函数式语言,函数是程序基本组成C程序必须,且只有一个main不论位置,程序总从主程序开始所有变量必须先定义(规定数据类型),再使用每个语句必须用分号“;”结束使用库函数,必须使用“文件包含”,、函数定义函数返回值类型函数名(形式参数)形式参数说明局部变量说明函数体语句,一、标准C语言,1、keilC和ANSIC的异同2、变量定义格式3、单片机特有的数据类型,一、C51变量定义格式,1、keilC和ANSIC的异同C51主要针对51系列单片机的结构进行程序设计2、变量定义格式C语言:存储属性数据类型变量名表(普林斯顿型存储结构)C51:存储属性数据类型存储类型变量名表(哈佛型存储结构)例:staticunsignedchardatax1)存储属性指定变量存放区域的属性。(确定生命周期)内部变量(auto)堆栈中。仅在函数调用时存在,退出消失(默认值)(static)固定地址。始终存在,函数体内可访问。(register)直接使用硬件寄存器,效率高外部变量(global)固定地址,始终存在,并可访问(默认值)(extern)(static)固定地址。始终存在,若为多文件程序,仅在所定义的模块文件可访问,一、C51变量定义格式,C51:存储属性数据类型存储类型变量名表2)存储类型确定变量存储区显式声明unsignedchardatax默认存储类型,一、C51变量定义格式,C51:存储属性数据类型存储类型变量名表2)存储类型确定变量存储区显式声明:autounsignedchardatax;unsignedchardatax;unsignedcharx;默认存储类型:由Cx51编译器存储模式决定SMALL模式:默认存储类型为data.快速、高效COMPACT模式:默认存储类型为pdata.片外RAM256B,通过R0/R1间接寻址。LARGE模式:默认存储类型为xdata.空间64KB,通过数据指针DPTR间接寻址。,一、C51变量定义格式,C51:存储属性数据类型存储类型变量名表3)数据类型确定存储单元长度,一、C51变量定义格式,单片机特有的数据类型:bit位变量,值为0或1sbit声明可位寻址空间的一个位sfr特殊功能寄存器,8位sfr16特殊功能寄存器,16位,C语言已有基本数据类型:Char:单字节,可以存放一个字符。Int:整数,对大多数单片机开发软件而言是双字节大小float:单精度浮点数。double:双精度浮点数。Signed、unsigned限定:char、int类型Short、long限定:int类型,C51:存储属性数据类型存储类型变量名表3)数据类型确定存储单元长度,一、C51变量定义格式,3、单片机特殊功能寄存器的C51定义,(1)sfr:声明字节寻址的特殊功能寄存器。例如:sfrP0=0 x80;,(2)sfr16:该关键字对于一些8051派生系列单片机,可以声明其内两个连续地址的特殊功能寄存器(SFR)。例如:sfr16T2=0 xCC;,(3)sbit:声明可位寻址的特殊功能寄存器标志位。“=”号后将绝对地址赋给变量名,声明形式有以下3种:,用已声明的sfr寄存器名指定位;例如:sbitKEY_UP=P01;/指定P0的第1位连接UP按键。,用寄存器地址指定位;例如:sbitKEY_UP=0 x801;,直接用寄存器标志位地址。例如:sbitKEY_UP=0 x81;,一、C51变量定义格式,3、单片机特殊功能寄存器的C51定义,(4)8051并行接口及位变量的C51定义,REG51.h和REG52.h这两个头文件,sfrP0=0 x80;sfrP1=0 x90;sfrP2=0 xA0;sfrP3=0 xB0;,AT89X51.H头文件,sbitP0_0=0 x80;sbitP0_1=0 x81;sbitP0_2=0 x82;,sfrSEGDATA=P0;/*数码管数据端口*/sbitSEL0=P10;/*数码管0片选端口*/sbitSEL1=P11;/*数码管1片选端口*/sbitKEY_SET=P17;/*设置按键*/,程序头包含定义SFR的头文件后,可直接使用,为提高程序可读性,可重定义,一、C51变量定义格式,1、算术运算符:*/%2、自增减运算符:+-例:若intx=3,y;求y=x+-1,y=+x-1,y=x-+1后的(x,y)结果:(4,2)(4,3)(2,4)3、复合赋值运算符:+=-=*=/=%=4、关系运算=(位右移)例:charc=c|0 x0f;置位c=ca左移2位并赋值给b,二、C51运算符、表达式及规则,先计算再自+,先自+再计算,7、条件运算符?:if为真,则返回表达式2的值;为假,则返回表达式3的值例:a=(b0)?b:-b;ifb0,thena=b;ifb0)y=x+2;elsey=abs(x);return(y);,二、选择语句选择语句有三种:if语句、switch/case语句和条件表达式Switch/case语句switch(x)casec1:语句组1;break;/ifx=c1,执行语句组1后退出casec2:语句组2;break;default:语句组n+1;break;条件表达式?:,三、C51流程控制语句语言,二、循环语句循环语句有三种:for语句、while语句和do-while语句for语句一般形式:for(初始化;条件表达式;表达式3)循环语句(组);/循环体用于构成当型循环:先判断后执行,条件为真继续循环,假结束for()中初始化及表达式可缺省,但两个分号“;”不可缺例:求i=1+2+3+99+100(i=0100)main()unsigndeintdatai,sum=0for(i=1;i=100;i+)sum=sum+i;/循环100次,三、C51流程控制语句语言,二、循环语句循环语句有三种:for语句、while语句和do-while语句while循环语句一般形式:while(条件表达式)循环语句(组);/循环体用于构成当型循环:先判断后执行,条件为真继续循环,假结束do-while循环语句一般形式:do循环语句(组);/循环体while(条件表达式);用于构成直到型循环:先执行循环体,再判断条件为真继续循环,假结束,三、C51流程控制语句语言,main()unsigndeintdatai,sum;i=sum=0;while(i+100)sum+=i;,main()intai,sum;i=1;sum=0;dosum+=i;while(i+100);,四、C51构造数据类型,1数组,2指针,3结构体,4共用体,5枚举,1、数组一维数组和多维数组unsigndechardataa5;unsigndechardatab23;数组的初始化,例:在LED中循环显示09。#includesfrsegcon=P1;sbitbitcon=P20;voidmain()unsignedcharcodeled10=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;unsignedintx;/*x=09*/while(1)for(x=0;x=9;x+)segcon=ledx;bitcon=1;/*共阳LED*/delay(2);,四、C51构造数据类型,五、函数,include/预处理命令longfun1();/函数说明floatfun2();intx,y;/全局变量说明,作用域为整个源程序floatz;func1()/功能函数1局部变量说明;/作用域限于函数体内函数体;Main()/主函数局部变量说明;/主程序内部定义的变量也为局部变量主函数体;func2()/功能函数2局部变量说明;函数体;,一、C语言程序的一般组成结构,五、函数,一、C语言程序的一般组成结构,函数定义函数返回值类型函数名(形式参数)/形参作用域限于调用期间形式参数说明局部变量说明函数体语句,五、函数,二、C51中断服务程序,1.中断服务函数的定义,返回值类型标识符函数名()interrupt中断号using寄存器组号函数体语句;,中断函数不能进行参数传递;中断函数没有返回值;建议定义为void类型在任何情况下都不能直接调用中断函数,否则会产生编译错误。C51编译器对中断函数自动的现场保护和恢复。(ACC、B、DPH/L、PSW)using修饰符,用于指定中断函数内部使用的工作寄存器组取值为03interrupt修饰符,指明函数为中断函数。MCS51对应的中断号为05。该向量包含一个到中断函数入口地址的绝对跳转。,voidint1()interrupt2using1count+;/count为全局变量,例:统计外中断1的中断次数的中断服务程序,五、函数,三、局部变量和全局变量,按作用域范围可分为两种:即局部变量和全局变量。,1.局部变量,局部变量也称为内部变量。作用域仅限与函数内。,局部变量是在函数内作定义说明的。,intf1(inta)/a为形参,函数调用期间有效intb,c;/b,c局部变量,main()intm,n;/m,n局部变量,作用域限于main函数内,五、函数,三、局部变量和全局变量,按作用域范围可分为两种:即局部变量和全局变量。,2.全局变量,全局变量也称为外部变量,函数外部定义的变量。其作用域是整个源程序。并遵循先定义后使用的原则,inta,b;/外部变量,作用域整个程序voidf1()/函数f1floatx,y;/外部变量,作用域f2之后。若f1对x,y说明,则可用intf2()/函数f2main()/主函数,五、函数,举例:输入正方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。,ints1,s2,s3;intvs(inta,intb,intc)intv;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;returnv;main()intv,l,w,h;printf(ninputlength,widthandheightn);scanf(%d%d%d,六、C51库函数1、一般I/O函数stdio.h,六、C51库函数2、字符函数库string.h,六、C51库函数3、标准函数库stdlib.h及其它头文件,(1)标准函数库(STDLIB.H)头文件中包含类型转换和存储器分配函数的原型和定义,如下所列:,atofatoiatolcallocinit_mempoolmallocrandreallocstrtodstrtolstrtoulfreerand,(2)数学函数库(math.h)头文件中包含所有浮点运算函数的定义和原型,其它的数学运算函数也包含在该文件中,所有的数学运算函数如下:,absacosasinstanstan2cabscoscoshexpfabsfloorfmodfprestorefpsaavelabsloglog10modfpowsinsinhsqrttantanh,六、C51库函数3、标准函数库stdlib.h及其它头文件,(3)绝对地址访问(absacc.h)头文件中包含的宏定义允许用户直接访问8051单片机的不同存储区,所有的宏定义如下:,CBYTECWORDDBYTEDWORDFARRAYFCARRAYFCVARFVARPBYTEPWORDXBYTEXWORD,(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.hreg152.hreg320.hreg410.hreg451.hreg452.hreg509.hreg51.hreg515.hreg515a.hreg515c.hreg517.hreg517a.hreg51f.hreg51g.hreg51gb.hreg52.hreg552.hreg592.hreg781.h,七、C51模块化程序设计,一、基本概念,程序的组成程序有数据说明和数据操作两部分组成。从结构化角度看,程序应由模块化函数组成。,七、C51模块化程序设计,一、基本概念,2.常用名词,(1)文件,C51文件扩展名如下:.ASM或.A51汇编语言源文件.C或.C51C51语言源文件.H编译时源文件中的头文件.LST汇编/编译的程序和错误列表文件.ERR错误报告文件.OBJ可重定位的目标模块文件.LIB库文件.LNK连接/定位器使用的文件.MAP或.MAP连接/定位后产生的映像文件.HEX连接/定位后产生的目标文件,七、C51模块化程序设计,一、基本概念,2.常用名词,(2)源程序文件,源程序文件是由用户编制的由一个或多个函数组成的完成特定功能的程序代码。,(3)目标文件,目标文件是单片机可执行的程序文件,它包含着用户开发的运行在单片机上的机器代码。,(4)汇编器/编译器,汇编器是针对汇编语言程序的,而编译器是针对高级语言(如C语言)程序的。它们被用来将源程序翻译成单片机可执行的目标代码,从而产生一个目标文件。,七、C51模块化程序设计,一、基本概念,2.常用名词,(5)段,段与数据或者程序存储器有关,即程序段和数据段。一个段有段名、类型以及属性,它们在存储器中的位置由用户指定或者由连接器/定位器确定。,(6)模块,模块是包含一个或多个段的文件。一个模块通常为显示、计算或与下层接口有关的函数或子程序,能够单独完成一定的功能。,(7)库,库是包含一个或者多个模块的文件。库中的这些模块通常是由编译或者汇编得到的可重定位的目标模块。连接器仅从库中选取与其他模块相关的模块进行连接。,七、C51模块化程序设计,一、基本概念,2.常用名词,(8)连接/定位器,连接器将一个程序的多个源文件产生的各个目标文件按照一定规则与用户自定义库文件和标准库文件连接起来。定位器将地址分配给程序中的各个段。经过连接、定位后,生成绝对目标文件(单片机可执行的文件)和映像文件(提供给程序员的最终个空间映像表)。,(9)应用程序,应用程序是整个开发过程的最终结果,并最终在单片机用户系统中运行,完成设计功能。,七、C51模块化程序设计,二、模块化程序开发过程,项目规划,汇编源文件,汇编Ax51,C源文件,编译Cx51,库文件,链接/定位,目标文件,固化到单片机/或下载,调试通过,项目完成,修改,N,七、C51模块化程序设计,二、模块化程序开发过程,每一个C源文件都建立一个与之名字一样的H文件(头文件),其中仅包括该C文件中的函数的声明。建立一个所有的文件都要共同使用的头文件(文件名可取为common.h),该头文件可以包含单片机管脚使用的定义,还有那些必需的编译器系统头文件(如reg52.h,absacc.h等等)。每个C源文件应该包含自己的头文件以及common.h,C文件内可以定义该文件内部使用的全局变量,如果在其他文件中还要访问这个全局变量,可以在其头文件中以extern再次定义该全局变量。,七、C51模块化程序设计,二、模块化程序开发过程,主文件main.c里面包含所有C源文件对应的头文件和common.h,main.c中的函数可以再建一个头文件main.h声明,也可以直接放在main.c文件的开头部分声明,中断服务程序一般也放在main.c文件中。对于那些贯穿整个工程的变量,可以先在main.c文件中定义,然后在common.h文件中用extern关键字再次声明一遍,哪个文件要使用就只需包含common.h文件即可。建立工程的时候,只要把C源文件加到工程中,把H文件直接放到相应的工程目录下,不需要加到工程里面。,例1:延时程序voiddelay(unsignedintx)unsignedcharj;while(x-)for(j=0;j0)y=x+2;elsey=abs(x);return(y);,八、keil-C51应用实例,第10章KeilC51软件使用简介,软件开发流程创建一个项目从器件数据库中选择目标器件,并配置工具软件的设置用C或汇编创建源程序编译程序,生成HEX可执行程序调试程序,纠正源文件中的错误固化程序,软件设置Target对话框选项,Vision3集成开发环境,【例3】设MCS-51单片机系统时钟频率fosc为6MHz,请编出利用定时/计数器T0在P1.0引脚上产生周期为2s,占空比为20%的方波信号的程序,C程序:#include#defineucharunsignedcharuchartime;ucharperiod=20;ucharhigh=4;sbitp1_0=P10;voidtimer0()interrupt1using1TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(+time=high)p1_0=0;if(time=period)time=0;p1_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显示程序:#defineucharunsignedchar#definePAXBYTE0 x0000/定义A口#definePCXBYTE0 x0002/定义C口uchardatadispbuff4;/显示缓存ucharcodeledtab10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07H,0 x7f,0 x6f;/定义LED字形码voiddisplay()uchari,x;uchardisnum=4;/显示位数ucharbitcom=0 x10;/显示位控码for(i=0;idisnum;i+)x=disbuffi;/取显示数据PA=ledtabx;/取字形码送PA口PC=bitcom;/取位控码送PC口bitcom=bitcom1;/位控码左移1位delay(2);,例4LED动态显示方式用8255A控制键盘及4位LED,实现动态显示,5DAC的应用,C语言程序设计设计锯齿波发生器。幅值-5V0,频率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#defineDA0832XBYTE0 xfffe/DAC地址#defineucharunsignedcharvoidstair(void)uchari;while(1)for(i=0;i=250;i+)/形成锯齿波输出值DA0832=i;/D/A转换输出_nop_;/空操作,6DAC的应用DAC双缓冲方式应用同步波形输出同时输出X和Y波形到示波器,C程序设计:#include#include#defineINPUTR1XBYTE0 xfffd/定义#defineINPUTR2XBYTE0 xfffe/端口#defineDACRXBYTE0 xffff#defineucharunsigneducharvoiddac2b(data1,data2)uchardata1,data2;INPUTR1=data1;/送数据到1#0832INPUTR2=data2;/送数据到2#0832DACR=0;/启动两路DAC转换,例78路模拟量输入的巡回检测系统C程序设计。,C源程序:#include#include#d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论