




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,C51程序设计基础,主要介绍了C51程序设计基础知识,包括C语言的数据类型、运算符、各种语句、数组与函数等知识,使大家具有单片机C语言程序设计的能力。,学习目的及要求:,2,*2.1 C51程序设计基础知识,*2.2 C51的函数与数组,3,*2.1 C51程序设计基础知识,2.1.1 C51特点,2.1.2 C51编程的例子,2.1.3 C51的标识符和保留字,2.1.4 C51的数据类型,2.1.5 C51的常量,2.1.6 变量,2.1.7 C51的常用运算符,2.1.8 C51的输入输出,2.1.9 C51的基本语句,4,2.1.1 C51特点,C51与ASM51相比,主要具有如下
2、特点:,1)编程调试灵活方便 2)生成的代码编译效率高 3)完全模块化 4)可移植性好 5)便于项目维护管理,5,C51语言与ANSI C的对比,C51与标准C语言对比 相同之处: 语法规则、程序结构、编程方法 差异之处: 数据结构(数据类型、存储模式)、中断处理 本章教学内容: C51的数据结构 C51编程实践与Keil C使用方法,6,7,2.1.2 C51编程的例子,【例2-1】 编程使接在P1.0引脚上的LED闪烁。,8,预处理命令-,函数说明-,全局变量定义-,主函数-,调用函数-,局部变量定义-,程序体,程序体-,9,2.1.2 C51编程的例子,1. 编译预处理部分,程序的第一行
3、是一个“文件包含”处理。程序中包含reg51.h文件的目的是为了要使用P1这个符号,即通知C51编译器,程序中所写的P1是指80C51单片机的P1端口而不是其他变量。 可根据不同的编程需要选择不同的头文件,一般情况下若只用简单控制,只需要下面3个头文件: #include /*寄存器说明头文件*/ #include /*输入/输出说明头文件*/ #include /*部分特殊指令说明头文件*/,10,2.1.2 C51编程的例子,在C语言里,如果直接写P1.0,C编译器并不能识别,而且P1.0也不是一个合法的C语言变量名,所以需给它另起一个名字,这里使用了Keil C的关键字sbit来定义。,
4、2. 说明与定义部分,3. 函数,函数是C51程序的基本单位,一个C51程序至少有一个主函数main(),也可以由一个主函数main()和若干个其他函数构成。函数由函数说明部分和函数体两部分构成。,11,2.1.3 C51的标识符和保留字,标识符用于标识语句、数据类型、函数、变量、数组、存储方式等对象,也就是这些对象的名字。在C语言中,标识符严格区分大小写。在C51编译器中,支持标识符的前32位为有效标识,如果超长,则超长部分被舍弃。 注意:变量名只能由字母、数字、下划线组成,且只能由字母和下划线开头。变量不能是C语言的保留字(或称关键字),即不能使用C语言系统已经有固定含义的单词。,12,2
5、.1.3 C51的标识符和保留字,表2-1 C语言32个保留字,表2-2 C51扩展13个保留字,13,2.1.4 C51的数据类型,数据在计算机内存中的存放情况由数据结构决定。C语言的数据结构是由数据类型决定的,C51的数据类型分为基本数据类型和组合数据类型,组合数据类型是由基本数据类型构造而成的。组合数据类型有数组类型、结构体类型、共同体类型、枚举类型、指针类型和空类型。,14,2.1.4 C51的数据类型,15,float浮点型:,float型数据的长度为4字节,格式符合IEEE754标准的单精度浮点型数据,包含指数和尾数两部分,最高位为符号位,“1”表示负数,“0”表示正数,其次的8位
6、为阶码,最后的23位为尾数的有效数位,由于尾数的整数部分隐含为“1”,所以尾数的精度为24位。,2.1.4 C51的数据类型,16,2.1.4 C51的数据类型,* 指针型:,指针变量本身也是一个变量,在这个变量中存放的是指向另一个数据的地址。这个指针变量要占用一定的内存单元,对不同的处理器其长度不一样,在C51中它的长度一般为13个字节。,17,C51扩充数据类型:bit、sfr或sfr16、sbit,bit 型,关键词bit用于定义一个位变量,语法规则:,bit bit_name = 0或1;,例如:bit door = 0 ; /定义一个叫door的位变量且初值为0,注意:上述变量的物理
7、地址是由编译器分配的,18,sfr或sfr16型,关键词sfr或sfr16用于定义SFR字节地址变量,语法规则: sfr 或 sfr16 sfr_name = 字节地址常数;,51MCU中有21个SFR,如何定义与这些单元相关的变量?,19,例如,sfr P0 = 0 x80; /定义P0口地址80H sfr PCON = 0 x87; /定义PCON地址87H sfr16 DPTR=0 x82; /定义DPTR的低端地址82H,注意:SFR字节地址变量的物理地址是由MCU资源决定的,20,sbit型,部分SFR具有位地址,如何定义与这些位地址相关的变量?,两种位地址表达形式:绝对位地址、相对
8、位地址,21,1)将SFR的绝对位地址定义为位变量名 sbit bit_name = 位地址常数; 例如, sbit CY = 0 xD7;,3)将SFR的相对位位置定义位变量名 sbit bit_name = sfr_name 位位置; 例如, sbit CY = PSW7;,2)将SFR的相对位地址定义为位变量名 sbit bit_name = sfr字节地址 位位置; 例如, sbit CY = 0 xD07;,关键词sbit用于定义SFR位地址变量,三种定义形式:,采用这种方式定义的位地址或字节地址必须在80HFFH之间。,22,C51编译器在头文件“REG51.H”中定义了全部sfr
9、/sfr16和sbit变量。,用一条预处理命令#include 把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。,23,应用举例:,24,2.1.4 C51的数据类型,以上所述的数据类型中只有bit与unsigned char两种数据类型可以直接转换成机器指令。所以C语言中使用的其他数据类型,虽然语句上很简单,但都要C51编译器用一系列机器指令处理这些数据类型。特别是对浮点数,处理起来更加复杂,将明显增加程序的长度与执行时间。因此应该避免使用复杂的数据类型。在编制C51程序时,应该尽可能使用无符号字符变量和位变量。,25,2.1.5 C51的常量,常量是指在程序执行过程中其
10、值不能改变的量。在C51中支持整型常量、浮点型常量、字符型常量和字符串型常量。,整型常量也就是整型常数,根据其值范围在计算机中分配不同的字节数来存放。在C51中它可以表示成以下几种形式: (1) 十进制数。如123、-45、0等。 (2) 十六进制数。以0 x开头表示,如0 x12、-0 x3B等。,1整型常量,26,2浮点型常量,浮点型常量也就是实型常数。有十进制表示形式和指数表示形式。 十进制表示形式又称定点表示形式,由数字和小数点组成,如3.14159、0.36。 指数表示又称科学记数法,常用于表示较大、较小的实型常量,指数形式为: 数字 .数字 e 整数 如:6.021023,可表示成
11、6.02e+23或6.02e23。 -1.610-19,可表示成:-1.6e-19。,27,字符型常量是用单引号括起的字符,如2、A、n等。可以是可显示的ASCII字符,也可以是不可显示的控制字符。,3字符型常量,28,4字符串型常量,字符串型常量由一对双引号括起来的零个或多个字符组成,双引号仅起定界作用,本身并不是字符串中的内容。如“0123”、“Hello!”、“I am a student. ”、“”等。 注意:字符串常量与字符常量是不一样的,一个字符常量在计算机内只用一个字节存放,而一个字符串常量在内存中存放时不仅双引号内的每个字符占一个字节,而且系统会自动的在后面加一个转义字符“0”
12、作为字符串结束符。“0”代表空操作字符,它不引起任何操作,也不会显示到屏幕上。 如字符串student在内存中的存储形式如下:,29,5. 符号常量,#difine False 0 x0; /用预定义语句可以定义常量 #difine True 0 x1; /这里定义False为0,True为1 /在程序中用到False编译时自动用0替换,同理True替换为1 #difine PI 3.1415926;,C51允许将程序中的常量定义为一个标示符,称为符号常量。,30,2.1.6 变量,在程序执行过程中,数值可以发生改变的量称为变量。,变量名与存储单元地址相对应,变量值与存储单元的内容相对应。,例
13、如,在哈佛结构的存储空间中如何建立变量概念?,31,2.1.6 变量,【存储种类】数据类型【存储类型】 变量名,(标准C),(标准C),* 括号项可以缺省(但需有缺省值),C51变量定义的四要素:,(C51特有),(标准C+C51),32,【存储种类】数据类型【存储类型】变量名,共有四个说明符: 1、auto(自动型)变量的作用范围在定义它的函数体或语句块内。执行结束后,变量所占内存即被释放。 2、extern(外部型) 在一个源文件中被定义为外部型的变量,在其它源文件中需要通过extern说明方可使用。 3、static(静态型) 利用static可使变量定义所在的函数或语句块执行结束后,其
14、分配的内存单元继续保留。 4、register(寄存器型) 将变量对应的储存单元指定为通用寄存器,以提高程序运行速度。,缺省存储种类为auto (自动)型变量,33,在定义变量时,必须通过数据类型说明符指明变量的数据类型,指明变量在存储器中占用的字节数。,数据类型,unsigned int i, j, k ;,unsigned char x=100;,float a=3.1415926,34,存储类型,存储类型是用于指明变量所处的单片机的存储区域情况。存储类型与存储种类完全无关。,35,51单片机的 三个逻辑存储空间:,片内数据存储器,片外数据存储器和程序存储器。,36,建立C51存储类型与存
15、储空间的对应关系,37,38,(1)data区,data区的寻址是最快的,所以应该把经常使用的变量放在data区,但是data区的空间是有限的,data区除了包含程序变量外,还包含了堆栈和寄存器组。 data区声明中的存储类型标式符为data,通常指片内RAM的低128字节的内部数据存储的变量,可直接寻址。 声明举例如下: unsigned char data system_status=0; unsigned int data unit_id2; char data inp_string16;,39,(2)bdata,bdata实际是data中的位寻址区,在这个区中声明变量就可以进行位寻址。
16、位变量的声明对状态寄存器来说是十分有用的,因为它可能仅仅需要某一位,而不是整个字节。 以下是在bdata区中声明的位变量和使用位变量的例子:,40,unsigned char bdata status_byte; unsigned int bdata status_word; unsigned long bdata status_dword; sbit stat_flag=status_byte4; if(status_word15) stat_flag=1;,41,(3)idata区,idata区也可以存放使用比较频繁的变量,使用寄存器作为指针进行寻址。idata区声明中的存储类型标识符为i
17、data,指内部的256字节的存储区,但是只能间接寻址,速度比直接寻址慢。,unsigned char idata system_status=0; unsigned int idata unit_id2; signed char idata inp_string16; float idata out_value;,42,(4)pdata区和xdata区,pdata区和xdata区属于外部数据存储区,外部数据区是可读可写的存储区,最多可以有64KB。 在这两个区,变量的声明与在其他区的语法是一样的,但pdata区只有256字节而xdata区可达65536字节。,43,unsigned char
18、 xdata system_status=0; unsigned int pdata unit_id2 ; char xdata inp_string16 ; float pdata out_value;,外部地址段中除了包含存储器地址外,还包含I/O器件的地址。对外部器件寻址可以通过指针或C51提供的宏,使用宏对外部器件I/O口进行寻址更具可读性。,44,(5)程序存储区code,程序存储区的数据是不可改变的,跳转向量和状态表对code段访问和对xdata区访问的时间是一样的。编译的时候要对程序存储区中的对象进行初始化,否则就会产生错误。 程序存储区code声明的标识符为code,在C51语
19、言编译器中可以用code存储区类型标识符来访问程序存储区。下面是程序存储区声明的例子: unsigned char code a = 0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07,0 x08,0 x09,0 x10,0 x11,0 x12,0 x13,0 x14,0 x15;,45,变量存储类型定义举例:,unsigned char data var1; bit bdata flags; float idata x,y,z; unsigned int pdata dimension; unsigned char xdata vector1044
20、;,46,编译模式,Keil C51定义变量时如果省略“存储类型”选项, 则按编译时使用的编译模式SMALL、COMPACT或LARGE来规定默认存储类型,确定变量的存储器空间。,47,编译模式,编译模式 默认存储类型 SMALL DATA,变量被定义在8051片内数据 存储器中。 COMPACT PDATA,变量被定义在分页寻址的 片外数据存储器中, 每一页片外数据 存储器的长度为256字节。 LARGE XDATA,变量被定义在片外数据 存储器中(最大可达64K字节), 。,48,变量名可以由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度随编译系统而定。,变量名
21、具有字母大小写的敏感性,如SUM和sum代表不同的变量。 强调:头文件中定义的变量都是大写的,若程序采取小写变量则需要重新定义。,【存储种类】数据类型【存储类型】变量名,49,unsigned char data system_status = 0;,/定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。,数据结构定义举例,变量名为system_status,位于片内RAM区,无符号字符型,自动型,初值为零,50,unsigned char bdata status_byte;,unsigned int code unit_id2=0 x1234, 0 x8
22、9ab;,static char m, n;,/定义status_byte为无符号字符型自动变量,该变量位于bdata区,/定义unit_id2为无符号整型自动变量,该变量位于code区中,是长度为2的数组,且初值为0 x1234和0 x89ab。,/定义m和n为有符号字符型静态变量。,51,使用C51变量时应注意的问题,尽量使用短变量 尽量使用无符号变量 尽量避免使用浮点类型变量或指针 在编程时,为了书写方便,经常使用简化的缩写形式来定义变量的数据类型: #define uchar unsigned char 使用位变量。 用局部变量代替全局变量 为变量分配内部存储区,52,2.1.7 C5
23、1的常用运算符,学习C51运算符要注意3点:优先级、结合方向、与数学运算符的区别。,1运算符 1) 赋值运算符 格式:变量=表达式; 执行时先计算出右边表达式的值,然后赋给左边的变量。,a = 0 xFF; b = c = 33; d = e; f = a+b;,53,格式:表达式1算术运算符表达式2;,算术运算符,54,unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f; unsigned char count; P0=tablecount/10; P2=tablecount
24、%10;,55,设有定义:int a = 1, b = 2, c; 则有:,算术运算符,56,关系运算用于比较两个数的大小,用关系运算符将两个表达式连接起来形成的式子,称为关系表达式。,关系运算符,关系运算的结果为逻辑量,成立为真(1),不成立为假(0)。,57,逻辑运算符,逻辑运算符则用于求条件式的逻辑值。用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。,58,位运算符,若a=11000011B,将a值循环右移2位,59,unsigned char data x=0 x23; unsigned char data a,b; a=x4; /*取x的高4位*/ b=x /*取x的低
25、4位*/ ,【例2-7】用“右移”4位方式分离一个压缩BCD码的两个BCD码,60,复合赋值运算符,复合赋值运算的一般格式如下: 变量 复合运算赋值符 表达式,61,复合赋值运算符,例如: a+=b /a=(a+b) x*=a+b /x=(x*(a+b) a 被指向变量和指针变量位于C编译器默认的内存区域中。,标准C语言指针的一般定义形式为: 数据类型 *指针变量名;,例如: int a =0 x1234; int *p1= ,64,C51的指针,在C51里定义指针,需要额外说明两个问题: 1)指针变量自身位于哪个存储区域? 2)被指向变量位于哪个存储区中?,65,数据类型被指向变量的数据类型
26、,不能缺省; 存储类型1被指向变量所在的存储区类型,缺省时根据该变量的定义语句确定; 存储类型2指针变量所在的存储区类型,缺省时根据C51编译模式的默认值确定; 指针变量名按C51变量名的规则选取.,C51指针的一般定义形式: 数据类型 【存储类型1】 * 【存储类型2】 指针变量名,66,例1 char xdata a = A; char * ptr = ,举例说明C51指针定义的用法 (SMALL编译模式下),ptr是一个指向char型变量的指针变量; 它本身位于SMALL编译模式默认的data存储区里; 它的值是位于xdata存储区里的char型变量a的地址; “存储类型1” 缺省时,靠
27、被指向变量的定义确定存储类型。,67,例2 char xdata a = A; char xdata *idata ptr = ,【解】 ptr是固定指向xdata存储区的char型变量的指针变量; 它自身存放在idata存储区中; “存储类型2”存在时, ptr 指针具有明确的存储区域。,68,int * pointer_1, * pointer_2; int a=100,b=10; int x,y; pointer_1=,69,2.1.9 C51的基本语句,在表达式的后边加一个分号“;”就构成了表达式语句。注意不能丢掉或输入为全角符号。,1表达式语句,仅由一个分号“;”占一行形成一个表达式
28、语句,这种语句称为空语句。,70,复合语句,复合语句是由若干条语句组合而成的一种语句,在C51中,用一个大括号“”将若干条语句括在一起就形成了一个复合语句,复合语句最后不需要以分号“;”结束,但它内部的各条语句仍需以分号“;”结束。复合语句的一般格式为:, 局部变量定义; 语句l; 语句2; ,71,复合语句是允许嵌套的,在执行时,其中的各条单语句按顺序依次执行,整个复合语句在语法上等价于一条单语句。在复合语句内部语句所定义的变量,称为该复合语句中的局部变量,它仅在当前这个复合语句中有效。,复合语句,72,分支语句,if语句是C51中的一个基本条件选择语句。 (1)不带else的if语句,格式
29、如下: if (表达式) 语句; (2)带else的if语句,格式如下: if (表达式) 语句1; else 语句2;,if语句:,if(表达式1)语句1; else if(表达式2)语句2; else if(表达式3)语句3; else 语句n;,73,switch (表达式) case 常量表达式1:语句1;break; case 常量表达式2:语句2;break; case 常量表达式n:语句n;break; default:语句n+1; ,switch/case语句,分支语句,switch是C51中提供的专门处理多分支结构的多分支选择语句。格式如下:,74,说明: (1)switch
30、后面括号内的表达式,可以是整型或字符型常量表达式。 (2)将switch后条件表达式的值与case后的各常量比较,转到值相等的那个case标号后的语句块执行,执行过程中一旦遇到break语句,则跳出switch语句;如果无一值相等,则执行default后的语句n+1. (3)每个case语句后面可以有break,也可以没有。有break语句,执行到break则退出switch结构;若没有则顺次执行后面的语句,直至遇到break或结束。,75,【例2-11】51单片机的P1.0和P1.1引脚接有2只按键,其4种逻辑组合分别点亮由P2.0P2.3控制的4只LED(低电平点亮)。,76,#inclu
31、de void main() char a; while(1) P1=0 xff ; a=P1; a=a ,77,循环语句,基于while构成的循环 基于do-while构成的循环 基于for语句构成的循环,78,while语句在C51中用于实现当型循环结构。 格式: while(表达式) 语句; /*循环体*/,基于while构成的循环,while语句后面的表达式是能否循环的条件,后面的语句是循环体。当表达式为非0(真)时,就重复执行循环体内的语句;当表达式为0(假),则中止while循环,程序将执行循环结构之外的下一条语句。,79,do - while语句用于实现直到型循环结构。 do 语
32、句;/*循环体*/ while(表达式),先执行循环体中的语句,后判断表达式。如表达式成立(真),则再执行循环体,然后又判断,直到有表达式不成立(假)时退出循环,执行do-while结构的下一条语句。任何do-while的循环体至少会被执行一次。,基于do-while构成的循环,80,格式: for(表达式1;表达式2;表达式3) 语句;/*循环体*,在for循环中,一般表达式1为初值表达式,用于给循环变量赋初值;表达式2为条件表达式,对循环变量进行判断;表达式3为循环变量更新表达式,用于对循环变量的值进行更新,使循环变量能不满足条件而退出循环。,基于for语句构成的循环,81,#includ
33、e void main( ) int i, s; s=0; for(i=0;i=100;i+) s=s+i; printf(“1+2+100=%dn”,s); ,82,void Delay1Unit( void ) /用软件产生1s延时 unsigned int i, j; for( i=0; i1000; i+ ) for( j=0; j100; j+ ); /调整j,产生1ms延时 ,【例2-15】用嵌套结构构造一个1s延时程序。,83,2.2 C51的预处理命令,C51语言中提供了各种预处理命令,其作用类似于汇编程序中的伪指令。 预处理命令通常只进行一些符号的处理,并不执行具体的硬件操作
34、。C51的预处理命令包括文件包含命令、宏定义指令和条件编译指令。预处理命令前要加一个“#”。,84,文件包含,#include或 #include “文件名”,文件包含是指一个程序文件将另一个指定的文件的全部内容包含进去。,采用格式时,在头文件目录中查找指定文件,采用文件名格式时,在当前目录中查找指定文件。 #include命令末尾不需要分号“;”结束。 #include命令只能调入ASCII文本文件。,85,#include #include #include “myfile1.h” void main( ) int i,sum=0; for(i=0;i=20;i+) sum=sum+fun
35、(i); printf(“sum=%dn”,sum); ,myfile1.h文件的内容如下: int fun(int i) int mu1; mu1=i*i; return(mu1); ,86,宏定义,宏定义语句属于C51的预处理指令,可以增加程序的可读性、可维护性和可移植性。有简单的宏定义和带参数的宏定义。,#define uchar unsignedchar #define uint unsigned int #define PI 3.1415926,87,宏定义,#include #include sbit SDA=P10; sbit SCL=P11; #define NUM 10 #d
36、efine delayNOP( ) _nop_();_nop_();_nop_();_nop_(); unsigned char idata sendbufNUM; unsigned char idata receivebufNUM; bit bdata SystemError;,88,2.3 C51的函数,函数是指能够执行特定功能和任务的程序代码段。一个完整的C51程序是由一个主函数和若干个其他函数组成。 主函数即main( )函数,有且只有一个main( )函数,其它函数数目不限制; main( )函数可以调用其他函数,但不允许被其他函数调用,其他函数之间允许互相调用。,89,函数的定义,
37、函数类型 函数名(形式参数表) 函数体 ,函数体中能包含有局部变量的定义和程序语句,如函数要返回运算值则要使用return语句进行返回。在函数的号中也可以什么也不写,这就成了空函数。,90,1函数类型 函数类型说明了所定义函数返回值的类型。如函数不需要返回值函数类型可写作“void” 。注意:函数体返回值的类型一定要和函数类型一致,否则会造成错误。,函数的定义,2形式参数表 形式参数是指调用函数时要传入到函数体内参与运算的变量,形参可以有一个、几个或没有,当不需要形式参数也就是无参函数,括号内可以为空或写入“void”表示,但括号不能少。,91,函数的返回值,在调用函数的过程中,经常希望得到一
38、个从被调用函数带来的一个结果,这就是函数的返回值。 函数的返回值通过return语句得到。 如果函数有返回值,则返回值的类型就是函数定义的类型。 一个函数只能有一个返回值。,92,函数举例,设计一个延时1ms的软件延时函数delay( ),void delay( ) int i; for(i = 0; i 100; i+); ,如果利用该延时函数,在不同的调用场合实现不同的延时时间。如何修改?,93,函数举例,void delay(int a) int i; while(a-) for(i = 0; i 100; i+); ,94,【例】编写一个无符号字符型数据循环右移n位的函数,若a=110
39、00011B,将a值循环右移2位,95,【例】编写一个无符号字符型数据循环右移n位的函数,unsigned char circulate_right (unsigned char a,n) ,unsigned char b,c; b=an; c=a(8-n); a=b|c; return (a);,96,97,#include void delayms(int ms) /延时函数 int i; while(ms-) for(i = 0; i n; c=a(8-n);a=b|c; return (a); void main() unsigned char scode,i; while(1) sc
40、ode=0 x7f; for(i=0;i8;i+) P2= scode; delayms(150); scode=circulate_right(scode, 1); ,98,【例】键控流水灯,设置 “左”、“右”两个按键,当“左”键按下时,流水灯循环左移;当“右”键按下时,流水灯循环右移。,99,100,unsigned char circulate_right (unsigned char a,n) unsigned char b,c; /循环右移函数 b=an; c=a(8-n);a=b|c; return (a); ,unsigned char circulate_left(unsig
41、ned char a,n) unsigned char b,c; /循环左移函数 b=a(8-n);a=b|c; return (a); ,101,void main() unsigned char xx,scode; int i; Keyleft=1; Keyright=1; while(1) if(Keyleft=0) /左移键按下否 scode=0 xfe; for(i=0;i8;i+) P2= scode;delayms(150); scode=circulate_left(scode, 1); if(Keyright=0)/右移键按下否 scode=0 x7f; for(i=0;i8
42、;i+) P2= scode; delayms(150); scode=circulate_right(scode, 1); ,#include sbit Keyleft=P10; sbit Keyright=P11;,102,中断函数,103,中断函数,51单片机的中断系统十分重要,C51编译器允许在C语言源程序中声明中断和编写中断服务程序,从而减轻了采用汇编程序编写中断服务程序的繁琐程度。,104,中断函数,通过使用interrupt关键字来实现。定义中断函数的一般格式如下:,void 函数名( ) interrupt n using m,using m指明该中断服务程序所对应的工作寄存器
43、组,取值范围:03。指定工作寄存器组的缺点是所有被中断调用的过程都必须使用同一个寄存器组,否则参数传递会发生错误。通常不设定using m。,关键字interrupt后面的n是中断号,n的取值范围:031。,105,用定时器实现1Hz的规律闪烁。,106,定时器中断服务函数,void Time0(void) interrupt 1 /定时器0中断函数 TH0=(65536-50000)/256; TL0=(65536-50000)%256; count+; if(count=10) count=0; LED=!LED; ,107,#include sbit LED=P10; unsigned
44、char count=0; void main(void) TMOD=0 x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; LED=0; while(1) ; ,108,C51的库函数,C51强大功能及其高效率的重要体现之一在于其丰富的可直接调用的库函数,多使用库函数使程序代码简单,结构清晰,易于调试和维护,下面介绍C51的库函数系统。,109,本征库函数和非本征库函数,C51提供的本征函数是指在编译时直接将固定的代码插入当前行,而不是用ACALL和LCALL语句实现的,这样就大大提供了函数访问的效率,
45、而非本征函数则必须由ACALL及LCALL调用。,110,本征库函数,C51的本征库函数只有9个,数目少但都非常有用。,_crol_ , _cror_: 将char型变量循环向左(右)移动指定位数后返回 _irol_ , _iror_ : 将int型变量循环向左(右)移动指定位数后返回 _lrol_ , _lror_ : 将long型变量循环向左(右)移动指定位数后返回,111,本征库函数,_nop_ :相当于插入NOP _testbit_ :相当于JBC bitvar测试该位变量并跳转同时清除。 _chkfloat_ :测试并返回源点数状态。,使用时,必须包含#inclucle 一行。,11
46、2,本征库函数,#inclucle void main() unsigned int y; y0 x00ff; y_irol_(y,4); ,运行后,y0 x0ff0。,113,非本征库函数,C51提供了丰富的非本征库函数资源,包括大量的关于I/O操作、内存分配、字符串操作、数据类型转换、数学计算等函数库。它们是以执行代码的形式出现,供用户在连接定位时用。在用预处理器命令#include包含相应的头文件后,就可以在程序中使用这些函数。,114,非本征库函数,1. 专用寄存器包含文件 REG51.h 2. 绝对地址包含文件 absacc.h 3. 动态内存分配函数位于stdlib.h中 4. 缓
47、冲区处理函数位于“string.h”中 5. 输入输出流函数位于“stdio.h”中 6. 算数运算函数位于math.h,115,绝对地址包含文件absacc.h,用预处理器伪指令#define为各空间的绝对地址定义宏数组名如下:,#define CBYTE(unsigned char*)0 x500000L) #define DBYTE(unsigned char*)0 x400000L) #define PBYTE(unsigned char*)0 x300000L) #define XBYTE(unsigned char*)0 x200000L),/*code空间*/,/*data空间*/,/*pdata空间*/,/*xdata空间*/,以上存取对象是char类型字节,116,绝对地址包含文件absacc.h,#define CWORD(unsigned char*)0 x500000L) #define DWORD (unsigned char*)0 x400000L) #define PWORD (unsigned char*)0 x300000L) #define XWORD (unsigned char*)0 x200000L),存取对象是int类型字,117,绝
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版高端酒店装修工程采购合同范本
- 2025版办公室装修工程设计与施工质量保障合同
- 二零二五年度生物制品测试加工专项合同
- 二零二五年度信息安全责任与义务保障协议书合同
- 二零二五年宾馆客房卫生间洁具更换合同
- 2025版互联网公司员工保密竞业及竞业禁止合同
- 二零二五年度智慧社区管理系统销售合同模板
- 2025年度智能化设备安装服务合同高端定制
- 2025版环保设备采购与运营维护服务合同范本
- 聚焦2025年农产品深加工产业园区建设与农村电商合作模式研究报告
- 胸腔积液PPT.ppt 课件
- 断指再植术后的切口
- 曾国藩为官之道
- 李中莹心理创伤简快辅导技巧(课堂PPT)
- Q∕GDW 12205-2022 高压柔性直流输电系统控制保护联调试验技术规范
- VS1真空断路器说明书
- JTT230-2021汽车导静电橡胶拖地带_(高清-最新)
- 监理周例会总承包单位工作汇报PPT课件
- 四大经典之温病
- 四氯化硅的提纯
- 《小学公开课教研活动总结》
评论
0/150
提交评论