找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7503|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

PL2000A/PL2101電力載波芯片中文資料及接收、發(fā)射程序 電路圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105323 發(fā)表于 2016-3-3 18:51 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
本帖最后由 51黑黑黑 于 2016-3-4 00:46 編輯

PL2101芯片中文資料
        直序擴(kuò)頻,半雙工異步調(diào)制解調(diào)器
        二相相移鍵控,120KHz載頻,帶寬15KHz,傳輸速率500 bps
        接收靈敏度:50mVRMS(500bps)
        15位偽碼長度,可編程同步捕獲門限
        上電復(fù)位、電壓監(jiān)測電路及看門狗定時器;
        內(nèi)建高靈敏度放大器及四象限乘法器
        I2C串行通信接口
        可編程實(shí)時鐘(/////星期/)(掉電后電池維護(hù))
        32Bytes SRAM(掉電后電池電池維護(hù))
         5V供電,I/O口帶 4000V ESD 保護(hù);
        發(fā)射功率0.5w,單級傳輸距離≥1000m;
        抗干擾能力:抗20倍功率的噪聲,抗衰減:-80dB
        工業(yè)級溫度標(biāo)準(zhǔn): -40oC ~85oC
        數(shù)字/模擬混合0.5μmCMOS集成電路工藝,SOP28表貼封裝;
PL2101管角定義圖


概述
PL2101 是專為電力線通訊網(wǎng)絡(luò)設(shè)計的半雙工異步調(diào)制解調(diào)器。它僅由單一的5V 電源供電,以及一個外部的接口電路與電力線耦合。PL2101除具備基本的通訊控制功能外,還內(nèi)置了五種常用的功能電路:實(shí)時鐘電路,32Bytes SRAM,電壓監(jiān)測,看門狗定時器及復(fù)位電路,它們通過標(biāo)準(zhǔn)的I2C接口與外部的微處理器相聯(lián),其中實(shí)時鐘與32 Bytes SRAM在主電源掉電的情況下可由3V備用電池供電繼續(xù)保持工作。PL2101 是特別針對中國電力網(wǎng)惡劣的環(huán)境所研制開發(fā)的低壓電力線載波通信芯片。由于采用了直接序列擴(kuò)頻、數(shù)字信號處理、直接數(shù)字頻率合成等新技術(shù),并采用大規(guī)模數(shù)字/模擬混合0.5μmCMOS 工藝制作,所以在抗干擾及抗衰落性能以及國內(nèi)外同類產(chǎn)品性能價格比等方面有著出眾的表現(xiàn)。



管腳描述

1
VFB
內(nèi)部限幅放大器反相輸入端(外接0.1uF電容至GNDA
2
FLTi
混頻信號輸出。內(nèi)部混頻器輸出的信號由此管腳輸出進(jìn)入外部陶瓷濾波器
3
Ref2
內(nèi)部基準(zhǔn)電壓源自舉端(外接10M電阻至VDDA
4
Ref1
內(nèi)部電壓比較器調(diào)整端
5
Dout
內(nèi)部限幅放大器輸出監(jiān)測端
6
WDI
看門狗計數(shù)器清零輸入端。當(dāng)WDI持續(xù)436mS以上無高低電平變化,將導(dǎo)致看門狗計數(shù)器溢出復(fù)位
7
SCL
I2C串行總線時鐘輸入端
8
SDA
I2C串行總線數(shù)據(jù)輸入/輸出端。
9
?/R
半雙工收發(fā)控制輸入端。(高電平收/低電平發(fā))
10
RXD_TXD
半雙工數(shù)據(jù)收發(fā)輸入/輸出端
11
HEAD
數(shù)據(jù)同步端
12
RESET
上電復(fù)位及看門狗計數(shù)器溢出復(fù)位輸出端(高電平有效,持續(xù)時間218mS)。當(dāng)電源電壓低于4.3V時,RESET腳持續(xù)輸出高電平
13/14
XT2o/XT2i
時鐘晶體振蕩器輸入/輸出端。XT2oXT2i分別為片內(nèi)反相放大器的輸入端和輸出端,外接晶體可以組成晶體振蕩器。PL2101主振蕩器所需時鐘頻率為32.768KHz。電路連接如圖所示,為使振蕩器工作更加可靠,電容C1 一般用3pF,C2的取值可在3-6pF之間選擇。
15
VBAT
備用電源輸入端(可接3V-3.6V鋰電池)
16
VDDD
數(shù)字部分電源, 5.0V
17
PSK_OUT
數(shù)字信號發(fā)送輸出端。(驅(qū)動能力大于16mA
18
GNDD
數(shù)字地

19/20
XT1o/XT1i
9.6MHz主晶體振蕩器輸入/輸出端。XT1o、XT1i分別為片內(nèi)反相放大器的輸入端和輸出端,外接晶體可以組成晶體振蕩器。PL2101主振蕩器所需時鐘頻率為 9.6MHz。電路連接如圖所示,為使振蕩器工作更加可靠,電容C1 一般用30pFC2的取值可在30-68pF之間選擇。若使用外部時鐘,可直接從XT1i輸入9.6MHz的時鐘信號。
21
CLK600
600KHz本振輸出端。該管腳輸出600KHz方波信號,作為外接模擬混頻器MC3357/MC3361的一本振信號,它與SIGin輸入的120KHz信號混頻出480KHz的中頻信號以便陶瓷濾波器進(jìn)行帶通濾波(當(dāng)用戶使用內(nèi)部模擬混頻器時,該引腳懸空)
22
GNDA
模擬地
23
SIGin
模擬信號輸入,50mV– 800mV120KHz
24
VDDA
模擬部分電源, 4.8 – 5.0V
25
VFA
外接0.1uF電容至GNDA
26
PFo
電源掉電指示輸出端。PL2101除提供內(nèi)部電源電壓監(jiān)測/復(fù)位電路外還額外提供一個模擬電壓比較器,它的一個輸入端接片內(nèi)的2.5V電壓基準(zhǔn)源, 另一個輸入端即CMP,它的輸出端即PFo
27
CMP
電源掉電監(jiān)測外部比較輸入端
28
FLTo
濾波信號輸入。當(dāng)混頻信號經(jīng)過帶通濾波后由此管腳進(jìn)入內(nèi)部限幅放大器
I2C接口時序:
1.管腳說明
①    SDA串行地址/數(shù)據(jù)輸入/輸出端
   這是一個雙向傳輸端,用于傳輸?shù)刂泛蛿?shù)據(jù)進(jìn)入PL2101,以及從 PL2101 發(fā)送數(shù)據(jù)至外部 MCU 或其它控制器件。對于一般的數(shù)據(jù)傳輸,僅在SCL為低期間SDA才可以變化。在SCL為高期間變化,留給指示 START(開始)和 STOP(停止)條件。
SCL串行時鐘端
   此為時鐘輸入端,用于同步進(jìn)入 PL2101 和從 Pl2101 發(fā)出的數(shù)據(jù)。
2I2C時序描述
   PL2101 支持雙向兩線總線和數(shù)據(jù)傳輸協(xié)議。當(dāng)器件處于傳送數(shù)據(jù)到總線狀態(tài)時,我們稱之為發(fā)送器,當(dāng)器件處于接受數(shù)據(jù)狀態(tài)時則稱為接受器?偩必須由一個主器件控制,主器件可以是MCU 或其它設(shè)備,它產(chǎn)生串行時鐘(SCL),控制總線存取,并且產(chǎn)生開始位(START)和停止位(END),而 PL2101 作為從器件工作。主器件和從器件都能工作于發(fā)送器或者接受器的狀態(tài),但何種方式有效由主器件決定。為明確起見,除非另作說明以后所指的從器件均代表PL2101
①   總線數(shù)據(jù)傳輸開始/停止

l        總線不忙(A) —數(shù)據(jù)和時鐘線保持高
l        開始傳送數(shù)據(jù)(B) —當(dāng)時鐘(SCL)為高,SDA線由高到底的變化將產(chǎn)生起始位(Start Bit),所有的命令必須在產(chǎn)生起始位以后進(jìn)行。

l        停止數(shù)據(jù)傳送 —當(dāng)時鐘(SCL)為高,SDA線由低到高的變化將產(chǎn)生停止位(End Bit),所有的命令必須在產(chǎn)生停止位以前結(jié)束。

①  數(shù)據(jù)有效
l        在起始位后,時鐘信號的高電平周期期間,當(dāng)數(shù)據(jù)線是穩(wěn)定時,數(shù)據(jù)線的狀態(tài)表示數(shù)據(jù)線有效。
l        數(shù)據(jù)線上的數(shù)據(jù)改變必須發(fā)生在時鐘信號為低電平周期期間,每位數(shù)據(jù)需一個時鐘。
l        每次數(shù)據(jù)的傳輸必須在起始位后開始,在停止位前結(jié)束。在開始和停止條件之間數(shù)據(jù)字節(jié)的傳輸數(shù)目由主器件決定。
②   輸出應(yīng)答


l        在每一個字節(jié)被接收后,接受器件必須產(chǎn)生一個確認(rèn)位(ACK)當(dāng)接受器準(zhǔn)備接收下一字節(jié),或否定位(NACK)當(dāng)接受器準(zhǔn)備結(jié)束接收狀態(tài)。
l        主器件必須產(chǎn)生一個與此確認(rèn)位相應(yīng)的額外時鐘脈沖。
l        通過在相對應(yīng)于確認(rèn)位時鐘脈沖的高電平期間拉SDA線為穩(wěn)定的低電平,可產(chǎn)生確認(rèn)位(或置SDA線為穩(wěn)定的高電平,產(chǎn)生否定位)。
l        若不在從器件輸出的最后一個字節(jié)中產(chǎn)生確認(rèn)位,主器件必須發(fā)一個數(shù)據(jù)結(jié)束信號給從器件(即產(chǎn)生否定位)。在這種情況下,從器件會保持?jǐn)?shù)據(jù)線為高電平,使得主器件能產(chǎn)生停止位以便結(jié)束本次總線數(shù)據(jù)傳輸。
從器件代碼
l        產(chǎn)生起始位以后,總線主器件必須對 PL2101 發(fā)送七位器件代碼(1011000)組成的從器件地址,以便選中PL2101 并使得總線上的其它從器件處于非選中狀態(tài)并讓出總線控制權(quán)。
l        從器件地址的第八位 R/W 位的狀態(tài)決定主器件對 PL2101 進(jìn)行何種操作(讀或?qū)懀?/div>PL2101 一直監(jiān)視總線上與它相應(yīng)的從器件地址,如果從器件地址相符并且器件不忙,則PL2101產(chǎn)生一個確認(rèn)位。
操作
器 件 碼
讀/寫


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
地址字節(jié)
l        地址字節(jié)是由主器件發(fā)出的八位地址碼,用來尋址PL2101 內(nèi)部的存儲寄存器。
l        PL2101 內(nèi)部寄存器地址空間的分配如下

地址字節(jié)內(nèi)容
說明
00000000—00011111(00H-1FH)
SRAM
01000000 (40H)
01000001 (41H)
01000010 (42H)
01000011 (43H)
01000100 (44H)
01000101 (45H)
星期
01000110 (46H)
01001000 (48H)
捕獲門限
01001111 (4FH)
寫保護(hù)
  PL2101 內(nèi)部寄存器地址空間從 00H-FFH 共計 256 個字節(jié),除上表所列的以外其余均為無效地址,對無效地址寫入的數(shù)據(jù)將會被丟棄,從無效地址讀出的數(shù)據(jù)沒有實(shí)際意義。為保持程序代碼的兼容性,我們建議不要使用無效地址(因?yàn)樗赡軙?/font>PL210X系列的其它版本芯片使用),以便軟件可以被不加修改的直接移植到PL210X 系列的其它系統(tǒng)中。
寫保護(hù)
l        PL2101 上電復(fù)位后,寫操作是被禁止的( 4FH 字節(jié)的 bit7 被自動清零),整個地址空間內(nèi)除寫保護(hù)字節(jié)可讀/寫尋址外,其余地址只能做讀尋址。
l        若要打開寫保護(hù),需使寫入寫保護(hù)地址字節(jié)的數(shù)據(jù)最高位為1。
3.寫操作
寫單字節(jié)數(shù)據(jù)
l        在主器件發(fā)出起始位以后,主器件發(fā)送七位器件代碼,以及一位低電平的讀寫位到總線上,這指示PL2101 將被尋址,一個地址字節(jié)將跟在第九個時鐘周期由PL2101 產(chǎn)生的確認(rèn)位之后。由主器件發(fā)送的地址字節(jié)會被寫入到 PL2101 的地址指針寄存器。
l        主器件接收來自 PL2101 的另一個確認(rèn)信號以后,將數(shù)據(jù)字節(jié)發(fā)送到總線上,PL2101 接收它并將其寫入到被地址指針尋址的寄存器中。
l        PL2101 再次發(fā)出確認(rèn)信號,然后主器件產(chǎn)生停止位結(jié)束本次操作。
l        任何時候,如果從器件在應(yīng)該發(fā)出確認(rèn)信號時沒有給出確認(rèn)應(yīng)答,則表示PL2101 沒有正確接收到起始位并進(jìn)入命令準(zhǔn)備狀態(tài),這需要主器件重新發(fā)送操作命令。
4.讀操作
①   讀當(dāng)前地址內(nèi)容

l        PL2101 內(nèi)部的地址指針寄存器保持被存取的最后一個數(shù)據(jù)字節(jié)的地址,并在片內(nèi)自動加1。如果以前存。ㄗx或?qū)懖僮骶桑┑牡刂窞閚,下一個讀操作從 n 1 地址中讀出數(shù)據(jù)。但對于地址指針寄存器的加1操作相對與讀/寫時序是不同的,當(dāng)主器件做連續(xù)讀操作時是先讀后加,連續(xù)寫操作時是先加后寫(第一個被寫入的數(shù)據(jù)字節(jié)在寫周期前沒有地址加操作)。
l        當(dāng) PL2101 接收到R/W位為1的情況下,PL2101 發(fā)送一個確認(rèn)位并隨后送出8位數(shù)據(jù)字節(jié),然后主器件不確認(rèn)傳遞(產(chǎn)生 NACK),再發(fā)送停止位結(jié)束本次操作。
讀隨機(jī)地址內(nèi)容

l        這種方式可以讓主器件讀取PL2101 片內(nèi)任意地址的寄存器內(nèi)容,要完成這種方式的讀操作需要首先設(shè)置片內(nèi)地址指針寄存器,這可通過將地址字節(jié)作為寫操作的一部分送給PL2101來完成。
l        發(fā)送了地址字節(jié)后,主器件在確認(rèn)位后面立即產(chǎn)生一個起始位,用這種方式結(jié)束寫操作并開始另一個讀操作。
l        主器件再次發(fā)出器件代碼,并使 R/W 位為“1”,PL2101 將發(fā)出確認(rèn)位并隨后發(fā)送由上次地址寫操作設(shè)置的地址指針尋址的8位數(shù)據(jù)字節(jié),然后主器件不確認(rèn)傳遞(產(chǎn)生NACK),再產(chǎn)生一個停止位結(jié)束本次操作。
讀順序地址的內(nèi)容


l        讀順序地址內(nèi)容的方式與讀隨意地址內(nèi)容的方式以相同的方式啟動,PL2101發(fā)送完第一個數(shù)據(jù)字節(jié)以后,主器件發(fā)出一個確認(rèn)位(ACK),這樣 PL2101 將會發(fā)送下一個順序地址的8位數(shù)據(jù)字節(jié),直至主器件發(fā)出NACK 或停止位。
l        為提供這種讀方式,PL2101    包含的地址指針寄存器在每次操作完成以后自動加1。
l        利用這一特性,可以在一次操作期間連續(xù)順序地讀出整個存儲器的內(nèi)容。但不在有效地址空間內(nèi)的數(shù)據(jù)字節(jié)會被FFH 取代。
片內(nèi)寄存器地址/功能描述:
SRAM
(00H-1FH)共計 32 個字節(jié),在主電源掉電后可由備用電池繼續(xù)供電,保持?jǐn)?shù)據(jù)不丟失。
 實(shí)時鐘:
秒  (40H)   二進(jìn)制(BIN) 表示,0-59 表示零秒至五十九秒。
分  (41H)   二進(jìn)制(BIN) 表示,0-59 表示零分至五十九分。
時  (42H)   二進(jìn)制(BIN) 表示,0-23 表示零點(diǎn)至二十三點(diǎn)。
日  (43H)   二進(jìn)制(BIN) 表示,1-31 表示一號至三十一號。
月  (44H)   二進(jìn)制(BIN) 表示,1-12 表示一月至十二月。
星期 (45H)   二進(jìn)制(BIN) 表示,1-6 表示周一至周六,0 表示星期日。
年  (46H)   二進(jìn)制(BIN) 表示,0-99 表示 2000 年至 2099 年。
特殊寄存器:
捕獲門限   (48H)擴(kuò)頻偽碼同步捕獲門限,上電復(fù)位缺省值為30H。
寫 保 護(hù)  (4FH) 寫保護(hù)字節(jié)的最高位為“0”使能寫保護(hù),禁止對整個地址空間(除寫保護(hù)字節(jié)本身)的寫操作,寫保護(hù)字節(jié)的最高位為“1” 取消寫保護(hù)。其它位保留供功能擴(kuò)展使用。寫保護(hù)字節(jié)上電復(fù)位缺省值為30H。
對PL2000A/PL2101芯片的寫操作步驟
   a R/〒為“0”、發(fā)射態(tài);
   b HEAD對應(yīng)引腳產(chǎn)生中斷時,將發(fā)送數(shù)據(jù)的比特移位到RXD_TXD管腳;
   c 等待下一次HEAD中斷,返回b;
   d 直到發(fā)送數(shù)據(jù)發(fā)送結(jié)束;
   e R/〒為“1”、恢復(fù)接收態(tài);
