单片机常用常考程序.docVIP

  • 39
  • 0
  • 约3.6千字
  • 约 4页
  • 2018-06-02 发布于辽宁
  • 举报
单片机常用,常考程序 breeze 1.二进制数转换为BCD码,将累加器A中的二进制数0~FFH内的任一数转换为BCD码(0~255) (1)题意分析 BCD码是每4位二进制数表示一位十进制数,本例所要求转换的最大BCD码为255,表示成BCD码需要12位二进制数,超过了一个字节(8位),因此我们把高4位存放在B的低4位,高4位清零;低8位存放在A中。 0000 0010 0101 0101 B A 转换的方法是将A中二进制数除以100、10,所得商即为百、十位数,余数为个位数。 (2)汇编语言源程序 ;程序名:BINBCD ;功能:二进制数转换为BCD码 ;入口参数:要转换的二进制数存在累加器A中(0~FFH) ;出口参数:转换后的BCD码存放在B(百位)和A(十位和个位)中 BINBCD: PUSH PSW MOV B,#100 DIV AB ;除法指令,A/B →商在A中,余数在B中 PUSH ACC ;把商(百位数)暂存在堆栈中 MOV A,#10 XCH A,B ;余数交换到A中,B=10 DIV AB ;A / B→商(十位)在A中,余数在B(个位)中 SWAP A ;十位数移到高半字节 ADD A,B ;十位数和个位数组合在一起 POP B ;百位数存放到B中 POP PSW RET 2. 查表子程序。假设a、b均小于10,计算c=a2+b2,其中a事先存在内部RAM的31H单元,b事先存在32H单元,把c存入33H单元。 (1)题意分析 本例两次使用平方的计算,在前面的例4.9中已经编过查平方表得到平方值的程序,在此我们采用把求平方编为子程序的方法。 (2)汇编语言源程序 ORG 0000H ;主程序 MOV SP,#3FH ;设置栈底 MOV A,31H ;取数a存放到累加器A中作为入口参数 LCALL SQR MOV R1,A ;出口参数——平方值存放在A中 MOV A,32H LCALL SQR ADD A,R1 MOV 33H,A SJMP $ ;子程序:SQR ;功能:通过查表求出平方值y=x2 ;入口参数:x存放在累加器A中 ;出口参数:求得的平方值y存放在A中 ;占用资源:累加器A,数据指针DPTR SQR: PUSH DPH ;保护现场,将主程序中DPTR的高八位放入堆栈 PUSH DPL ;保护现场,将主程序中DPTR的低八位放入堆栈 MOV DPTR,#TABLE ;在子程序中重新使用DPTR,表首地址→DPTR MOVC A,@A+DPTR ;查表 POP DPL ;恢复现场,将主程序中DPTR的低八位从堆栈中弹出 POP DPH ;恢复现场,将主程序中DPTR的高八位从堆栈中弹出 RET TABLE: DB 0,1,4,9,16,25,36,49,64,81 3. 不同存储区域之间的数据传输。将内部RAM 30H单元开始的内容依次传送到外部RAM 0100H单元开始的区域,直到遇到传送的内容是0为止。 (1) 题意分析 本例要解决的关键问题是:数据块的传送和不同存储区域之间的数据传送。前者采用循环程序结构,以条件控制结束;后者采用间接寻址方式,以累加器A作为中间变量实现数据传输。程序流程图如图4.16所示。 图4.16 例4.8程序流程图 (2) 汇编语言源程序 ORG 0000H MOV R0,#30H ;R0指向内部RAM数据区首地址 MOV DPTR,#0100H ;DPTR指向外部RAM数据区首地址 TRANS: MOV A,@R0 ;A←(R0) MOVX @DPTR,A ;(DPTR)←A CJNE A,#00H,NEXT SJMP FINISH ;A=0,传送完成 NEXT: INC R0 ;修改地址指针 INC DPTR AJMP TRANS ;继续传送 FINISH: SJMP $ END 4. 设单片机系统的时钟频率为12MHz利用定时器T0(任选工作方式),编写一个完整的C51程序使P1.6和P1.7分别输出周期为1ms和2ms的方波信号(占空比为50%) ORG 0000HLJMP MAIN ORG 000BH LJMP TIME0 MAIN: ?MOV TMOD,#01H? ;设置T0为工作模式1?MOV IE,#82H?? ;开CPU中断,开T0定时器中断?MOV TH0,#0FCH? ;赋初值,定时1ms?MOV T

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档