系列单片机程序设计_第1页
系列单片机程序设计_第2页
系列单片机程序设计_第3页
系列单片机程序设计_第4页
系列单片机程序设计_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

系列单片机程序设计演示文稿目前一页\总数八十六页\编于十七点系列单片机程序设计目前二页\总数八十六页\编于十七点4.1汇编语言程序设计概述计算机是仿照人的思维方式顺序执行一条条指令来完成特定任务的机器,计算机程序因此被定义为指令或语句的“有序集合”,程序设计是指编写计算机程序的过程。汇编语言是用指令助记符等表示的计算机指令,采用汇编语言编写的程序被称为汇编语言程序。汇编语言程序具有代码效率高(编译后的指令代码占用存储空间小)和执行时间短等优势和特点。由于单片机的存储器等资源有限,单片机应用程序中经常需要面对硬件操作,且对程序执行的时间有较为严格的要求或限制。因此,汇编语言程序设计是单片机应用系统设计的重要基础之一。

目前三页\总数八十六页\编于十七点4.1汇编语言程序设计概述1、汇编语言的特点:

汇编语言的特点归纳如下:

助记符指令与机器指令一一对应;

程序代码效率高,占用存储空间小,运行速度快,汇编语言程序往往是最优化的程序;

助记符指令(汇编指令)与计算机硬件联系紧密,要求编程人员对计算机硬件较为熟悉;

汇编语言程序缺乏通用性,移植性较差。

4.1.1汇编语言的特点及语句格式目前四页\总数八十六页\编于十七点4.1汇编语言程序设计概述2、汇编语言的语句格式

MCS-51系列单片机汇编语言的语句格式如下:

[<标号>]:<操作码>[<操作数>];[<注释>]

[<标号>]——标号是汇编语句地址的符号表示。

<操作码>——用于规定该语句所执行的操作。

[<操作数>]——操作数为汇编指令的操作提供数据或地址

[<注释>]——注释是指对一条汇编语句或一段汇编语言程序的说明,以增加汇编语言程序的可读性。

4.1.1汇编语言的特点及语句格式目前五页\总数八十六页\编于十七点4.1汇编语言程序设计概述

1、起始地址定位伪指令ORG

格式:[标号]:ORG操作数说明:其功能是指出紧接其后的指令的目标代码的第一个字节在程序存储器中的绝对地址。例如:

ORG0030HSTART:MOVA,#33H......即定义标号START表示的起始地址值为0030H,该段程序的指令代码从该地址开始顺序存放。

4.1.2汇编语言伪指令目前六页\总数八十六页\编于十七点4.1汇编语言程序设计概述

2、赋值伪指令EQU

格式:字符名称EQU操作数说明:该指令用于字符名称赋值。在同一个源程序中,任何一个字符名称只能赋值一次。且一旦赋值之后,整个源程序中该字符的值就固定不变了。例如:

ADPORTEQU1001H即给字符名称ADPORT赋值16进制数1001H。

4.1.2汇编语言伪指令目前七页\总数八十六页\编于十七点4.1汇编语言程序设计概述

3、数据地址赋值伪指令DATA格式:字符名称DATA操作数说明:DATA伪指令的功能与EQU伪指令相似,不同之处在于DATA伪指令所定义的字符名称可先使用后定义(赋值),也可先定义(赋值)后使用。在程序中它常用来定义(赋值)数据地址。

4.1.2汇编语言伪指令目前八页\总数八十六页\编于十七点4.1汇编语言程序设计概述

4、字节数据赋值伪指令DB格式:[标号:]DB数据表(字节)说明:该伪指令用于定义(赋值)若干字节数据表(固定常数),并存放在指定地址单元开始的程序存储器中。例如:

ORG0050HTABLE:DB99H,88H

即表示在地址0050H(标号TABLE)开始定义(赋值)两个字节数据(99H,88H)。

4.1.2汇编语言伪指令目前九页\总数八十六页\编于十七点4.1汇编语言程序设计概述