PL2000A/PL2101芯片的讀操作步驟:
  aR/〒為“1”、接收態(tài);
   b HEAD對應(yīng)引腳產(chǎn)生中斷時,將RXD_TXD管腳比特數(shù)據(jù)移位到C并保存;
   c 等待下一次HEAD中斷,返回b;
   d 直到按規(guī)約接收一次完整幀;
   e 進(jìn)行數(shù)據(jù)處理。
同步接收數(shù)據(jù)過程:
* R_T為“1”、接收態(tài),HEAD發(fā)生下降沿產(chǎn)生中斷后,將RXD_TXD狀態(tài)讀入緩沖字節(jié);
  * 在16Bit的滑動窗口中搜索同步幀,當(dāng)搜索到0x09、0xAF同步幀頭后,表示已經(jīng)進(jìn)入同步狀態(tài);
  * 隨后數(shù)據(jù)為通訊數(shù)據(jù)體,接收數(shù)據(jù)每8Bit 依次還原為一個有效字節(jié)數(shù)據(jù),由規(guī)約進(jìn)
解釋,直至接收完成。


下面介紹PL2000A/PL2101電力載波芯片接收、發(fā)射測試?yán)?電路圖
電力載波電路圖如下:

主程序循環(huán)檢測1AH單元是否=”F”,并等待中斷接收載波數(shù)據(jù),收到數(shù)據(jù)后,RXD_TXD_BYTE=1AH載波收發(fā)標(biāo)志置成”F”,主程序再向主機(jī)(pc)發(fā)送數(shù)據(jù).此例程需要2臺機(jī)器配合使用,這一臺做為載波接收機(jī),另一臺作為載波發(fā)射機(jī),向它發(fā)送數(shù)據(jù),它收到后通過串口發(fā)送給微機(jī),

      R_T BIT          P1.7; R/〒為“0”、發(fā)射態(tài);為“1”、接收態(tài);
            RXD_TXD    BIT  P1.6
            HEAD    BIT    0b2h;INT0
            ROM_SDABIT   0B5H;;;
           ROM_SCLBIT   0B6H;;;
