51单片机汇编程序7.docx

上传人:b****6 文档编号:7235147 上传时间:2023-01-22 格式:DOCX 页数:13 大小:18.54KB
下载 相关 举报
51单片机汇编程序7.docx_第1页
第1页 / 共13页
51单片机汇编程序7.docx_第2页
第2页 / 共13页
51单片机汇编程序7.docx_第3页
第3页 / 共13页
51单片机汇编程序7.docx_第4页
第4页 / 共13页
51单片机汇编程序7.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

51单片机汇编程序7.docx

《51单片机汇编程序7.docx》由会员分享,可在线阅读,更多相关《51单片机汇编程序7.docx(13页珍藏版)》请在冰豆网上搜索。

51单片机汇编程序7.docx

51单片机汇编程序7

§7多功能智能钟

程序清单如下:

;*******************************************************************

;写字节子程序WMAX

;占用寄存器ACC

;*******************************************************************

DINEQUP1.6

CLKEQUP1.4

WMAX:

JBE7,W7;判是否为1

LCALLWM0;不是,则调用写“0”子程序

LJMPN7

W7:

LCALLWM1;是,则调用写“1”子程序

N7:

JBE6,W6

LCALLWM0

LJMPN6

W6:

LCALLWM1

N6:

JBE5,W5

LCALLWM0

LJMPN5

W5:

LCALLWM1

N5:

JBE4,W4

LCALLWM0

LJMPN4

W4:

LCALLWM1

N4:

JBE3,W3

LCALLWM0

LJMPN3

W3:

LCALLWM1

N3:

JBE2,W2

LCALLWM0

LJMPN2

W2:

LCALLWM1

N2:

JBE1,W1

LCALLWM0

LJMPN1

W1:

LCALLWM1

N1:

JBE0,W0

LCALLWM0

LJMPN0

W0:

LCALLWM1

N0:

CLRCLK

CLRDIN

RET

;*******************************************************************

;写“1”子程序

;*******************************************************************

WM1:

CLRCLK

SETBDIN;送出“1”

NOP

SETBCLK;产生CLK的上升沿

NOP

NOP

CLRCLK;产生CLK的下降沿

RET

;*******************************************************************

;写“0”子程序

;*******************************************************************

WM0:

CLRCLK

CLRDIN;送出“0”

NOP

SETBCLK;产生CLK的上升沿

NOP

NOP

CLRCLK;产生CLK的下降沿

RET

  2.X25045的初始化及读写子程序

;X25045引脚定义如下

SCKEQUP2.3;串行时钟输入

SIEQUP2.4;串行数据输入

SOEQUP2.6;串行数据输出

CSEQUP2.7;片选输入

;其中写保护输入WP始终接高电平

;状态寄存器及各命令字节定义

STATUS_REGEQU#00010000B

;上述状态寄存器中的WD1=0,WD0=1,即看门狗周期为600ms

;另外,BL1=0,BL0=0

READ_INSTEQU#00000011B

WRITE_INSTEQU#00000010B

RDSR_INSTEQU#00000101B

WREN_INSTEQU#00000110B

WRSR_INSTEQU#00000001B

WRDI_INSTEQU#00000100B

;*******************************************************************

;写1字节数据到X25045中的子程序WRONE

;数据在A中,地址在DPTR中

;占用寄存器:

ACC,DPTR

;*******************************************************************

WRONE:

PUSHACC;待写数据保护

LCALLWREN;WRITEENABLE.

CLRSCK;X25045的SCK置低

CLRCS;片选CS置低,选中

MOVA,WRITE_INST

MOVB,DPH

MOVC,B.0

MOVACC.3,C;DPH的最低位(A8)送ACC.3

LCALLOUTBYT;送含地址高位的写命令

MOVA,DPL

LCALLOUTBYT;送低8位地址

POPACC

LCALLOUTBYT;写一字节数据

CLRSCK;X25045的SCK置低

STEBCS;片选CS置高,无效

RET

;*******************************************************************

;设置写使能锁存器WREN子程序(即允许写操作)

;*******************************************************************

WREN:

CLRCS

CLRSCK

MOVA,WREN_INST

LCALLOUTBYT;送写使能命令WREN

SETBCS

CLRSCK

RET

;*******************************************************************