5、双字节数据赋值伪指令DW格式:[标号:]DW数据表(双字节)说明:该伪指令与DB伪指令的不同之处在于DW定义(赋值)的是双字节数据,而DB定义(赋值)的是单字节数据。高8位数据安排在低地址单元,低8位数据安排在高地址单元。6、预留空间定义伪指令DS格式:[标号:]DS操作数说明:该伪指令的作用是通知汇编程序,从指定的地址单元开始(通常由标号指定首地址),保留由操作数(常数或表达式)规定的字节空间。

4.1.2汇编语言伪指令目前十页\总数八十六页\编于十七点4.1汇编语言程序设计概述

7、位地址赋值伪指令BIT格式:字符名称BIT位地址说明:该伪指令给字符名称赋予位地址(片内RAM和SFR中的位地址),常用于位操作程序中。例如:

FLAGBIT20H

即将位地址20H赋予字符名称FLAG。8、定义汇编结束伪指令END格式:[标号:]END说明:汇编结束伪指令END的作用是通知汇编程序,汇编源程序到此结束。在一个汇编程序中,只允许出现一条END伪指令,且必须安排在整个源程序的末尾处。

4.1.2汇编语言伪指令目前十一页\总数八十六页\编于十七点4.1汇编语言程序设计概述4.2基本程序结构1、顺序结构程序2、分支结构程序3、循环结构程序4、子程序5、中断程序基本程序结构目前十二页\总数八十六页\编于十七点4.2基本程序结构

顺序结构是各类程序中最简单的,也是最基本的程序结构。顺序结构程序的特征是整个程序段没有任何转移指令。主要由数据传递类指令和数据运算类指令组成,通常用于执行数据传送和较为简单的算术或逻辑运算任务。

4.2.1顺序结构目前十三页\总数八十六页\编于十七点4.2基本程序结构

例4-1,将内部RAM中20H单元和30H单元的无符号数相加,存入R0(高位)和R1(低位)中。源程序如下:

MOVA,20H;取出被加数

ADDA,30H;两数相加

MOVR1,A;低位存入R1 CLRA;

ADDCA,#00H;取进位标志

MOVR0,A;高位存入R0 RET

4.2.1顺序结构目前十四页\总数八十六页\编于十七点4.2基本程序结构

分支结构程序利用条件转移指令,使程序在执行某一指令后(产生测试条件),根据所规定的条件满足与否改变其后程序执行的顺序(产生分叉),即根据判断条件的成立与否来确定程序的走向。分支结构程序的特征是程序段中有控制转移类指令(条件转移指令)。 依据程序分叉的数目,可将分支结构程序细分为单分支选择结构和多分支选择结构两类。

4.2.2分支结构目前十五页\总数八十六页\编于十七点4.2基本程序结构1、单分支选择结构当程序的判断仅有两个出口(分叉),即两者选一时,称为单分支结构。通常用条件判断指令来选择并确定程序的出口。例4-3.设内部RAM40H和41H单元中存放2个8位无符号二进制数,试编程找出其中的大数存人30H单元中。源程序如下:

MOVA,40H CJNEA,41H,LOOP;取2个数进行比较

LOOP:JNCLOOP1;根据CY值,判断单分支出

MOVA,41H;41H单元中是大数

LOOP1:MOV30H,A;40H单元中是大数

RET

4.2.2分支结构目前十六页\总数八十六页\编于十七点4.2基本程序结构

2、多分支选择结构当程序的判别部分有两个以上的出口(分叉)时,称为多分支选择结构。例4-4,设变量X的值存放在内部RAM的30H单元中,编程求解下列函数式,将求得的函数值Y存人40H单元。

X+1(X≥100)

Y=0(10≤X<100)

X一1(X<10)

4.2.2分支结构目前十七页\总数八十六页\编于十七点4.2基本程序结构MOVA,30H;取自变量X值

