這篇部落格記錄下最近乙個星期研究的兩塊板通過乙個口線實現的資料傳輸。
我用的兩塊板上各有乙個微控制器,此處稱為控制板和電源板。兩微控制器各出乙個i/o口,乙個輸入乙個輸出,然後通過規定此i/o口高電平和低電平的持續時間來傳輸「0」和「1」,這種傳輸方式非常普遍,紅外遙控基本原理與這個十分類似,不過紅外遙控是通過a發出紅外光,然後b接受紅外光,根據是否接收到紅外光和他的持續時間來編碼為「0」或「1」,再把不同的「0」「1」組合來規定不同的鍵。
我此處的工程較為簡單,兩塊板通過導線直接連線,然後電源板只需要根據其i/o口的高低電平的持續時間即可判斷出控制板發出的訊號為「0」還是「1」。
此處的**為彙編**,語言可能有讀者會看不懂,我大致會注釋一下:
#include
sbit send_data = p1^1;
unsigned
char bit_step,bit_num,bit_step;
unsigned
char trans_buf1,trans_data1,trans_buf2,trans_data2,bit_trans;
unsigned
char flag0;
void
transmit()
;void
int_init()
void
timer0
() interrupt 1 using 0
}void
transmit()
elseif(
(bit_step <40)
&&(bit_num ==0)
)if((bit_num >0)
&&(bit_num <=8)
)elseif(
(bit_trans ==0)
&&(bit_step >4)
)}else
if(bit_num >=9)
else}}
void
main()
原彙編**為:
transmit:
szincr bit_step ;bit_step變數自增
nop
ld a,bit_num ;傳值
snzb status,z ;判斷bit_num是否為空,為空跳過下一條指令
jp transmit1
transmit0: ; 5ms高電平
ld a,bit_step
hsubia d'40' ;bit_step減40
snzb status,c ;判斷是否溢位,不溢位則跳過下一條指令
jp send1
clr bit_step ;清bit_step
ldia d'1' ;賦值1給acc
ld bit_num,a ;傳值
ld a,trans_buf1
ld trans_data1,a
/*將trans_buf1的值傳給trans_data1 此處的trans_buf1的值是在另一段函式中由flag0賦的,
而flag0中每一位儲存的各設為我微控制器的標誌位,包括了開關標誌位,高檔,中檔,低檔等(產品為塔式風扇),
傳輸flag0即可告訴電源板 這邊控制板的狀態和命令,以便電源板輸出相應的命令,如將高檔位導通,則電機以高檔頻率執行*/
ld a,trans_buf2 ;將trans_buf2的值傳給trans_data2
ld trans_data2,a
jp send0 ;置成低電平,否則傳送的第一位資料的波形一直持續為高
transmit1: ; 16位**
ld a,bit_num
hsubia d'17'
szb status,c ;判斷是否溢位,溢位則跳過下一條
jp stop_transmit
snzb trans_data1,7 ;判斷trans_data1的第7位,為1則跳過,為0不跳過下一條**
jp bit0 ;跳轉到傳送「0」
bit1: ; 「1」:1.5ms脈寬
ld a,bit_step
hsubia d'12' ;12*125us=1500us
snzb status,c ;判斷是否溢位,溢位則不跳過
jp end_transmit ;離開這段**
jp bit_jud ;跳轉到後續處理
bit0: ; 0:0.5ms脈寬
ld a,bit_step
hsubia d'4' ;4*125us = 500us
snzb status,c
jp end_transmit
bit_jud: ;後續處理
clr bit_step ;清掉脈衝計時變數
szincr bit_num ;增加傳送位數變數
noprlcr trans_data2 ;帶進製左移
rlcr trans_data1
/*帶進製左移,此處通過進製標誌位c來傳值,trans_data2最高位左移會傳給進製標誌位c,
trans_data1左移會把c中的值移到最低位*/
ldia b'00000100' ; p2.2為資料傳送口
xorr p2 ;異或,確保波形隨著位數的增加而取反
jp end_transmit
stop_transmit: ; 結束0.5ms低電平
ld a,bit_step
hsubia d'4'
szb status,c
clr bit_num ;結束時清除傳送位數變數
send0:
clrb out_data ;out_data埠輸出低電平
jp end_transmit
send1:
setb out_data ;out_data埠輸出高電平
end_transmit: ;離開函式
微控制器序列通訊工程心得 接收端
這篇部落格記錄下序列通訊的接收端的訊號處理 下面的兩段 分別為c51和組合語言,c51是為了方便理解而寫的,不保證 能工作,請讀者見諒。include sbit remote p1 1 unsigned char tn,remote num unsigned char code1,code2,rem...
微控制器(記憶體篇) 通訊工程專業筆記
儲存器及儲存空間 特殊功能暫存器 高128位元組,sfr 擴充套件 d7d6 d5d4 d3d2 d1d0 cyac f0rs1 rs0ovf1p rs1,rs0 暫存器組選擇位,用來選擇當前的工作暫存器組。f0,f1 使用者標識位0,1 p 奇偶校驗位,如果a暫存器中1的個數字奇數時,p位置1,為...
微控制器(一)51微控制器串列埠接收 傳送通訊
這次做課設整體不太順利,因為學校的開發板真的是 一言難盡 這裡就選擇性的分享一點 方面,有據可循,不那麼玄學的問題。只要開了中斷,一點要寫中斷函式,可以是 void timer0 interrupt 4 可以是這樣,先放乙個空函式,不會有什麼玄學問題 不信,嘿嘿?你試試 這是個串列埠收發暫存器,教科...