




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机原理与接口技术电子教案单片机原理与接口技术电子教案第第 章章成都大学工业制造学院 程 跃3单片机单片机C C语言程序开发语言程序开发2内容概要内容概要 本章在读者已掌握标准本章在读者已掌握标准C C语言前提下语言前提下,初步介绍如何使用如何使用C51C51来编写来编写AT89C51AT89C51单片机的应用程序单片机的应用程序。 C51C51是在标准是在标准C C的基础上,根据单片机存储器硬件的基础上,根据单片机存储器硬件结构及内部资源,扩展了相应的数据类型和变量,结构及内部资源,扩展了相应的数据类型和变量,而C51在语法规定、程序结构与设计方法上,都与标准在语法规定、程序结构与设计方法
2、上,都与标准C C相同。相同。 本章重点介绍本章重点介绍C51C51对标准对标准C C所扩展的部分所扩展的部分,并通过一些例程例程来介绍C51的程序设计思想。3单片机入门主要掌握以下知识和应用单片机入门主要掌握以下知识和应用 最小系统能够运行起来的必要条件。 1.电源 2.晶振3.复位电路 对单片机任意IO口的随意操作 1.输出控制电平高低2.输入检测电平高低。 定时器:重点掌握最常用的方式2 中断:外部中断、定时器中断、串口中断 串口通信:单片机之间、单片机与计算机间4 目前51系列单片机编程的C语言都采用Keil C51(简称C51),Keil C51是在标准是在标准C C语言基础上发展起
3、来的。语言基础上发展起来的。 C语言是美国国家标准协会(ANSI)制定的编程语言标准,1987年ANSI公布87 ANSI C87 ANSI C,即标准C语言。Keil C51Keil C51语语言言是在是在ANSI CANSI C的基础上针对的基础上针对5151单片机的硬件特点进行的扩展,单片机的硬件特点进行的扩展,并向51单片机上移植,经过多年努力,C51语言已经成为公认的高效、简洁而又贴近51单片机硬件的实用高级编程语言。3.1 C513.1 C51语言简介语言简介5 C 语言具有结构化和模块化特点,便于阅读和维护。 C 语言可移植性好,很多微控制器都支持C 编译器。功能化的代码能够很方
4、便的从一个工程移植到另一个工程,从而减少了开发时间。提供的库函数包含许多标准子程序,具有较强的数据处理能力。使用使用C C语言的优点语言的优点6使用使用C C语言的优点语言的优点 C 语言编写的程序比汇编语言编写的程序更符合人们的思考习惯,寄存器分配,不同存储器的寻址及数据类型等细节交由编译器管理,开发者可以更专心的考虑算法,而不是考虑一些细节问题。这样可以减少编程出错的机率,从而提高开发效率,减少调试的时间。 C 语言和微控制器是相对独立的,开发者不必知道处理器的具体内部结构和处理过程。当用新型的微控制器开发程序时,可以很快上手,减少学习时间和程序开发时间。7:由源代码文件生成目标文件由源代
5、码文件生成目标文件:包含了编译器、链接器等开发工具的组合包包含了编译器、链接器等开发工具的组合包 将项目管理、源代码编辑和程序编译、链接、调试等各种工具组合在一将项目管理、源代码编辑和程序编译、链接、调试等各种工具组合在一个功能强大的环境中,具有良好人机界面。个功能强大的环境中,具有良好人机界面。8051单片机所使用的单片机所使用的C语言编译器简称为语言编译器简称为 Cx51例如包含例如包含Cx51、Ax51、BL51、LIB51、OH51、RTX51等等KEIL C51 8Cx51.exe9C C语言结构特点语言结构特点 一个C程序由一个或多个函数组成,其中必须有一个用main命名的主函数。
6、 每个函数由头部和函数体两部分组成。 每个C语句以“;”结尾。 C程序的书写格式比较自由。 可以在程序的任何位置用/*.*/对C程序中的任何部分作注释。 可以在行末用/追加注释。10(一个或若干个)(一个或若干个)n 程序的入口程序的入口 函数名固定,且与书写的位置无关函数名固定,且与书写的位置无关n 有且仅有一个有且仅有一个n 库函数或用户自定义的函数库函数或用户自定义的函数n 可以有若干个可以有若干个C51程序大体上是若干函数的集合11单片机控制单片机控制LEDLED(电路图)(电路图)XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD13
7、8P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.0/T21P1.1/T2EX2P1.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/A1427U1AT89C52C122pFC222pFC310uFX1CRYSTA
8、LD1LED-REDR1220R210k12我的第一个程序(单片机控制我的第一个程序(单片机控制LEDLED点亮)点亮)#include sbit LED = P10;void main( )/主程序 LED = 0;/点亮LED while(1);13单片机控制单片机控制LEDLED闪烁(程序)闪烁(程序)#include #define uchar unsigned char#define uint unsigned intsbit LED = P10;void delay(uint x)/延时程序 uchar i; while(x-) for(i = 0;i 120; i+); void
9、 main()/主程序 while(1) LED = LED; /LED灯闪烁 delay(400); 14C51C51与标准与标准C C的主要区别的主要区别(1 1)头文件的差异。)头文件的差异。51系列单片机厂家有多个,它们的差异在于内部资源如差异在于内部资源如定时器、中断、定时器、中断、I/OI/O等数量以及功能的不同等数量以及功能的不同,而对使用者来说,只需要将相应的功能寄存器的头文件加载在程序内,就可实现所具有的功能。因此,Keil C51Keil C51系列的头文件系列的头文件集中体现了各系列芯片的不同资源及功能。(2 2)数据类型的不同)数据类型的不同。51系列单片机包含位操作空
10、间和丰富的位操作指令,因此Keil C51与ANSI C相比又扩展了4种类型,以便能够灵活地进行操作。电脑CPU是32位或64位,运算能力强,内存大,大量使用float型与long int型变量,单片机一般为8位或16位,运算能力较弱,以char型为主,int型为辅15(3 3)数据存储类型的不同)数据存储类型的不同。C语言最初是为通用计算机设计的,在通用计算机中只有一个程序和数据统一寻址的内存空间,而而5151系列单片机系列单片机有片内、有片内、外程序存储器,还有片内、外数据存储器。外程序存储器,还有片内、外数据存储器。标准标准C C并没有提供这部分存储并没有提供这部分存储器的地址范围的定义
11、。器的地址范围的定义。此外,对于AT89C51单片机中大量的特殊功能寄存器也没有定义。(4 4)标准)标准C C语言语言没有没有处理处理单片机中断单片机中断的定义的定义。(5 5)Keil C51与标准C的库函数库函数有较大的不同。 由于标准C的中的部分库函数部分库函数不适于嵌入式处理器系统不适于嵌入式处理器系统,因此被排除在Keil C51之外,如字符屏幕和图形函数。16(6)目标代码 电脑生成.exe格式,编译完成后直接在电脑上运行,单片机编译生成.bin代码文件,需要烧写到单片机中并结合外围电路执行。(7)仿真调试 单片机的C程序在电脑上进行编译,然后需通过仿真器连接后进行仿真调试,近年
12、来随着电路仿真软件的不断完善,也可通过proteus等软件直接在电脑上进行仿真调试。17 但是从数据运算操作、程序控制语句以及函数但是从数据运算操作、程序控制语句以及函数的使用上来说,的使用上来说,Keil C51Keil C51与标准与标准C C几乎没有什么明显几乎没有什么明显的差别。的差别。如果程序设计者具备了有关标准C的编程基础,只要注意Keil C51与标准C的不同之处,并熟悉AT89S51单片机的硬件结构,就能够较快地掌握Keil C51的编程。18 数据 数据类型、数据结构、存储类型 运算 算术运算、关系运算、逻辑运算、位操作 控制 顺序结构、选择结构、循环结构、函数C C语言编程
13、的三大要素语言编程的三大要素193.2 KEIL3.2 KEIL与与PROTEUSPROTEUS快速入门快速入门 Keil C51Keil C51是美国是美国Keil SoftwareKeil Software公司出品的公司出品的5151系列兼容单系列兼容单片机片机C C语言软件开发系统,与汇编相比,语言软件开发系统,与汇编相比,C C语言在功能上、结语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用用过汇编语言后再使用C C来开发,体会更加深刻。来开发,体会更加深刻。 Keil C51软件提供丰富的库函
14、数和功能强大的集成开发调试工具,全Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。 20 1、建立一个新工程 单击Project菜单,在弹出的下拉菜单中选中New Project选项,如图3所示。图3 新建工程文件KEIL C51KEIL C51快速入门快速入门21 2、然后选择你要保存的路径,输入工程文件的名字, 如图4所示,然后点击保存。图4 新建工程文件的保存路径KEIL C51KEIL C51快速入门快速入门22 3、这时会弹出一个对
15、话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择,keil c51几乎支持所有的51内核的单片机, 如图所示,选择89C51之后,右边栏是对这个单片机的基本的说明,然后点击确定。图5 选择单片机的型号KEIL C51KEIL C51快速入门快速入门234、完成上一步骤后,屏幕如图6所示。图6 完成新建工程文件KEIL C51KEIL C51快速入门快速入门24 下面可以编写程序。 5、在图2-7中,单击“File”菜单,再在下拉菜单中单击“New”选项。新建文件后屏幕如图8所示。图7 新建文档图8 完成 新建文档KEIL C51KEIL C51快速入门快速入门25 此时光标在编辑窗
16、口里闪烁,这时可以键入应用程序了,建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“Save As”选项单击,屏幕如下图所示,在“文件名”栏右侧的编辑框中,键入欲使用的文件名,用C语言编写扩展名为(.c)如果用汇编语言编写扩展名必须为(.asm)。然后,单击“保存”按钮。 如图8所示。图8 保存新建文档KEIL C51KEIL C51快速入门快速入门26 6、回到编辑界面后,单击“Target 1”前面的“”号,然后在“Source Group 1”上单击右键,弹出菜单9。图9 打开添加文档界面KEIL C51KEIL C51快速入门快速入门27 然后单击“Add File
17、 to Group Source Group 1”,屏幕如图10所示。 图10 添加文档KEIL C51KEIL C51快速入门快速入门28选中main.c,然后单击“Add ”屏幕如下图所示。 注意到“Source Group 1”文件夹中多了一个子项“main.c”子项的多少与所增加的源程序的多少相同。 7、现在便可输入程序了,输入完毕进行调试便可运行。 图10 完成添加文档KEIL C51KEIL C51快速入门快速入门29Proteus Proteus 快速入门快速入门 Proteus软件和我们手头的其他电路设计仿真软件最大的不同即它的功能不是单一的。它的强大的元件库可以和任何电路设计
18、软件相媲美;它的电路仿真功能可以和Multisim相媲美,且独特的单片机仿真功能是Multisim及其他任何仿真软件都不具备的;它的PCB电路制版功能可以和Protel相媲美。它的功能不但强大,而且每种功能都毫不逊于Protel,是学习电子设计难得的一个工具软件。30 ISIS智能原理图输入系统,系统设计与仿真的基本平台。 ARES 高级PCB布线编辑软件。 在Proteus中,从原理图设计、单片机编程、系统仿真到PCB设计一气呵成,真正实现了从概念到产品的完整设计。Proteus 从原理图设计到PCB设计,再到电路板完成的流程如图所示。313.3 C513.3 C51数据类型与运算数据类型与
19、运算 常量与变量 常量:程序运行中值不能改变的量称为常量,常量存在于ROM中。 变量:变量代表存贮器中的一个或多个存储单元,用来存放数据,一般来讲这些值在程序运行中可以改变(只读变量除外) 变量名命名规则:变量名只能由半角的字母、数字、下划线组成,且第一个字符不能是数字。 变量存在的类型称为数据类型。32C51C51数据类型与标准数据类型与标准C C数据类型的最大不同之处:数据类型的最大不同之处:位型。位型。位型(位型(bit)字符型(字符型(char)整型(整型(int)长整型(长整型(long)浮点型(浮点型(float)双精度浮点型(双精度浮点型(double)数组类型(数组类型(arr
20、ay)结构体类型(结构体类型(struct)共用体(共用体(union)枚举(枚举(enum)基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型数据类型数据类型3.3.1 C513.3.1 C51数据类型数据类型33数据类型数据类型长度长度值域值域 bit1 bit0,1 unsigned char8 bit0 255 (signed) char8 bit-128 127 unsigned int16 bit0 65535 (signed) int16 bit-32768 32767 unsigned long32 bit0 4294967295 (signed) long32 bi
21、t-21474836482147483647 float32 bit1.7e-38 3.40e+38 (6位) double64 bit1.7e-38 3.40e+38 (10位) * (一般指针)13字节存储空间地址34C51C51数据类型数据类型数据类型C51专用长度取值范围signed char单字节-128 to +127unsigned char单字节0 to 255signed short2字节-32768 to +32767unsigned short2字节0 to 65535signed int2字节-32768 to +32767unsigned int2字节0 to 655
22、35signed long4字节-2147483648 to +214746483647unsigned long4字节0 to 4294967295float4字节1.175494E-38 to 3.402823E+38*13字节对象的地址enum1或2字节-128 to +127 或 -32768 to +3276735数据类型C51专用长度取值范围bit专用1位0 或 1sbit专用1位0 或 1sfr专用1字节0 255sfr16专用2字节0 65535C51C51数据类型数据类型3637C C语言的变量定义与赋值语言的变量定义与赋值 定义一个变量 先定义,后使用。例如:Int a;
23、char b; 变量赋初值,C允许在定义变量的同时给变量赋初值。 例如: char c = a; int a = 7; int a,b,c=9; /定义a、b、c为整型变量,对c赋初值。 int a = 3,b = 3,c = 3; 错误:int a=b=c=3;38 定义定义变量类型变量类型应考虑如下问题:应考虑如下问题:程序运行时该变量可能的取值范围,是否有负值,绝对值有多大,以及相应需要的存储空间大小。在够用的情况下,尽量选择8位即一个字节的char型,特别是unsiged char。对于51系列这样的定点机而言,浮点类型变量将明显增加运算时间和程序长度,如果可以的话,尽量使用灵活巧妙的
24、算法来避免浮点变量的引入。39C51C51的扩展数据类型的扩展数据类型(1 1)位变量)位变量bitbitbit的值可以是1(true), 也可以是0(false)。使用关键字使用关键字bitbit例如:例如:bit lockbit lock;/ /* *将将locklock定义为位变量定义为位变量* */ /bit direntionbit dirention;/ /* *将将directiondirection定义为位变量定义为位变量* */ /4041C51C51的扩展数据类型的扩展数据类型(2 2)特殊功能寄存器)特殊功能寄存器sfrsfr AT89S51特殊功能寄存器在片内RAM区的
25、80HFFH之间,“sfrsfr” ” 数据类型数据类型占用一个内存单元。利用它可访问AT89S51内部的所有特殊功能寄存器。 例如:例如:sfr P1=0 x90sfr P1=0 x90这一语句定义P1口在片内的寄存器,在后面语句中可用“P1=0 xff”(使P1的所有引脚输出为高电平)之类的语句来操作特殊功能寄存器。 标准SFR在reg51.h、reg52.h 等头文件中已经被定义,只要用文件包含做出申明即可使用。42(3 3)特殊功能寄存器)特殊功能寄存器sfr16sfr16 “ “sfr16sfr16”数据类型数据类型占用两个内存单元。sfr16和sfr一样用于操作特殊功能寄存器。所不
26、同的是它用于操作占两个字节的特殊功能寄存器。 例如:例如: sfr16 DPTR=0 x82sfr16 DPTR=0 x82语句定义了片内16位数据指针寄存器DPTR,其低8位字节地址为82H。在后面的语句中可以对DPTR进行操作。43(4 4)特殊功能位)特殊功能位 sbitsbitsbitsbit 是指AT89C51片内特殊功能寄存器的可寻址位。例如:例如: sfr PSW=0 xd0sfr PSW=0 xd0 ;/ /* *定义定义PSWPSW寄存器地址为寄存器地址为0 xd00 xd0* */ /sbit PSW 2 = 0 xd2sbit PSW 2 = 0 xd2;/ /* *定义
27、定义OVOV位为位为PSW.2PSW.2* */ /符号“”前面是特殊功能寄存器的名字,“”的后面数字定义特殊功能寄存器可寻址位在寄存器中的位置,取值必须是07。注意,不要把注意,不要把bitbit与与sbitsbit混淆。混淆。bit用来定义普通的位变量,值只能是二进制的0或1。而sbit定义的是特殊功能44#include sbit D3 = P22;void main() D3 = 0 ; /点亮LED while(1) /循环,挂起 ; _ _ _ 引用含有引用含有SFRSFR符号定义的头文件符号定义的头文件 定义符号定义符号D3D3为为P2P2口的第口的第2 2位位 D3D3可以换为
28、其他自定义符号,作可以换为其他自定义符号,作用相同,如:用相同,如: sbit P2_2 = P22;sbit P2_2 = P22; 点亮发光二极管的功能语句点亮发光二极管的功能语句 while(1) while(1)无限循环,用于程序的无限循环,用于程序的反复执行或者程序挂起,很重要!反复执行或者程序挂起,很重要! 使用使用tabtab或者空格,使程序结构或者空格,使程序结构清晰,便于阅读清晰,便于阅读 适当加入注释,使编程思路清晰,适当加入注释,使编程思路清晰,便于阅读和后期的修改便于阅读和后期的修改q sbit的使用453.3.2 89C513.3.2 89C51单片机存储类型单片机存
29、储类型 8051系列微处理器采用了哈佛结构,即程序存储器和数据存储器是分离的。8051系列微处理器提供了三种不同类型的存储区域(memory areas): 程序存储区(program memory) 内部数据存储区(internal data memory) 外部数据存储区(external data memory) 这三种存储区域均从地址0开始编址,通过采用不同的寻址指令来解决地址重叠的问题。 46存储类型存储类型说明说明直接寻址的片内数据存储器(128B),访问速度最快(00H-7FH)可位寻址的片内数据存储器(16B),允许位和字节混合访问(20H-2FH)间接访问的片内数据存储器(2
30、56B),全部片内RAM空间(00H-FFH)分页访问的片外数据存储器(256B) 00H-FFH片外数据存储器(64KB),访问速度相对比较慢 0000H-FFFFH程序存储器(64KB) 0000H-FFFFHn C51数据的存储类型数据的存储类型 在讨论在讨论C51的数据类型的时候,必须理解数据的的数据类型的时候,必须理解数据的存储类型存储类型和它与和它与8051单片机单片机存储器结构存储器结构的关系的关系.47C51C51存储类型存储类型存储器类型存储区域大小对应的汇编语句描述code程序存储区64KBMOVC A,A+DPTR用来说明常量data直接寻址的内部数据存储区128BMOV
31、 XX,#ADDR访问速度快idata间接寻址的内部数据区256BMOV XX,Rn可访问整个内部数据区域bdata位寻址的内部数据存储区16B可使用位寻址或字节寻址来访问这一区域xdata外部数据存储或64KBMOVX A,DPTR使用DPTR来访问外部数据存储器48内部内部 ROM4KBEA=1外部外部 ROM4KBEA=0内部内部 RAM128B0FFFH0000H0FFFH0000HFFFFH1000H外部外部 RAM64KB特殊功能特殊功能寄存器寄存器(21个个SFR)外部外部 ROM60KBFFH80H7FH00H程序存储器地址空间程序存储器地址空间数据存储器地址空间数据存储器地址
32、空间FFFFH0000H(MOV 指令操作域)指令操作域)(MOVX 指令操作域)指令操作域)(MOVC 指令操作域)指令操作域)89C5189C51单片机存储器组织结构单片机存储器组织结构49存储区域的划分存储区域的划分50程序存储区(程序存储区(program memoryprogram memory) 程序存储区,也称为CODE 区,常用来存放可执行代码。代码区的地址位数为16 位,即寻址空间可达64K。 一般情况,程序存储区是只读的,除了保存可执行代码,还可用于保存各种常量值,查找表等固定的数据结构。如:unsigned char code test=“hello!”;51内部数据存储
33、区(内部数据存储区(internal data memoryinternal data memory) 内部数据存储区(internal data memory),共256个字节。这部分主要是作为程序的数据段。 前128 字节,称为DATA 区。该区可采用直接寻址方式来访问。DATA区也以用R0 和R1间接寻址访问。 后128个字节,即从地址80H 开始的内部数据存储区,用做特殊功能寄存器区(special function register memory),简称SFR。这些特殊功能寄存器用来控制计时器,计数器,串行I/O,I/O端口和外设的工作。只能直接寻址 注意:特殊功能寄存器并未占用特殊
34、功能寄存器区的所有地址单元,即特殊功能寄存器是离散分布。52内部数据存储区的DATA区又可以细分为三个子段:四个工作寄存器组,每个寄存器组包含8个寄存器,四个寄存器组共32 个字节。由PSW 的RS1 和RS0选择四组寄存器的任意一组作为当前工作寄存器组。位寻址段BDATA, 包括16 个字节,共128 位,每一位都可单独寻址。也可以按字节进行寻址。一般数据存储器,仅能按字节寻址,共80个字节。内部数据存储区(内部数据存储区(internal data memoryinternal data memory)53 说明:某些系列的单片机(如8052) 有额外的128 字节的内部RAM, 同样位于
35、从80H 开始的内部数据存储地址空间中,称为IDATA区。IDATA 区的地址和SFR的地址是重叠的,必须使用不同的寻址方式的指令来解决地址重叠问题。SFR区只能通过直接寻址来访问, IDATA 区只能通过间接寻址来访问。内部数据存储区(内部数据存储区(internal data memoryinternal data memory)54外部数据存储区(外部数据存储区(external data memoryexternal data memory) 也称为XDATA 区。XDATA区和CODE 区一样也采用16 位地址寻址,即寻址空间可达64KB。 该区通常包括一些通用数据存储器或者一些需要
36、通过总线接口访问的外围器件。 访问外部数据区比访问内部数据区要慢,因为访问外部数据区时,必须先将要访问单元的16位地址装载到数据指针寄存器DPTR中,然后才能通过DPTR采用间接访问方式来访问该单元。55 C51使用两种修饰符来表示外部数据区:xdata , pdata xdata :说明外部数据空间的所有64KB的地址空间。 pdata :指向外部数据空间中的大小为一页(256字节)的数据存储空间。 注意:某些新型的51芯片有更大的XRAM(如16M的XRAM),一般用far类型来描述这些区域。可以分别用 far 和const far 来访问位于扩充RAM空间中的变量和扩充ROM空间中的常量
37、。 某些单片机芯片提供了片内的XRAM空间,这种空间也使用和传统的外部数据空间相同的指令来访问外部数据存储区(外部数据存储区(external data memoryexternal data memory)56存储器类型的变量声明举例存储器类型的变量声明举例char data var1;char code text = ENTER PARAMETER:; unsigned long xdata array100; float idata x,y,z;unsigned int pdata dimension;unsigned char xdata vector1044;说明:说明:声明变量时声
38、明变量时存储区修饰符和数存储区修饰符和数据类型修饰符的位据类型修饰符的位置可以互换,即置可以互换,即char data x; 和和 data char x; 是完是完全等效的。不过从全等效的。不过从兼容性考虑,建议兼容性考虑,建议使用前一种格式。使用前一种格式。57变量类型修饰符总结变量类型修饰符总结 data: 速度最快,可以读或写操作,只有128字节,可以省略,89C51单片机默认的变量存储位置就是128字节的片内数据存储区。 idata: 速度较快,可以读或写操作,只有128字节,注意只存在于尾缀为52以上的单片机中,当data数据不够可用idata。 xdata: 速度较慢,可以读或写
39、操作,最多有64k字节(取决于外接的SRAM芯片容量),一般用于解决内部SRAM不够用同时对变量访问不需要非常快的应用场合。 code: 速度最慢,只读,最多有64K字节(取决于内部ROM与外部ROM容量之和)。一般用于存储大量的只读数据(如图形液晶的数据,文本数据等)58 定义数据的存储类型通常遵循如下原则:定义数据的存储类型通常遵循如下原则:只要条件满足,尽量选择内部直接寻址的存储类型data,然后选择idata即内部间接寻址。对于那些经常使用的变量要使用内部寻址。在内在内部数据存储器数量有限或不能满足要求的情况下才使用外部部数据存储器数量有限或不能满足要求的情况下才使用外部数据存储器。数
40、据存储器。选择外部数据存储器可先选择pdatapdata类型,最后最后选用选用xdataxdata类型类型。 需指出,扩展片外存储器,原理上虽很简单,但在实际开发中,很多时候,会带来不必要的麻烦,如可能降低系统稳定性、增加成本、拉长开发和调试周期等,推荐充分利用片内推荐充分利用片内存储空间。存储空间。59另外,通常的单片机应用都是面对小型的控制,代码比较短,对于程序存储区的大小要求很低,常常是片内RAM很紧张而片内Flash ROM很富裕,因此如果实时性要求不高,可考虑可考虑使用使用宏宏,以及将一些子函数的常量数据做成数据表,放置在程序存储区,当程序运行时,进入子函数动态调用下载至RAM即可,
41、退出子函数后立即释放该内存空间。60定义变量时如果省略定义变量时如果省略“存储器类型存储器类型”选项,则按编译时使用选项,则按编译时使用的存储器模式的存储器模式来使用默认的存储来使用默认的存储器类型。器类型。默认存储类型为默认存储类型为data,访问速度最快,容量小,访问速度最快,容量小默认存储类型为默认存储类型为pdata默认存储类型为默认存储类型为xdata,访问效率最低,代码长,访问效率最低,代码长,容量大容量大n C51数据的存储模式数据的存储模式61存储模式(存储模式(memory modelsmemory models) 如果在变量声明时未声明变量的存储器类型,则该变量的存储器类型
42、,由程序的存储模式来决定。 小模式(small model):默认data区 紧凑模式(compact model):默认pdata区 大模式(large model):默认xdata区 注意:除非应用在特殊的场合,否则SMALL存储模式可以提供最快和最有效的代码。 62存储模式存储模式说说 明明SMALL 参数及局部变量放入可直接寻址的片内存储器(最大参数及局部变量放入可直接寻址的片内存储器(最大128字节,字节,默认存储类型是默认存储类型是data),因此访问十分方便。另外所有对象,包括),因此访问十分方便。另外所有对象,包括栈,都必须嵌入片内栈,都必须嵌入片内RAM。栈长很关键,因为实际
43、栈长依赖于不同。栈长很关键,因为实际栈长依赖于不同函数的嵌套层数函数的嵌套层数COMPACT 参数及局部变量放入分页片外存储区(最大参数及局部变量放入分页片外存储区(最大256字节,默认的存字节,默认的存储类型是储类型是 pdata),通过寄存器),通过寄存器R0和和R1间接寻址,栈空间位于内部间接寻址,栈空间位于内部数据存储区中数据存储区中LARGE 参数及局部变量直接放入片外数据存储区(最大参数及局部变量直接放入片外数据存储区(最大64KB,默认存,默认存储类型为储类型为 xdata),使用数据指针),使用数据指针DPTR来进行寻址。用此数据指针来进行寻址。用此数据指针访问的效率较低,尤其
44、是对二个或多个字节的变量,这种数据类型访问的效率较低,尤其是对二个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度,另一不方便之处在于这种数据指的访问机制直接影响代码的长度,另一不方便之处在于这种数据指针不能对称操作针不能对称操作单片机的存储模式633.3.3 C513.3.3 C51的数据运算的数据运算符号说明+加法运算-减法运算*乘法运算/除法运算%取模运算+自增1-自减1算术运算符及其说明算术运算符及其说明64 对于“/ /”和“%”%”往往会有疑问。这两个符号两个符号都涉及除法运算,但“/”运算是取商,而“%” 运算为取余数。例如例如“5/35/3”的结果(商)的结果(商)为
45、1,而“5%35%3”的结果的结果为2(余数)。 自增和自减运算符是使变量自动加1或减1,自增和自减运算符放在变量前和变量之后是不同的。+i+i,-i-i:在使用:在使用i i之前,先使之前,先使i i值加(减)值加(减)1 1。i+i+,i-i-:在使用:在使用i i之后,再使之后,再使i i值加(减)值加(减)1 1。65 例如:例如:若i=4,则执行x=+i时,先使i加1,再引用结果,即x=5,运算结果为i=5,x=5。再如:再如:若i=4,则执行x=i+时,先引用i值,即x=4,再使i加1,运算结果为i=5,x=4。66关系运算符关系运算符符号说明大于=大于或等于=小于或等于=等于!=
46、不等于67逻辑运算符逻辑运算符符号说明&逻辑与逻辑或!逻辑非68位运算符位运算符 位运算是指进行二进制位的运算。在单片机编程中,常需要处理二进制位的问题。 例如:例如: 将寄存器的某一位或某几位置1、清0与取反;将一个存储单元中各二进制位左移或右移N位,两个数按位相加等等。 C语言中提供位运算的功能,更加贴近单片机硬件,与其他高级语言相比,具有很大的优越性。69位运算符位运算符符号含义&按位与|按位或按位异或按位取反。一元运算符右移操作。右边移出的位舍去,左边移入的位对无符号数补0;对有符号数补符号位70位运算符位运算符 左移运算符() 用来将一个数的各二进位全部左移若干位,左
47、高位溢出,右低位补0。 如b=a2;a=a2;a=2; a=15,左移2位等于多少? 高位左移后溢出,舍弃掉。在该数左移时被溢出舍弃的高位不包含1时,左移1位相当于该数乘以2. 152=60 143) 用来将一个数的各二进位全部右移若干位,左高位补0,右低位溢出。 如b=a2;a=a2;a=2; a=15,左移2位等于多少? 低位右移后溢出,舍弃掉。 152=3 142=372位运算符位运算符 按位异或运算符() 异或运算符的规则是参加运算的两个二进制位相同为0(假),相异为1(真)。即 00=0;01=1;10=1;11=0; 例如:0 x2D0 x0F=0 x22,将十六进制数0 x2D与
48、十六进制数0 x0F进行按位异或运算,高四位保持不变,低四位全部翻转。通过按位运算可以实现对变量的某一位或某几位取反操作。73位运算符位运算符 取反运算符() 是一个单目运算符,用来对一个二进制数按位取反,即将0变1,1变0。例如48。 取反运算符常与移位运算符及按为与、按位或、按位异或运算符结合使用以实现对某一位或某几位清0、置1、取反的操作。 按位与运算符(&) 参加运算的两个数据,按二进制位进行与运算。 按位或运算符(|) 参与按位或运算的二进制位中只要有一个为1,该位的结果为1. 74编程实例编程实例( (流水灯编程演示)流水灯编程演示) 实现8位LED从左到右循环 实现8位L
49、ED左右来回循环75 例:unsigned char x=0 x55 ; unsigned char y=0 x37 ; unsigned char z; z=x&y ; 则z=0 x15 z=x|y ; 则z=0 x77 z=xy ; 则z=0 x62 z=x; 则z=0 xAA z=x1;则z=0 x2A位运算符举例位运算符举例76位运算举例(将某一位置位运算举例(将某一位置1 1、置、置0 0、取反)、取反)将某一位置1(相应位与1进行按位或运算) 例:P0 | = (1 n); /将P0的第n位置1,其它位不变将某一位置0 (相应位与0按位进行与运算) 例:P0 & =
50、 (1 n); /将P0的第n位置0,其它位不变将某一位取反(相应位与1进行按位异或运算) 例:P0 = ( 1 n ) 77按位与的用途按位与的用途某一位或某几位清零而其它位保持原值如 原有数在P0寄存器中,为01011010,现要将其第一位清0,其它位保持不变。 则可与11111101进行按位与。 即 P0 = P0 & 0 xFD; 或 P0 &= 0 xFD 也可写成 P0 &= (11);P0 & = (1 n); /将P0的第n位置0,其它位不变78按位与的用途按位与的用途 取一个数中的某些指定位例:取单片机P0口的P0.2位状态(1或0)可这样操作
51、: if(P0 &(12) ; else.;79按位异或的用途按位异或的用途将某一位或某几位取反(相应位与1进行按位异或运算) 例:P0 = ( 1 n ) 编程实现 8位LED灯1357位和2468位依次交替闪烁80按位或的用途按位或的用途 将某一位或某几位置1(相应位与1进行按位或运算) 例:P0 | = (1 n); /将P0的第n位置1,其它位不变81赋值、指针和取值运算符赋值、指针和取值运算符符号说明=赋值*指向运算符&取地址82复合赋值运算符 十种:, , , , ,。按优先级顺序结合运算。 例如: a+=b 等价于a=(a+b) x*=a+b 等价于x=(x*(a
52、+b) a&=b 等价于a=(a&b) a=4 等价于a=(ay) P0=y; if (表达式)语句1 if(xy) P0=x;else 语句2 else P0=y; if (表达式1)语句1else if(表达式2)语句2else if(表达式3)语句3else 语句n 在选择结构中,else默认与最靠近它的if配对,可用改变配对。 if语句中,如果需要执行的语句不止一条,可用组成复合语句。8889例:例:K1-K4K1-K4按键状态显示按键状态显示 设计一电路和程序实现如下功能: 按下K1或K2键时LED1或LED2点亮,松开时对应的LED熄灭,当按下K3或K4后释放时,L
53、ED3或LED4点亮,再次按下并释放时熄灭。90XTAL218XTAL119ALE30EA31PSEN29RST9P0.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/A1
54、124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51C122pFC222pFC310uFX112MR110kD1R2220D2R3220D3R4220D4R5220K1K2K3K4K1,K2按下时按下时LED亮亮,松开时灭松开时灭K3,K4按下时按下时LED亮亮,再次按下时灭再次按下时灭91 switch语句专门用来处理多路分支的情形,形式如下:switch (表达式)case 常量表达式1:语句1:break;case 常量表达式2:语句2:break;case 常量表达式n:语句n:break;default:语句n+1;break;92 对switch语句
55、需要注意:case分支中的常量表达式的值必须是整形、字符型或枚举类型,不能使用条件运算符。break语句用于跳出switch结构。若case分支中未使用break语句,则程序将继续执行下一个case分支中的语句直至遇到break语句或整个switch语句结束。这可以用于多个分支需要执行相同的语句进行处理的情况。93 for循环语句的一般格式为: for(表达式1; 表达式2; 表达式3) 循环体语句 for循环语句的执行过程为: 求解表达式1。 求解表达式2。若其值为真,则执行循环体;若其值为假,则循环语句结束,执行后续语句。 求解表达式3。并转到第2步继续执行,直至条件为假时结束循环。 注意
56、:若第一次求解表达式2,其值就不成立,则循环体将一次都不执行。94 while循环 while语句格式为: while(表达式) 循环体语句 while语句先求解循环条件表达式的值。如果为真,则执行循环体;否则跳出循环,执行后续操作。 注意:一般来说在循环体中应该有使循环最终能结束的语句。如果表达式初始值为假,则循环体将一次都不执行。95 dowhile循环 dowhile语句格式为: do 循环体语句 while(表达式); dowhile循环是先执行循环体一次,再判断表达式的值,若为真,则继续执行循环,否则退出循环。 注意:dowhile语句至少执行循环体一次96 while(1) /循环
57、体; while(1); for(;);97 goto语句 goto语句的格式: goto 语句标号; goto语句是无条件转移语句,它将程序的运行转移 到指定的标号处。 注意:goto语句使程序的转移控制变得非常灵活,但是也可能破坏程序良好结构,因此应小心使用。 98break语句 在循环语句中,break语句的作用是在循环体中测试到指定条件为真时,其控制程序立即跳出当前循环结构,转而执行循环语句的后续语句。continue语句 continue语句只能用于循环结构中,作用是结束本次循环。一旦执行了continue语句,程序就跳过循环体中位于该语句后的所有语句,提前结束本轮循环并开始下一轮循
58、环。 99例程:用四个按键分组控制例程:用四个按键分组控制LEDLED 电路图如图所示: 编程实现以下功能:每次按下K1时LED从上到下递增点亮一只LED,全亮时再次循环开始。K2按下后点亮上面4只LEDK3按下后点亮下面4只LEDK4按下后关闭所有LED要求,用switch 语句来处理按键功能的实现1001013.5 3.5 函数函数 从用户的角度来看,有两种函数:标准库函数和用户从用户的角度来看,有两种函数:标准库函数和用户自定义函数。自定义函数。 函数定义的一般形式为:函数定义的一般形式为: 函数类型函数类型 函数名(形式参数表)函数名(形式参数表) 形式参数说明;形式参数说明; 局部变
59、量定义;局部变量定义; 函数体语句;函数体语句; 其中,其中,“函数类型函数类型”说明了自定义函数返回值的类型。说明了自定义函数返回值的类型。 102在在C C语言中可以采用三种方式完成函数的调用:语言中可以采用三种方式完成函数的调用: (1 1)函数语句。在主调函数中将函数调用作为一条语句。)函数语句。在主调函数中将函数调用作为一条语句。如:如:delay(100);delay(100); (2 2)函数表达式。在主调函数中将函数调用作为一个运算对)函数表达式。在主调函数中将函数调用作为一个运算对象直接出现在表达式中。象直接出现在表达式中。 如:如:c=2c=2* *max(a,b); ma
60、x(a,b); (3 3)函数参数。在主调函数中将函数调用作为另一个函数用)函数参数。在主调函数中将函数调用作为另一个函数用的实际参数。的实际参数。如如:m=max(a,max(b,c):m=max(a,max(b,c)103函数举例函数举例设计可调节时间的延时程序设计可调节时间的延时程序void delay10ms(uint n)uchar i,j;while(n-)for(i = 128;i 0;i-)for(j = 10;j 0;j-);104函数举例函数举例 带参数返回函数带参数返回函数uchar Busy_Check()uchar state;Lcd_RS = 0;Lcd_RW = 1;Lcd_EN = 1;DelayMS(1);state = P0; Lcd_EN = 0;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国电动螺丝枪行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国珠光色素粒子行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国热收缩机行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国温控药品包装行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年中国混合现实行业市场现状供需分析及投资评估规划分析研究报告
- 职业转型培训保证金协议
- 2025至2030年中国男式高档袜市场分析及竞争策略研究报告
- 文化机构心理健康教育项目计划
- 智慧城市项目施工组织设计计划
- 2025至2030年中国油皮沙发市场分析及竞争策略研究报告
- 心力衰竭试题及答案
- 公安治安管理培训
- 平面向量及其应用 章末题型归纳总结(基础篇)(10大题型)原卷版-2024-2025学年高一数学(人教A版必修第二册)
- 债权管理制度
- 运动营养学知到课后答案智慧树章节测试答案2025年春黑龙江冰雪体育职业学院
- 【基于改进杜邦分析法的中国东方航空公司财务分析(数据图表论文)13000字】
- 2025高级插花花艺师核心备考试题库及答案(浓缩300题)
- 光伏发电站施工规范完整版2025年
- 金氏五行升降中医方集
- 煤矿防洪专项应急预案
- 2025年陕西省初中学业水平考试英语 例析与指导 试卷示例题
评论
0/150
提交评论