C51程序设计基础解析课件_第1页
C51程序设计基础解析课件_第2页
C51程序设计基础解析课件_第3页
C51程序设计基础解析课件_第4页
C51程序设计基础解析课件_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机C51程序设计教程与实验主讲教师:董蕴华实验指导教师:杨其锋单片机C51程序设计教程与实验教学安排本课程共45学时(理论25学时,实验20学时)课程性质:考查 本课程考试以应用程序设计作为考查的评分依据教学安排本课程共45学时(理论25学时,实验20学时)学习本课应具备的基础知识学习本课程应具备的基础知识 单片机原理及应用 C语言程序设计学习本课应具备的硬件 实验板一块 程序下载线一条学习本课应具备的基础知识学习本课程应具备的基础知识本课程主要内容单片机基础知识(复习)C51编程语言及开发环境Keil uVision功能模块的C语言编程实现本课程主要内容单片机基础知识(复习)MCS-51

2、系列单片机的结构 (1)面向控制的8位CPU; (2)128B的片内数据存储器; (3)可以寻址64KB的片外程序存储器; (4)可以寻址64KB的片外数据存储器; (5)32根双向和可单独寻址的I/O线; (6)一个全双工的异步串行口; (7)两个16位定时/计数器; (8)5个中断源,两个中断优先级; (9)有片内时钟振荡器; (10)采用高性能HMOS生产工艺生产; (11)有布尔处理(位操作)能力; (12)含基本指令111条,其中单机器周期指令64种。 MCS-51系列单片机的结构 MCS-51系列单片机的内部总体结构88微处理器(运算部件)控制部件B 数据存储器RAMP0口P2口程

3、序存储器P1口P3口串行口定时/计数器中断系统特殊功能寄存器(SFR)88ROM/EPROMVCCVSSXTAL1XTAL2 PSENALEEARESET MCS-51系列单片机的内部总体结构88 P0口P2口程序第一讲 C51程序设计基础主要内容: 单片机程序设计语言 单片机汇编语言与C语言的特点 C语言程序设计知识(复习) 第一讲 C51程序设计基础主要内容:1.1 单片机程序设计语言(1)机器语言 :机器可以识别的语言如: 74010111010000000001 78020111100000000010 3800111000(2)汇编语言:由指令助记符书写的语言 如: MOV A, #

4、01H MOV R0,#02H ADD A, R0(3)C语言:通用程序设计语言,由函数组成 如: void main( ) int m; m=1+2; 1.1 单片机程序设计语言(1)机器语言 :机器可以识别三种语言的特点机器语言:计算机可以识别,直接面向硬件、程序代码短、可直接运行、运行速度快、但难懂、难记、开发慢;汇编语言:必须“翻译”成机器语言,直接面向硬件、运行速度快、但通用性差、不易移植;C语言:使用了与人的思维更接近的关键字和操作函数,容易理解,通用性好、易移植。 应用C语言设计单片机程序可以大大加快开发速度,增强程序可读性,便于修改、扩充、移植,是目前开发人员用的最多的一种单片

5、机开发语言。三种语言的特点机器语言:计算机可以识别,直接面向硬件、程序代C的优势C语言作为一种方便语言得到广泛支持,多个硬件开发都用C,如单片机、DSP、ARM。C本身不依赖于机器硬件系统,基本上不作修改就可将程序从不同单片机中移植过来。C提供很多数学函数并支持浮点运算,开发效率高。C的优势C语言作为一种方便语言得到广泛支持,多个硬件开发都用1.2 C51与ASM-51相比的优势对单片机的指令系统不要求了解,仅要求对8051的存储结构有初步了解;寄存器分配,不同存储器的寻址及数据类型等细节由编译器管理;程序有规范的结构,可分成不同的函数,这种方式可使程序结构化;提供的库包含多个标准子程序,具有

6、较强的处理能力;由于具有方便的模块化设计,便于移植。1.2 C51与ASM-51相比的优势对单片机的指令系统不要汇编语言特点代码执行效率高;占用存储空间少;可移植性差。 长度上比较:高级语言比汇编语言长15%200%; 执行时间上比较:高级语言比汇编语言增长50%300%。 C51用于编写复杂的大型程序,对要求反应灵敏、控制及时,实时检测等控制系统都是用汇编语言和C语言联合编写的。对时钟要求严格时,使用汇编语言是唯一的方法。汇编语言特点代码执行效率高; 1.3 C语言程序设计知识简单C程序举例void main( ) int b ,a=1; / a表示一个整型变量,变量名为a / ;为语句结束