;给X25045写入1字节地址或数据子程序OUTBYT

;欲写内容在A中

;占用寄存器:

ACC,B

;*******************************************************************

OUTBYT:

MOVB,#08H;置循环次数8

OUTBYT1:

CLRSCK

RLCA;Acc的最高位送Cy

MOVSI,C;Cy送X25045的SI

SETBSCK

DJNZB,OUTBYT1;循环8次,8bits

CLRSI;X25045的SI置低

CLRSCK

RET

;*******************************************************************

;功能:

读X25045状态寄存器,等待内部写

;入口条件:

R6的数据是等待延时时间

;出口信息:

WIP=1,正在写,WIP=0写完成

;占用资源:

R6、A、B、PSW

;*******************************************************************

RDS045:

MOVR6,0FFH;循环次数送入R6

RDS01:

CLRSCK 

NOP

CLRCS;选中X25045

NOP

MOVA,RDSR_INST;05H,读X25045状态寄存器命令送A

LCALLOUTBYT;调用X25045写入1个字节子程序

LCALLINBYT;调用X25045读出1个字节子程序

SETBCS;不选中X25045

JNBACC.0,DS02;WIP=1,正在写,WIP=0写完成

DJNZR6,DS01

RDS02:

RET

;*******************************************************************

;功能:

向X25045写入一批数据子程序W045

;入口条件:

R0的内容为CPU内存的地址

;R1的内容是X25045的待写地址,R3是待写数据的长度

;R4的内容是02H或0AH,表示写命令的执行区域

;出口信息:

R3的内容为0

;占用资源:

A、B、PSW、R0、R1、R2、R3、R4

;*******************************************************************

W045:

CLRSCK

NOP

CLRCS

NOP

MOVA,WREN_INST;#06H,写允许命令送入A

LCALLOUTBYT;调用向X25045写入1个字节子程序

SETBCS

NOP

CLRCS

MOVA,R4;命令送入A

LCALLOUTBYT;调用X25045写入1个字节子程序

MOVA,R1;X25045的首地址送入A

LCALLOUTBYT;调用25045写入1个字节子程序

W0450:

MOVA,@R0;待写数据送入A

LCALLOUTBYT;调用X25045写入1个字节子程序

INCR0;调整CPU内数据存储区的位置

DJNZR3,W0450;判断这批数据是否写完

SETBCS;批量数据写完,不选中X25045

RET

;*******************************************************************

;功能:

向X25045读出一批数据子程序

;入口条件:

R0的内容为CPU内存的地址

 R1的内容是X25045的待写地址,R3是待写数据的长度

R4的内容是03H或0BH,表示写命令的执行区域

;出口信息:

R3的内容为0

;占用资源:

A、B、PSW、R0、R1、R2、R3、R4

;*******************************************************************

R045:

CLRSCK

NOP

CLRCS

NOP

MOVA,R4;命令送入A

LCALLOUTBYT;25045写入8个字节子程序

MOVA,R1;对X25045的操作首地址送入A

LCALLOUTBYT;25045写入8个字节子程序

R0451:

LCALLINBYT;调用读出8位数据子程序

MOV@R0,A;读出的数据送入CPU内存

INCR0;调整CPU内部存放数据的位置

DJNZR3,R0451;数据未读完,跳转

SETBCS;数据读完,不选中X25045

RET

;*******************************************************************

;功能:

  从X25045中读出8位数据子程序

;出口信息:

A的内容为读出的8位数据

;占用资源:

B、PSW

;*******************************************************************

INBYT:

MOVB,#08H

INBYT:

CLRSCK

NOP

MOVC,SO

NOP

SETBSCK

RLCA

NOP

DJNZB,INBYT

CLRSCK

RET

 

3.DS1302的初始化及读写子程序

;*********************************************************

T_CLKEQUP3.3;实时时钟时钟线引脚

T_IOEQUP3.4;实时时钟数据线引脚

T_RSTEQUP3.2;实时时钟复位线引脚

;*******************************************************************

;子程序名:

Set1302

;功能:

设置DS1302初始时间,并启动计时。

;说明:

;调用:

RTInputByte

;入口参数:

初始时间在:

Second,Minute,Hour,Day,Month,Week,YearL

;(地址连续)

;返回值:

;影响资源:

