找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7562|回复: 1
打印 上一主题 下一主题
收起左侧

PL2000A/PL2101电力载波芯片中文资料及接收、发射程序 电路图

[复制链接]
跳转到指定楼层
楼主
ID:105323 发表于 2016-3-3 18:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 51黑黑黑 于 2016-3-4 00:46 编辑

PL2101芯片中文资料
        直序扩频,半双工异步调制解调器
        二相相移键控,120KHz载频,带宽15KHz,传输速率500 bps
        接收灵敏度:50mVRMS(500bps)
        15位伪码长度,可编程同步捕获门限
        上电复位、电压监测电路及看门狗定时器
        内建高灵敏度放大器及四象限乘法器
        I2C串行通信接口
        可编程实时钟(/////星期/)(掉电后电池维护)
        32Bytes SRAM(掉电后电池电池维护)
         5V供电,I/O口带 4000V ESD 保护
        发射功率0.5w,单级传输距离≥1000m
        抗干扰能力:抗20倍功率的噪声,抗衰减:-80dB
        工业级温度标准: -40oC ~85oC
        数字/模拟混合0.5μmCMOS集成电路工艺,SOP28表贴封装;
PL2101管角定义图


概述
PL2101 是专为电力线通讯网络设计的半双工异步调制解调器。它仅由单一的5V 电源供电,以及一个外部的接口电路与电力线耦合。PL2101除具备基本的通讯控制功能外,还内置了五种常用的功能电路:实时钟电路,32Bytes SRAM,电压监测,看门狗定时器及复位电路,它们通过标准的I2C接口与外部的微处理器相联,其中实时钟与32 Bytes SRAM在主电源掉电的情况下可由3V备用电池供电继续保持工作。PL2101 是特别针对中国电力网恶劣的环境所研制开发的低压电力线载波通信芯片。由于采用了直接序列扩频、数字信号处理、直接数字频率合成等新技术,并采用大规模数字/模拟混合0.5μmCMOS 工艺制作,所以在抗干扰及抗衰落性能以及国内外同类产品性能价格比等方面有着出众的表现。



管脚描述

1
VFB
内部限幅放大器反相输入端(外接0.1uF电容至GNDA
2
FLTi
混频信号输出。内部混频器输出的信号由此管脚输出进入外部陶瓷滤波器
3
Ref2
内部基准电压源自举端(外接10M电阻至VDDA
4
Ref1
内部电压比较器调整端
5
Dout
内部限幅放大器输出监测端
6
WDI
看门狗计数器清零输入端。当WDI持续436mS以上无高低电平变化,将导致看门狗计数器溢出复位
7
SCL
I2C串行总线时钟输入端
8
SDA
I2C串行总线数据输入/输出端。
9
?/R
半双工收发控制输入端。(高电平收/低电平发)
10
RXD_TXD
半双工数据收发输入/输出端
11
HEAD
数据同步端
12
RESET
上电复位及看门狗计数器溢出复位输出端(高电平有效,持续时间218mS)。当电源电压低于4.3V时,RESET脚持续输出高电平
13/14
XT2o/XT2i
时钟晶体振荡器输入/输出端。XT2oXT2i分别为片内反相放大器的输入端和输出端,外接晶体可以组成晶体振荡器。PL2101主振荡器所需时钟频率为32.768KHz。电路连接如图所示,为使振荡器工作更加可靠,电容C1 一般用3pFC2的取值可在3-6pF之间选择。
15
VBAT
备用电源输入端(可接3V-3.6V锂电池)
16
VDDD
数字部分电源, 5.0V
17
PSK_OUT
数字信号发送输出端。(驱动能力大于16mA
18
GNDD
数字地

19/20
XT1o/XT1i
9.6MHz主晶体振荡器输入/输出端。XT1oXT1i分别为片内反相放大器的输入端和输出端,外接晶体可以组成晶体振荡器。PL2101主振荡器所需时钟频率为 9.6MHz。电路连接如图所示,为使振荡器工作更加可靠,电容C1 一般用30pFC2的取值可在30-68pF之间选择。若使用外部时钟,可直接从XT1i输入9.6MHz的时钟信号。
21
CLK600
600KHz本振输出端。该管脚输出600KHz方波信号,作为外接模拟混频器MC3357/MC3361的一本振信号,它与SIGin输入的120KHz信号混频出480KHz的中频信号以便陶瓷滤波器进行带通滤波(当用户使用内部模拟混频器时,该引脚悬空)
22
GNDA
模拟地
23
SIGin
模拟信号输入,50mV– 800mV120KHz
24
VDDA
模拟部分电源, 4.8 – 5.0V
25
VFA
外接0.1uF电容至GNDA
26
PFo
电源掉电指示输出端。PL2101除提供内部电源电压监测/复位电路外还额外提供一个模拟电压比较器,它的一个输入端接片内的2.5V电压基准源, 另一个输入端即CMP,它的输出端即PFo
27
CMP
电源掉电监测外部比较输入端
28
FLTo
滤波信号输入。当混频信号经过带通滤波后由此管脚进入内部限幅放大器
I2C接口时序:
1.管脚说明
①    SDA串行地址/数据输入/输出端
   这是一个双向传输端,用于传输地址和数据进入PL2101,以及从 PL2101 发送数据至外部 MCU 或其它控制器件。对于一般的数据传输,仅在SCL为低期间SDA才可以变化。在SCL为高期间变化,留给指示 START(开始)和 STOP(停止)条件。
SCL串行时钟端
   此为时钟输入端,用于同步进入 PL2101 和从 Pl2101 发出的数据。
2I2C时序描述
   PL2101 支持双向两线总线和数据传输协议。当器件处于传送数据到总线状态时,我们称之为发送器,当器件处于接受数据状态时则称为接受器。总线必须由一个主器件控制,主器件可以是MCU 或其它设备,它产生串行时钟(SCL),控制总线存取,并且产生开始位(START)和停止位(END),而 PL2101 作为从器件工作。主器件和从器件都能工作于发送器或者接受器的状态,但何种方式有效由主器件决定。为明确起见,除非另作说明以后所指的从器件均代表PL2101
①   总线数据传输开始/停止

l        总线不忙(A) —数据和时钟线保持高
l        开始传送数据(B) —当时钟(SCL)为高,SDA线由高到底的变化将产生起始位(Start Bit),所有的命令必须在产生起始位以后进行。

l        停止数据传送 —当时钟(SCL)为高,SDA线由低到高的变化将产生停止位(End Bit),所有的命令必须在产生停止位以前结束。

①  数据有效
l        在起始位后,时钟信号的高电平周期期间,当数据线是稳定时,数据线的状态表示数据线有效。
l        数据线上的数据改变必须发生在时钟信号为低电平周期期间,每位数据需一个时钟。
l        每次数据的传输必须在起始位后开始,在停止位前结束。在开始和停止条件之间数据字节的传输数目由主器件决定。
②   输出应答


l        在每一个字节被接收后,接受器件必须产生一个确认位(ACK)当接受器准备接收下一字节,或否定位(NACK)当接受器准备结束接收状态。
l        主器件必须产生一个与此确认位相应的额外时钟脉冲。
l        通过在相对应于确认位时钟脉冲的高电平期间拉SDA线为稳定的低电平,可产生确认位(或置SDA线为稳定的高电平,产生否定位)。
l        若不在从器件输出的最后一个字节中产生确认位,主器件必须发一个数据结束信号给从器件(即产生否定位)。在这种情况下,从器件会保持数据线为高电平,使得主器件能产生停止位以便结束本次总线数据传输。
从器件代码
l        产生起始位以后,总线主器件必须对 PL2101 发送七位器件代码(1011000)组成的从器件地址,以便选中PL2101 并使得总线上的其它从器件处于非选中状态并让出总线控制权。
l        从器件地址的第八位 R/W 位的状态决定主器件对 PL2101 进行何种操作(读或写)。
PL2101 一直监视总线上与它相应的从器件地址,如果从器件地址相符并且器件不忙,则PL2101产生一个确认位。
操作
器 件 码
读/写


1  0  1  1  0  0   0

1  0  1  1  0  0   0

  1

  0


SLAVEADDRESS









R/W
A
1
0
1
1
0
0
0
地址字节
l        地址字节是由主器件发出的八位地址码,用来寻址PL2101 内部的存储寄存器。
l        PL2101 内部寄存器地址空间的分配如下

地址字节内容
说明
00000000—00011111(00H-1FH)
SRAM
01000000 (40H)
01000001 (41H)
01000010 (42H)
01000011 (43H)
01000100 (44H)
01000101 (45H)
星期
01000110 (46H)
01001000 (48H)
捕获门限
01001111 (4FH)
写保护
  PL2101 内部寄存器地址空间从 00H-FFH 共计 256 个字节,除上表所列的以外其余均为无效地址,对无效地址写入的数据将会被丢弃,从无效地址读出的数据没有实际意义。为保持程序代码的兼容性,我们建议不要使用无效地址(因为它可能会被PL210X系列的其它版本芯片使用),以便软件可以被不加修改的直接移植到PL210X 系列的其它系统中。
写保护
l        PL2101 上电复位后,写操作是被禁止的( 4FH 字节的 bit7 被自动清零),整个地址空间内除写保护字节可读/写寻址外,其余地址只能做读寻址。
l        若要打开写保护,需使写入写保护地址字节的数据最高位为1。
3.写操作
写单字节数据
l        在主器件发出起始位以后,主器件发送七位器件代码,以及一位低电平的读写位到总线上,这指示PL2101 将被寻址,一个地址字节将跟在第九个时钟周期由PL2101 产生的确认位之后。由主器件发送的地址字节会被写入到 PL2101 的地址指针寄存器。
l        主器件接收来自 PL2101 的另一个确认信号以后,将数据字节发送到总线上,PL2101 接收它并将其写入到被地址指针寻址的寄存器中。
l        PL2101 再次发出确认信号,然后主器件产生停止位结束本次操作。
l        任何时候,如果从器件在应该发出确认信号时没有给出确认应答,则表示PL2101 没有正确接收到起始位并进入命令准备状态,这需要主器件重新发送操作命令。
4.读操作
①   读当前地址内容

l        PL2101 内部的地址指针寄存器保持被存取的最后一个数据字节的地址,并在片内自动加1。如果以前存取(读或写操作均可)的地址为n,下一个读操作从 n 1 地址中读出数据。但对于地址指针寄存器的加1操作相对与读/写时序是不同的,当主器件做连续读操作时是先读后加,连续写操作时是先加后写(第一个被写入的数据字节在写周期前没有地址加操作)。
l        当 PL2101 接收到R/W位为1的情况下,PL2101 发送一个确认位并随后送出8位数据字节,然后主器件不确认传递(产生 NACK),再发送停止位结束本次操作。
读随机地址内容

l        这种方式可以让主器件读取PL2101 片内任意地址的寄存器内容,要完成这种方式的读操作需要首先设置片内地址指针寄存器,这可通过将地址字节作为写操作的一部分送给PL2101来完成。
l        发送了地址字节后,主器件在确认位后面立即产生一个起始位,用这种方式结束写操作并开始另一个读操作。
l        主器件再次发出器件代码,并使 R/W 位为“1”,PL2101 将发出确认位并随后发送由上次地址写操作设置的地址指针寻址的8位数据字节,然后主器件不确认传递(产生NACK),再产生一个停止位结束本次操作。
读顺序地址的内容


l        读顺序地址内容的方式与读随意地址内容的方式以相同的方式启动,PL2101发送完第一个数据字节以后,主器件发出一个确认位(ACK),这样 PL2101 将会发送下一个顺序地址的8位数据字节,直至主器件发出NACK 或停止位。
l        为提供这种读方式,PL2101    包含的地址指针寄存器在每次操作完成以后自动加1。
l        利用这一特性,可以在一次操作期间连续顺序地读出整个存储器的内容。但不在有效地址空间内的数据字节会被FFH 取代。
片内寄存器地址/功能描述:
SRAM
(00H-1FH)共计 32 个字节,在主电源掉电后可由备用电池继续供电,保持数据不丢失。
 实时钟:
秒  (40H)   二进制(BIN) 表示,0-59 表示零秒至五十九秒。
分  (41H)   二进制(BIN) 表示,0-59 表示零分至五十九分。
时  (42H)   二进制(BIN) 表示,0-23 表示零点至二十三点。
日  (43H)   二进制(BIN) 表示,1-31 表示一号至三十一号。
月  (44H)   二进制(BIN) 表示,1-12 表示一月至十二月。
星期 (45H)   二进制(BIN) 表示,1-6 表示周一至周六,0 表示星期日。
年  (46H)   二进制(BIN) 表示,0-99 表示 2000 年至 2099 年。
特殊寄存器:
捕获门限   (48H)扩频伪码同步捕获门限,上电复位缺省值为30H。
写 保 护  (4FH) 写保护字节的最高位为“0”使能写保护,禁止对整个地址空间(除写保护字节本身)的写操作,写保护字节的最高位为“1” 取消写保护。其它位保留供功能扩展使用。写保护字节上电复位缺省值为30H。
对PL2000A/PL2101芯片的写操作步骤
   a R/〒为“0”、发射态;
   b HEAD对应引脚产生中断时,将发送数据的比特移位到RXD_TXD管脚;
   c 等待下一次HEAD中断,返回b
   d 直到发送数据发送结束;
   e R/〒为“1”、恢复接收态;
PL2000A/PL2101芯片的读操作步骤:
  aR/〒为“1”、接收态;
   b HEAD对应引脚产生中断时,将RXD_TXD管脚比特数据移位到C并保存;
   c 等待下一次HEAD中断,返回b
   d 直到按规约接收一次完整帧;
   e 进行数据处理。
同步接收数据过程:
* R_T为“1”、接收态,HEAD发生下降沿产生中断后,将RXD_TXD状态读入缓冲字节;
  * 在16Bit的滑动窗口中搜索同步帧,当搜索到0x09、0xAF同步帧头后,表示已经进入同步状态;
  * 随后数据为通讯数据体,接收数据每8Bit 依次还原为一个有效字节数据,由规约进
解释,直至接收完成。


下面介绍PL2000A/PL2101电力载波芯片接收、发射测试例程 电路图
电力载波电路图如下:

主程序循环检测1AH单元是否=”F”,并等待中断接收载波数据,收到数据后,RXD_TXD_BYTE=1AH载波收发标志置成”F”,主程序再向主机(pc)发送数据.此例程需要2台机器配合使用,这一台做为载波接收机,另一台作为载波发射机,向它发送数据,它收到后通过串口发送给微机,

      R_T BIT          P1.7; R/〒为“0”、发射态;为“1”、接收态;
            RXD_TXD    BIT  P1.6
            HEAD    BIT    0b2h;INT0
            ROM_SDABIT   0B5H;;;
           ROM_SCLBIT   0B6H;;;
RXD_TXD_BYTEEQU      1AH      ;载波收发标志
TR_RC_BUF_1     EQU      30H
BIT_SEND_CNT  EQU      1CH
TMP_SEND_BYTE     EQU      1DH
BYTE_SEND_CNT      EQU      1EH
HEAD_WORD_L EQU      1FH;同步字低位字节
HEAD_WORD_H EQU      14H
READ_BUF  EQU      15H
T_NOR_BIT  BIT  17H ;发送普通数据标志
T_END_BIT  BIT  18H

            ORG      0000H
            AJMP    MAIN
            ORG      0003H
            LJMP     TRANCIEVE;中断接收载波数据
       ORG 001BH
            RETI
       ORG 0023H
       LJMPS         ;接收数据转S

            ORG 0030h
MAIN:   MOVSP,#60H    ;设堆栈指针
            MOV     IE,#10011101B   ;
            MOV     IP,#00011000B
       SETB     IT1             ;下降沿有效
             SETB     IE1             ;外部中断1
          MOV A,#21H
          MOV 89H,A  ;TMOD定时器1工作方式2,8位可重装,定时器0工作方式116位定时器
       MOV A,#50H ;设串行口模式1
          MOV 98H,A   ;送串行控制SCON
             MOV 8BH,#0EBH ;给定时器1赋值6M=F31200波特率,0.833毫秒/,12M=E8H,9.6=EBH
           MOV 8DH,#0EBH ;给定时器0赋值6M=F31200波特率,0.833毫秒/,12M=E8H
       SETB TR1
            SETB     R_T
Q:       MOV A,#0FFH
             MOV R2,#15  ;清数据区
            MOV R0,#21H
  QING:MOV@R0,A
            INC R0
            DJNZ R2,QING
       MOV 30H,#09H
    MOV31H,#0AFH
         MOV A,#55H
             MOV R2,#40  ;清数据区
            MOV R0,#32H
  QING1:MOV@R0,A      ;清数据区
            INC R0
            DJNZ R2,QING1

       MOV    HEAD_WORD_L,#0
       MOV    HEAD_WORD_H,#0
       MOV    BIT_SEND_CNT,#9
       MOV    TMP_SEND_BYTE,#0FFH
       MOV    TR_RC_BUF_1,#21H  ;发送、接收数据缓冲区首址
       MOV    BYTE_SEND_CNT,#40 ;接收数据长度
          ACALLINIT_PL2000A
       MOV     RXD_TXD_BYTE,#'R'
MAIN1: LCALL   RDOG;喂狗
         MOV     A,RXD_TXD_BYTE; 1AH  ;载波收发标志
        XRL A,#'F';接收完,转换状态,同时通知主程序接收完毕F=46
        JZ ZBEND;向主机发数据,否则等待接收数据
            AJMP    MAIN1
ZBEND :ACALLFPC  ;串口发送数据到主机
            AJMPMAIN1
INIT_PL2000A: ;检查PL2000A/PL2101的捕获门限是否正确,错误复位靠上电置初值
            SETB     RXD_TXD
            SETB     R_T       ; R/〒为“1”、接收态
            SETB     HEAD; HEAD发生下降沿产生中断后,将 RXD_TXD状态读入缓冲字节
            MOV     R0,#READ_BUF
            MOV    B,#1
            MOV    R1,#0B1H   ;读命令
            MOV      R2,#48H    ;PL2000A/PL2101的捕捉门限地址
            LCALL RDOG
            ACALL  RD_X    ;读取1个字节
            MOV     A,@R0
            CJNE     A,#30H,EER
            SETB     RXD_TXD
            SETB     R_T
        RET

EER:     CLR EA  ;错误复位
      SJMP     EER

            ORG 0100H;中断接收,R/〒为“1”、接收态;在HEAD对应引脚产生中断时,将RXD_TXD 管脚比特数据移位到C并保存;等待下一次HEAD中断,直到按规约接收一次完整帧;进行数据处理。
TRANCIEVE:
            PUSH    PSW      ;TRANCIEVE
            PUSH    ACC
            MOV     A,R0
            PUSH    ACC
            MOV     A,R1
            PUSH    ACC
       LCALL   RDOG
            MOV     A,RXD_TXD_BYTE
            CJNE     A,#'R',TRANS      ;;;;;;;R=52,A=R是接收,否则发送
            LCALL  RECEIVE_DATA  ;接收
RETURN_TR_RC: POP ACC
            MOV     R1,A
            POP ACC
            MOV     R0,A
            POP ACC
            POP PSW
            RETI

TRANS: LCALL  TRANS_BEGIN         ;RX_TX=0,转发射
            SJMP     RETURN_TR_RC
RECEIVE_DATA:
       SETB     RXD_TXD
            SETB     R_T
            MOV     C,RXD_TXD              ;R_T状态入Cflag
            MOV     A,HEAD_WORD_L     ;读入同步字低位字节
            RLCA                                      ;ACCCF右环移位
            MOV     HEAD_WORD_L,A     ;回写同步字低位字节

TB:        JB 20H.0,REC_NOR        ;R_HEAD_BIT=1,帧同步已被接收,进入正常接收状态
       MOV   A,HEAD_WORD_H
       SUBB A,#9
       JNC TB1
       MOV     A,HEAD_WORD_L
            CJNE  A,#0FFH,RC  ;HEAD_WORD_H=0x09,接收到的高字节不符合,返回
           INC   HEAD_WORD_H
       SETB P1.0
       SETB P1.3
       AJMP   RETURN_RC
16Bit的滑动窗口中搜索同步帧,当搜索到 0x090xAF同步帧头后,表示已经进入同步状态;
TB1:      MOV A,HEAD_WORD_L;
       CJNE  A,#0AFH,RETURN_RC
       MOV   HEAD_WORD_H ,#0
            SETB  20H.0                         ;符合同步字节,设置进入正常数据接受态
            CLR p1.0
            MOV   BIT_SEND_CNT,#9    ;设置比特位计数器
            RET                                         ;此次接收完成

REC_NOR: DJNZ BIT_SEND_CNT,return_rc;一个字节未接收完,继续接收,否则按字节处理
            MOV     A,TR_RC_BUF_1              ;读入接收缓冲区基址
            MOV     R1,A      ;
            MOV     @R1,HEAD_WORD_L      ;将接收到的数据存入相应的RAM
       INC     TR_RC_BUF_1
            MOV     A,TR_RC_BUF_1              ;读入接收缓冲区基址30H59h-30h=29h=41d
            CJNEA,#59H,RETURN_OTHERS     ;数据尚未全部接收完,继续接收
            MOV     RXD_TXD_BYTE,#'F'  ;接收完,转换状态,同时通知主程序接收完毕F=46
            MOVTR_RC_BUF_1,#30H        ;接收完40个数据,恢复发送数据缓冲区起始地址
            CLR 20H.0
       LCALL  INIT_PL2000A     ;初始化PL2000A/PL2101
        SETB P1.0
        RET

RETURN_OTHERS:    MOV   BIT_SEND_CNT,#9    ;设置比特位计数器
            MOV A,  HEAD_WORD_L
            XRL A,#55H
            JNZ AAA
       CLR P1.3
AAA:     MOV     HEAD_WORD_L,#0    ;接收完一个字节后清0
       ACALL YSA
RC:    MOV   HEAD_WORD_H ,#0
            RET
RETURN_RC:             RET

      ORG 0300h
TRANS_BEGIN:  CLR R_T                         ; R/〒为“0”、发射态;
SETBP1.5                         ;合上继电器
TRAN1:        MOVA,TR_RC_BUF_1             ;=30H
                   CJNEA,#59H,TRANS_DATA     ;
                   MOV TR_RC_BUF_1,#21H  ;发送完40个数据,恢复发送数据缓冲区起始地址
TRANS_ERR:
             MOV     RXD_TXD_BYTE,#'R'  ;发射结束,置接收标志
                          SETB R_T
               SETB P1.0
               SETB P1.3
RETURN_TR:      RET

TRANS_DATA:    DJNZ  BIT_SEND_CNT,TRANS_GOON ;没发送完8位继续
TR_NOR_1:        MOV     BIT_SEND_CNT,#9     ;每字节8bit
                          INC TR_RC_BUF_1
                          MOV     A,TR_RC_BUF_1
                          MOV     R0,A
                          MOV     TMP_SEND_BYTE,@R0    ;读入欲发送数据
                CLR P1.0
                          RET
TRANS_GOON:   MOV A,TMP_SEND_BYTE
                          RLC A
                          MOV     RXD_TXD,C  ;发送当前BIT
                          MOV     TMP_SEND_BYTE,A
                   CLRP1.5                                         ;断开继电器
                          RET

   S:    PUSHACC;串口通信程序,可以和微机通信
            PUSH PSW
            PUSH DPH
            PUSH DPL
            MOV R2,#03H
          MOV R1,#10H
            MOV R0,#1CH
;     CLR 0AFH
          SETB  REN  ;允许接收
S2:   JNB  RI,  $             ;查询接收,RI=0等待,RI=1时收到
       CLR   RI
       MOV  A,  SBUF   ;读输入缓冲区
            MOV @R1,A
            DEC R1
            LCALL  ASC
       SWAP   A
       MOV   1FH,   A
       INC   R1
       LCALL  ASC
       ORL  1FH,   A
            MOV @R0,1FH
            INC R0
            INC R1
            DJNZ R2,S2
            ACALLRDOG     ;关闭看门狗
            MOV A,1CH
       XRL  A,   #0AH
       JNZ S1
       MOV     RXD_TXD_BYTE,#'S'
            AJMP SEND

S1:    MOV   A,1CH
         XRL  A,   #0BH
            JNZ SEND
       MOV     RXD_TXD_BYTE,#'R'

SEND:   POP DPL
            POP DPH
            POP PSW
            POP ACC
            SETB 0AFH
            RETI

ASC:   MOV   A,   @R1
       CLR   C
       SUBB   A,   #30H
       MOV   R6,   A
       SUBB  A,   #0AH
       JC    ASCEND
       XCH   A,   R6
       SUBB  A,   #07H
       MOV   R6,  A
ASCEND:MOV   A,   R6
       RET

FPC:      MOV R7,#41;串口发送数据到主机(PC)
        MOV R1,#30H
        CLR P1.0
        CLREA
FSD:      CLR REN
             MOV    A,   @R1
       ANL    A,     #0F0H
       SWAP   A
       MOV    SBUF,   A
       JNB    TI,    $
       CLR    TI
       MOV    A,  @R1
       ANL    A,     #0FH
       MOV    SBUF,   A
       JNB    TI,    $
       CLR    TI
       INC R1
       ACALL  RDOG
       ACALL YSB
       DJNZ R7,FSD
       SETB REN
       SETB EA
       SETB P1.0
       MOV     RXD_TXD_BYTE,#'R'
       RET

      ORG 0600H
;子程序1:打开写保护子程序
WR_OPEN:
      MOV     40H,#80H
      MOV     R0,#40H
      MOV     R1,#0B0H
      MOV     R2,#4FH
      MOV     B,#1
      LCALL   WR_X
      RET

;;子程序2:关闭写保护子程序
WR_CLOSE:
      MOV     40H,#30H
      MOV     R0,#40H
      MOV     R1,#0B0H
      MOV     R2,#4FH
      MOV     B,#1
      LCALL   WR_X
      RET

;子程序3:读同步门限子程序,同步门限默认值为30H
RD_SNY:
      MOV     R0,#40H
      MOV     R1,#0B1H
      MOV     R2,#48H
      MOV     B,#1
      LCALL   RD_X
      RET

;子程序4:读时间子程序
RD_TIME:
      MOV     R0,#40H
      MOV     R1,#0B1H
      MOV     R2,#40H
      MOV     B,#7
      LCALL   RD_X
      RET

;子程序5:从PL2000A/PL2101中读多字节数据子程序
;(R2) 数据在PL2000A/PL2101中的首地址
;(R0) 读取数据在RAM中的存放地址
;(B) 需读数据个数
;(R1) 读命令字

RD_X:
      LCALL   I2C_START
      MOV     A,R1
      CLR ACC.0
      LCALL   WRITE_BYTE
      JC   RDA_RET
      MOV     A,R2
      LCALL   WRITE_BYTE
      JC   RDA_RET
      LCALL   I2C_START
      MOV     A,R1
      LCALL   WRITE_BYTE
      JC   RDA_RET
      DJNZ     B,RDA_S1
      SJMP     READ_ONE

RDA_S1:
      LCALL   READ_BYTE
      MOV     @R0,A
      INC R0
      CLR ROM_SDA
      SETB     ROM_SCL
      NOP
      CLR       ROM_SCL
      SETB     ROM_SDA
      DJNZ     B,RDA_S1

READ_ONE:
      LCALL   READ_BYTE
      MOV     @R0,A
      SETB     ROM_SDA
      SETB     ROM_SCL

RDA_RET:
      LCALL   I2C_STOP
      NOP
      NOP
      RET
             ORG 0700H
;子程序6:向PL2000A/PL2101写数据子程序
;(R2) 数据在PL2000A/PL2101中的首地址
;(R0) 写数据在RAM中的地址
;(B)需写数据个数
;(R1) 写命令字
WR_X:
      LCALL   I2C_START
      MOV     A,R1
      LCALL   WRITE_BYTE
      JC   WR_RET
      MOV     A,R2
      LCALL   WRITE_BYTE
      JC   WR_RET
      MOV     A,@R0
      LCALL   WRITE_BYTE
      JC   WR_RET
      INC R0
      INC R2
      LCALL   I2C_STOP
      DJNZ     B, WR_X

WR_RET:
      NOP
      NOP
      RET

;子程序7:向PL2000A/PL2101送起始位子程序
I2C_START:
      CLR       ROM_SCL
      NOP
      SETB     ROM_SDA
      NOP
      SETB     ROM_SCL
      NOP
      CLR ROM_SDA
      RET

;子程序8:向PL2000A/PL2101送停止位子程序
I2C_STOP:
      CLR       ROM_SCL
      NOP
      CLR ROM_SDA
      NOP
      SETB     ROM_SCL
      NOP
      SETB     ROM_SDA
      NOP
      NOP
      CLR       ROM_SCL
      NOP
      CLR       ROM_SDA
      RET

;子程序9:从PL2000A/PL2101读一字节子程序
READ_BYTE:
      MOV     R7,#08H

RD_B1:
      SETB     ROM_SDA
      NOP
      SETB     ROM_SCL
      NOP
      MOV     C,ROM_SDA
      RLC A
      CLR       ROM_SCL
      DJNZ     R7,RD_B1
      RET

;子程序10:向PL2000A/PL2101写一字节子程序
WRITE_BYTE:
      MOV     R7,#08H
WR_B1:
      CLR       ROM_SCL
      RLC       A
      MOV     ROM_SDA,C
      NOP
      SETB     ROM_SCL
      DJNZ     R7,WR_B1
      CLR ROM_SCL
      NOP
      SETB     ROM_SDA
      NOP
      SETB     ROM_SCL
      MOV     C,ROM_SDA
      CLR ROM_SCL
      RET

YS:   MOV  7EH,   #0FFH;延时           ;7E---4EH
              ACALL RDOG
YS1:   MOV  7FH,   #0FFH                ;7F---4FH
YS2:   DJNZ 7FH,   YS2
         DJNZ 7EH,   YS1
         RET

  YSA:  MOV  7FH,   #0FFH
  YSA1:  DJNZ 7FH,   YSA1
         RET

  YSB:   MOV 7EH,   #50H
  YSB1:  DJNZ7EH,   YSB1
         RET
RDOG:    SETB   P1.7
         NOP
         NOP
         NOP
         NOP
         CLR    P1.7
         NOP
         NOP
         NOP
         NOP
         RET
   ORG 07F0H
   DB0FFH,0FFH,0FFH,0FFH,0FFH,09H,0AFH
END


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:454295 发表于 2021-8-26 11:22 | 只看该作者
刚好要做载波通讯的项目,值得参考
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表