CJNEA,#10,LOOP;与10比较,A中值不改变LOOP:JCLOOP2;若X<10,转LOOP2CJNEA,#100,LOOP1;与100比较LOOP1:JNCLOOP3;若X>100,转LOOP3MOV40H,#00H;因10≤X<100,故Y=0SJMPEXITLOOP2:DECA;因X<10,故Y=X一1MOV40H,ASJMPEXITLOOP3:INCA;若X>100,故Y=X+1MOV40H,AEXIT:RET目前十八页\总数八十六页\编于十七点4.2基本程序结构

在程序设计中,遇到一段程序需要多次重复执行的情况,通常应该采用循环结构程序。1、循环结构程序组成循环结构程序由初始化、循环处理、循环控制和循环结束4部分组成。

(1)初始化部分初始化部分设置循环处理之前的初始状态,如循环次数、变量初值、地址指针初值等。

(2)循环处理部分循环处理部分又称循环体,是重复执行的数据处理程序段,它是循环程序的核心部分(功能主体)。4.2.3循环结构目前十九页\总数八十六页\编于十七点4.2基本程序结构

(3)循环控制部分 控制部分控制循环继续与否。(4)结束部分 结束部分对循环程序全部执行结束后的结果进行分析、处理和保存。 循环结构程序一般分为“单重循环”和“多重循环”两类,循环次数的控制有多种方式,当循环次数已知时,可采用循环次数计数器控制循环;若循环次数未知时,可按条件满足与否控制循环。4.2.3循环结构目前二十页\总数八十六页\编于十七点4.2基本程序结构2.循环程序设计

在一个循环程序的循环体中不包含另外的循环结构称为单重循环。

例4-5,设某字符串以回车符(0DH)为结束标志,并存放在内部RAM40H单元开始的连续存储单元之中,编写测试字符串长度的汇编语言程序。

编程思路——为测试字符串(0DH)的长度,应使用逐个字符依次与回车符(ODH)比较的方法。为此需要设一个字符串指针和一个长度计数器,字符串指针用于指定字符,长度计数器用于累加字符串的长度。如比较不相等,则长度计数器和字符串指针都加1,以继续往下比较;如果比较相等,则表示该字符为回车符,字符串结束,长度计数器的值就是字符串的长度。4.2.3循环结构目前二十一页\总数八十六页\编于十七点4.2基本程序结构2.循环程序设计

程序如下:

MOVR7,#0FFH;设长度计数器初值

MOVR0,#3FH;字符串指针初值LOOP:INCR7INCR0 CJNE@R0,#ODH,LOOP RET4.2.3循环结构目前二十二页\总数八十六页\编于十七点4.2基本程序结构4.2.4子程序结构

在编写程序过程中,如果遇到在几个程序段中都需要执行某段相同程序的情况(功能独立),为减少编程工作量和节省程序存储空间,就应该采用子程序结构,将重复执行的相同程序段编写成为一个子程序(功能子程序)。返回调用断点子程序主程序目前二十三页\总数八十六页\编于十七点4.2基本程序结构MAIN:……;进入主程序MOVR0,#03H;设置入口参数(延时1)ACALLSUBPRO;调用子程序……;子程序返回,继续执行主程序;###################################;子程序入口地址(子程序名称):SUBPRO;功能:延时子程序(延时时间由R0初值设置);入口参数:R0内存放延时计数初值;出口参数:无;使用寄存器:R0、R1;###################################SUBPRO:MOVR1,#03HDJNZR1,$DJNZR0,SUBPRORET;子程序返回END4.2.3子程序结构目前二十四页\总数八十六页\编于十七点4.2基本程序结构单片机中断程序设计主要有以下三个方面:

1、中断向量设置

2、中断初始化

3、中断服务程序

4.2.5中断程序结构目前二十五页\总数八十六页\编于十七点4.2基本程序结构例4-7,设89C51单片机外中断0(EX0)下降沿有效,每次进入中断服务程序,要求将89C51单片机的P1.7~P1.0取反。主程序如下:

ORG0000HSTAR:AJMPMAIN;主程序原始入口

ORG0003H;外部中断0中断向量

AJMPEXTR;跳转到EX0中断服务子程序实际入口地址

ORG0030HMAIN:SETBIT0;主程序实际入口,边沿触发设置

SETBEX0;外部中断0允许

SETBEA;总中断允许HERE:AJMPHERE;等待再次进入中断服务程序4.2.5中断程序结构目前二十六页\总数八十六页\编于十七点4.2基本程序结构中断服务子程序:

ORG1200HEXTR:PUSHPSW;保护现场

CPLA;累加器A数据取反

MOVP1,A;数据输出至P1端口

POPPSW;恢复现场

RETI;中断返回4.2.5中断程序结构目前二十七页\总数八十六页\编于十七点4.3汇编语言程序设计实践

汇编语言程序设计的一般步骤如下:

建立数学模型——用适用的数学方法描述所需要解决的问题;

确定算法——将数学模型转化为适合单片机处理(顺序执行)的形式,采用绘制程序流程图等方法表示程序设计的思路和依据。

编写源程序——采用模块化设计方法,合理划分功能模块,分配存储器和I/O端口(依据硬件电路)等资源,确定各模块内各程序段的结构,编写源程序文件。

汇编及调试——在集成开发环境的支持下,汇编语言源程序经汇编生成目标程序文件,并通过调试以及对运行结果的分析,修正源程序中的错误,达到预期的设计目标。目前二十八页\总数八十六页\编于十七点

所谓查表,就是根据变量x在表格中查找y,使y=f(x)。函数值y事先根据变量x的取值范围计算出,并按一定规律编成表格存放在计算机的程序存储器中。当用户程序中需要用这些数据时,直接按编排的索引值(或程序号)寻找答案。这样编写的程序称为查表程序。查表程序是一种常用程序,广泛应用于LED显示器控制、智能化仪表控制、打印机打印以及数据转换等功能程序中,具有程序简单、执行速度快等优点。查表程序有多种结构形式,下面举例介绍一种常用的查表程序。4.3.1查表程序4.3汇编语言程序设计实践

目前二十九页\总数八十六页\编于十七点4.3.1查表程序

例4-8,将16进制数转换成ASCII码的子程序。假设16进制数存放在R0中低4位,要求将转换后的ASCII码送回到R0中。设计思路:己知0-9的ASCII码为30H一39H,A—F的ASCII码为41H一46H。对十六进制数而言,0-F是连续的,而对应的ASCII码不连续,查表方法对解决此类问题十分有效。根据题意,子程序的入口参数和出口参数均通过R0传递,表中所有的值都是单字节,表格长度为16字节。4.3汇编语言程序设计实践

目前三十页\总数八十六页\编于十七点查表子程序:MOVA,R0;读取主程序通过R0传送的十六进制数ANLA,0FH;屏蔽高4位,取出低4位ADDA,#02H;设置变址值(依据表首地址与查表指 令所处位置)MOVCA,@A+PC;查表指令(获得对应的ASCII码)MOVR0,A:通过R0将查表结果传递给主程序RETTAB:DB30H,31H,32H,33H,34H,35H,36H,37HDB38H,39H,41H,42H,43H,44H,45H,46H

程序中因为“MOVCA,@A+PC”指令与表格首址相隔两个字节,故变址调整值为2,程序中对应变量x的函数值y为单字节。4.3.1查表程序4.3汇编语言程序设计实践

目前三十一页\总数八十六页\编于十七点

在51系列单片机指令集中有单字节的算术运算(加、减、乘、除)指令,但在实际程序设计中经常会遇到多字节算术运算问题,需要通过编制专门的功能子程序解决此类问题。 例4-9,多字节无符号数加法运算。假设R0中存放被加数低位字节地址指针,R1中存放加数低位字节地址指针,R2中存放字节数,多字节算术运算一般从低字节(低位)到高字节(高位)的顺序依次进行。

4.3.2算术运算程序4.3汇编语言程序设计实践

目前三十二页\总数八十六页\编于十七点汇编源程序如下:ADDBIN:CLRCLOOP1:MOVA,@R0;取被加数

ADDCA,@R1;两数相加,带进位

MOV@R0,A INCR0 INCR1 DJNZR2,LOOP1;未加完转LOOP1 JNCLOOP2;无进位转LOOP2 MOV@R0,#0lH RETLOOP2:DECR0 RET

4.3.2算术运算程序4.3汇编语言程序设计实践

目前三十三页\总数八十六页\编于十七点例4-10,BCD码多字节加法运算。假设R0中存放被加数低位字节地址指针,R1中存放加数低位字节地址指针,R2中存放字节数。

BCDADD:MOV20H,R0 MOV23H,R2 CLRCLP0:MOVA,R0;取被加数

ADDCA,@R1;两数相加

DAA;十进制调整

MOV@RO,A INCR0;指针加1 DJN2R2,LP0;做完加法否4.3.2算术运算程序

MOVR2,23H JNCRETURN;有无进位

MOV@R0,#01H INCR3RETURN:MOVR0,#20H RET4.3汇编语言程序设计实践

目前三十四页\总数八十六页\编于十七点例4-11,如图4-2所示,MCS-51单片机的P1作为输出端口,连接8只发光二极管。按该电路工作原理,P1口各位输出“0”时,将发光二极管点亮;P1口各位输出“1”使发光二极管灭。分析下述汇编程序运行后,8个发光二极管点亮的规律。4.3.3I/O接口控制程序图4-2P1口驱动LED示意图4.3汇编语言程序设计实践

目前三十五页\总数八十六页\编于十七点主程序:

LP:MOVP1,#7EHLCALLDELAYMOVP1,#0BDHLCALLDELAYMOVP1,#0DBHLCALLDELAYMOVP1,#0E7HLCALLDELAYMOVP1,#0DBHLCALLDELAYMOVP1,#0BDHLCALLDELAYSJMPLP子程序:

DELAY:MOVR2,#0FAHL1:MOVR3,#0FAHL2:DJNZR3,L2DJNZR2,L1RET 4.3.3I/O接口控制程序目前三十六页\总数八十六页\编于十七点

例4-12:按照图4-2所示的电路,试编写控制发光二极管指示灯移位的程序,要求8个发光二极管依次亮一个,循环左移,一个一个地亮,直至循环。相关源程序如下:MOVA,#7FHL1:MOVP1,ARLALCALLDELAY;与例4-11的延时程序相同

SJMPLl4.3.3I/O接口控制程序4.3汇编语言程序设计实践

目前三十七页\总数八十六页\编于十七点一个函数的定义由类型、函数名、参数表和函数体四部分组合而成。一个函数在程序中可以三种形态出现:函数定义、函数调用、函数说明。

C51函数的一般格式为: 类型函数名(参数表) 参数说明;

{

数据说明部分;//注释执行语句部分;

}4.4.1C51程序结构

4.4面向51单片机的C语言程序目前三十八页\总数八十六页\编于十七点4.4.2C51数据类型数据类型位型(bit)字符型(char)整型(int)长整型(long)浮点型(float)双精度浮点型(double)数组类型(array)结构体类型(struct)共用体(union)枚举(enum)基本类型构造类型指针类型空类型1.数据类型目前三十九页\总数八十六页\编于十七点KEILC51编译器支持的数据类型、长度和值域如表4-1所列。数据类型长度/Byte值域BitUnsignedcharSignedcharUnsignedintSignedintUnsignedlongSignedlongFloatDouble……11224440,10~255-128~1270~65535-32768~327670~4294967295-2147483648~2147483647±1.176E-38~±3.40E+38(6位数字)±1.176E-38~±3.40E+38(10位数字)表4-1KEILC51数据类型4.4.2C51数据类型1.数据类型目前四十页\总数八十六页\编于十七点

C语言的数据有常量、变量之分。常量是在程序运行的过程中,其值不能改变的量;变量是在程序运行中,其值可以改变的量。一个变量由两部分构成:变量名和变量值,每一个变量都有一个变量名,在内存中占据一定的存储单元(地址),并在该内存单元中存放该变量的值。常量定义:#defineCONST44//定义常量符号CONST,值为44

变量定义:chart;//定义字符型变量,变量名为t C语言中习惯上以小写字母定义变量,以大写字母定义常量。另外由于51单片机的寄存器及数据总线为8位所以在定义变量时,应尽可能使用无符号字符型。4.4.2C51数据类型1.数据类型-常量和变量目前四十一页\总数八十六页\编于十七点

2.C51数据存储类型

51系列单片机的程序存储器与数据存储器是分开的,并独立寻址。51系列单片机共有如下四个存储空间:

片内程序存储空间;

片外程序存储空间;

片内数据存储空间;

片外数据存储空间。

C语言编程时在对常量、变量的定义时,要注意不同功能的常量、变量应存储在不同的存储区,在定义变量或常量时要定义成不同的存储类型(data,bdata,idata,pdata,xdata,code)。4.4.2C51数据类型目前四十二页\总数八十六页\编于十七点存储类型存储空间databdataidatapdataxdatacode内部RAM低128单元,可直接寻址片内RAM位寻址区内部RAM,间接寻址片外RAM,256字节片外RAM,64KB代码存储区,64KB表4-2C51存储类型与单片机存储空间对应关系4.4.2C51数据类型2.C51数据存储类型目前四十三页\总数八十六页\编于十七点

3.特殊功能寄存器的定义

在51单片机内部RAM的高128字节,分散着21个特殊功能寄存器(SFR),为了能直接访问这些特殊功能寄存器,KEILC51提供一种自主形式的定义方法,此种方法与标准C语言不兼容,只适用于对8051系列单片机进行定义。这种定义的方法引入关键字“sfr”,如:

sfrTMOD=0x89;/*定时/计数器方式控制寄存器地址为89H*/。sbit:特殊功能位声明,sbitled1=P1^0;4.4.2C51数据类型目前四十四页\总数八十六页\编于十七点将其视为片外数据存储器的一个单元,利用#define语句进行定义:#definePORTAXBYTE[0x0020] /*将PORTA定义为外部I/O口,地址为0x0020*/例:要通过地址0x0020向外部写数据0x01,下面分别用汇编语言和C语言编程实现:汇编语言实现: MOVDPTR,#0020H MOVA,#01H MOVX@DPTR,AC语言实现:#definePORTAXBYTE[0x0020] PORTA=0x01;4.4.2C51数据类型4.片外扩展I/O口目前四十五页\总数八十六页\编于十七点

C51的运算符主要包括算术运算、关系运算、逻辑运算、位操作运算、自增减运算及复合运算等。其运算符与表达式与C语言要求基本一致。4.4.3C51运算符和表达式4.4.2C51数据类型目前四十六页\总数八十六页\编于十七点4.4.3C51运算符和表达式运算符分类运算符表达式示例优先关系(高→低)算术运算符*乘法/除法%求余+加法或正值-减法或负值a+b;(a+b)*c;!算术运算符关系运算符逻辑运算符赋值运算符关系运算符<小于>大于<=小于或等于>=大于或等于==测试等于!=测试不等于c>(a+b)a==b<c逻辑运算符&&逻辑与||逻辑或!逻辑非c=a&&bb=!a位操作运算符&按位与|按位或^按位异或~按位取反<<位左移>>位右移c=a&ba=b<<1自增减运算符++自加1--自减1++ii++复合运算符算术运算符及位操作运算符复合使用i+=3目前四十七页\总数八十六页\编于十七点C语言程序主要有顺序、选择和循环三种结构。顺序结构即语句逐条执行,是最基本、最简单的程序结构。选择结构和循环结构的相关控制语句分别介绍如下:

1.选择结构语句及流程图在选择结构中常见的控制语句有:if,elseif,switch-case。其中if、elseif主要应用在串行多分支结构程序控制中,而switch-case主要用于并行从分去结构程序的控制中。图4-3所示为串行多分支结构流程图。

