版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机原理与应用第3章指令系统与汇编语言程序设计内容指南:单片机的工作就是执行程序,而程序是指令的有序集合。汇编语言是最基本的编程方式,而C语言则是单片机程序开发的主流。对于应用C语言程序开发的读者来说,了解单片机的指令系统和汇编语言也是十分必要的。本章主要介绍AT89S51单片机的指令系统与汇编语言程序设计。学习目标:掌握51单片机指令系统与汇编语言程序的基本概念。了解51单片机汇编指令的分类、语法规则、功能及程序用法。了解汇编语言程序设计步骤及编程方法。第3章指令系统与汇编语言程序设计3.1指令系统概述3.2寻址方式3.3指令详解3.4汇编语言程序设计
第3章指令系统与汇编语言程序设计数据传送类(28条)算术运算类(24条)逻辑运算类(25条)控制转移类(17条)位操作类(17条)指令系统——计算机中全部指令的集合51单片机共有111条指令,按功能可划分为五大类:指令——CPU用于指挥功能部件完成某一指定动作的指示
和命令第3章指令系统与汇编语言程序设计CPU能直接识别并执行的指令是机器语言指令,表现形式为二进制编码。例如:0111010010101011机器语言指令显然不利于阅读与编程第3章指令系统与汇编语言程序设计为了改善可读性约定了一些能反应机器指令功能的单词来代表该机器指令把内部的各种资源符号化!!0111010010101011MOVA,#0ABH汇编指令机器指令第3章指令系统与汇编语言程序设计易懂的单词ADDCLRSETBRETJMPSWAPNOPACCBDPTRP0TMODSBUF资源符号化第3章指令系统与汇编语言程序设计编译器就是将“高级语言”翻译为“机器语言”的程序KeiluVision4MicrosoftVisualC++6.0第3章指令系统与汇编语言程序设计汇编语言:用助记符号表示指令的计算机语言汇编指令集、伪指令和使用他们的规则的统称特点1.与机器相关性不同型号CPU有不同的机器指令系统,也就有不同的汇编语言2.执行效率高汇编直接对硬件操作3.编写程序较为复杂汇编语言要安排运算的每一个细节4.汇编语言用到大量的各类转移指令,这些跳转指令加大了调试的难度第3章指令系统与汇编语言程序设计使用领域:要求执行效率高,反应快的领域如:操作系统内核,实时系统与硬件资源密切相关的软件开发如:设备驱动程序受存储容量限制的应用领域如:家用电器的计算机控制功能没有适当的高级语言开发环境不宜使用的领域:大型软件的整体开发第3章指令系统与汇编语言程序设计汇编语言(AssemblyLanguage)——用助记(字)符代替操作码,用地址符号代替地址码的一种面向机器的程序设计语言;本章学习目标:了解汇编语言的一般规则,借助指令手册能读懂汇编程序。汇编语言特点——代码精炼、执行速度快,但不便于编写较复杂的程序;汇编程序处理过程——输入源程序→检查语法正确性(如有语法错误,输出错误信息)→翻译成二进制目标程序。第3章指令系统与汇编语言程序设计一条汇编语言指令中最多包含4个区段,其一般格式为:
[标号:]操作码[操作数][;注释]标号(标识符)当前指令行的符号地址,其值为
该指令的机器码首字节在ROM中的存放地址;标号由英文字母开头的1~6个字符组成,不区分大小写;标号与(英文)冒号可以同时省略。………….…….0122H0123H0124H…….
xxH
xxH
xxH
74H
12HROMSTART→
[标号:]
操作码[操作数][;注释] ……START:MOVA,#12H;机器码7412H ……例如:第3章指令系统与汇编语言程序设计
[标号:]
操作码
[操作数][;注释]操作码是指令的操作行为,由操作码助记字符表征;51单片机共有42种操作码助记符,不区分大小写。MOVA,#12H;
move(传送)SETBP1.0 ;setbit(置位)CJNEA,R0,START;compareandjumpifnotequal(比较跳转)举例:第3章指令系统与汇编语言程序设计
[标号:]操作码
[操作数]
[;注释]操作数是指令的操作对象,用操作数简记符表示,不区分大小写;操作数可以是3个、2个、1个或没有操作数;操作数大于1时要用(英文)逗号隔开。CJNEA,R0,START;若A≠R0,转STARTADDA,#10H ;A+10H→ACRLA ;A←0RET ;子程序返回举例:第3章指令系统与汇编语言程序设计
[标号:]操作码[操作数]
[;注释]注释是对指令的解释性说明,用以提高程序的可读性;可用任何文字或符号描述,可以省略;由(英文)分号开始,无需结束符号。MOVA,#12H;立即数12H→ASETBP1.0 ;P1.0←1CJNEA,R0,START;若A≠R0,转START
举例:第3章指令系统与汇编语言程序设计指令手册中,每条指令的操作数却是以简记符号表示的。掌握简记符号规则→便于阅读源程序(查指令手册)真实指令中一般都含有具体的操作数,例如:MOVA,R3或MOVA,#35H第3章指令系统与汇编语言程序设计简记符号Rn(n=0~7)-当前工作寄存器组中的寄存器R0~R7之一Ri(i=0,1)-当前工作寄存器组中的寄存器R0或R1@----------间址寄存器前缀#data------8位立即数/#data16-----16位立即数direct------片内低128个RAM单元地址及SFR地址addr11------11位目的地址addr16------16位目的地址rel---------8位地址偏移量,范围:-128~+127bit---------片内RAM位地址、SFR的位地址(X)------表示X地址单元或寄存器中的内容((X))------由X间接寻址的单元中的内容←----------箭头左边的内容被箭头右边的内容所取代/----------位操作数的取反操作前缀第3章指令系统与汇编语言程序设计寻址方式是对操作数存在规律的归纳,一条指令究竟属于哪种寻址方式往往并不重要,也不会影响它的使用,因而不必过意追究。51单片机共有七种寻址方式:直接寻址、寄存器寻址、寄存器间接寻址、立即寻址、变址寻址、位寻址、相对寻址。寻址方式越多,单片机的功能就越强;CPU取得操作数的方法称为寻址方法
寻址方式第3章指令系统与汇编语言程序设计立即寻址操作数在指令编码中寻址空间:ROM对于MOVDPTR,#2100H指令,立即数高8位“21H”装入DPH
【例】执行MOVA,#50H
结果:(A)=50H
MOV A,#100MOV 33H,#10H
MOV R0,#0FFH
第3章指令系统与汇编语言程序设计寄存器寻址操作数在寄存器中寻址范围:R0~R7、A、B、DPTR【例】若(R0)=30H,
执行MOVA,R0后,(A)=30H
MOV A,R0
ADD A,R5
MOV
R7,A INCDPTR
第3章指令系统与汇编语言程序设计直接寻址指令中的操作数直接以单元地址的形式给出寻址空间:片内RAM低128字节;SFR(符号形式)另一类直接寻址是转移目标地址的寻址。如:LJMPADDR16【例】若(50H)=3AH,
执行MOVA,50H后,(A)=3AH
MOV A,30HMOV 50H,BADD A,60HMOVA,P1第3章指令系统与汇编语言程序设计寄存器间接寻址寄存器中的内容是操作数的地址寻址空间:片内RAM(@Ri、SP) 片外RAM(@Ri、@DPTR)【例】若(R0)=30H,(30H)=5AH
执行MOVA,@R0后,(A)=5AH
MOV A,@R0MOV @R1,AADD A,@R0MOVXA,@DPTR第3章指令系统与汇编语言程序设计位寻址(实质属于位的直接寻址)寻址位数据寻址空间:片内RAM位空间、SFR位空间【例】位地址00H内容为1,MOVC,00H执行后,位地址PSW.7的内容为1。位地址的表示方法:用位名称如P1.5,Cy用位地址如95HMOV C,30HCLRCSETB20HCPLP1.0第3章指令系统与汇编语言程序设计变址寻址操作数地址:基地址+偏移量寻址空间:ROM【例】(A)=0FH,(DPTR)=2400H
执行MOVCA,@A+DPTR(A)=88HMOVC
A,@A+DPTRMOVC
A,@A+PCJMP@A+DPTR第3章指令系统与汇编语言程序设计相对寻址用于跳转指令,实现程序分支Rel常用符号地址表示,离源地址不要超过(-128~+127)
【例】若rel为75H,PSW.7为1,JCrel存于1000H开始的单元。执行JCrel指令后,程序将跳转到1077H单元取指令并执行。
JCrelJBP1.3,ALARMJZNEXTDJNZR7,LOOP第3章指令系统与汇编语言程序设计——可实现RAM、SFR和ROM之间的数据互传或交换数据传送与交换类指令
指令分类介绍第3章指令系统与汇编语言程序设计第3章指令系统与汇编语言程序设计数据传送与交换类指令共有8种操作码: MOV用于访问片内RAM MOVX用于访问片外RAM MOVC用于访问程序存储器 XCH和XCHD用于字节交换 SWAP用于A内半字节交换 PUSH和POP用于堆栈操作第3章指令系统与汇编语言程序设计数据传送类指令的基本通式为:
<
transfer>
<dest>,<src>表示将源操作数(src)的内容传送给目的操作数
(dest),传送后源操作数中内容不变。transfer具有三种具体形式:MOV——数据在片内RAM范围内传送MOVX——数据在A与片外RAM之间传送MOVC——数据在A与ROM之间传送第3章指令系统与汇编语言程序设计单向箭头表示只能从源到目的双向箭头表示源和目的可以互换位置弧线箭头表示源和目的相同(唯一)箭头线旁边的文字是相应的操作码基本规律:①立即数和ROM地址只能作为源操作数(单向箭头);②内外ROM与A的数据传送只能用MOVC操作码助记符;③片外RAM与A的数据传送只能用MOVX操作码助记符;④PUSH、POP、SWAP只有1个操作数(弧线箭头);⑤位数据传送只能在C(即Cy标志位)与bit间进行。数据传送目的和源的快捷记忆法第3章指令系统与汇编语言程序设计算术运算类指令
——可实现加、减、乘、除和增1、减1等运算功能第3章指令系统与汇编语言程序设计算术运算类指令共有8种操作码: ADD用于不带进位加法 ADDC用于带进位加法 SUBB用于带借位减法 INC和DEC用于加1和减1 MUL用于乘法 DIV用于除法
DA用于十进制加法调整第3章指令系统与汇编语言程序设计特点:①除加1和减1外,都需以累加器A为目的操作数;②一般都会影响PSW中的CY、AC、OV和P四个标志位。AC算术运算类指令快捷记忆法第3章指令系统与汇编语言程序设计逻辑运算及移位类指令
——可实现与、或、异或、求反、置1、清0、移位等功能第3章指令系统与汇编语言程序设计逻辑运算及移位类指令共有10种操作码: ANL用于逻辑与运算 ORL用于逻辑或运算 XRL用于逻辑异或运算 SETB和CLR用于置1和清0 CPL用于取反 RL和RR于循环左移和循环右移
RLC和RRC用于带C循环左移和带C循环右移第3章指令系统与汇编语言程序设计特点:字节运算以A为目的操作数(#data与direct的运算例外),位运算以C为目的操作数。CLRCPLCLRSETB逻辑运算指令快捷记忆法第3章指令系统与汇编语言程序设计特点:只能针对A进行操作左移1位相当于乘2,右移1位相当于除2。功能:对累加器A进行循环移位操作循环移位指令的四种移位关系第3章指令系统与汇编语言程序设计控制转移类指令
——通过改变程序计数器PC值,实现程序转移功能
第3章指令系统与汇编语言程序设计控制转移类指令共有18种操作码:AJMP、SJMP、LJMP、JMP用于无条件转移ACALL和LCALL用于子程序调用RET和RETI用于子程序和中断返回JZ、JNZ、CJNE和DJNZ用于字节条件转移
JC、JNC、JB、JNB和JBC用于位条件转移NOP用于空操作第3章指令系统与汇编语言程序设计功能:根据转移地址修改PC当前值;转移地址:LJMP——16位;AJMP——11位;
SJMP——8位;JMP——16位特点:前三项都可用语句标号代替具体地址;
(例如LJMPSTART或SJMP$)
第四项为变址寻址转移指令
PC←A+@DPTR无条件转移第3章指令系统与汇编语言程序设计功能:根据转移地址(rel)修改PC当前值;特点:rel值为-128~127,可用语句标号代替;
例如JCSMALL以rel表示操作数的存在方式——相对寻址条件转移指令快捷记忆法
第3章指令系统与汇编语言程序设计伪指令
汇编语言指令的两类指令:真指令(指令性语句)——汇编后可以产生机器码的指令,如前介绍的111条指令;伪指令(指示性语句)——用于指示汇编系统软件要完成的操作,一般不产生机器码常用的伪指令:
ORG、END、EQU、DATA、BIT、DB第3章指令系统与汇编语言程序设计
MCS-51常用伪指令伪指令名称格式功能描述ORG(Oringin)程序起始地址ORG16位地址用于定义汇编程序或数据在ROM中存放的起始地址EQU(Equate)等值指令标识符EQU数或汇编符号用于将一个数值或汇编符号赋给该标示符DATA(Data)数据地址赋值标识符DATA内存字节地址用于将一个内部RAM的地址赋给该标示符BIT(Bit)位地址赋值标识符DATA位地址或位名称用于将一个位地址或位名称赋给该标示符DB(DefineByte)定义字节[标号:]DB<项或项表>用于把项或项表中的字节(8位)数值依次存入标号开始的存储单元中END(End)结束汇编END用于指示汇编源程序段结束第3章指令系统与汇编语言程序设计汇编语言程序设计步骤
分析问题,确定算法或解题思路
画程序流程图编写汇编程序程序调试与修改用汇编语言进行程序设计的过程和用高级语言进行程序设计的过程类似,一般需要经过以下几个步骤:第3章指令系统与汇编语言程序设计流程图(程序框图)表示程序的执行过程或解题步骤和方法给出程序的结构,体现整体与部分之间的关系便于阅读、理解程序,查找错误起始第3章指令系统与汇编语言程序设计【例3-17】电路如图3-8所示,AT89S51单片机的P2口作输出,经上拉电阻驱动连接8只发光二极管D1~D8,当输出位为1时发光二极管点亮;输出位为0时发光二极管熄灭。试编制程序实现以下发光二极管点亮的功能:D1D8亮其余灭→延时→D2D7亮其余灭→延时→D3D6亮其余灭→延时→D4D5亮其余灭→延时→D3D6亮其余灭→延时→D2D7亮其余灭→延时→D1D8亮其余灭,重复上述过程。第3章指令系统与汇编语言程序设计①确定解决方案高电平驱动的发光二极管,写1灯亮,写0灯灭;循环改写P2.0~P2.7;通过软件延时子程序调节P2口输出频率。第3章指令系统与汇编语言程序设计②画程序流程图尽可能详细地表示出每一相关环节的内容
③编写汇编程序第3章指令系统与汇编语言程序设计④程序编译调试第3章指令系统与汇编语言程序设计实际运行效果:第3章指令系统与汇编语言程序设计单片机原理与应用第4章单片机的C语言程序设计内容指南本章主要介绍C51语言的数据结构和程序结构、C51语言的运算符与表达式、C51语言的函数等编程基础,在此基础上结合Keil
uVision编译调试环境和Proteus仿真设计环境,重点讨论了单片机并行I/O口的C51编程应用。学习目标掌握C51语言的数据结构和编程相关基础。熟悉KeiluVision编译调试环境和Proteus仿真设计环境的使用。掌握常用外设和单片机I/O的连接原理及编程方法。第4章单片机的C语言程序设计第4章单片机的C语言程序设计汇编语言能直接操作单片机的系统硬件,程序代码效率高。但其程序可读性差,且编写、移植困难。
C51是为51内核单片机设计的一种C语言,其特点:C51语言已成为51系列单片机程序开发的主流软件方法。结构化语言,代码紧凑——效率可与汇编语言媲美接近真实语言,程序可读性强——易于调试、维护库函数丰富,编程工作量小——产品开发周期短机器级控制能力,功能很强——适合于嵌入式系统开发与汇编指令无关,易于掌握——在单片机基础上上手快第4章单片机的C语言程序设计4.1C51语言的数据结构4.2C51语言的运算符与表达式
4.3C51语言的函数4.4C51的程序结构4.5C51开发调试环境4.6并行I/O口的应用编程
第4章单片机的C语言程序设计4.1C51的数据结构、C51的数据类型C51支持标准C中的基本数据类型,包括字符型char、整型int、长整型long和浮点型float。对整数类型,又可以分为signed(有符号数)和unsigned(无符号数)两种。若声明为signed,编译器会将整数部分的最高位解释为符号位。此外,根据51内核单片机存储结构的特点,C51增加了一些特有的数据类型,包括普通位类型bit、特殊功能寄存器可寻址位sbit、特殊功能寄存器sfr和sfr16。普通位类型bitAT89S51/S52单片机中,片内RAM地址0x20~0x2f共16个字节是可以位寻址的。因此,C51中专门规定了位变量类型来方便这部分内存的访问。在C51中,用关键词bit定义一个位变量,格式如下: bit
bit_name[=0或1]; 例如:bitdoor=0;//定义一个叫door的位变量且初值为0 可见与标准C的数据类型声明的语法规则是一致的。第4章单片机的C语言程序设计
特殊功能寄存器可寻址位sbit对于可位寻址的特殊功能寄存器,可以使用sbit关键字将特殊功能寄存器位声明为位变量以方便访问。C51提供了以下三种方法声明特殊功能寄存器位变量:(1)第1种方法
sbit
位名=特殊功能寄存器名^位置;(2)第2种方法
sbit
位名=字节地址^位置;(3)第3种方法
sbit
位名=位地址;第4章单片机的C语言程序设计例:
sfrPSW=0xD0;
sbitOV=PSW^2;
sbitOV=0xD0^2;
sbitOV=0xD2;第4章单片机的C语言程序设计特殊功能寄存器sfr和sfr16关键词sfr或sfr16用于定义SFR字节地址变量,格式如下:sfr
sfr_name=
字节地址常数;sfr16sfr_name=
字节地址常数;例如, sfrP0=0x80;//定义P0口地址80H
sfrPCON=0x87;//定义PCON地址87H sfr16DPTR=0x82;//定义DPTR的低地址82H第4章单片机的C语言程序设计第4章单片机的C语言程序设计2.C51的变量
在程序执行过程中,数值可以发生改变的量称为变量。变量的基本属性是变量名和变量值。变量名与存储单元地址相对应(变量名就是数据的符号地址),变量值与存储单元的内容相对应。例如第4章单片机的C语言程序设计【存储种类】
数据类型
【存储类型】
变量名;(标准C)(标准C)C51变量定义的四要素:(C51特有)(标准C+C51)括号项【】——可以缺省数据类型和变量名不能缺省要在C51程序中使用变量必须先对其进行定义。第4章单片机的C语言程序设计【存储种类】
数据类型
【存储类型】
变量名存储种类用于说明变量的作用范围:1、auto(自动型)——变量的作用范围在定义它的函数体或语句块内。执行结束后,变量所占内存即被释放。2、extern(外部型)——在一个源文件中被定义为外部型的变量,在其它源文件中需要通过extern说明方可使用。3、static(静态型)——利用static可使变量定义所在的函数或语句块执行结束后,其分配的内存单元继续保留。4、register(寄存器型)——目前已不推荐使用。缺省存储种类为auto(自动)型变量第4章单片机的C语言程序设计数据类型用于表示数据存放格式,C51支持的基本数据类型与标准C相同:*有符号数类型可以忽略signed标识符【存储种类】
数据类型
【存储类型】
变量名C51编译器在头文件“REG51.H”中定义了全部sfr/sfr16和sbit类型变量。用一条预处理命令#include<REG51.H>把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。第4章单片机的C语言程序设计第4章单片机的C语言程序设计编程举例:【存储种类】
数据类型
【存储类型】
变量名存储类型体现了变量的存放区域。51系列单片机共有6个存储类型(分布在3个逻辑存储空间中)。data区code区xdata区bdata区pdata区idata区第4章单片机的C语言程序设计不同存储类型的特点SMALL系统COMPACT系统LARGE系统编译模式第4章单片机的C语言程序设计三种编译模式分别对应于三种缺省存储类型:如果定义变量时省略存储类型,编译器会自动默认存储类型(由编译模式决定存储类型,默认SMALL模式)3种编译模式分别对应于3种缺省存储类型:第4章单片机的C语言程序设计【存储种类】
数据类型
【存储类型】
变量名C51编译器可根据当前采取的编译模式自动认定默认的存储类型约定:若无特殊声明,一般均为“SMALL编译模式”变量名可以由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线,变量名长度随编译系统而定。变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。强调:头文件中定义的变量都是大写的,若程序采取小写变量则需要重新定义。【存储种类】
数据类型
【存储类型】
变量名第4章单片机的C语言程序设计C51扩展的若干关键字一览表
变量名不得使用标准C语言和C51语言的关键字。第4章单片机的C语言程序设计unsignedchardatasystem_status=0;
//定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。数据结构定义举例变量名为system_status位与片内RAM区无符号字符型自动型初值为零第4章单片机的C语言程序设计unsignedcharbdata
status_byte;
unsignedintcodeunit_id[2]={0x1234,0x89ab};
staticcharm,n;
//定义status_byte为无符号字符型自动变量,该变量位于bdata区//定义unit_id[2]为无符号整型自动变量,该变量位于code区中,是长度为2的数组,且初值为0x1234和0x89ab。//定义m和n为2个位于data区中的有符号字符型静态变量。第4章单片机的C语言程序设计3、C51的数组构造数据类型之一数组:有序数据的集合,用数组名标识元素:属同一数据类型,用数组名和下标确定第4章单片机的C语言程序设计一维数组的定义:数据类型数组名[常量表达式];
合法标识符表示元素个数例
inta[6];a[0]a[1]a[2]a[3]a[4]a[5]a编译时分配连续存储地址存储字节数=数组维数*
sizeof(元素数据类型)数组名是表示数组首地址的地址常量第4章单片机的C语言程序设计一维数组的初始化
inta[5]={1,2,3,4,5};等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;说明:数组不初始化,其元素值为随机数当全部数组元素赋初值时,可不指定数组长度
inta[]={1,2,3,4,5,6};编译系统根据初值个数确定数组维数注意:数组的下标是从0开始第4章单片机的C语言程序设计一维数组的引用数组必须先定义,后使用只能逐个引用数组元素,不能一次引用整个数组引用形式:数组名[下标]其中:下标从0开始到n-1,不能越界,下标可以是变量、常量或整型表达式。例inta[10];
printf(“%d”,a);(
)必须for(j=0;j<10;j++)
printf(“%d\t”,a[j]);(
)第4章单片机的C语言程序设计数组元素也可以用指针来引用指向数组元素的指针变量例intarray[10];
int*p=&array[0](或int*p=array);array[0]array[1]array[2]array[3]array[9]...整型指针p&array[0]parray[i]
*(p+i)这里的*是取值运算符第4章单片机的C语言程序设计4、C51的指针
指针:一个变量的地址称为该变量的“指针”指针变量:存储变量地址(指针)的变量称为“指针变量”指针的值:某个变量在内存中的首地址指针的类型:该指针所指向的变量的类型直接访问(直接寻址):通过变量名来访问间接访问(间接寻址):通过变量的指针来访问第4章单片机的C语言程序设计指针指针变量指针的值指针的类型直接寻址间接寻址第4章单片机的C语言程序设计chara,b;char*p;p=&a;*p=10;b=*p指针有关的运算符*取值运算符&取地址运算符(直接寻址)(间接寻址)char*p=&a;标准C语言指针的一般定义形式为:
数据类型*指针变量名[=&被指向变量名];其中,数据类型说明了该指针变量所指向的变量的类型。第4章单片机的C语言程序设计例:int*pointer;//定义一个指向整型变量的指针变量pointer注意:指针变量名前的“*”号表示该变量为指针变量,但指针变量名是pointer而不是*pointer。例:inta=’A’;int*p1=&a;这表示p1是一个指向int型变量的指针变量,此时p1的值为int型变量a的地址。对于C51,除了数据类型外,指针定义中还应包含以下信息:1)指针变量自身位于哪个存储区中?
2)被指向变量位于哪个存储区中?故C51指针的一般定义形式:数据类型[存储类型1]*[存储类型2]指针变量名[=&被指向变量名]数据类型——被指向变量的类型,如int型或char型存储类型1——被指向变量所在的存储区,缺省时由地址赋值关系决定存储类型2——指针变量所在的存储区,缺省时为编译器默认的存储区第4章单片机的C语言程序设计第4章单片机的C语言程序设计如缺省存储类型,C51编译器会根据当前编译模式默认存储类型,例如:
inta=’A’; int*p1=&a;这表示p1是一个指向int型变量的指针变量,此时p1的值为int型变量a的地址,而a和p1两个变量都位于C编译器默认的内存区中。第4章单片机的C语言程序设计4.2C51语言的运算符与表达式1.算术运算符C51语言的运算符与表达式与标准C语言相同C51语言中的算术运算符有:+加法运算符-减法运算符*乘法运算符。/除法运算符。%模(求余)运算符。用算术运算符和括号将运算对象连接起来的式子称为算术表达式,其中的运算对象包括常量,变量,函数,数组等等。算术运算符的优先级规定为先乘除模,后加减,括号最优先。第4章单片机的C语言程序设计4.2C51语言的运算符与表达式2.赋值运算符C51语言的运算符与表达式与标准C语言相同 在C51语言中,赋值运算符有两类,一类是基本赋值运算符“=”,一类是基本赋值运算符派生出来的复合赋值运算符,包括:+=,-=,*=,/=,%=,>>=,<<=,&=,^=,|=。 赋值运算符将运算符右侧操作数的值赋给左侧操作数或变量。复合赋值运算符则首先对变量进行某种运算之后再将运算结果赋给该变量。利用赋值运算符将一个变量与一个表达式连接起来的式子称为赋值表达式。第4章单片机的C语言程序设计4.2C51语言的运算符与表达式3.关系运算符C51语言的运算符与表达式与标准C语言相同C51的关系运算符有6种:<(小于)>(大于)<=(小于等于)>=(大于等于)==(等于)!=(不等于)前四种关系运算符(<,>,<=,>=)的优先级相同,后两种也相同;前四种优先级高于后两种。关系运算符的优先级低于算术运算符,高于赋值运算符。第4章单片机的C语言程序设计4.2C51语言的运算符与表达式4.逻辑运算符C51语言的运算符与表达式与标准C语言相同C51的逻辑运算符有3种:&& 逻辑与(AND)|| 逻辑或(OR)! 逻辑非(NOT)逻辑与&&和逻辑或||是双目运算符,要求有两个运算对象;而逻辑非!是单目运算符,只要求一个运算对象。C51逻辑运算符与算术运算符、关系运算符、赋值运算符之间优先级的次序为:逻辑非!运算符优先级最高,关系运算符低于算术运算符但高于逻辑与&&和逻辑或||运算符,最低的是赋值运算符。第4章单片机的C语言程序设计4.2C51语言的运算符与表达式5.位操作运算符C51语言的运算符与表达式与标准C语言相同 C51有如下位操作运算符: &按位与 |接位或 ^接位异或 ~按位取反 <<位左移 >>位右移除了按位取反运算符~以外,以上位操作运算符都是两目运算符,即要求运算符两侧各有一个运算对象。位运算对象只能是整型或字符型数,不能为实型数据。第4章单片机的C语言程序设计4.3C51语言的函数标准库函数:标准库函数是由C51编译器提供的,用户可直接调用C51库函数而不需为这个函数编写任何代码,只需要包含具有该函数说明的头文件即可。例如调用正弦计算函数sin(x)时,要包含数学运算库文件: #include<math.h>用户自定义函数:用户自定义函数是用户根据需要所编写的函数。从函数定义的形式分为无参函数、有参函数和空函数。中断函数:中断函数是C51所特有的,使用interrupt关键字可以将一个函数定义成中断服务函数。①预处理命令(文件包含、宏定义)全局变量定义、函数原型说明;②程序由函数组成,函数由局部变量定义和语句(程序体)组成;③程序从主函数开始执行,主函数中的所有语句执行完毕,则程序结束。④函数和变量都需遵循先定义后使用的基本原则;第4章单片机的C语言程序设计C51与标准C程序结构完全相同4.4C51的程序结构
函数原型声明C语言程序的结构特点:1.一个程序由一个或多个源程序文件组成小程序往往只包括一个源程序文件一个源程序文件中可以包括三个部分:预处理指令全局声明若干个函数#include<stdio.h>等全局变量及函数原型的声明每个函数用来实现一定的功能第4章单片机的C语言程序设计2.函数是C程序的组成部分一个C程序是由一个或多个函数组成的.必须包含一个main函数(且只能有一个).每个函数都用来实现一个或几个特定功能被调用的函数可以是库函数,也可以是自己编制设计的函数.第4章单片机的C语言程序设计3.一个函数包括两个部分:函数首部intmax(intx,
inty)函数的第1行函数类型函数名参数类型参数名若函数无参,在括弧中写void或空括弧函数体
{}括起来部分声明部分定义在本函数中所用到的变量执行部分:由若干个语句组成,指定在函数中所进行的操作;语句以;结束。第4章单片机的C语言程序设计4.程序总是从main函数开始执行5.C程序对机器的操作由C语句完成C程序书写格式是比较自由的一行内可以写几个语句一个语句可以分写在多行上为清晰起见,习惯上每行只写一个语句6.数据声明和语句最后必须有分号7.程序应当包含注释,增加可读性第4章单片机的C语言程序设计C程序格式特点:习惯用小写字母不使用行号,无程序行概念可使用空行和空格常用锯齿形书写格式main(){
inti,j,sum;sum=0;
for(i=1;i<10;i++){
for(j=1;j<10;j++){sum+=i*j;}}
printf(“%d\n”,sum);}优秀程序员的素质之一:使用TAB缩进{}对齐有足够的注释有合适的空行第4章单片机的C语言程序设计第4章单片机的C语言程序设计举例:LED闪烁控制功能LOOP:CLRP1.0ACALLDEL50SETBP1.0ACALLDEL50SJMPLOOPDEL50:MOVR7,#200DEL1:MOVR6,#125DEL2:DJNZR6,DEL2DJNZR7,DEL1RETEND30p30p第4章单片机的C语言程序设计预处理命令---------函数声明------------全局变量定义------
主函数------------自定义函数---------局部变量定义---------
程序体
程序体------将P1.0端口定义为p1_0位变量第4章单片机的C语言程序设计1、将Keil编译形成的*.hex文件加载到*.DSN文件中,通过proteus控制仿真运行(无法在运行过程中进行调试)在Keil
uVision进行程序开发调试的步骤我们在第一章进行了介绍。这里我们结合单片机仿真软件Proteus来说明仿真开发运行的两种方式。4.5C51的程序开发与仿真调试
第4章单片机的C语言程序设计2、在Keil软件里控制Proteus仿真运行(可以在运行过程中进行调试)步骤:下载()→运行()→停止()第4章单片机的C语言程序设计4.1C51语言的数据结构4.2C51语言的运算符与表达式
4.3C51语言的函数4.4C51的程序结构4.5C51开发调试环境4.6并行I/O口的C51编程应用第4章单片机的C语言程序设计基本输出元件:发光二极管(LightEmittingDiode)低电平驱动高电平驱动灌电流拉电流基本I/O设备与单片机的连接灌入的最大电流为
10mA
拉出的最大电流为
1mA
单片机输出低电平时驱动能力尚可,输出高电平时驱动能力很差。
基本输入元件:按钮(Button)或开关(Switch)第4章单片机的C语言程序设计当按键未按下压时,Px.n端口为高电平;按压按键后为低电平。【例4-1】如图4-11单片机I/O引脚连接一开关和一LED,编程实现K1合上时L1点亮,K1断开时L1熄灭(模拟开关灯)。
while(1) {L1=K1;}第4章单片机的C语言程序设计【例4-2】如图4-13,P0口低四位连接了4个按钮,P2口低四位连接了4个LED,开机时LED全熄,编程要求根据按键的动作使相应的灯亮,并将亮灯状态保持到按压其它键时为止。第4章单片机的C语言程序设计程序分析:为使按键抬起后LED能保持先前的点亮状态,需要在按键未压下期间禁止向P2输出P0状态值。第4章单片机的C语言程序设计第4章单片机的C语言程序设计仿真运行效果【例4-3】如图4-14所示,8个发光二极管LED0~LED7经限流电阻分别接至P2口的P2.0~P2.7引脚上,阳极共同接高电平。编程来实现发光二极管的从上到下然后从下到上的流水点亮,重复循环。第4章单片机的C语言程序设计程序分析:此例中是将P2口循环送出的亮灯码构造为一个数组tab[],通过主函数中的循环控制变量i作为数组的下标来引用数组中的数据tab[i],依次送出到P2口。第4章单片机的C语言程序设计例4-4键控流水灯
第4章单片机的C语言程序设计【要求】K1为“启动键”,首次按压K1可产生“自下向上”的流水灯运动;K2为“停止键”,按压K2可终止流水灯的运动;
K3和K4为“方向键”,分别产生“自上向下”和“自下向上”运动。第4章单片机的C语言程序设计思路分析:设立状态变量→根据键值修改变量值→根据变量值控制灯的亮灭第4章单片机的C语言程序设计按键状态值:无按键——xxxx1111B按压K1——xxxx1110B按压K2——xxxx1101B按压K3——xxxx1011B按压K4——xxxx0111B按键动作判断——(P0&0x0f)是否等于0x0f?若是,说明无按键动作,反之则有按键动作。→0x0f→0x0e→0x0d→0x0b→0x07获取按键状态第4章单片机的C语言程序设计修改方向和启停标志值
switch语句是多分支选择语句,switch语句的一般形式如下:switch(表达式){ case常量表达式1:{语句1;}break; case常量表达式2:{语句2;}break;
…… case常量表达式n:{语句n;}break; default:{语句n+1;}}第4章单片机的C语言程序设计P2口亮灯编码:xxxx1110xxxx1101xxxx1011xxxx0111D1~D4循环方向控制
charled[]={0xfe,0xfd,0xfb,0xf7};for(i=0;i<=3;i++){P2=led[i];}//↓移动for(i=3;i>=0;i--){P2=led[i];}//↑移动查表方法第4章单片机的C语言程序设计if(表达式){语句1;}else{语句2;}相当于双分支选择结构voidmain(){bitdir=0,run=0;chari;while(1){switch(P0&0x0f){ //读取键值case0x0e:run=1;break; //K1动作,设run=1case0x0d:run=0,dir=0;break;//K2动作,设run=dir=0case0x0b:dir=1;break; //K3动作,设dir=1case0x07:dir=0;break;}//K4动作,设dir=0
if(run) //若run=dir=1,自上而下
if(dir)
for(i=0;i<=3;i++) {P2=led[i]; delay(200); }else //若run=1,dir=0,自下而上
for(i=3;i>=0;i--) {P2=led[i]; delay(200);}elseP2=0xff; //若run=0,灯全灭}}#include"reg51.h"unsignedcharled[]={0xfe,0xfd,0xfb,0xf7};voiddelay(unsignedchartime){unsignedintj=15000;
for(;time>0;time--)
for(;j>0;j--);}程序运行效果第4章单片机的C语言程序设计第4章单片机的C语言程序设计LED数码管原理与应用
LED显示元件——人机交互输出设备,其作用是指示中间运行结果与运行状态。点式字段式点阵式光柱式LED的类型第4章单片机的C语言程序设计引脚配置七段式LED数码管(Proteus:7-SegmentDisplay)共阳极型共阴极型公共端接“0”公共端接“1”字符的显示码或字模与数码管的类型有关第4章单片机的C语言程序设计显示字符dpgfedcba字型码共阴极共阳极0001111113FC010000011006F92010110115BA43010011114FB040110011066995011011016D926011111017D8270000011107F88011111117F809011011116F90第4章单片机的C语言程序设计【例4-5】如图4-19所示,在P0口连接一个共阴极数码管,编程使数码管循环显示0~9数字。分析:将显示码循环输出到P0口即可实现循环显示。但由于数字0~9的显示段码没有规律可循,需要采取查表方式进行操作:第4章单片机的C语言程序设计①将显示码按序存放在一个数组中,顺序号与代表的显示字符相对应(如,charled_mod[]={x1,x2,….,xn);②通过查表语句(如,P0=led_mode[i])输出显示码。第4章单片机的C语言程序设计参考程序第4章单片机的C语言程序设计仿真运行效果第4章单片机的C语言程序设计【例4-6】计数显示器根据如下共阴极型数码管电路,编程实现计数显示功能,即以十进制形式显示击键次数,次数大于99后重新由0开始。个位LED接P2口,十位LED接P0口按钮接P3.2,抬起时为1电平,按压时为0电平。第4章单片机的C语言程序设计编程分析:两个问题:1:如何将计数值拆解成个位和十位两个数?2:如何避免按键压下时被连续计数?第4章单片机的C语言程序设计初始化:P2=P0=table[0];取模运算(%10)→个位整除10运算(/10)→十位P2=table[count%10];P0=table[count/10];拆解计数值方法:第4章单片机的C语言程序设计避免连续计数——等待按键释放时才统计一次计数第4章单片机的C语言程序设计参考程序程序运行效果
第4章单片机的C语言程序设计第4章单片机的C语言程序设计按键在闭合和断开瞬间会因弹簧开
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课题开题报告模板
- 重庆三峡学院《设计史》2021-2022学年第一学期期末试卷
- 重庆三峡学院《全媒体节目制作与包装》2022-2023学年第一学期期末试卷
- 重庆人文科技学院《国家公务员制度》2021-2022学年第一学期期末试卷
- 重庆人文科技学院《传统文化艺术》2021-2022学年第一学期期末试卷
- 重庆三峡学院《继电保护及自动装置》2022-2023学年期末试卷
- 重庆三峡学院《机械设计》2023-2024学年第一学期期末试卷
- 重庆三峡学院《化工过程模拟》2022-2023学年第一学期期末试卷
- 重庆三峡学院《创意写作》2021-2022学年第一学期期末试卷
- 2024北京北京中学七年级(上)期中数学(教师版)
- 《精装修成品保护》课件
- 2024年房地产开发商与装修公司装修合同
- 2024年畜牧业经营管理教案:转型与升级
- 浙江省绍兴市建功中学教育集团2024-2025学年八年级上学期10月份学科素养竞赛语文试卷
- 2024 ESC慢性冠脉综合征指南解读(全)
- 2024二十届三中全会知识竞赛题库及答案
- (高清版)JTG 5142-2019 公路沥青路面养护技术规范
- 物流运输项目 投标方案(适用烟草、煤炭、化肥、橡胶等运输项目)(技术方案)
- 大学生生涯发展展示 (二版)
- 电力企业合规培训课件
- 领导干部任前谈话记录表
评论
0/150
提交评论