RXD_TXD_BYTEEQU      1AH      ;載波收發(fā)標(biāo)志
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;同步字低位字節(jié)
HEAD_WORD_H EQU      14H
READ_BUF  EQU      15H
T_NOR_BIT  BIT  17H ;發(fā)送普通數(shù)據(jù)標(biāo)志
T_END_BIT  BIT  18H

            ORG      0000H
            AJMP    MAIN
            ORG      0003H
            LJMP     TRANCIEVE;中斷接收載波數(shù)據(jù)
       ORG 001BH
            RETI
       ORG 0023H
       LJMPS         ;接收數(shù)據(jù)轉(zhuǎn)S

            ORG 0030h
MAIN:   MOVSP,#60H    ;設(shè)堆棧指針
            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 ;設(shè)串行口模式1
          MOV 98H,A   ;送串行控制SCON
             MOV 8BH,#0EBH ;給定時器1賦值6M=F3,1200波特率,0.833毫秒/,12M=E8H,9.6=EBH
           MOV 8DH,#0EBH ;給定時器0賦值6M=F3,1200波特率,0.833毫秒/,12M=E8H
       SETB TR1
            SETB     R_T
Q:       MOV A,#0FFH
             MOV R2,#15  ;清數(shù)據(jù)區(qū)
            MOV R0,#21H
  QING:MOV@R0,A
            INC R0
            DJNZ R2,QING
       MOV 30H,#09H
    MOV31H,#0AFH
         MOV A,#55H
             MOV R2,#40  ;清數(shù)據(jù)區(qū)
            MOV R0,#32H
  QING1:MOV@R0,A      ;清數(shù)據(jù)區(qū)
            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  ;發(fā)送、接收數(shù)據(jù)緩沖區(qū)首址
       MOV    BYTE_SEND_CNT,#40 ;接收數(shù)據(jù)長度
          ACALLINIT_PL2000A
       MOV     RXD_TXD_BYTE,#'R'
MAIN1: LCALL   RDOG;喂狗
         MOV     A,RXD_TXD_BYTE; 1AH  ;載波收發(fā)標(biāo)志
        XRL A,#'F';接收完,轉(zhuǎn)換狀態(tài),同時通知主程序接收完畢F=46
        JZ ZBEND;向主機(jī)發(fā)數(shù)據(jù),否則等待接收數(shù)據(jù)
            AJMP    MAIN1
ZBEND :ACALLFPC  ;串口發(fā)送數(shù)據(jù)到主機(jī)
            AJMPMAIN1