4.4.4C51流程控制语句4.4面向51单片机的C语言程序目前四十八页\总数八十六页\编于十七点图4-3串行多分支结构流程图串行多分支结构目前四十九页\总数八十六页\编于十七点语句的基本形式:

1)if(表达式){语句;}//当括号内的表达式为真,则执行{}内的语句;

2)if(表达式){语句1;}else{语句2;}//当括号内的表达式为真,则执行{}内的语句,否则执行语句2;

3)if(表达式1){语句1;}

elseif(表达式2){语句2;}

…………

else{语句n;}

//哪一个表达式条件为真,则执行对应{}中的语句,但判断时表达式1的优先级最高,只有条件不满足时,才继续向下判断。

4)if(表达式1)

{if(表达式2){语句1;}

else{语句2;}

}

//if的嵌套使用,只有当表达式1为真时,才进行下一级判断。

1.选择结构语句及流程图目前五十页\总数八十六页\编于十七点

并行多分支结构图4-4并行多分支结构流程图目前五十一页\总数八十六页\编于十七点switch-case语句表达形式:

switch(表达式1)

{

case值1:语句1;break;

case值2:语句2;break;

…………

case值N:语句N;break;

default:语句N+1;

}

1.选择结构语句及流程图4.4.4C51流程控制语句目前五十二页\总数八十六页\编于十七点2.循环结构语句及流程图

循环结构中常见的控制语句主要有while,dowhile,for等。

While语句的一般形式为:while(条件){语句;},图4-5while结构流程图4.4.4C51流程控制语句目前五十三页\总数八十六页\编于十七点

与while相比,dowhile的区别就是行执行循环语句后判断循环条件。语句的形式为:do{语句;}while(条件)。流程图如图4-6所示。

图4-6dowhile结构流程图4.4.4C51流程控制语句2.循环结构语句及流程图目前五十四页\总数八十六页\编于十七点for(表达式1;表达式2;表达式3) {语句;},for语句在执行时共有5个过程,具体执行过程如下:

对表达式进行赋值初始化

判断表达式2是否为真,若为真则进行循环,若为假则退出循环

若表达式2为真,则执行循环体内的语句,并求解表达式3

回到第二步,再判断表达式2

退出for循环4.4.4C51流程控制语句2.循环结构语句及流程图目前五十五页\总数八十六页\编于十七点

51单片机内部资源主要是特殊功能寄存器或SFR寻址,在KEILC51中提供了定义这些寄存器的头文件<reg51.h>,在进行C语言编程,应在源程序的开始处包含头文件,#include<reg51.h>。内部资源的C语言编程主要介绍外中断、定时器和串行口编程。

C51编译器支持在C源程序中直接开发中断程序,采用特殊语法定义中断函数,定义方法如下:返回值函数名interruptnusingmn代表单片机的中断编号,n的范围(0—4)依次为外部中断0、定时/计数器0、外部中断1、定时/计数器1、串行口中断。m表示通用寄存器组的的选择,范围(0-3)。4.4.5单片机资源与C语言编程目前五十六页\总数八十六页\编于十七点

4.4.6C语言程序实例

在进行单片机的C语言编程时,其步骤与汇编语言编程没有区别,首先要了解单片机系统硬件电路的设计,尤其单片机的外部资源的地址编码,当了解了单片机系统的硬件电路后,就可以根据要求画出流程图,合理分配内部资源进行编程,下面以一个数据采集的实例进行说明。目前五十七页\总数八十六页\编于十七点

图4-7为ADC0809与51系列单片机(89S51)的接口电路原理图,要求顺序采集ADC0809的8个通道的模拟量,并存放在数组ADCON[]中

图4-7单片机数据采集原理图目前五十八页\总数八十六页\编于十七点

