您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第5章 单片机C51程序设计基础
第5章单片机C51程序设计基础5.1C51特点C51程序结构与标准C语言程序结构相同,采用函数结构,有一个且只有一个main()函数。C51特点1、C51中定义的库函数与标准C定义的库函数不同,C51是按照单片机结构来定义的。2、C51的数据类型与标准C有一定的区别,增加了几个单片机类型。3、C51存储类型与标准C变量的存储类型不同,C51的存储模式与单片机的存储器密切相关。4、C51在函数使用方面与标准C有不同,C51中有专门的中断函数。一、C51数据类型1、与标准C中相同的基本数据类型:字符型Char:8位,默认是signedchar范围:128~+127unsignedchar范围:0~255整型Int:16位,默认是signedint范围:-32768~+32767unsignedint范围:0~65535短整型Short:16位长整型long:32位默认是signedlong范围:-2147483648~+214748364unsignedlong范围:0~4294967295单精度浮点数float:32位。双精度浮点数double:64位。2、特殊功能寄存器型C51特有的数据类型,用于访问单片机中的特殊功能寄存器主要介绍两种:sfr,sfr16sfr:字节型特殊功能寄存器类型,可以访问单片机内部所有的特殊功能寄存器。sfr16:双字型特殊功能寄存器类型注:在C51中对所有的特殊功能寄存器的访问都需要用这两个类型说明符进行说明定义格式:sfr(sfr16)特殊功能寄存器名=地址;例:特殊功能寄存器的定义sfrPSW=OXD0;sfrP0=0X80;。3、位类型用于访问单片机中的可寻址的位单元,C51支持两种位类型:bit类型和sbit类型用sbit定义的位变量与单片机中的一个可以寻址的位单元相联系。格式:sbit位变量名=位地址例:sbitCY=0XD7;sbitACC=0XD6;说明:1、keil公司的C51开发软件提供有reg51.h和reg52.h头文件,进行了相应的特殊功能寄存器和位的定义。在程序中加入51头文件#includereg51.h2、在程序中自定义位地址格式有三种Sbit位变量=特殊寄存器名^位号例:sbitkey=P0^0;sbitP0_1=P0^1;sbit位变量=直接位地址例:sbitkey=0x80h;sbitP0_1=0x81h;Sbit位变量=字节地址^位号例:sbitkey=0x80h^0二、C51数据的存储类型变量存储类型可以由关键词指定,或是有存储模式指定。1、关键词指定直接用关键词声明变量数据的存储类型类型关键字存储区描述dataDATA单片机内部RAM空间的低128字节,可在一个周期内直接寻址。bdataBDATADATA区中可以字节、位混合寻址的16字节位寻址区。idataIDATA52系列的单片机内部RAM高128字节,必须采用间接寻址。xdataXDATA片外RAM,地址范围64KB,使用DPTR间接寻址。pdataPDATA片外RAM的低256字节,可通过P0口的地址对其寻址。codeCODE程序存储区,内容只读,使用DPTR寻址。例:chardatavar1;在片内RAM的低128B定义用直接寻址方式访问的字符型变量unsignedintbdatavar2;在位寻址区定义变量var2unsignedcharxdataadda[128];在片外RAM区定义128个存储单元intcodevar3;在ROM空间内定义整型变量var3,说明:code程序存储区的数据时不可更改的,通常将程序中固定不变的数据声明为code类型例:共阴极七段数码管的声明unsignedcharcodeled[]={0x37,0x06,0x5b…};2、存储模式存储模式决定了没有明确指定存储类型的变量的缺省存储区域。3种存储模式:Small模式,所有缺省变量参数均装入内部RAM。优点是速度快Compact模式,所有缺省变量均位于外部RAM区的一页(256个字节),优点是可用空间较Small宽裕,速度比Small慢但比Large要快。Large模式,所有缺省变量可放在多达64KB的外部RAM区。优点在于空间大,可存变量多,缺点是速度较前两种模式要慢。在程序中如何定义:变量存储模式:#pragma预处理命令实现例:#pragmacompactchari;函数存储模式:函数定义时后面带存储模式例:intfunc1(intx1)large说明:如变量和函数定义缺省存储模式,则默认为是small模式。三、C51的运算符和表达式1、赋值运算符2、算术运算符2、关系运算符3、逻辑运算符4、位运算符四、C51程序结构三种基本结构:顺序结构、选择分支结构和循环结构1、选择分支结构使用的语句:if语句,switch/case语句if(条件){语句}else{语句}多分支选择常用switch/case语句switch(表达式){case值1:语句;break;case值2:语句;break;default:语句;break;2、循环结构提供三种循环结构:for语句,while语句,do–while语句while型循环结构dowhile型循环结构C51软件和硬件配合使用,在程序中经常使用无限循环语句for(;;;)while(1){}五、C51函数1、函数的定义函数类型函数名(形参)[interruptm][usingn]{局部变量定义函数体}(1)函数类型是函数返回值的类型,无返回值,定义为void(2)无函数没有参数传递,形参也没有或是void(3)interruptm修饰符中断程序必须使用此修饰符m值0~310-外部中断01-定时器/计数器02-外部中断13-定时器/计数器14-串行口中断5-定时器/计数器2说明:中断函数不能进行参数传递,形参为空中断函数没有返回值(4)usingn修饰符功能:指定本函数内部使用的寄存器组n=0~3表示寄存器组号。说明:本修饰符不能用于由返回值的函数。例1:p1口高四位开关控制发光二极管#includereg51.h#includestdio.hsbitp1_0=P1^0;sbitp1_1=P1^1;sbitp1_2=P1^2;sbitp1_3=P1^3;sbitp1_4=P1^4;sbitp1_5=P1^5;sbitp1_6=P1^6;sbitp1_7=P1^7;main(){p1_0=p1_4;p1_1=p1_5;p1_2=p1_6;p1_3=p1_7;}例2:p1口控制数码管#includereg51.h#includestdio.hunsignedcharcodeled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voiddelay(unsignedi){unsignedintj,k;for(j=0;j200;j++)for(k=0;ki;k++);}main(){unsignedinti;while(1){for(i=0;i10;i++){P1=led[i];delay(200);}}}
本文标题:第5章 单片机C51程序设计基础
链接地址:https://www.777doc.com/doc-3195471 .html