7、符号 b=+a; / a的值加一变为2,然后将a的值赋给b说明: C程序从main开始执行程序,前一个void表示无值返回; C程序中用到的变量一定要先定义变量的数据类型,只有定义了变量的数据类型后,变量才会在内存中按其数据类型长度给其分配空间。 1.3 C语言程序设计知识简单C程序举例1.3.1 数据类型数据类型 位数 字节数 值域 bit 1 01 signed char 8 1 -128+127 unsigned char 8 1 0255 enum 16 2 -32768+32767 signed short 16 2 -32768+32767 unsigned short 16 2

8、065535 signed int 16 2 -32768+32767 unsigned int 16 2 0655351.3.1 数据类型数据类型 位数 数据类型(二)数据类型 位数 字节数 值域signed long 32 4 -2147483648 2147483647unsigned long 32 4 04294967295 float 32 4 0.175494E- 38 0.402823E+38 sbit 1 01 sfr 8 1 0255 sfr16 16 2 065535单片机中使用最多的是char,int型,默认为有符号型。sbit ,sfr ,sfr16是C51对C的扩展

9、。数据类型(二)数据类型 位数 字节数 unsigned int a;for(a=100;a=0;a-)unsigned int a;for(a=100;a=01.3.2 常量与变量常量:使用预定义对常量进行定义,使用一个标识符代替一个常量。例:#define CONST 10为了与变量区别,常量一般使用大写。#define 宏名 字符串以一个宏名称来代表一个字符串,当程序任何地方使用宏名称时将以代表的字符串来替换,可以是一个常数、表达式等。#define uchar unsigned char#define unit unsigned int1.3.2 常量与变量常量:使用预定义对常量进行定

10、义,使用一变量变量有3个相关参数:变量名、变量值、变量地址。变量名由字母、数字、下划线组成,首字母必须是字母或下划线。在程序定义变量时首先要选择它的数据类型,一个变量可能有多大值,要几个字节能存下,在够用的情况下,尽量选一个字节的char。例: bit b_Start; char c_Start; int i_Start;变量使用前必须进行定义。变量变量有3个相关参数:变量名、变量值、变量地址。1.3.3 C语言的基本运算符-算术运算符运算符 范 例 说 明+ a+b a变量值和b变量值相加- a-b a变量值和b变量值相减* a*b a变量值乘以b变量值/ a/b a变量值除以b变量值% a

11、%b a变量值除以b变量值的余数1.3.3 C语言的基本运算符-算术运算符运算符 赋值运算符运算符 范 例说 明= a=6 将6赋值给a变量,即a变量值等于6+= a+=b 等同于a=a+b,将a和b相加的结果又存回a-= a-=b 等同于a=a-b,将a和b相减的结果又存回a*= a*=b 等同于a=a*b,将a和b相乘的结果又存回a/= a/=b 等同于a=a*b,将a和b相除的结果又存回a%= a%=b 等同于a=a%b,a值除以b值的余数又存回 a有两个操作数的运算符都可写成复合形式变量 运算符 变量 等效为 变量变量 运算符 变量x=y 等效为 x=xy赋值运算符运算符 范 例说 明

12、关系运算符运算符 范 例 说 明 ab 测试a是否大于b a= a=b 测试a是否大于或等于b = ay的值为1,xyz的值为0。(左结合性)关系运算符运算符 范 例 说 明逻辑运算符运算符 范 例 说 明& a&b a和b逻辑与,两个变量都是“真”, 结果才为 “真”否则结果为“0”| a|b a和b作逻辑OR,只要有任何 一个变量为“真”,结果就为“真” !! !a 将a变量的值取反,即原来为“真”则 变 “假”,为“假”则变为真“0”代表假,“非0”代表真例:a=3, b=6 , 则!a的值为0a&b的值为1注意:汇编语言中字节做与或非运算(ANL ORL XRL CPL )为按位操作。

13、逻辑运算符运算符 范 例 说 位操作位操作可大大提高单片机程序的运行速度,方便用户编程,经常用到。 运算符 范 例 说 明 ab a和b按位作OR运算& a&b a和b按位作AND运算 ab a和b按位作XOR运算 a 将a的每一位取反 ab 将a按位右移b个位,左侧补“0”,溢出舍去 ab 将a按位左移b个位,右侧补“0”,溢出舍去注意:C51中没有循环移位,需自己编程实现。位操作位操作可大大提高单片机程序的运行速度,方便用户编程,经自增减运算,-,相当于变量变量1例:设x=0 x23则 y=x+; /y=23H, x=24H y=+x; /y=24H, x=24H y=x-; /y=23H

14、, x=22H y=-x; /y=22H, x=22Hx+是先赋值,后自加;+x是先自加,后赋值自增减运算,-,相当于变量变量1逗号运算符表达式1,表达式2,表达式n表达式按从左到右的方式运算,整个表达式的值取决于最后一个。例:unsigned char x=100; unsigned char y; y=(x=x/10,x/2) /先计算 x/10=10,然后计算 x/2=5,所以y=5逗号运算符表达式1,表达式2,表达式n条件运算符条件运算符:表达式1?表达式2:表达式3条件运算符表达式的运算规则:如果表达式1的值为真,那么整个表达式的值就是表达式2的值,否则是表达式3的值。各种运算符时,

15、要考虑运算符的优先级及结合性。(P51)条件运算符条件运算符:表达式1?表达式2:表达式31.3 C51控制流顺序结构选择结构循环结构1.3 C51控制流顺序结构 选择结构(1) if (条件表达式) 动作 如果条件表达式的值为真(非零数),则执行 内的动作,如果条件表达式为假,则略过该动作而继续往下执行。 选择结构(1) if (条件表达式)(2) if (条件表达式) 动作1 else 动作2 如果条件表达式为真,则执行动作1,略过else的部分,接着往下执行,如果条件表达式为假,则略过if的部分而执行else的动作2,然后再往下执行。 范例 IfDemo2.C (P54)(2) if (

16、条件表达式)(3)if (条件表达式1) if (条件表达式2) if (条件表达式3) 动作A else 动作B else 动作C else 动作D 动作 A:条件表达式1,2,3都成立时才会执行。动作 B:条件表达式1,2成立,但条件表达式3不成立时才会执行。动作 C:条件表达式1成立,条件表达式2不成立时才会执行。动作 D:条件表达式1不成立时才会执行。范例 IfDemo3.C(3)if (条件表达式1)(4) switch-case语句 switch (条件表达式) case条件值1: 动作1 break; case条件值2: 动作2 break; case条件值3: 动作3 brea

17、k; default: 动作4break; (4) switch-case语句switch内的条件表达式的结果必须为整数或字符。Switch用条件表达式的值来与各case的条件值对比,如 果与某个条件值相符合,则执行该case的动作,之后一定要写break退出循环。如果所有的条件值都不符合,则执行default的动作,每 一个动作之后一定要写break,否则会继续执行。 另外case之后的条件值必须是数据常数,不能是变量, 而且不可以重复,即条件值必须各不同,如果有数种case所做的动作一样时,也可以写在一起,即上下并列。 一般当程序必须作多选1时,可以采用switch语句。switch内的条

18、件表达式的结果必须为整数或字符。break:是跳出循环的命令,任何由switch、for、while、do-while构成的循环,都可以用break来跳出。必须注意的是break一次只能跳出一层循环,通常都和if连用,当某些条件成立后就跳出循环。 default:当所有case的条件值都不成立时,就执行 default所指定的动作,作完后也要使用break指令跳出switch循环。范例 SwitchDemo.c(P58)break:是跳出循环的命令,任何由switch、for、w例:x有1-5共5个取值,判断该值,并将另外一个变量y分别赋值为前5个素数2,3,5,7,11。switch(x)

19、case 1:y=2; break; case 2:y=3; break; case 3:y=5; break; case 4:y=7; break; default:y=11; break;if(x=1) y=2;else if(x=2) y=3;else if(x=3) y=5;else if(x=4) y=7;else y=11;例:x有1-5共5个取值,判断该值,并将另外一个变量y分别赋#include #include void Uart_Init();main() int nVar1; Uart_Init(); while(1) printf(“Input a character:

20、n”);nVar1=getchar();printf(“n”);switch(nVar1) case (0): printf(“case 0 switchedn”); break; case (1): printf(“case 1 switchedn”); break; case (2): printf(“case 2 switchedn”); break; default: printf(“default casen”); break; void Uart_Init() SCON=0X52; TMOD=0X20; TCON=0X69; TH1=0Xf3;#include #include 循