由电路原理图可以看到,ADC0809的启动信号START由译码器Y1与单片机RD信号经或非门产生,输出使能信号OE由Y1与单片机WR信号经或非门产生,3/8译码器的输入接到P2.5至P2.7,ADC0809的通道选择信号接到单片机的地址线A0至A2,因此得到ADC0809的8个输入通道的地址为2000H—2007H,ADC0809转换结束标志EOC经非门后接到单片机的P3.2口。

目前五十九页\总数八十六页\编于十七点C51源程序如下:

#include<reg51.h> //包含头文件

#include<absacc.h> #defineucharunsignedchar #defineIN0XBYTE[0x2000]//设置ADC0809通道0的地址

sbitad_over=P3^2; //转换结束标志定义

voidad0809(ucharidata*x)//采集函数

{ uchari; ucharxdata*ad_adr; ad_adr=&IN0; for(i=0;i<8;i++) //循环采集8个通道

{*ad_adr=0; //启动AD while(ad_over==0); //查询转换结束标志

x[i]=*ad_adr; //存储结果

ad_adr++; //下一通道

} } voidmain(void) //主函数

{staticucharad[10]; ad0809(ad); }目前六十页\总数八十六页\编于十七点目前六十一页\总数八十六页\编于十七点#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitD0=P1^0;uinta;voidmain(){

D0=0; a=59000; while(a--); D0=1; a=50000; while(a--); }目前六十二页\总数八十六页\编于十七点#include<AT89X51.h>delay_10ms(unsignedt){unsignedinti,j;for(i=0;i<t;i++) for(j=0;j<1880;j++);}voidmain(){while(1){ delay_10ms(100); P0=0xfe; delay_10ms(100); P0=0xfd; delay_10ms(100); P0=0xfb; Delay_10ms(100); P0=0xf7; delay_10ms(100); P0=0xef; delay_10ms(100); P0=0xdf; delay_10ms(100); P0=0xbf; delay_10ms(100); P0=0x7f;}}目前六十三页\总数八十六页\编于十七点#include<reg52.h> //52系列单片机头文件#defineuintunsignedint //宏定义#defineucharunsignedcharvoiddelayms(uint); //声明子函数ucharx; //声明无符号数原变量x(占1B)voidmain() //主函数{ P1=0xfe; //赋初值11111110 while(1) //大循环

{ for(x=0;x<8;x++) //左移8次

{delayms(500);//延时500毫秒

P1=P1<<1;//左移1位

} //左移结束,灯全部亮

for(x=0;x<8;x++) //右移8次

{delayms(500); P1=P1>>1|0x80; //右移1位,并设定最高位为1 } //右移结束,灯全部灭

}目前六十四页\总数八十六页\编于十七点无论是单片机汇编语言还是C语言编程,都需要借助一个软件工具,一般也称为开发环境,目前有很多专业的单片机软件开发工具,下面为读者介绍一种单片机的集成开发环境,KeiluVision2集成开发环境。KeilµVision2集成开发环境是德国Keil公司针对51系列单片机应用系统开发而推出的基于32位windows环境下,以51单片机为开发目标,以高效率C语言为基础的集成开发平台。本节主要介绍KeilC51V7.20版,它主要包括C51交叉编译器和A51宏汇编等工具,还内嵌了单片机仿真调试软件,可以让用户采用模拟仿真和实时在线仿真两种方式对目标系统进行开发。软件仿真时,它可以查看程序变量,内部存储单元。以及模拟和查看单片机I/O口,定时器及中断的工作方式和设置,甚至可以仿真单片机的串行通信。4.5KeilµVsion2集成开发环境目前六十五页\总数八十六页\编于十七点

双击安装程序setup,进入安装模式。它与一般软件安装过程类似。值得注意的是,当出现提示“InstallSupport....全新安装”和“UpdateCurrentInstallation……升级安装”时,选择“InstallSupport....全新安装”。并且在出现提示“Fullversion”和“Evalversion”时,选择“Fullversion”。随后依次点击“Next->Yes->选择安装目录->Next->”输入序列号、姓名、公司”等。安装完成后在Windows桌面上会出现一个Keilµ

温馨提示

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

评论

0/150

提交评论