ABR0R1R4R7

;*******************************************************************

Set1302:

CLRT_RST

CLRT_CLK

SETBT_RST

MOVB,#8EH;控制寄存器

LCALLRTInputByte

MOVB,#00H;写操作前WP=0

LCALLRTInputByte

SETBT_CLK

CLRT_RST

MOVR0,#Second;

MOVR7,#7;秒分时日月星期年

MOVR1,#80H;秒写地址

Set13021:

CLRT_RST

CLRT_CLK

SETBT_RST

MOVB,R1;写秒分时日月星期年地址

LCALLRTInputByte

MOVA,@R0;写秒数据

MOVB,A

LCALLRTInputByte

INCR0

INCR1

INCR1

SETBT_CLK

CLRT_RST

DJNZR7,Set13021

CLRT_RST

CLRT_CLK

SETBT_RST

MOVB,#8EH;控制寄存器

LCALLRTInputByte

MOVB,#80H;控制,WP=1,写保护

LCALLRTInputByte

SETBT_CLK

CLRT_RST

RET

;*******************************************************************

;子程序名:

Get1302

;功能:

从DS1302读时间

;说明:

;调用:

RTInputByte,RTOutputByte

;入口参数:

时间保存在:

Second,Minute,Hour,Day,Month,Week,YearL

;返回值:

;影响资源:

ABR0R1R4R7

;*******************************************************************

Get1302:

MOVR0,#Second

MOVR7,#7

MOVR1,#81H;秒地址

Get13021:

CLRT_RST

CLRT_CLK

SETBT_RST

MOVB,R1;秒分时日月星期年地址

LCALLRTInputByte

LCALLRTOutputByte

MOV@R0,A;秒

INCR0

INCR1

INCR1

SETBT_CLK

CLRT_RST

DJNZR7,Get13021

RET

;*******************************************************************

;写1302一字节子程序

;*******************************************************************

RTInputByte:

MOVR4,#8

Inbit1:

MOVA,B

RRCA

MOVB,A

MOVT_IO,C

SETBT_CLK

CLRT_CLK

DJNZR4,Inbit1

RET

;*******************************************************************

;读1302一字节子程序

;*******************************************************************

RTOutputByte:

MOVR4,#8

Outbit1:

MOVC,T_IO

RRCA

SETBT_CLK

CLRT_CLK

DJNZR4,Outbit1

RET

 

;*******************************************************************

;发送接收控制信号

SFCTRLEQUP1.7

;本通信节点地址定义

ADDRESSEQU01H

;通信所需变量定义

;*******************************************************************

;主程序串行通信的初始化

MAIN:

MOVSP,#60H

MOVPCON,#00H;SMODE=0

MOVTMOD,#20H;定时器1设为模式2(波特率发生器)

CLREA

MOVTH1,#0F3H;定时起始值,6MHz晶振时波特率1200bps

MOVTL1,#0F3H

MOVSCON,#0D8H;串行口模式3,TB8=1发送地址呼叫

SETBTR1;启动定时器1

SETBEA

(其他初始化)

(其他处理程序)

TX:

SETBRS0;选择1组工作寄存器

PUSHACC

CLRRI;清接收标志

CLRES;关闭串行口中断

CLRSFCTRL;使485处于接收方式

MOVA,SBUF;接收数据

MOVB,A;数据暂存

XRLA,#0FFH;判是否是复位命令(字节0FFH)

JNZTX_1;不是,则转

SETBSM2;是,则进行软复位处理

SETBES

(设置系统软复位标志以便系统进行软复位处理)

POPACC;恢复现场

CLRRS0

RETI

TX_1:

MOVA,B;取出数据以判是否呼叫本机

CJNEA,#ADDRESS,TX_2

SJMPTX_3

TX_2:

SETBES;不是,则中断返回

POPACC;恢复现场

CLRRS0

RETI

TX_3:

CLRSM2

SETBSFCTRL;使485处于发送状态

MOVA,#ADDRESS;用本机地址作为应答

MOVSBUF,A

TX_4:

JNBTI,TX_4;等待发送完成

CLRTI

CLRSFCTRL;使485恢复接收状态

(下面开始接收并进行相应处理)

...

SETBES

POPACC;恢复现场

CLRRS0

RETI

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1