21、环结构(1)while循环语句while (条件表达式) 动作 先测试条件表达式是否成立,当条件表达式为真时,则执行循环内动作,做完后又继续跳回条件表达式作测试,如此反复直到条件表达式为假为止,使用时要避免条件永远为真,造成死循环。范例 whileDemo.c循环结构例:求1-100的和,存放到sum中。main() unsigned char counter; int sum; counter=1; sum=0; while(counter=100) sum=sum+counter; counter+; 例:求1-100的和,存放到sum中。(2)do-while 循环语句 do 动作 wh

22、ile(条件表达式);先执行动作后,再测试条件表达式是否成立。当条件表达式为真,则继续回到前面动作,如此反复直到条件表达式为假为止,不论条件表达式的结果为何,至少会做一次动作,使用时要避免条件永远为真,造成死循环。范例 DowhileDemo.c(2)do-while 循环语句main() unsigned char counter; int sum; counter=1; sum=0; do sum=sum+counter; counter+; while(counter=100);main() unsigned char cou(3) for循环语句: 是循环语句中最灵活和最强大的语句fo

23、r (表达式1;表达式2;表达式3) 动作 表达式1:通常是设定起始值。表达式2:通常是条件判断式,如果条件为真时,则执行动作,否则终止循环。表达式3:通常是步长表达式,执行动作完毕后,必须再回到这里做运算,然后再到表达式2做判断。break语句:退出循环体continue语句:退出当前循环体,从下一轮循环开始执行范例 ForDemo.c(3) for循环语句: 是循环语句中最灵活和最强大的语句main( ) unsigned char counter; int sum=0; for(counter=0;counter=100;counter+) sum=sum+counter; 特例:for