INIT_PL2000A: ;檢查PL2000A/PL2101的捕獲門限是否正確,錯誤復(fù)位靠上電置初值
            SETB     RXD_TXD
            SETB     R_T       ; R/〒為“1”、接收態(tài)
            SETB     HEAD; HEAD發(fā)生下降沿產(chǎn)生中斷后,將 RXD_TXD狀態(tài)讀入緩沖字節(jié)
            MOV     R0,#READ_BUF
            MOV    B,#1
            MOV    R1,#0B1H   ;讀命令
            MOV      R2,#48H    ;PL2000A/PL2101的捕捉門限地址
            LCALL RDOG
            ACALL  RD_X    ;讀取1個字節(jié)
            MOV     A,@R0
            CJNE     A,#30H,EER
            SETB     RXD_TXD
            SETB     R_T
        RET

EER:     CLR EA  ;錯誤復(fù)位
      SJMP     EER

            ORG 0100H;中斷接收,R/〒為“1”、接收態(tài);在HEAD對應(yīng)引腳產(chǎn)生中斷時,將RXD_TXD 管腳比特數(shù)據(jù)移位到C并保存;等待下一次HEAD中斷,直到按規(guī)約接收一次完整幀;進(jìn)行數(shù)據(jù)處理。
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是接收,否則發(fā)送
            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         ;當(dāng)RX_TX=0,轉(zhuǎn)發(fā)射
            SJMP     RETURN_TR_RC
RECEIVE_DATA:
       SETB     RXD_TXD
            SETB     R_T
            MOV     C,RXD_TXD              ;R_T狀態(tài)入Cflag
            MOV     A,HEAD_WORD_L     ;讀入同步字低位字節(jié)
            RLCA                                      ;ACCCF右環(huán)移位
            MOV     HEAD_WORD_L,A     ;回寫同步字低位字節(jié)

TB:        JB 20H.0,REC_NOR        ;R_HEAD_BIT=1,幀同步已被接收,進(jìn)入正常接收狀態(tài)
       MOV   A,HEAD_WORD_H
       SUBB A,#9
       JNC TB1
       MOV     A,HEAD_WORD_L
            CJNE  A,#0FFH,RC  ;當(dāng)HEAD_WORD_H=0x09,接收到的高字節(jié)不符合,返回
           INC   HEAD_WORD_H
       SETB P1.0
       SETB P1.3
       AJMP   RETURN_RC
16Bit的滑動窗口中搜索同步幀,當(dāng)搜索到 0x09、0xAF同步幀頭后,表示已經(jīng)進(jìn)入同步狀態(tài);
TB1:      MOV A,HEAD_WORD_L;
       CJNE  A,#0AFH,RETURN_RC
       MOV   HEAD_WORD_H ,#0
            SETB  20H.0                         ;符合同步字節(jié),設(shè)置進(jìn)入正常數(shù)據(jù)接受態(tài)
            CLR p1.0
            MOV   BIT_SEND_CNT,#9    ;設(shè)置比特位計數(shù)器
            RET                                         ;此次接收完成

REC_NOR: DJNZ BIT_SEND_CNT,return_rc;一個字節(jié)未接收完,繼續(xù)接收,否則按字節(jié)處理
            MOV     A,TR_RC_BUF_1              ;讀入接收緩沖區(qū)基址
            MOV     R1,A      ;
            MOV     @R1,HEAD_WORD_L      ;將接收到的數(shù)據(jù)存入相應(yīng)的RAM
       INC     TR_RC_BUF_1
            MOV     A,TR_RC_BUF_1              ;讀入接收緩沖區(qū)基址30H59h-30h=29h=41d
            CJNEA,#59H,RETURN_OTHERS     ;數(shù)據(jù)尚未全部接收完,繼續(xù)接收
            MOV     RXD_TXD_BYTE,#'F'  ;接收完,轉(zhuǎn)換狀態(tài),同時通知主程序接收完畢F=46
            MOVTR_RC_BUF_1,#30H        ;接收完40個數(shù)據(jù),恢復(fù)發(fā)送數(shù)據(jù)緩沖區(qū)起始地址
            CLR 20H.0
       LCALL  INIT_PL2000A     ;初始化PL2000A/PL2101
        SETB P1.0
        RET

