按照相應的編碼格式,對串列埠資料進行編碼,傳送至微控制器,微控制器對資料進行解析,寫入或者讀取eeprom,再返回資料至微控制器串列埠。
讀取資料0x03 且只需要傳入3個16進製制數即可,寫入資料0x06,具體不超過255個資料,要想多寫入資料,可以將資料長度的值增加到兩個16進製制數,程式也需要相應改變,對兩個16進製制數運算,整合成乙個16位的資料。
位址資料標誌
資料長度
值0x01
0x03
0x05
0x01.0x02…
代表微控制器的位址,用來區分微控制器
03是讀取資料,06是寫入資料
代表讀取和寫入資料的長度
寫入資料時填寫要寫入資料的值,讀取資料不需要進行編碼
這裡對於eeprom的操作是使用的這裡的庫函式檔案,感謝!.**件
/*
when who remarks
----------------------------------
2011-oct-06 黃長浩 初始版本
*/#ifndef __eeprom_h__
#define __eeprom_h__
#define stc_eeprom_start_addr 0x2000
//stc89c52rc片內eeprom起始位址
unsigned
char
eepromread
(unsigned
int address )
;void
eepromwrite
(unsigned
int address,
unsigned
char writedata )
;void
eepromerasesector
(unsigned
int address )
;#endif
.c檔案/*
when who remarks
----------------------------------
2011-oct-06 黃長浩 初始版本 */
sfr isp_data=
0xe2
;sfr isp_addrh=
0xe3
;sfr isp_addrl=
0xe4
;sfr isp_cmd=
0xe5
;sfr isp_trig=
0xe6
;sfr isp_contr=
0xe7
;//擦除片內eeprom的乙個扇區
//擦除只能以扇區為最小單位進行,沒法只擦除乙個位元組
//乙個扇區是512個位元組
//本函式引數裡面的位址落在哪個扇區,則該扇區內資料都將被擦除
//如果呼叫 eepromerasesector(0x2001),則第一扇區內資料都將被擦除
//擦除成功後,該扇區內各位元組都將變為0xff
void eepromerasesector (
unsigned
int address)
//對stc片內eeprom的指定位址寫入資料(即,位元組程式設計)。
//注意:位元組程式設計是指將eeprom的1寫成1或0,將0寫成0,而無法將0寫成1
//所以,在寫入資料前,一定要用扇區擦除將所有位元組變為0xff
void
eepromwrite
(unsigned
int address,
unsigned
char write_data)
//讀取stc微控制器內部eeprom的乙個位元組
//主要不同的stc微控制器eeprom起始位址不同
unsigned
char
eepromread
(unsigned
int address)
串列埠中斷函式void
ser(
) interrupt 4
flag++;if
(getdata[1]
==0x03
)else
if(getdata[1]
==0x06
)else
if(flag >= a)
}
觸發中斷以後接收資料,根據接收到的資料標誌來判斷上位機要傳遞到微控制器多少個位元組的資料。
串列埠傳送
void
put(uchar *ff,lenth)
}void
delay
(uint i)
引數是陣列和整數,但是不知道為啥,我的板子,再每一幀資料傳送完成時不加乙個小延時的話,會亂碼。
剩下的就是讀和寫eeprom了,根據接收到的資料,做相應的處理即可。
程式
#include
#include
"eeprom.h"
#define uchar unsigned char
#define uint unsigned int
uchar num,a=
0,i,flag=0;
uchar xdata getdata[30]
=;//串列埠接收到的資料快取
uchar xdata datacache[30]
=;//響應解析串列埠資料後,要返回的資料。 根據自己要讀寫的位元組數量來擴大陣列的容量。
uint datalenth;
uchar ok[4]
=;//初始化就會先行寫入的資料。
/* 0x01 0x06 0x00 0x0f 0x66 0x77 ...
51address dataflag datalenth data
*/void
delay
(uint i)
void
put(uchar *ff,lenth)
}void
init()
void
readdata()
}void
w(uchar *cache,len)
}void
main()
if(getdata[1]
==0x06)w
(datacache,datalenth);}
put(datacache,datalenth)
; num=0;
es=1;
}}}void
ser(
) interrupt 4
flag++;if
(getdata[1]
==0x03
)else
if(getdata[1]
==0x06
)else
if(flag >= a)
}
51微控制器串列埠通訊
1 並行通訊 傳送方和接收方用多根資料線連線,多位資料同時傳送。傳輸線多,長距離傳輸時成本大。2 序列通訊 單根資料線傳送資料,逐位傳送。長距離傳送成本低,但控制相對複雜。序列通訊又可分為 非同步序列通訊和同步序列通訊。非同步序列通訊 所謂 非同步 指的是雙方裝置使用各自的時鐘,以字元為單位傳輸,採...
51微控制器 UART串列埠通訊
使用半雙工通訊 使用硬體uart模組和串列埠中斷 include typedef unsigned int uint void configuart uint baud void main void configuart uint baud 中斷型別碼為4,中斷向量的位址 中斷型別碼 8 3 voi...
51微控制器複習 串列埠通訊
計算機通訊是指計算機與外部裝置或計算機與計算機之間的資訊交換。比如電腦和微控制器 通訊有並行通訊和序列通訊兩種方式。在多微機系統以及現代測控系統中資訊的交換多採用序列通訊方式。並行通訊 通常是將資料位元組的各位用多條資料線同時進行傳送 比如這樣說,乙個位元組有八位,我有八根線,一根傳一位,八位同時傳...