微机原理及应用07C语言II2015_第1页
微机原理及应用07C语言II2015_第2页
微机原理及应用07C语言II2015_第3页
微机原理及应用07C语言II2015_第4页
微机原理及应用07C语言II2015_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

第七讲51单片机C语言程序设计(教材4.4~4.5节)1微机原理及应用

PrincipleandApplicationsofMicro-Computers教学目的:函数和模块化程序设计要求: 掌握程序设计的模块化思路和分层设计思路;掌握如何使用高级语言访问MCU的片上资源难点: 掌握程序设计的模块化思路和分层设计思路例1,循环程序设计包含的主要指令:DJNZ包含的主要C语言:例2,查表和子程序(包含输入和输出参数)调用包含的主要指令:MOVC,LCALL包含的主要C语言:例3,BCD码运算程序包含的主要指令:ADD,ADDC,DA例4,搜索最小(大)数程序(逻辑判断)包含的主要指令:JNC,XCH例5,I/O端口控制程序设计(位操作)包含的主要指令:JB,JNB,CPL内容2023/2/33汇编语言程序设计示例1功能

计算n个无符号整型数之和要求写成子程序形式子程序的输入和输出参数输入:数据个数存放在R4中,数据的起始地址在R0中输出:和存放在R4(高8位)和R5(低8位)中2023/2/34汇编语言程序设计示例1的源码Sum:

PUSHAcc

;保存A的内容在堆栈区

PUSHB

;保存B的内容在堆栈区

PUSHPSW

;保存PSW的内容在堆栈区 MOVA,#00H;首先将和的低8位清零 MOVB,#00H;首先将和的高8位清零 CLRC;将进位位清零 MOVR5,#00H;R5寄存器清零Sum1: ADDCA,@R0

;将一个字节的数据加到和的低字节中 MOVR5,A;保存和的低字节到R5中 CLRA;累加器A清零 ADDCA,B;将进位位加到和的高8位中MOVB,A;将和的高8位仍保存在B中 MOVA,R5;将临时保存在R5中的和的低8位传送到A中 INCR0;数据缓冲区指针加1,指向下一个字节

DJNZR4,Sum1

;累加是否继续?

;累加完成,和存放在B(高8位)和A(低8位)中 MOVR4,B;将和的高8位传送到R4中

POPPSW

;从堆栈区恢复PSW的内容

POPB

;从堆栈区恢复B的内容

POPAcc

;从堆栈区恢复A的内容

RET#definexDataPt((unsighnedchar*)0x00 )#definepR4=(char*)0x03;unsignedintDataSum(void){unsignedinti,result;CY=0;for(i=0;i<*pR4;i++)result+=*(xDataPt+i);*pR4=result;}2023/2/35汇编语言程序设计课内练习1功能

将片外扩展的数据存储器中的20个无符号整型数转移到片内数据存储器中要求写成子程序形式子程序的输入和输出参数输入:保存原数据的起始地址为8000H输出:片内数据存储器的起始地址为80H2023/2/36汇编语言程序设计课内练习1续MOVR6,#20;LOOP:MOVDPTR,#8000H;MOVR0,#80H;MOVXA,@DPTR;MOV@R0,A;INCDPTRINCR0DJNZR6,LOOPRET

voidDataMove(void){unsignedinti,result;charidata*DTo=(char*)0x80;charxdata*DFrom;*DFrom=(char*)0x8000;for(i=0;i<20;i++)*(DTo+i)=*(DFrom+i);}2023/2/37汇编语言程序设计示例2功能

将一组6个十六进制数转换成对应的ASCII串(该字符串由12个字符顺序组成)要求写成子程序形式子程序的输入和输出参数输入:保存原数据的起始地址为30H输出:保存ASCII串的起始地址为50HASCII_Table: DB‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’ DB‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’2023/2/38汇编语言程序设计示例2的源码(1)用查表方法,编写一个子程序,实现单字节十六进制数到ASCII字符的转换

ANLA,#0FH MOVCA,@A+DPTR POPDPH POPDPL POPPSW RETASCII_Table:DB‘0’,‘1’,’2’,’3’,’4’,’5’,’6’,’7’,DB‘8’,’9’,’A’,’B’,’C’,’D’,’E’,’F’THex2ASCII:;见教材p.71 PUSHPSW PUSHDPL PUSHDPH MOVDPTR,#ASCII_Table MOVB,A SWAPA ANLA,#0FH MOVCA,@A+DPTR XCHA,B请问:输入参数是?输出参数是?2023/2/39汇编语言程序设计示例2的源码(2)编写一个子程序,调用前一个子程序,将6个字节十六进制数转换成一个字符串 INCR1 MOV@R1,A INCR1 INCR0

DJNZR7,ToStr POPB POPAcc

RETToString: PUSHAcc PUSHB MOVR0,#30H MOVR1,#50H MOVR7,#6ToStr: MOVA,@R0 LCALLTHex2ASCII

MOV@R1,B2023/2/310C程序设计示例2的源码(2)编写一个子程序,调用前一个子程序,将6个字节十六进制数转换成一个字符串voidmain(){

unsignedinti,result;

charidata*DTo=(char*)0x50;charidata*Dfrom=(char*)0x30;inti;

for(i=0;1<6,i++){Hex2Str(Dfrom,DTo);Dfrom++;DTo++;}}