24、(counter=0;counter=100;counter+);没有代码段,用于一定的时间延时,其延时长度由单片机执行每一条指令所需的时间决定。main( ) unsigned char cou 所谓函数,即子程序,也就是“语句的集合”。就是说把经常使用的语句群定义为函数,在程序用到时调用,这样就可以减少重复编写程序的麻烦,也可以减少程序的长度。当一个程序太大时,建议将其中的一部分改用函数的方式比较好,因为大程序过于繁杂容易出错,而小程序容易调试,也易于阅读和修改。1.4 函数(FUNCTION)1.4 函数(FUNCTION)C程序由一个个函数构成,其从一个主函数开始执行,调用其它函数后返

25、回主函数,进行相应操作,最后从主函数中退出整个程序。从结构上分 (1)主函数:可调用普通函数(2)普通函数:可调用其他普通函数,不能调用主函数从用户使用角度分(1)标准库函数:C51编译器提供的函数库,通过#include对应的头文件调用。例:math.h, reg51.h, stdio.h, stdlib.h(2)用户自定义函数从定义的形式分:(1)无参数函数(2)有参数函数C程序由一个个函数构成,其从一个主函数开始执行,调用其它函数(1).函数的定义数据类型 函数名称 ( 数据类型 参数1, 数据类型 参数2,.) 声明语句和代码块; /声明语句是对函数内使用的变量声明 (2).函数的调用

