资源预览内容
第1页 / 共42页
第2页 / 共42页
第3页 / 共42页
第4页 / 共42页
第5页 / 共42页
第6页 / 共42页
第7页 / 共42页
第8页 / 共42页
第9页 / 共42页
第10页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第4章章 MCS-51单片机程序设计单片机程序设计4.1 MCS-51单片机汇编语言简介单片机汇编语言简介汇编语言的形式汇编语言的形式汇编语言格式汇编语言格式标号段标号段操作码段操作码段操作数段操作数段注释段注释段 ORG 0000HSTART: MOV A, #00H ; A 0 MOV R2, #0AH ;R2 10 MOV R1, #03H ;R1 3 LOOP: ADD A, R1 ;A A+R1 DJNZ R2,LOOP ;若若R2-1 0, 则则 LOOP NOP SJMP $ END(1)标号字段)标号字段 位于语句的开头,指明指令操作码地址位于语句的开头,指明指令操作码地址(2)操作码字段)操作码字段 必选项不可缺,由汇编程序生成目标代码必选项不可缺,由汇编程序生成目标代码(3)操作数字段)操作数字段 操作数或操作数地址,通常有单、双和无操作数或操作数地址,通常有单、双和无操作数操作数3种形式,表示形式有种形式,表示形式有5种种1)二进制)二进制 十进制十进制 十六进制形式十六进制形式MOV A,#10001010BMOV A,#138 MOV A,#8AH 若若16进制进制A-F,则需前加,则需前加0,如,如MOV A,#0FFH2)工作寄存器和特殊功能寄存器)工作寄存器和特殊功能寄存器3)标号地址)标号地址 如如MOV A,M14)带加减算符表达式)带加减算符表达式 如如MOV A,M1+15)采用)采用$符符 如如 SJMP $(4) 注释字段注释字段 任选项,以;开始,不产生机器码任选项,以;开始,不产生机器码汇编语言构成汇编语言构成1、指令性语句、指令性语句 :产生机器代码:产生机器代码 2、指示性语句即伪指令:不产生机器代码、指示性语句即伪指令:不产生机器代码几个汇编概念几个汇编概念汇编语言程序:用汇编语言编写的、完成特定功能的指令序列。汇编语言程序:用汇编语言编写的、完成特定功能的指令序列。汇编程序:能将汇编语言源程序转换成机器语言目标程序的系统软件。汇编程序:能将汇编语言源程序转换成机器语言目标程序的系统软件。汇编语言程序到机器语言程序的转换过程称为汇编。有两种汇编语言程序到机器语言程序的转换过程称为汇编。有两种1 1、手工汇编:人工查指令表汇编。用于设计短小程序或调试程序的、手工汇编:人工查指令表汇编。用于设计短小程序或调试程序的场合。场合。2、机器汇编:用汇编程序进行汇编。、机器汇编:用汇编程序进行汇编。汇编的主要任务:汇编的主要任务:1)确定程序中每条汇编语言指令的指令机器码。)确定程序中每条汇编语言指令的指令机器码。2)确定每条指令在存储器中的存放地址。)确定每条指令在存储器中的存放地址。3)提供错误信息。)提供错误信息。4)提供目标执行文件()提供目标执行文件(*.OBJ/*.HEX)和列表文件(和列表文件(*.LST)。)。4.2 MCS-51单片机汇编语言常用伪指令单片机汇编语言常用伪指令伪指令是放在汇编语言源程序中用于指示汇编程序如何对源程序伪指令是放在汇编语言源程序中用于指示汇编程序如何对源程序进行汇编的指令,它不同于指令系统中的指令,进行汇编的指令,它不同于指令系统中的指令,指令系统中的指令指令系统中的指令在汇编程序汇编时能够产生相应的指令代码,而伪指令在汇编程序在汇编程序汇编时能够产生相应的指令代码,而伪指令在汇编程序汇编时不会产生代码汇编时不会产生代码,只是对汇编过程进行相应的控制和说明。,只是对汇编过程进行相应的控制和说明。常用的伪指令只有几条。常用的伪指令只有几条。1ORG伪指令伪指令格式:格式:ORG 地址(十六进制表示)地址(十六进制表示)这条伪指令放于一段源程序或数据的前面,汇编时用于指明程序或数据这条伪指令放于一段源程序或数据的前面,汇编时用于指明程序或数据从程序存储空间什么位置开始存放。从程序存储空间什么位置开始存放。ORG伪指令后的地址是程序或数据的伪指令后的地址是程序或数据的起始地址。起始地址。【例【例4-1】 ORG 1000HSTART:MOV A,#7FH 指明后面的程序从程序存储器的指明后面的程序从程序存储器的1000H单元开始存放。单元开始存放。2DB伪指令伪指令格式:格式:标号:标号: DB 项或项表项或项表 DB伪指令用于定义字节数据,可以定义一个伪指令用于定义字节数据,可以定义一个字节,也可定义多个字节,字义多个字节时,字节,也可定义多个字节,字义多个字节时,两两之间用逗号间隔,定义的多个字节在存储两两之间用逗号间隔,定义的多个字节在存储器中是连续存放的。定义的字节可以是一般常器中是连续存放的。定义的字节可以是一般常数,也可以为字符,还可以是字符串,字符和数,也可以为字符,还可以是字符串,字符和字符串以引号括起来,字符数据在存储器中以字符串以引号括起来,字符数据在存储器中以ASCII码形式存放。码形式存放。在定义时前面可以带标号,定义的标号在程在定义时前面可以带标号,定义的标号在程序中是起始单元的地址。序中是起始单元的地址。【例【例4-2】 ORG 3000HTAB1: DB 12H,34HDB 5,A,abc汇编后,各个数据在存储单元中的存放情况汇编后,各个数据在存储单元中的存放情况如下:如下:12H34H35H41H61H62H63H3000H3001H3002H3003H3004H3005H3006H3DW伪指令伪指令格式:格式:标号:标号: DW 项或项表项或项表 这条指令与这条指令与DB相似,但用于定义字数据。相似,但用于定义字数据。项或项表指所定义的一个字在存储器中占两项或项表指所定义的一个字在存储器中占两个字节。汇编时,机器自动按高字节在前,个字节。汇编时,机器自动按高字节在前,低字节在后,即高字节存放在低地址单元,低字节在后,即高字节存放在低地址单元,低字节存放在高地址单元。低字节存放在高地址单元。【例【例4-3】 ORG 3000HTAB2:DW 1234H,5678H汇编后,各个数据在存储单元中的存放情汇编后,各个数据在存储单元中的存放情况如下:况如下:12H34H56H78H3000H3001H3002H3003H4DS伪指令伪指令格式:格式:标号:标号: DS 数值表达式数值表达式该伪指令用在存储器中保留一定数量该伪指令用在存储器中保留一定数量的字节单元。保留存贮空间主要为以后的字节单元。保留存贮空间主要为以后存放数据。保留的字节单元数由表达式存放数据。保留的字节单元数由表达式的值决定。的值决定。【例【例4-4】 ORG 2000HTAB1: DB 12H,34HDS 4HDB 5汇编后,存储单元中的分配情况如下:汇编后,存储单元中的分配情况如下:12H34H-35H3000H3001H3002H3003H3004H3005H3006H5EQU伪指令伪指令格式:符号格式:符号 EQU 项项该伪指令的功能是将指令中的项的值赋予该伪指令的功能是将指令中的项的值赋予EQU前面的符号。项前面的符号。项可以是常数、地址标号或表达式。以后可以通过使用该符号使用相可以是常数、地址标号或表达式。以后可以通过使用该符号使用相应的项。应的项。【例【例4-5】 TAB1 EQU 1000HTAB2 EQU 2000H汇编后汇编后TAB1、TAB2分别等于分别等于1000H、2000H。程序后面使用。程序后面使用1000H、2000H的地方就可以用符号的地方就可以用符号TAB1、TAB2替换。替换。用用EQU伪指令对某标号赋值后,该符号的值在整个程序中不能伪指令对某标号赋值后,该符号的值在整个程序中不能再改变。再改变。6bit伪指令伪指令格式:符号格式:符号 bit 位地址位地址bit该伪指令用于给位地址赋予符号,经赋值后可用该符号代替该伪指令用于给位地址赋予符号,经赋值后可用该符号代替bit后后面的位地址。面的位地址。【例【例4-6】 PLG bit F0AI bitP1.0定义后,在程序中位地址定义后,在程序中位地址F0、P1.0就可以通过就可以通过FLG和和AI来使用。来使用。7END伪指令伪指令格式:格式:END该指令放于程序最后位置,用于指明汇编语言源程序该指令放于程序最后位置,用于指明汇编语言源程序的结束位置,当汇编程序汇编到的结束位置,当汇编程序汇编到END伪指令时,汇编结伪指令时,汇编结束。束。END后面的指令,汇编程序都不予处理。一个源程后面的指令,汇编程序都不予处理。一个源程序只能有一个序只能有一个END命令,否则就有一部分指令不能被汇命令,否则就有一部分指令不能被汇编。编。4.3 MCS-51系列单片机汇编程序设计系列单片机汇编程序设计4.3.1 数据传送程序数据传送程序例【例【4-7】把片内】把片内RAM 的的40H-4FH的的16字节的内容传送到片外字节的内容传送到片外RAM的的2000H单元位置处。单元位置处。 ORG 1000H MOV R0,#40H MOV DPTR,#2000H MOV R2,#16LOOP: MOV A,R0 MOVX DPTR,A INC R0 INC DPTR DJNZ R2,LOOP RET开始开始#40R0#2000HDPTR#16R2R0DPTRR0+1R0DPTR+1DPTRR2-1R2R2=0?结束结束否否是是4.3.2 运算程序运算程序【例【例4-8】多字节无符号数加法】多字节无符号数加法设从片内设从片内RAM30H单元和单元和40H单元有两个单元有两个16字节数,把它们相加,字节数,把它们相加,结果放于结果放于30H单元开始的位置处(设结果不溢出)。单元开始的位置处(设结果不溢出)。处理过程处理过程: 用用R0作指针指向作指针指向30H单元,用单元,用R1作指针指向作指针指向40H单元,单元,用用R2为循环变量,初值为为循环变量,初值为16,在循环体中用,在循环体中用ADDC指令把指令把R0指针指指针指向的单元与向的单元与R1指针指向的单元相加,加得的结果放回指针指向的单元相加,加得的结果放回R0指向的单元,指向的单元,改变改变R0、R1指针指向下一个单元,循环指针指向下一个单元,循环16次,在第一次循环前应先次,在第一次循环前应先将将CY清零。程序流程图和程序如下:清零。程序流程图和程序如下:程序:程序:ORG 1000HMOV R0,#30HMOV R1,#40HMOV R2,#16CLR CLOOP:MOV A,R0ADDC A,R1MOV R0,AINC R0INC R1DJNZ R2,LOOPEND开始开始#30R0#40HR1#16R6R0+R1R0R0+1R0R1+1R1R2-1R2R2=0?结束结束否否是是4.3.3 数据的拼拆和转换数据的拼拆和转换【例【例4-9】设在】设在30H和和31H单元中各有一个单元中各有一个8位数据位数据:(30H)=x7x6xx4xx2x1x0 (3lH)=y7y6yy4yy2y1y0现在要从现在要从30H单元中取出低单元中取出低5位,并从位,并从31H单元中取出低单元中取出低3位完成拼装,位完成拼装,拼装结果送拼装结果送40H单元保存,并且规定单元保存,并且规定:(40H)=y2y1y0x4xx2x1x0 利用逻辑指令利用逻辑指令ANL、ORL、RL等来完成数据的拼拆,处理过程:等来完成数据的拼拆,处理过程:将将30H单元的内容高单元的内容高3位屏蔽;位屏蔽;31H单元内容的低单元内容的低5位屏蔽,高低四位交位屏蔽,高低四位交换,左移一位;然后与换,左移一位;然后与30H单元的内容相或,拼装后放到单元的内容相或,拼装后放到40H单元。单元。程序如下:程序如下:ORG 0100HMOV A,30H ANL A,#00011111BMOV 30H,AMOV A,31HANL A,#00000111B SWAP ARL A ORL A,40HMOV 40H,AEND【例【例4-11】一位十六进制数转换成】一位十六进制数转换成ASC1I码。码。一位十六进制数有十六个符号一位十六进制数有十六个符号09、A、B、C、D、E、F。其中,。其中,09的的ASCII码为码为30H39H,AF的的ASCII码为码为41H46H,转换时,只要判断十,转换时,只要判断十六进制数是在六进制数是在09之间还是在之间还是在AF之之间,如在间,如在09之间,加之间,加30H,如在,如在AF之间,加之间,加37H,就可得到,就可得到ASCII码。设十六进制数放于码。设十六进制数放于R2中,转换的中,转换的结果放于结果放于R2中。中。程序如下:程序如下:ORG 0200HMOV A,R2 CLR CSUBB A,#0AH ;减去;减去0AH,判断在,判断在09之间,还是在之间,还是在AF之间之间MOV A,R2JC ADD30 ;如在;如在09之间,直接加之间,直接加30HADD A,#07H ;如在;如在AF之间,先加之间,先加07H,再加,再加30HADD30:ADD A,#30HMOV R2,AEND【例【例4-12】一位十六进制数转换】一位十六进制数转换8段式数码管显示码。段式数码管显示码。一位十六进制数一位十六进制数09、A、B、C、D、E、F的的8段式数码管的共阴极显示段式数码管的共阴极显示码为码为3FH、06H、5BH、4FH、66H、6DH、7DH、07H、7FH、67H、77H、7CH、39H、5EH、79H、71H。由于数与显示码没有规律,不能通过运算。由于数与显示码没有规律,不能通过运算得到,只能通过查表方式得到。得到,只能通过查表方式得到。数放在数放在R2中,查得的显示码也放于中,查得的显示码也放于R2中,用中,用MOVC A,A+DPTR查表。查表。程序如下:程序如下:ORG 0200HCONVERT:MOV DPTR,#TAB ;DPTR指向表首址指向表首址MOV A,R2 ;转换的数放于;转换的数放于MOVC A,A+DPTR ;查表指令转换;查表指令转换MOV R2,ARETTAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,67H,77H,7CH,39H,5EH,79H,71H ;显示码表;显示码表在这个例子中,编码是一个字节,只通过一次查表指令就可实现转换,如在这个例子中,编码是一个字节,只通过一次查表指令就可实现转换,如编码是两个字节,则需要用两次查表指令才能查得编码,第一次取得低位,编码是两个字节,则需要用两次查表指令才能查得编码,第一次取得低位,第二次取得高位。第二次取得高位。【例【例4-13】在一温度控制系统中,温度】在一温度控制系统中,温度0100C每一个温度值都已经每一个温度值都已经通过温度传感器测得一个两字节的标准电压值。现在通过温度传感器测得一个两字节的标准电压值。现在R2中给出一个中给出一个0100C的温度值,取得它的标准电压值放于的温度值,取得它的标准电压值放于R3、R4中,低字节放在中,低字节放在R3中,高字节放在中,高字节放在R4中。中。 通过用通过用MOVC A,A+DPTR查表,两个字节分两次取得,由查表,两个字节分两次取得,由DPTR指向表首,由放于指向表首,由放于R2中的温度值得到所查的电压值相对于表首位中的温度值得到所查的电压值相对于表首位置的位移量放于累加器置的位移量放于累加器A中,由于每一个电压值为两个字节,位移量须中,由于每一个电压值为两个字节,位移量须用用R2中的温度值乘以中的温度值乘以2得到。第一次取得低字节,第二次位移量加得到。第一次取得低字节,第二次位移量加1后后查表取得高字节,分别放于查表取得高字节,分别放于R3、R4中。中。程序如下:程序如下:ORG 0300HCHECK: MOV DPTR,#TAB ;指向表首;指向表首MOV A,R2 ;温度值送;温度值送ARL A ;乘;乘2得位移量得位移量MOV R1,A ;位移量暂存于;位移量暂存于R1中中MOVC A,A+DPTRMOV R3,A ;第一次查得内容送;第一次查得内容送R3MOV A,R1 ;取出暂存的位移量送;取出暂存的位移量送AINC A ;指向高字节;指向高字节MOVC A,A+DPTRMOV R4,A ;第二次查得内容送;第二次查得内容送R4RETTAB: DW 0056H,0059H,0067H,0076H;电压值表;电压值表3.5.3 多分支转移(散转)程序多分支转移(散转)程序一用多分支转移指令一用多分支转移指令JMP A+DPTR实现的多分支转移程序实现的多分支转移程序【例【例4-14】现有】现有128路分支,分支号分别为路分支,分支号分别为0127,要求根据,要求根据R2中的中的分支信息转向各个分支的程序。即当分支信息转向各个分支的程序。即当(R2)=0,转向,转向OPR0(R2)=1,转向,转向OPRl(R2)=127,转向,转向OPR127先用无条件转移指令(先用无条件转移指令(“AJMP”或或“LJMP”)按顺序构造一个转移指)按顺序构造一个转移指令表,执行转移指令表中的第令表,执行转移指令表中的第n条指令,就可以转移到第条指令,就可以转移到第n个分支,将转个分支,将转移指令表的首地址装入移指令表的首地址装入DPTR中,将中,将R2中的分支信息装入累加器中的分支信息装入累加器A形成形成变址值。然后执行多分支转移指令变址值。然后执行多分支转移指令JMP A+DPTR实现转移。实现转移。程序清单如下:程序清单如下:MOV A,R2RL A ;分支信息乘;分支信息乘2MOV DPTR,#TAB ;DPTR指向转移指令表首址指向转移指令表首址JMP A+DPTR ;转向形成的散转地址;转向形成的散转地址TAB:AJMP OPR0 ;转移指令表;转移指令表AJMP OPR1AJMP OPR127转移指令表中的转移指令是由转移指令表中的转移指令是由LJMP指令构成指令构成 程序如下:程序如下:ORG 0200HMOV DPTR,#TAB ;DPTR指向转移指令表首址指向转移指令表首址MOV A,R2 ;分支信息放累加器;分支信息放累加器A中中MOV B,#3MUL AB ;分支信息乘;分支信息乘3XCH A,BADD A,DPH ;高字节调整到;高字节调整到DPH中中MOV DPH,AXCH A,BJMP A+DPTR ;转向形成的散转地址;转向形成的散转地址TAB:LJMP OPR0 ;转移指令表;转移指令表LJMP OPR1LJMP OPR2LJMP OPR127转移指令表中的转移指令是由转移指令表中的转移指令是由AJMP指令构成,如果分支数大于指令构成,如果分支数大于128个,如分支数有个,如分支数有256个个 ORG 0200HMOV DPTR,#TAB ;DPTR指向转移指令表首址指向转移指令表首址MOV A,R2 ;分支信息放累加器;分支信息放累加器A中中RL A ;分支信息乘;分支信息乘2JNC NEXTINC DPH ;高字节调整到;高字节调整到DPH中中NEXT: JMP A+DPTR ;转向形成的散转地址;转向形成的散转地址TAB: LJMP OPR0 ;转移指令表;转移指令表LJMP OPR1LJMP OPR2LJMP OPR127二采用二采用RET指令实现的多分支程序指令实现的多分支程序用用RET指令实现多分支程序的方法是:先把各个分支的目的地址按顺序指令实现多分支程序的方法是:先把各个分支的目的地址按顺序组织成一张地址表,在程序中用分支信息去查表,取得对应分支的目的组织成一张地址表,在程序中用分支信息去查表,取得对应分支的目的地址,按先低字节,后高字节的顺序压入堆栈,然后执行地址,按先低字节,后高字节的顺序压入堆栈,然后执行RET指令,执指令,执行后则转到对应的目的位置。行后则转到对应的目的位置。【例【例4-15】用】用RET指令实现根据指令实现根据R2中的分支信息转到各个分支程序的中的分支信息转到各个分支程序的多分支转移程序。多分支转移程序。设各分支的目的地址分别为设各分支的目的地址分别为addr00、addr01、addr02、addrFF。程序如下:程序如下:MOV DPTR,#TAB3 ;DPTR指向目的地址表指向目的地址表MOV A,R2 ;分支信息放累加器;分支信息放累加器A中中RL A ;分支信息乘;分支信息乘2JNC NEXTINC DPH ;高字节调整到;高字节调整到DPH中中NEXT: MOV R3,A ;变址放于;变址放于R3中暂存中暂存MOVC A,A+DPTR ;取目的地址低;取目的地址低8位位PUSH ACC ;低;低8位地址入栈位地址入栈MOV A,R3 ;取出;取出R3中变址到累加器中变址到累加器AINC A ;加;加1得到目的地址高得到目的地址高8位单元的变址位单元的变址MOVC A,A+DPTR ;取转向地址低;取转向地址低8位位PUSH ACC ;高;高8位地址入栈位地址入栈RET ;转向目的地址;转向目的地址TAB3: DW addr00 ;目的地址表;目的地址表DW addrD0lDW addrFF上述程序执行后,将根据上述程序执行后,将根据R2中的分支信息转移到对应的分支程序。中的分支信息转移到对应的分支程序。4.3.5 延时程序延时程序设系统时钟频率为设系统时钟频率为12MHZ,下面是延时,下面是延时10ms的程的程序序DEL10ms: MOV R6, #20 ;1个机器周期个机器周期 DEL1: MOV R7, #249 ;1个机器周期个机器周期 DJNZ R6, $ ;2个机器周期个机器周期 DJNZ R6, DEL1 ;2个机器周期个机器周期 RET ;2个机器周期个机器周期4.5 MCS-51单片机内部资源及编程单片机内部资源及编程 MCS-51单片机的内部资源主要有并行单片机的内部资源主要有并行I/O口、定时器口、定时器/计数器、串行计数器、串行接口以及中断系统,接口以及中断系统,MCS-51单片机的大部分功能就是通过对这些资单片机的大部分功能就是通过对这些资源的利用来实现的。下面分别对其介绍,并用汇编语言和源的利用来实现的。下面分别对其介绍,并用汇编语言和C语言分别语言分别给出相应例子。给出相应例子。4.5.1 并行口应用与编程并行口应用与编程【例【例4-25】 利用单片机的利用单片机的P1口接口接8个发光二极管,个发光二极管,P0口接口接8个开关,个开关,编程实现,当开关动作时,对应的发光二极管亮或灭。编程实现,当开关动作时,对应的发光二极管亮或灭。只须把只须把P0口的内容读出后,通过口的内容读出后,通过P1口输出即可。口输出即可。汇编程序:汇编程序:ORG 0100HMOV P0,#0FFHLOOP: MOV A,P0MOV P1,ASJMP LOOP4.5.2 定时定时/计数器的初始化编程及应用计数器的初始化编程及应用一定时一定时/计数器的编程计数器的编程MCS-51单片机定时单片机定时/计数器初始化过程如下:计数器初始化过程如下:1根据要求选择方式,确定方式控制字,写入方式控制寄存器根据要求选择方式,确定方式控制字,写入方式控制寄存器TMOD。2根据要求计算定时根据要求计算定时/计数器的计数值,再由计数值求得初值,写计数器的计数值,再由计数值求得初值,写入初值寄存器。入初值寄存器。3根据需要开放定时根据需要开放定时/计数器中断(后面须编写中断服务程序)。计数器中断(后面须编写中断服务程序)。4设置定时设置定时/计数器控制寄存器计数器控制寄存器TCON的值,启动定时的值,启动定时/计数器开始计数器开始工作。工作。5等待定时等待定时/计数时间到,到则执行中断服务程序;如用查询处理计数时间到,到则执行中断服务程序;如用查询处理则编写查询程序判断溢出标志,溢出标志等于则编写查询程序判断溢出标志,溢出标志等于1,则进行相应处理。,则进行相应处理。二定时二定时/计数器的应用计数器的应用 通常利用定时通常利用定时/计数器来产生周期性的波形。利用定时计数器来产生周期性的波形。利用定时/计数器产生计数器产生周期性波形的基本思想是:利用定时周期性波形的基本思想是:利用定时/计数器产生周期性的定时,定时计数器产生周期性的定时,定时时间到则对输出端进行相应的处理。如产生周期性的方波只须定时时时间到则对输出端进行相应的处理。如产生周期性的方波只须定时时间到对输出端取反一次即可。间到对输出端取反一次即可。【例【例4-26】 设系统时钟频率为设系统时钟频率为12MHZ,用定时,用定时/计数器计数器T0编程实编程实现从现从P1.0输出周期为输出周期为500s的方波。的方波。分析:从分析:从P1.0输出周期为输出周期为500s的方波,只须的方波,只须P1.0每每250s取反一取反一次则可。当系统时钟为次则可。当系统时钟为12MHZ,定时,定时/计数器计数器T0工作于方式工作于方式2时,最时,最大的定时时间为大的定时时间为256s,满足,满足250s的定时要求,方式控制字应设定的定时要求,方式控制字应设定为为00000010B(02H)。系统时钟为)。系统时钟为12MHZ,定时,定时250s,计数值,计数值N为为250,初值,初值X=256-250=6,则,则TH0=TL0=06H。汇编程序:汇编程序:ORG 0000HLJMP MAINORG 000BH ;中断处理;中断处理程序程序CPL P1.0RETIORG 0100H ;主程序;主程序MAIN:MOV TMOD,#02HMOV TH0,#06HMOV TL0,#06HSETB EASETB ET0SETB TR0SJMP $ENDC语言程序:语言程序:# include /包含特包含特殊功能寄存器库殊功能寄存器库sbit P1_0=P10;void main()TMOD=0x02;TH0=0x06;TL0=0x06;EA=1;ET0=1;TR0=1;while(1);void time0_int(void) interrupt 1 /中断服务程序中断服务程序 P1_0=!P1_0;(1)采用中断处理方式的程序:采用中断处理方式的程序:(2)采用查询方式处理的程序)采用查询方式处理的程序汇编程序:汇编程序:ORG 0000HLJMP MAINORG 0100H ;主程序;主程序MAIN:MOV TMOD,#02HMOV TH0,#06HMOV TL0,#06HSETB TR0LOOP:JBC TF0,NEXT ;查询计数溢出;查询计数溢出SJMP LOOPNEXT:CPL P1.0SJMP LOOPSJMP $ENDC语言程序:语言程序:# include /包含包含特殊功能寄存器库特殊功能寄存器库sbit P1_0=P10;void main()char i;TMOD=0x02;TH0=0x06;TL0=0x06;TR0=1;for(;) if (TF0) TF0=0;P1_0=! P1_0; /查询计数溢出查询计数溢出如果定时时间大于如果定时时间大于65536s,这时用一个定时,这时用一个定时/计数器直接处理不能实计数器直接处理不能实现,这时可用两个定时现,这时可用两个定时/计数器共同处理或一个定时计数器共同处理或一个定时/计数器配合软件计数器配合软件计数方式处理。计数方式处理。 【例【例4-27】设系统时钟频率为】设系统时钟频率为12MHZ,编程实现从,编程实现从P1.1输出周期为输出周期为1s的方波。的方波。 根据例根据例5-2的处理过程,这时应产生的处理过程,这时应产生500ms的周期性的定时,的周期性的定时,定时到则对定时到则对P1.1取反就可实现。由于定时时间较长,一个定时取反就可实现。由于定时时间较长,一个定时/计数计数器不能直接实现,可用定时器不能直接实现,可用定时/计数器计数器T0产生周期性为产生周期性为10ms的定时,然的定时,然后用一个寄存器后用一个寄存器R2对对10ms计数计数50次或用定时次或用定时/计数器计数器T1对对10ms计数计数50次实现。系统时钟为次实现。系统时钟为12MHZ,定时,定时/计数器计数器T0定时定时10ms,计数值,计数值N为为10000,只能选方式,只能选方式1,方式控制字为,方式控制字为00000001B(01H),初值),初值X:则则TH0=11011000B=D8H,TL0=11110000B=F0H。(1)用寄存器)用寄存器R2作计数器软件计数,中断处理方式。作计数器软件计数,中断处理方式。汇编程序:汇编程序:ORG 0000HLJMP MAINORG 000BHLJMP INTT0ORG 0100HMAIN:MOV TMOD,#01HMOV TH0,#0D8HMOV TL0,#0F0HMOV R2,#00HSETB EASETB ET0SETB TR0SJMP $INTT0:MOV TH0,#0D8HMOV TL0,#0F0HINC R2CJNE R2,#32H,NEXTCPL P1.1MOV R2,#00HNEXT:RETIENDC语言程序:语言程序:# include /包含特殊功能寄存器库包含特殊功能寄存器库sbit P1_1=P11;char i;void main()TMOD=0x01;TH0=0xD8;TL0=0xf0;EA=1;ET0=1;i=0;TR0=1;while(1);void time0_int(void) interrupt 1 /中断服务程序中断服务程序TH0=0xD8;TL0=0xf0;i+;if (i= =50) P1_1=! P1_1;i=0;(2) 用定时用定时/计数器计数器T1计数实现,定时计数实现,定时/计数器计数器T1工作于计数方式时,工作于计数方式时,计数脉冲通过计数脉冲通过T1(P3.5)输入,设定时)输入,设定时/计数器计数器T0定时时间到对定时时间到对T1(P3.5)取反一次,则)取反一次,则T1(P3.5)每)每20ms产生一个计数脉冲,那产生一个计数脉冲,那么定时么定时500ms只须计数只须计数25次,设定时次,设定时/计数器计数器T1工作于方式工作于方式2,初值,初值X=256-25=231= 11100111B=E7H,TH1=TL1=E7H。因为定时。因为定时/计数计数器器T0工作于方式工作于方式1,定时,则这时方式控制字为,定时,则这时方式控制字为01100001B(61H)。)。定时定时/计数器计数器T0和和T1都采用中断方式工作。都采用中断方式工作。汇编程序如下:ORG 0000HLJMP MAINORG 000BHMOV TH0,#0D8HMOV TL0,#0F0HCPL P3.5RETIORG 001BHCPL P1.1RETIORG 0100HMAIN:MOV TMOD,#61HMOV TH0,#0D8HMOV TL0,#0F0HMOV R2,#00HMOV TH1,#0E7HMOV TL1,#0E7HSETB EASETB ET0SETB ET1SETB TR0SETB TR1SJMP $ENDC语言程序如下:语言程序如下:# include /包含特殊功能寄存器库包含特殊功能寄存器库sbit P1_1=P11;sbit P3_5=P35;void main()TMOD=0x61;TH0=0xD8;TL0=0xf0;TH1=0xE7; TL1=0xE7;EA=1;ET0=1;ET1=1;TR0=1;TR1=1;while(1);void time0_int(void) interrupt 1 /T0中断服务程序中断服务程序 TH0=0xD8;TL0=0xf0;P3_5=!P3_5;void time1_int(void) interrupt 3 /T1中断服务程序中断服务程序 P1_1=! P1_1;4.5.4 MCS-51中断系统的应用中断系统的应用【例例4-32】某某工工业业监监控控系系统统,具具有有温温度度、压压力力、PH值值等等多多路路监监控控功功能能,中中断断源源的的连连接接如如图图5.26所所示示。对对于于PH值值,在在小小于于7时时向向CPU申申请请中中断断,CPU响响应应中中断断后后使使P3.0引引脚脚输输出出高高电电平平,经经驱驱动动,使使加加碱碱管管道道电电磁磁阀阀接接通通1秒钟,以调整秒钟,以调整PH值。值。 系系统统监监控控通通过过外外中中断断INT0来来实实现现,这这里里就就涉涉及及多多个个中中断断源源的的处处理理,处处理理时时往往往往通通过过中中断断加加查查询询的的方方法法来来实实现现。多多个个中中断断源源通通过过“线线或或”接接于于 INT0上上。那那么么无无论论哪哪个个中中断断源源提提出出请请求求,系系统统都都会会响响应应中中断断,响响应应后后,进进入入中中断断服服务务程程序序,在在中中断断服服务务程程序序中中通通过过对对P1口口线线的的逐逐一一检检测测来来确确定定哪哪一一个个中中断断源源的的提提出出了了中中断断请请求求,进进一一步步转转到到对对应应的的中中断断服服务务程程序序入入口口位位置置执执行行对对应应的的处处理理程程序序。这这里里只只针针对对PH7时时的的中中断断构构造造了了相相应应的的中中断断服服务务程程序序INT02,接接通通电电磁磁阀阀延延时时1秒秒钟钟的的延延时时子子程程序序DELAY已经构造好了,只须调用即可。已经构造好了,只须调用即可。 电磁阀P3.2INT0P3.08051P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7QRDCLK温度1超限温度2超限PH值超限压力超限+5V汇编程序如下:(只涉及中断程序,注意外中断汇编程序如下:(只涉及中断程序,注意外中断INT0中断允许,且为电中断允许,且为电平触发)平触发) ORG 0003H ;外部中断;外部中断0中断服务程序入口中断服务程序入口JB P1.0,INT00 ;查询中断源,转对应的中断服务子程序;查询中断源,转对应的中断服务子程序JB P1.1,INT01JB P1.2,INT02JB P1.3,INT03ORG 0080H ;PH值超限中断服务程序值超限中断服务程序INT02:PUSH PSW ;保护现场;保护现场PUSH ACCSETB PSW.3 ;工作寄存器设置为;工作寄存器设置为1组,以保护原组,以保护原0组的内容组的内容SETB P3.0 ;接通加碱管道电磁阀;接通加碱管道电磁阀ACALL DELAY ;调延时;调延时1秒子程序秒子程序CLR P3.0 ;1秒钟到关加碱管道电磁阀秒钟到关加碱管道电磁阀ANL P1,#0BFH ORL P1,#40H ;这两条用来产生一个;这两条用来产生一个P1.6的负脉冲,用来撤除的负脉冲,用来撤除PH7 ;的中断请求;的中断请求POP ACCPOP PSWRETIC语言程序:语言程序:#include sbit P10=P10;sbit P11=P11;sbit P12=P12;sbit P13=P13;sbit P16=P16;sbit P30=P30;void int0() interrupt 0 using1void int00();void int01();void int01();void int01();if (P10= =1) int00(); /查询调用对应的函数查询调用对应的函数else if (P11= =1) int01();else if (P12= =2) int02();else if (P13= =1) int03();void int02()unsigned char i;P30=1;for (i=0;i255;i+) ;P30=0;P16=0;P16=1;
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号