RETURN_OTHERS:    MOV   BIT_SEND_CNT,#9    ;設(shè)置比特位計數(shù)器
            MOV A,  HEAD_WORD_L
            XRL A,#55H
            JNZ AAA
       CLR P1.3
AAA:     MOV     HEAD_WORD_L,#0    ;接收完一個字節(jié)后清0
       ACALL YSA
RC:    MOV   HEAD_WORD_H ,#0
            RET
RETURN_RC:             RET

      ORG 0300h
TRANS_BEGIN:  CLR R_T                         ; R/〒為“0”、發(fā)射態(tài);
SETBP1.5                         ;合上繼電器
TRAN1:        MOVA,TR_RC_BUF_1             ;=30H
                   CJNEA,#59H,TRANS_DATA     ;
                   MOV TR_RC_BUF_1,#21H  ;發(fā)送完40個數(shù)據(jù),恢復(fù)發(fā)送數(shù)據(jù)緩沖區(qū)起始地址
TRANS_ERR:
             MOV     RXD_TXD_BYTE,#'R'  ;發(fā)射結(jié)束,置接收標(biāo)志
                          SETB R_T
               SETB P1.0
               SETB P1.3
RETURN_TR:      RET

TRANS_DATA:    DJNZ  BIT_SEND_CNT,TRANS_GOON ;沒發(fā)送完8位繼續(xù)
TR_NOR_1:        MOV     BIT_SEND_CNT,#9     ;每字節(jié)8bit
                          INC TR_RC_BUF_1
                          MOV     A,TR_RC_BUF_1
                          MOV     R0,A
                          MOV     TMP_SEND_BYTE,@R0    ;讀入欲發(fā)送數(shù)據(jù)
                CLR P1.0
                          RET
TRANS_GOON:   MOV A,TMP_SEND_BYTE
                          RLC A
                          MOV     RXD_TXD,C  ;發(fā)送當(dāng)前BIT
                          MOV     TMP_SEND_BYTE,A
                   CLRP1.5                                         ;斷開繼電器
                          RET

   S:    PUSHACC;串口通信程序,可以和微機(jī)通信
            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   ;讀輸入緩沖區(qū)
            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     ;關(guān)閉看門狗
            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;串口發(fā)送數(shù)據(jù)到主機(jī)(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:打開寫保護(hù)子程序
WR_OPEN:
      MOV     40H,#80H
      MOV     R0,#40H
      MOV     R1,#0B0H
      MOV     R2,#4FH
      MOV     B,#1
      LCALL   WR_X
      RET

;;子程序2:關(guān)閉寫保護(hù)子程序
WR_CLOSE:
      MOV     40H,#30H
      MOV     R0,#40H
      MOV     R1,#0B0H
      MOV     R2,#4FH
      MOV     B,#1
      LCALL   WR_X
      RET

;子程序3:讀同步門限子程序,同步門限默認(rèn)值為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中讀多字節(jié)數(shù)據(jù)子程序
;(R2) 數(shù)據(jù)在PL2000A/PL2101中的首地址
;(R0) 讀取數(shù)據(jù)在RAM中的存放地址
;(B) 需讀數(shù)據(jù)個數(shù)
;(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寫數(shù)據(jù)子程序
;(R2) 數(shù)據(jù)在PL2000A/PL2101中的首地址
;(R0) 寫數(shù)據(jù)在RAM中的地址
;(B)需寫數(shù)據(jù)個數(shù)
;(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讀一字節(jié)子程序
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寫一字節(jié)子程序
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 踩

相關(guān)帖子

回復(fù)

使用道具 舉報

沙發(fā)
ID:454295 發(fā)表于 2021-8-26 11:22 | 只看該作者
剛好要做載波通訊的項目,值得參考
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表