26、 函数名(参数列表)(3)函数的返回值return是用来使函数立即结束以返回原调用程序的指令,而且可以把函数内的最后结果数据传回给原调用程序。返回值的类型和被调用函数类型相同。没有返回值使用void标识符(1).函数的定义数据类型 函数名称 ( 数据类型 参数例: int Sum(unsigned char A, unsigned char B) / 函数定义 int temp; temp=A+B; return temp; /函数返回 void main() int RealSum; unsigned char X,Y; X=0 x23; Y=0 x65; RealSum=Sum(X,Y);

27、 /函数调用例: int Sum(unsigned char A, 使用函数的注意事项1、函数定义时要同时声明其类型;2、调用函数前要先声明该函数;3、传给函数的参数值,其类型要与函数原定义一致;4、接受函数返回值的变量,其类型也要与函数一致。 函数的定义void functionl(void)此函数无返回值,也不传参数。void function2(unsigned char i , int j)此函数无返回值,但需要unsign char类型的i参数和int类型的j参数。unsigned char function3(unsigned char i)此函数有unsign char类型的返回

28、值给原调用程序。使用函数的注意事项1.5 C51语言对标准C的扩展(1)数据类型 C51具有标准C语言的所有标准数据类型,除此之外,为了更加有效的利用8051结构,还加入了以下特殊的数据类型。sbit 从字节中声明的位变量0或1。sfr 特殊功能寄存器,sfr字节地址为0255sfr16 同sfr ,只是 sfr字地址为065535 bit、sbit、sfrs和sfr16数据类型专门用于8051硬件和C51编译器,并不是标准C语言的一部分,不能通过指针进行访问。 sbit、sfr和sfr16数据类型用于访问8051的特殊功能寄存器. 例如sfr P0=0 x80,表示声明变量P0,并为其分配特

29、殊功能寄存器地址0 x80。1.5 C51语言对标准C的扩展(1)数据类型 (2)存储类型及存储区C51编译器支持8051及其扩展系列,并提供对8051所有存储区的访问。 存储区可分为片内RAM,片外RAM,片内ROM,片外ROM。8051最多可有256字节片内RAM,其中低128字节可直接寻址,高128字节(从0 x80到0 xFF)为SFR,从20H开始的16字节可位寻址。(2)存储类型及存储区C51编译器支持8051及其扩展系列,C51程序设计时,每个变量可以明确地分配到指定的存储空间。对内部存储器的访问比对外部存储器的访问快许多,因此应当将频繁使用的变量尽量选择data,然后选择ida

30、ta,在内部RAM不够时才使用pdata,最后选xdata。存储类型的选择关系到程序的执行效率问题。关键字 存储器对应关系data片内直接寻址RAM区,低128字节,bdata片内位寻址区,可字节、位混合寻址的16个Byteidata片内间接寻址RAM区,可以访问全部RAM内容xdata外部RAM(64K),使用DPTRpdata分页寻址片外RAM(256字节),使用指令MOVX Rncode程序存储区(64K)C51程序设计时,每个变量可以明确地分配到指定的存储空间。对1)data区: data指低128字节的内部数据区。data区可直接寻址,所以对其存取是最快的,应该把经常使用的变量放在d

31、ata区;但是data区的空间是有限的,data区除了包含程序变量外,还包括了堆栈和存储器组。举例:unsigned char data system_status=0;/定义无符号字符型变量system_status,初值为0使其存储在内部低128字节unsigned int data unit_id2;/定义无符号整型数组 data unit_id,存储在内部RAMchar data inp_string16;/定义字符型变量 inp_string,使其存储在内部低128字节1)data区:2)bdata区:指内部可位寻址的16字节存储区(20H到2FH)可位寻址变量的数据类型。 bdat

32、a区实际就是data区中的位寻址区,在这个区声明变量就可进行位寻址。位变量声明对状态寄存器来说是十分有用的,因为它可能仅仅需要使用某一位,而不是整字节。例1:unsigned char bdata status_byte;/定义无符号字符型 变量 status_byte,使其存储20H到2FH区,可进行位寻址。unsigned int bdata status_word;/ 定义无符号整型变量 status_word,使其存储20H到2FH区sbit start_flag=status_byte4;/将status_byte的第4位赋值 给位变量sbit start_flagIf(status

33、_word15) start_flag=0; . 2)bdata区:指内部可位寻址的16字节存储区(20H3)idata区: idata区声明中的存储类型标识符为idata,指内部的256字节的存储区,但是只能间接寻址,速度比直接寻址慢。举例如下:unsigned char idata system_status=0;unsigned int idata unit_id2;char idata inp_string16;float idata outp_value;3)idata区: idata区声明中的存储类型标识4)pdata和xdata区:pdata和xdata区属于外部存储区。外部存储

