单片机AT89S52和ADC0809连用时单片机启动ADC0809的汇编程序

单片机AT89S52和ADC0809连用时单片机启动ADC0809的汇编程序,第1张

启动ADC0809的汇编程序,仅仅两行而已:

MOV DPTR, #ADC0809的地址 这个地址,取决于单片机和0809的之间连线

MOVX @DPTR, A

这两行执行后,0809就启动了。

================================================================

功能:本程序实现P0口的对数码管动态显示秒表的分、秒、1/100秒;

计时程序由中断服务程序实现,采用定时计数器T0工作方式1;

P2口实现对数码管的片选功能

================================================================

==========================初始化================================

SHUCHUEQUP2 定义P0口为输出口

PIANXUAN EQUP1定义P2口为片选口

MIAO EQU30H

FEN EQU31H

MIAO0 EQU32H

SHUZIEQU33H

C_0 BIT20H.0

======================系统程序开始==============================

ORG 00H

LJMP START

ORG 03H

LJMP ON_OFF

ORG 0BH

LJMP T0_1

ORG 13H

LJMP RESET

ORG 30H

START:

CALL INIT

SETB C_0

MOVMIAO,#00

MOVMIAO0,#00

MOVFEN,#00

MOVDPTR,#TAB

MOV R2,#5

MAIN:

JNBC_0,$

CLRC_0

LL: CALL DISPLAY

CALL SHIJIAN

JMPMAIN

========================时间子程序=============================

输入:"30H、31H、32H"

输出:无

实现的功能:分、秒、百分之秒的计算。

===============================================================

SHIJIAN:

DJNZR2,TIAOCHU

MOV R2,#5

INC MIAO0

MOV R3,MIAO0

CJNER3,#100,TIAOCHU

MOV MIAO0,#00

INC MIAO

MOV R3,MIAO

CJNER3,#60,TIAOCHU

MOV MIAO,#00

INC FEN

MOV R3,FEN

CJNER3,#60,TIAOCHU

MOV FEN,#00

TIAOCHU:RET

========================显示子程序=============================

输入:"A"

输出:"P2口"

实现的功能:显示秒、分、百分之妙

===============================================================

DISPLAY:MOV SHUZI,MIAO0

CALL JISUAN

MOVC A,@A+DPTR

MOV SHUCHU,A 显示十位

MOV PIANXUAN,#10H片选

CALL DELAY

MOV PIANXUAN,#00H

MOV A,B

MOVC A,@A+DPTR

MOV SHUCHU,A 显示个位

MOV PIANXUAN,#20H片选

CALL DELAY延时

MOV PIANXUAN,#00H

MOV SHUZI,MIAO

CALL JISUAN

MOVC A,@A+DPTR

MOV SHUCHU,A 显示十位

MOV PIANXUAN,#04H片选

CALL DELAY

MOV PIANXUAN,#00H

MOV A,B

MOVC A,@A+DPTR

MOV SHUCHU,A 显示个位

MOV PIANXUAN,#08H片选

CALL DELAY延时

MOV PIANXUAN,#00H

MOV SHUZI,FEN

CALL JISUAN

MOVC A,@A+DPTR

MOV SHUCHU,A 显示十位

MOV PIANXUAN,#01H片选

CALL DELAY

MOV PIANXUAN,#00H

MOV A,B

MOVC A,@A+DPTR

MOV SHUCHU,A 显示个位

MOV PIANXUAN,#02H片选

CALL DELAY延时

MOV PIANXUAN,#00H

RET

========================计算子程序=============================

输入:30H

输出:"A和B"

实现的功能:把33H中的数据十位和个位分离出来

===============================================================

JISUAN:MOV A,SHUZI 数据放在A中

MOV B,#10除数放在B中

DIV AB 商放在A中,余数放在B中

RET

====================复位中断服务程序============================

输入;无

输出: 无

实现的功能:把30H、31H、32H中的数据清零。

================================================================

RESET:PUSH ACC

MOV 30H,#00H

MOV 3H,#00H

MOV 32H,#00H

CALL DELAY

POP ACC

RETI

====================启停中断服务程序============================

输入;无

输出: 无

实现的功能:关闭定时器

================================================================

ON_OFF:CPLTR0

CALL DELAY

RETI

====================定时中断0服务子程序========================

输入:无

输出:无

实现的功能:实现定时20MS,影响标中断志位C_0

===============================================================

T0_1:MOVTL0,50H 设置定时初值

MOVTH0,51H

SETB C_0定时标志位清0

RETI

========================中断设置子程序=========================

输入:无

输出:无

实现的功能:初始化设置定时器,设置初值,开中断0、中断1,定时器0.

===============================================================

INIT:MOVTMOD,#01H 定时器0工作方式1

MOVDPTR,#65536-20000

MOV50H,DPL

MOV51H,DPH

MOVTL0,50H设置定时初值

MOVTH0,51H

MOVIE,#87H 开定时器中断0

MOVTCON,#15H

RET

======================延时程序==================================

输入;无

输出: 无

实现的功能:延时一段时间

================================================================

DELAY:MOV R6,#80

L7:MOV R5,#60

L8:DJNZ R5,$

DJNZ R6,L7

RET

======================共阳查表数据==============================

TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

===========================结束=================================

END

ORG的意思是下面语句的地址

上电后,程序从0000的地址开始走

一句跳转指令就到了MAIN标号,

SP是设置堆栈,说明从50H以后都是堆栈的空间

PCON、TMOD、SCON是设置串口通信的方式(几位UART,波特率是否可变)

TH1、TL1是设置定时器来配合上面的三个寄存器设置波特率为9600

TCON给值40h,其实就是置它的TR1位,目的是让T1定时器开始工作,上面讲的TH1、TL1是设置定时器的,但是并没有启动,现在启动

下两条是清零发送中断标志和接收中断标志

下面一条把P1口全置1是用作输入的前提条件

调用延时程序等待

把1BH给累加器调用发送,以下几个都是一样

SEND子程序:

调用延时

JNB P1.2,SEND1 是判断电脑有没有准备好

准备好了就往下走(也就是发送)

MOV SBUF,A

这一步就是开始发送了

如果发送完成,TI就自动被置为1

所以只需要检查是否为1来判断是否发送完成。

JNB TI,$

如果不为1,就在原地等待,如果为1,就往下

清零TI,因为不会自动清零

发送子程序结束返回

不知道你是否明白,希望能帮上忙,另外显示动态数据需要看选择

什么样的显示器具体分析,比如8279,7279等,你需要学习相关

资料


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8067222.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存