51单片机汇编程序7.docx
《51单片机汇编程序7.docx》由会员分享,可在线阅读,更多相关《51单片机汇编程序7.docx(13页珍藏版)》请在冰豆网上搜索。
![51单片机汇编程序7.docx](https://file1.bdocx.com/fileroot1/2023-1/21/60d40f81-a173-4d2e-bb16-321b4f326c8c/60d40f81-a173-4d2e-bb16-321b4f326c8c1.gif)
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