| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1063 人关注过本帖
标题:我自己做的一个0809加c51加4015三位数码管显示程序
只看楼主 加入收藏
shida508
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-10-6
收藏
 问题点数:0 回复次数:0 
我自己做的一个0809加c51加4015三位数码管显示程序

我用0809采集数据(0到5伏),c51处理数据,三个4015作显示。
这是我的汇编程序。

ORG 0000H
LJMP MAIN
ORG 0003H ;中断0,当0809采集结束进入中断
LJMP INT0

MAIN:
MOV TCON,#01H ;设置中断
MOV IE,#81H

CLR P3.5 ;启动0809
CLR P3.6
SETB P3.6

CLR P3.6
SETB P3.5
CLR P3.5
YY: NOP ;等待进入中断
LJMP YY

INT0: ;中断
CLR EA ;关中断
SETB P3.7 ;让数据进入51
MOV P2,#0FFH ;从p2口进入
NOP
NOP
MOV A,P2
MOV B,#24 ;我的程序要求255对应120,所以先给数据乘以24再除以51,
MUL AB ;要调用双字节除法子程序,程序的入口R7(高),R6(低)为除数,R5(高),R4(低)为被除数,最后的商在R7(高),R6(低)
MOV R7,B
MOV R6,A
MOV R5,#00H
MOV R4,#51
LCALL CHUFA ;调用双字节除法子程序
CLR CY ; 我的商只有低位,在R6中,因为有三位7段数码管,可以显示三位,如果商大于等于99,则显示十位,个位,小数点后的第一位,小数点由P3.0控制(当P3.0为低时显示小数点);当商大于99时,则显示百位,十位,各位,不涉及小数点的显示
MOV A,R6
CJNE A,#99,LP1 ;判断等于99,不等转
LP6:CLR P3.0
MOV B,#10
DIV AB
MOV R0,A
LCALL XIAN1 ;显示最高位
MOV A,B
LCALL XIAN2 ;显示次位
MOV A,B
LCALL XIAN3 ;显示最低位
LJMP LP7
LP1:JC LP6 ;C等于1说明A小于99,转到LP6,否则继续
MOV B,#100
DIV AB
MOV R0,A
LCALL XIAN1
MOV A,#10
XCH A,B
DIV AB
LCALL XIAN2
MOV A,B
LCALL XIAN3

LP7: LCALL DELDY ;延时,隔一段时间采集一次
CLR P3.5 ;再次启动0809
CLR P3.6
SETB P3.6
CLR P3.6
SETB P3.5
CLR P3.5
SETB EA
RETI


XIAN1: ;P1口的低四位作显示输出,连接到三个4051,用P1.6,P1.5,P1.4分别控制最高位,次位,最低位的4051的工作,给该位赋0就是该位对应4051工作。
CJNE A,#00H,LP4
MOV P1,#0BAH
RET
LP4:ORL A,#0B0H
MOV P1,A
RET
XIAN2:
CJNE R0,#00H,LP5
CJNE A,#00H,LP5
MOV P1,#0BAH
RET
LP5:ORL A,#0D0H
MOV P1,A
RET
XIAN3:
ORL A,#0E0H
MOV P1,A
RET


CHUFA: 双字节除法子程序
MOV A,R4
JZ OVER
BEGIN: CLR A
MOV R3,A
MOV R2,A
MOV R1,#10H
DIV0: LCALL RLC4
MOV A,R2
SUBB A,R4
MOV R0,A
MOV A,R3
SUBB A,R5
JC NEXT
INC R6
MOV R3,A
MOV A,R0
MOV R2,A
NEXT: DJNZ R1,DIV0
MOV A,R3
RLC A
JC ROUND
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
SUBB A,R5
JC DONE
JNZ ROUND
MOV A,R2
SUBB A,R4
JC DONE
ROUND: LCALL ADD1
DONE: CLR A
RET
OVER: MOV A,#0FFH
RET
RLC4: CLR C
MOV A,R6
RLC A
MOV R6,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
RET
ADD1: MOV A,R6
ADD A,#1
MOV R6,A
MOV A,R7
ADDC A,#0
MOV R7,A
RET


DELDY: 延时子程序
MOV 0AH,#0FAH
LP3:MOV 0BH,#0FAH
LP2:NOP
NOP
DJNZ 0BH,LP2
DJNZ 0AH,LP3
RET
该程序上电后显示的数字是正确的,但是就不再改变了。我测试了所有的子程序都正确,但是不知道为什么不循环,谢谢大家赐教!

搜索更多相关主题的帖子: 数码管 CLR LJMP SETB 
2007-10-06 10:14
快速回复:我自己做的一个0809加c51加4015三位数码管显示程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021083 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved