[信息与通信]第五章 AT89s52程序设计与调试.ppt
第五章 AT89S52程序设计与调试,1,第五章 AT89S52程序设计与调试,5.1 程序设计步骤5.2 源程序的基本格式及编辑环境5.3 程序设计方法5.4 C51基础5.5 程序调试与下载运行,第五章 AT89S52程序设计与调试,2,5.1 程序设计步骤,1拟定设计任务书2建立数学模型并确定算法3程序的总体设计及其流程图4编写源程序5源程序的汇编与调试6系统软件的整体运行与测试7总结归纳进一步编写程序说明文件,第五章 AT89S52程序设计与调试,3,5.2 源程序的基本格式及编辑环境,5.2.1.源程序的基本格式5.2.2.源程序的编辑环境,第五章 AT89S52程序设计与调试,4,5.2.1.源程序的基本格式,1AT89S52的中断矢量分配2程序的起始3中断服务程序4程序字节5伪指令,第五章 AT89S52程序设计与调试,5,ORG 0000HLJMPMAIN;转向主程序ORG0003HLJMPINT0;转向外部中断0服务程序ORG000BHLJMPTIMER0;转向定时器0中断服务程序ORG002BHLJMPTIMER2;转向定时器2中断服务程序,源程序的基本格式,第五章 AT89S52程序设计与调试,6,ORG 0040HMAIN:SETBIT0;主程序从0040H开始SETBEX0;主程序初始化SETBEALCALLDISP;调用显示子程序LCALLDISPOSE;调用数据处理子程序ORG3000HDISP:;显示子程序,第五章 AT89S52程序设计与调试,7,DISPOSE:;数据处理子程序ORG4000HINT0:;外部中断0中断服务程序ORG4500HTIMER0:;定时器0中断服务程序ORG5000HTIMER2:;定时器2中断服务程序;其它中断服务程序ORG5500HTABDB:DB12H,56H,3FH;固定表格区段END;程序结束,第五章 AT89S52程序设计与调试,8,5.2.2.源程序的编辑环境,用于编写汇编程序的编写环境很广泛,可在许多文字编辑窗口进行输入,如写字板、记事本,或专门的汇编编辑、调试软件如MEDWIN、KEIL C中进行,文件名以.ASM为后缀。因为编写完成的汇编软件还需要在特定的编译环境下进行语法编译,所以一般情况下,源程序直接在编译或仿真环境下进行编写。编写前首先在PC机上安装需要的软件如MEDWIN或KEIL C,并进行适当的配置,然后建立工程,就可以编写源程序了。,第五章 AT89S52程序设计与调试,9,5.3 程序设计方法,5.3.1顺序结构程序5.3.2分支结构程序5.3.3循环结构程序5.3.4 子程序结构程序5.3.5中断服务程序,第五章 AT89S52程序设计与调试,10,5.3.1顺序结构程序,顺序结构程序指程序中没有使用转移类指令的程序段是程序设计中最基本、最简单的编程结构,所以也称为简单结构或直线结构。,第五章 AT89S52程序设计与调试,11,5.3.2分支结构程序,分支结构程序的特点是程序中含有转移指令,使程序具有判断和选择能力。由于转移指令分无条件转移和有条件转移,所以分支程序也分无条件分支和条件分支两类。无条件分支程序中含有无条件转移指令(如SJMP、AJMP等),比较简单。条件分支程序中含有条件转移指令,比较复杂。,第五章 AT89S52程序设计与调试,12,例5-2,已知40H(VAR)单元内有一自变量X,按如下条件编写程序求Y(FUN)的值,并存入41H单元。,第五章 AT89S52程序设计与调试,13,ORG 2000H VAR DATA 40H FUN DATA 41HXY:MOV A,VARJZ DONEJNB ACC.7,POSMOV A,#0FFHSIMP DONEPOS:MOV A,#01HDONE:MOV FUN,A RET,第五章 AT89S52程序设计与调试,14,ORG 2000H VAR DATA 40H FUN DATA 41HXY:MOV A,VAR JZ ZERO MOV FUN,#0FFH JB ACC.7,DONE MOV FUN,#01H SJMP DONE ZERO:MOV FUN,#00HDONE:RET,第五章 AT89S52程序设计与调试,15,例5-3,通过键盘扫描程序KEYSCAN读入键值09至累加器A,键值不同功能不同,设计程序根据键值分别转入键控程序KEY0KEY9。即要求:当(A)=0时,转键控程序KEY0;当(A)=1时,转键控程序KEY1;当(A)=9时,转键控程序KEY9;,第五章 AT89S52程序设计与调试,16,ORG2000HACALLKEYSCANRLAMOVDPTR,#JMPTBLJMPA+DPTRJMPTBL:AJMP KEY0 AJMP KEY1 AJMPKEY9KEY0:KEY1:KEY9:,第五章 AT89S52程序设计与调试,17,5.3.3循环结构程序,循环结构就是多次重复执行某一程序段,直到满足结束条件,再向下顺序执行。该程序段通常称为循环体。循环结构通常由四部分组成:1循环初始化2循环处理3循环控制 4循环结束,第五章 AT89S52程序设计与调试,18,循环程序有两种编制方法,第五章 AT89S52程序设计与调试,19,例5-5 AT89S52的晶振为12MHz,设计10ms延时程序。解:12MHz晶振的机器周期为1s,可用双重循环写出延时程序。根据指令的执行周期计算延时时间。ORG2000HDEL:MOVR7,#40;单周期,1sDEL1:MOVR6,#125;单周期,1sDEL2:DJNZR6,DEL2;双周期2s;1252=250sDJNZR7,DEL1;双周期2s;0.2540=10msRET,第五章 AT89S52程序设计与调试,20,ORG2000HDEL:MOV R7,#40;单周期,1sDEL1:MOV R6,#123;单周期,1sNOP;单周期,1sDEL2:DJNZR6,DEL2;双周期;2s1232+2=248sDJNZR7,DEL1;双周期;2s(248+2)40+1=10.001msRET,第五章 AT89S52程序设计与调试,21,5.3.4 子程序结构程序,子程序是一种能完成某确定任务的程序段,其资源需要为所有调用程序共享因此,子程序在结构上应具有通用性和独立性。,第五章 AT89S52程序设计与调试,22,1.子程序编写时应注意的问题。,(1)保护现场和恢复现场(2)主程序和子程序之间的参数传递参数的传递方法主要有以下几种:用寄存器或累加器传递参数 利用寄存器传递参数地址利用堆栈传递参数利用位地址传递参数,第五章 AT89S52程序设计与调试,23,2.子程序编写的原则,(1)子程序的第一条语句前必须有标号(2)标明子程序的入口参数和出口参数(3)子程序的结尾必须有RET指令(4)子程序中使用相对转移指令(5)注意堆栈区要满足要求(6)保护现场和恢复现场,第五章 AT89S52程序设计与调试,24,3.子程序编写举例,例 5-6 编写存取共阴极数码管对应显示代码子程序。解:;程序名称:SEGDISC;功能:取得共阴极数码管对应显示代码程序;入口参数:(R3)=要显示的数字如,0、1等;出口参数:(R4)=显示数字的代码,第五章 AT89S52程序设计与调试,25,ORG6000HSEGDISC:PUSHACC MOVA,R3 MOVDPTR,#SEGTAB MOVCA,A+DPTR MOVR4,A POPACC RET ORG8000HSEGTAB:DB3FH,06H,5BH,4FH,66H DB6DH,7DH,07H,7FH,67H,第五章 AT89S52程序设计与调试,26,主程序可如下编写:ORG 0000HLJMP MAIN0RG0050HMAIN:MOVSP,#70H;设置堆栈指针ACALLSEGDISC;调子程序END,第五章 AT89S52程序设计与调试,27,5.3.5中断服务程序,中断服务程序对实时事件请求作必要的处理,使系统能实时地并行完成各个操作中断服务程序必须包括现场保护、中断服务、现场恢复、中断返回等四个部分中断服务程序编写方法与子程序类似,再注意以下问题:,第五章 AT89S52程序设计与调试,28,(1)在中断程序的结尾一定要使用RETI,以便返回到主程序调用处。(2)中断服务程序中要清除中断标志,以免重复进入。具体标志和清除方法参见各中断部分。(3)中断服务程序的长度尽量短小,以免执行时占用CPU过多时间。所以主程序与中断服务程序之间的数据交换多采用标志位。(4)中断嵌套深度受堆栈区的影响。系统复位后,栈指针SP的初始值为07H,与工作寄存器区重叠,所以程序中一般要重新定义。AT89S52内部虽有256B的RAM,但堆栈区需利用低128B开辟,所以其堆栈深度有限。,第五章 AT89S52程序设计与调试,29,5.4 C51基础,5.4.1 C51的程序结构及编译环境5.4.2 C51的数据类型与存储类型5.4.3 AT89S52结构的C51定义5.4.4 C51和汇编语言的混合编程5.4.5 C51程序设计举例,第五章 AT89S52程序设计与调试,30,5.4.1 C51的程序结构及编译环境,1C51的程序结构C51 的程序结构与一般的C语言程序基本相同。C51程序基本由预处理器命令、变量定义、函数组成。C编程时,一般在程序的开始都要引入头文件。除了包含C语言标准的头文件外,一般还要包含与单片机硬件有关的头文件,如#include 语句,第五章 AT89S52程序设计与调试,31,2C51的编译环境及开发过程,许多公司都开发了C51的集成开发环境(IDE)及开发系统,常用的C51集成开发环境有Keil C51 Vision 和MEDWIN等软件。Keil C51 Vision是Keil Software,Inc/Keil Elektronik GmbH开发的基于51内核的微处理器软件开发平台,内嵌多种符合当前工业标准的开发工具,可以完成从工程建立和管理、编译、链接、目标代码的生成、软件仿真及硬件仿真等完整的开发流程。Medwin是南京万利电子(南京)有限公司推出的配合其Insight仿真器的集成开发环境。,第五章 AT89S52程序设计与调试,32,5.4.2 C51的数据类型与存储类型,1C51的数据类型C51的数据类型与一般C语言相同。有以下几种数据类型:位型bit、无符号字符型(unsigned char)、有符号字符型(signed char)、无符号整型(unsigned int)、有符号整型(signed int)、无符号长整型(unsigned long)、有符号长整型(signed long)、浮点型(float)和指针型。,第五章 AT89S52程序设计与调试,33,C51的数据类型,第五章 AT89S52程序设计与调试,34,2C51数据的存储类型,C51编写程序时数据的定义除了前面加上数据类型外,还需要额外增加数据存储空间的说明。根据单片机硬件结构的特点,C51定义了6种存储类型:data,bdata,idata,pdata,xdata,code,第五章 AT89S52程序设计与调试,35,存储类型,第五章 AT89S52程序设计与调试,36,数据类型举例,unsigned char data var1;bit bdata flag;float idata a,b,c;unsigned int pdata temp;unsigned char xdata array110;unsigned int code array212;,第五章 AT89S52程序设计与调试,37,3C51的存储模式,C51有三种存储模式SMALL、COMPACT和LARGE存储模式决定了变量默认的存储类型、参数传递区和无明确存储类型的说明,第五章 AT89S52程序设计与调试,38,存储模式,第五章 AT89S52程序设计与调试,39,5.4.3 AT89S52结构的C51定义,C51中引入了两个关键字“sfr”和“sbit”进行相应的定义。1关键字“sfr”语法:sfrsfr_name=int constant;,第五章 AT89S52程序设计与调试,40,例:利用sfr定义P0、P1、PSW、ACC、B、SP、DPL、DPH。解:sfr P0=0 x80;sfr P1=0 x90;sfr PSW=0 xD0;sfr ACC=0 xE0;sfr B=0 xF0;sfr SP=0 x81;sfr DPL=0 x82;sfr DPH=0 x83;,第五章 AT89S52程序设计与调试,41,2关键字“sbit”语法:sbit sbit_name=bit address;(1)sbit sbit_name=sfr_name int_constant;例如:sfr PSW=0 xD0;/*定义PSW地址为0 xD0*/sbit OV=PSW 2;/*定义OV位为PSW.2*/sbit Cy=PSW 7;/*定义Cy位为PSW.7*/,第五章 AT89S52程序设计与调试,42,sbit sbit_name=int_constant int_constant;例如:sbit OV=0 xD0 2;/*定义OV位地址为0 xD2*/sbit Cy=0 xD0 7;/*定义Cy位地址为0 xD7*/(3)sbit sbit_name=int_constant;例如:sbit OV=0 xD2;/*定义OV位地址为0 xD2*/sbit Cy=0 xD7;/*定义Cy位地址为0 xD7*/,第五章 AT89S52程序设计与调试,43,例59编写AT89S52部分寄存器及位定义的头文件,/*-AT89S52.H-*/*-Byte Registers-*/sfr P0=0 x80;sfr SP=0 x81;sfr DPL=0 x82;sfr DPH=0 x83;,第五章 AT89S52程序设计与调试,44,sfr PCON=0 x87;sfr TCON=0 x88;sfr TMOD=0 x89;sfr ACC=0 xE0;/*-P0 Bit Registers-*/sbit P0_0=0 x80;sbit P0_1=0 x81;sbit P0_2=0 x82;sbit P0_3=0 x83;sbit P0_4=0 x84;sbit P0_5=0 x85;sbit P0_6=0 x86;sbit P0_7=0 x87;,/*-Interrupt Vectors:Interrupt Address=(Number*8)+3-*/#define IE0_VECTOR0/*0 x03 外部中断0*/#define TF0_VECTOR1/*0 x0B定时器0*/#define IE1_VECTOR2/*0 x13 外部中断1*/#define TF1_VECTOR3/*0 x1B 定时器1*/#define SIO_VECTOR4/*0 x23 串行口*/#define TF2_VECTOR5/*定时器2*/#endif,第五章 AT89S52程序设计与调试,45,sbit除了上述特殊位地址定义外,在实际编程中还可以用来定义位。例如:unsigned char bdata flag;/*定义flag为bdata无符号字符型变量*/sbit flag1=flag1;/*flag1定义为flag的第1位*/sbit flag2=flag2;/*flag2定义为flag的第2位*/如此定义的flag1、flag2则可以在程序中做标志位使用。,第五章 AT89S52程序设计与调试,46,5.4.4 C51和汇编语言的混合编程,C51中直接插入汇编指令方式(1)使用“asm”功能格式:_asm“Assembler Code Here”;(2)使用“#pragma ASM”功能格式:#pragma ASM Assembler Code Here#pragma ENDASM,第五章 AT89S52程序设计与调试,47,编写程序从P1.0口输出方波。要求KEIL C环境下C51程序中嵌入汇编程序段。解:程序如下:#include sbit P10=P10;/*定义位变量P10*/void main(void)/*主函数*/while(1)P10=!P10;/*P1口输出取反*/#pragma ASM/*汇编程序段开始*/MOVR4,#18,第五章 AT89S52程序设计与调试,48,DJNZR4,$/*延时等待*/#pragma ENDASM/*汇编程序段结束*/*程序结束*/,第五章 AT89S52程序设计与调试,49,例5-11利用C51编写(例5-3)键盘散转程序。,解:程序清单:#include#define uchar unsigned charvoid key_data);void keyjmp(uchar key0_dispose(void);void key1_dispose(void);void key2_dispose(void);,第五章 AT89S52程序设计与调试,50,void key0_dispose(void)/*键0处理内容*/void key1_dispose(void)/*键1处理内容*/void key2_dispose(void)/*键2处理内容*/,第五章 AT89S52程序设计与调试,51,/*键散转子程序,入口参数:键值key_data,返回参数:无*/void keyjmp(uchar key_data)uchar key_temp;key_temp=key_data;switch(key_data)case 0:key0_dispose();break;/*键处理子程序*/case 1:key1_dispose();break;case 2:key2_dispose();break;default:break;,第五章 AT89S52程序设计与调试,52,void main(void)/*主程序*/keyjmp(0);,第五章 AT89S52程序设计与调试,53,5.5 程序调试与下载运行,5.5.1单片机开发系统(装置)5.5.2 源程序调试5.5.3程序下载运行,第五章 AT89S52程序设计与调试,54,图5.5.1 源程序的调试仿真流程图,第五章 AT89S52程序设计与调试,55,5.5.1单片机开发系统(装置),图5.5.2 开发系统与目标系统连接图,第五章 AT89S52程序设计与调试,56,开发系统一般都应具有以下功能 1.模拟仿真功能2.在线仿真功能3.调试功能4辅助设计功能5用户操作界面,第五章 AT89S52程序设计与调试,57,5.5.2 源程序调试,1模拟调试模拟调试是源程序调试必须经过的过程。一般经过两个步骤:(1)编译程序,检查汇编语言的语法是否正确(2)模拟运行程序,观察程序的执行是否符合要求2仿真调试,第五章 AT89S52程序设计与调试,58,5.5.3程序下载运行,程序调试通过后,进入到程序下载阶段。程序下载指的是利用编程器(烧写器或固化器)将调试正确的汇编程序的目标代码写入到FLASH或EPROM中,以便单片机能够独立运行。,