本帖最后由 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μm的CMOS集成電路工藝,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
| 時鐘晶體振蕩器輸入/輸出端。XT2o、XT2i分別為片內(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 一般用30pF,C2的取值可在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– 800mV(120KHz)
| 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ù)。
2.I2C時序描述
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
|
⑤ 地址字節(jié)
l 地址字節(jié)是由主器件發(fā)出的八位地址碼,用來尋址PL2101 內(nèi)部的存儲寄存器。 l PL2101 內(nèi)部寄存器地址空間的分配如下
地址字節(jié)內(nèi)容 | | 00000000—00011111(00H-1FH) | | | | | | | | | | | | | | | | | | | | 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芯片的讀操作步驟:
a置R/〒為“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工作方式1,16位定時器
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 ;ACC帶CF右環(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ū)基址30H,59h-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é)8個bit
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
|