34、区是可读写的存储区,最多可有64KB。访问外部数据存储区比访问内部数据存储区慢,因为外部数据存储区是通过数据指针加载地址来间接访问的。在这两个区,变量的声明和在其他区的语法是一样的,但pdata区只有265字节而xdata区可达65536字节。对pdata和xdata的操作是相似的;对pdata区的寻址比对xdata区的寻址要快,因为对pdata区的寻址只需要装入8位地址,而对xdata区的寻址需装入16位地址,所以要尽量把外部数据存储在pdata段中。MOVX A,R0MOVX A,DPTR4)pdata和xdata区:pdata和xdata区属于外从反汇编程序看,当一个变量定义在data区

35、和pdata、xdata区时,执行时间、程序所占内存差别很大例二#include#define uchar unsigned charuchar data inp_reg1;uchar data inp_reg2;void main()inp_reg1=P1;inp_reg2=P3;从反汇编程序看,当一个变量定义在data区和pdata、xd5)程序存储区code:程序存储区code声明中的标识符为code,在C51编译器中可用code存储区类型标识符来访问程序存储区。程序存储区的数据是不可改变的,编译的时候要对程序存储区中的对象进行初始化,否则就会产生错误。程序存储区声明的举例:unsign

36、ed 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;5)程序存储区code:程序存储区code声明中的标识符为c 存储器模式 存储器模式是函数自变量、自动变量和没有明确规定存储类型的变量的默认存储器类型,指定存储器需要在命令行中使用SMALL,COMPACT和LARGE 3个控制命令中的1个。例如:void fun(void) small ; 存储器模式 存储器模式是函数自变量、自动变SMALL : 相关参数、堆栈和局部变量

37、都默认地位于51内部数据存储器,使用data存储类型。在此模式下,变量访问的效率很高,但所有的数据对象和堆栈必须适合内部RAM。COMPACT:相关参数和局部变量都被默认为在256Byte的分页片外数据存储器,使用pdata存储类型。堆栈在片内数据存储器,和SMALL模式相比,该存储器模型的效率比较低,对变量访问的速度也慢一些,但比LARGE模式快。LARGE : 所有变量都默认为位于外部存储器(这和使用xdata指定存储器类型是一样的),并使用数据指针DPTR进行寻址。通过数据指针访问外部数据存储器的效率较低,特别是当变量为2字节或更多字节时,该模式要比SMALL和COMPACT产生更多的代

38、码。堆栈在片内数据存储器。SMALL : 相关参数、堆栈和局部变量都默认地位于51内部 特殊功能寄存器(SFR) 51系列单片机提供128字节的SFR寻址区,地址为80H-FFH。除了程序计数器PC和4组通用寄存器之外,其他所有的寄存器均为SFR,并位于片内特殊功能寄存器区。这个区域部分可位寻址,字节寻址或字寻址,用以控制定时/计数器,串口,I/O及其他部件。特殊功能寄存器可由以下几种关键字说明。(1)sfr: 声明字节寻址的特殊功能寄存器。例: sfr P0=0 x80; /P0口地址为80H sfr TL0=0 x8A; sfr TH0=0 x8C;注意:“sfr”后面必须跟一个特殊寄存器

39、名;“=”后面的地址必须是常数,不允许带有运算符的表达式,这个常数值的范围必须在特殊功能寄存器地址范围内,位于80H到FFH之间。 特殊功能寄存器(SFR) 51系列单片机提供1(2)sfr16:许多新的8051派生系列单片机用两个连续地址的SFR来指定16位值,例如8052用地址0 xCC和0 xCD表示定时器/计数器2的低和高字节。例: sfr16 T2=0 xCC;/定义T2口地址的低字节地址 T2L=0 xCC,高地址T2H=0 xCD。注意: sfr16声明和sfr声明遵循相同的原则。声明中名字后面不是赋值语句,而是一个sfr地址,其高字节必须位于低字节之后,这种声明适用于所有新的S

40、FR,但不能用于定时/计数器0和1。 (2)sfr16:许多新的8051派生系列单片机用两个连sbit:声明可位寻址的特殊功能寄存器和别的可位寻址的目标(20H-2FH)。 “=”号后将绝对地址赋给变量名。sbit声明变量位寻址的声明形式如下: sbit 变量名=SFR名称序号例:使用sbit定义位变量sfr PSW=0 xD0;sbit OV=PSW2; /声明溢出位变量OV,是PSW的第2位sbit P10=P10; /声明位变量P10,是P1口的第0位该变量用一个已声明的sfr_name作为sbit基地址,“”后面的表达式指定了位的位置,必须是07之间的一个数字。 sbit:声明可位寻址