codeunsignedcharASCii[]={’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’,’A’,’B’,’C’,’D’,’E’,’F’}voidHex2Str(char*Src,char*Dest)

{chartemp=*Src;*Dest=ASCii[(temp>>4)];Dest++;*Dest=ASCii[(temp&0x0F)];

}

课内练习2:编写程序将n个字节的十六进制数要转换为一个字符串.(用示例1的参数)对应MOVC2023/2/311汇编语言程序设计示例3功能

计算3个字节型BCD码之和,并表示成BCD码要求写成子程序形式子程序的输入和输出参数输入:数据存放在R4,R5和R6中输出:和存放在R2(高8位)和R3(低8位)中2023/2/312汇编语言程序设计示例3的源码BCDSum:

PUSHAcc

PUSHPSW MOV R2,#00H MOVA,R4 ADDA,R5 DAA MOVR3,A CLRA ADDCA,R2movR2,A MOVA,R3 ADDA,R6 DAA MOVR3,A CLRA ADDCA,R2 DAA MOV R2,A

POPPSW

POPAcc

RETR5R4+AC调整R3R2R6+ACR3调整R2C+R22023/2/313汇编语言程序设计课内练习3功能

将一个无符号整型十六进制数转换成BCD码要求写成子程序形式子程序的输入和输出参数输入:原数据保存在A中输出:BCD码保存在R3(高字节)和R4(低字节)中2023/2/314汇编语言程序设计课内练习3续MOV

B,#100 DIV

AB MOV

R3,A ;savehundredbit MOV

A,B MOV

B,#10 DIV

AB SWAP

A ORL

A,B MOV

R4,A RETvoidHex2BCD(charHEX,charBCD){BCD=(HEX/10*16)+(HEX%10);}main(){……}2023/2/315汇编语言程序设计示例4功能

某系统的片外RAM从0020H~0030H地址单元存放着一批无符号整型数,请查找其中的最小数是多少?位于哪个地址单元?要求写成子程序形式子程序的输入和输出参数输入:原数据存放在片外RAM的0020~0030H中输出:最小数存放在A中,其地址放在R2(高8位)和R3(低8位)中2023/2/316汇编语言程序设计示例4的源码Sort: MOVR7,#16 MOVDPTR,#0020H MOVXA,@DPTR MOVB,A INCDPTRSort1: MOVXA,@DPTR CLRC SUBBA,B JNCSort_Skip MOVXA,@DPTR XCHA,B MOVX@DPTR,A MOVR3,DPLSort_Skip: INCDPTR DJNZR7,Sort1 RET

课内练习4:编写程序确定这一组数据的最大数及其存储单元地址.2023/2/317汇编语言程序设计课内练习5功能

有16个字节的数据分别存放在2000H~200FH单元,请编写程序统计其中有多少个数据是大于80H的,将统计结果保存在片内RAM的30H单元。要求写成子程序形式子程序的输入和输出参数输入:原数据存放在片外RAM的2000H~200FH中输出:统计结果保存在片内RAM的30H单元2023/2/318汇编语言程序设计课内练习5续

MOV R4,#0 MOV R2,#16 MOV DPTR,#2000Hex1_loop: MOVX

A,@DPTR SUBB A,#80H ; JC ex1_skip INC R4ex1_skip: INC DPTR DJNZ

R2,ex1_loop MOV A,R4 MOV 30H,A RET内容例1,循环程序设计包含的主要指令:DJNZ包含的主要C语言:例2,查表和子程序(包含输入和输出参数)调用包含的主要指令:MOVC,LCALL包含的主要C语言:例3,BCD码运算程序包含的主要指令:ADD,ADDC,DA例4,搜索最小(大)数程序(逻辑判断)包含的主要指令:JNC,XCH例5,I/O端口控制程序设计(位操作)包含的主要指令:JB,JNB,CPL2023/2/320汇编语言程序设计示例5功能

按图中电路,控制LED:

按下Key时,LED常亮; Key断开时,LED亮0.1s,灭0.9s要求写成主程序形式P1.0+5V12MHzKeyP3.1XTAL1XTAL2按下KeyKey断开讨论实现思路.2023/2/321汇编语言程序设计示例5的流程启动按Key?YesNoLED亮,Flag=‘0’OnOff=‘0’,Cnt=00HFlag=‘1’OnOff=‘0’?YesNoCnt>9?NoYesCnt=Cnt+1OnOff=‘1’,Cnt=00HP1.0=‘0’Cnt>90?NoYesOnOff=‘0’,Cnt=00HP1.0=‘1’ANDFlag延时10ms启动和初始化任务2(识别Key状态)任务3(控制LED状态)任务1(延时10ms)2023/2/322汇编语言程序设计示例5的源码 FlagBIT00H OnOffBIT01H CntDATA30HORG0000HLJMPmain_entry;无中断程序ORG0100Hmain_entry: CLROnOff MOVCnt,#00Hmain_loop: LCALLTask1 LCALLTask2 LCALLTask3 LJMPmain_loopORG0200HTask1:;延时10ms MOVR7,#97T11:MOVR6,#50T12:DJNZR6,T12 DJNZR7,T11 RETTask2:;识别Key状态 JNBP3.1,T2Skip;按下

温馨提示

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

评论

0/150

提交评论