41、的特殊功能寄存器和别的可位寻址的目标(sbit 变量名=字节地址序号 例如:sbit CY=0 xD07;sbit OV=0 xD02;sbit P10=0 x900; sbit 变量名=位地址 例如: sbit OV=0 xD2; sbit P10=0 x90;sbit 变量名=字节地址序号 例如:sbit sbit也可对其他的变量定义,但变量必须存放在位寻址内存空间,绝对地址必须是位地址空间.例:使用sbit定义变量空间 bdata unsigned char uc_Byte; sbit b_x_Flg= uc_Byte1; sbit也可对其他的变量定义,但变量必须存放在位寻址内存空间若编

42、程时已将8051微处理器头文件包含#include则sfr PSW=0 xD0; sfr IE=0 xA8; sbit OV=PSW2; 可以不用声明PSW为特殊功能寄存器,因头文件中已定义。可直接在程序中使用PSW、IE、OV等。但P1_0、P1_1是头文件中没有的变量,要求它指向P1的第0位、第1位。所以使用时应定义sbit P1_0=P10;sbit P1_1=P11;注意:文件中的寄存器、特殊功能寄存器均是大写。所以P10、P11中的P1一定要大写。但P1_0 、P1_1由于是用户自定义变量,所以大小写随意,也可是其它标识符。若编程时已将8051微处理器头文件包含#includere(

43、3)函数的使用 函数声明keil C51编译器扩展了标准C函数声明,这些扩展有:1)指定一个函数作为一个中断函数;2)选择所用的寄存器组;3)选择存储模式;4)指定重入;声明C51函数的标准格式如下:返回类型 函数名(参数表)存储模式 reentrantinterrupt nusing nreetrant:表示函数是递归的或可重入的。interrupt:表示是一个中断函数。using n:指定函数所用的寄存器组,n=03(3)函数的使用 1、中断函数 51单片机的中断系统十分重要,可以用C51语言来声明中断和编写中断服务程序,当然也可以用汇编语言来写。中断过程通过使用interrupt关键字和

44、中断编号04来实现。中断函数的完整语法如下:返回值 函数名(参数) interrupt n using ninterrupt n 中的n对应中断源的编号:中断编号告诉编译器中断程序的入口地址,它对应着IE寄存器中的使能位,既IE寄存器中的0位对应着外部中断0,相应的外部中断0的编号是0。1、中断函数8051单片机的中断源以及中断编号.在51系列单片机中,有的单片机多达32个中断源,所以中断编号是031。 中断编号 中断源 入口地址 0外部中断0 0003H 1定时器/计数器0溢出 000BH 2外部中断 1 0013H 3定时器/计数器1溢出 001BH 4串行口中断 0023H8051单片机

45、的中断源以及中断编号.在51系列单片机中,有的using n中的n对应四组通用寄存器中的一组。 当正在执行一个特定任务时,可能有更紧急的事情需要CPU处理,这就涉及到了中断优先级。 高优先级中断可以中断正在处理的低优先级中断程序,因而最好给每种优先程序分配不同的寄存器组。 在C51中可使用using指定寄存器组,using后的变量为03的常整数,分别表示51单片机内的4个寄存器组。using n中的n对应四组通用寄存器中的一组。例:编写定时器0中断服务程序unsigned int interruptcnt=0;unsigned char second;void timer( ) interru

46、pt 1 using 2if(+interruptcnt=4000) /*计数到4000*/second+; /*另一个计数器*/ interruptcnt=0; /*计数器清零*/ 例:编写定时器0中断服务程序2、重入函数标准C中调用函数时会将函数的参数和函数中使用的局部变量入栈。而C51中采用为每个函数设定一个空间用于存放局部变量,当函数递归调用时会导致变量被覆盖。重入函数:可以在函数体内间接调用其自身的函数。每次调用时的局部变量都会被单独保存起来,而不会被覆盖。格式:函数类型 函数名(形参表) reentrant2、重入函数标准C中调用函数时会将函数的参数和函数中使用的局(4) 指针指针和指针变量变量的指针:就是变量的地址指向变量的指针变量:存放变量地址的变量,

温馨提示

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

评论

0/150

提交评论