第一篇:BACnet+網(wǎng)絡(luò)開發(fā)經(jīng)驗(yàn)總結(jié)
BACNet這個(gè)東西的資料太少了,有用的高效的資料更是少!
資料太少,摸索著實(shí)在太辛苦,這是BACnet項(xiàng)目完成之后的一點(diǎn)開發(fā)經(jīng)驗(yàn),希望對正在摸索的各位同仁,有所幫助。
任務(wù)定位:
BACNet分為系統(tǒng)應(yīng)用和開發(fā)應(yīng)用,購買現(xiàn)有的BACNet設(shè)備組網(wǎng),應(yīng)用,屬于系統(tǒng)應(yīng)用,放松心情,繼續(xù)讀下去,如果是開發(fā)BACNet設(shè)備,這里的一點(diǎn)經(jīng)驗(yàn)就不需耽誤時(shí)間了。
層次定義:
BACNet既然協(xié)議里分了那么多層,我們要做多少呢?
繼續(xù)放松,BACNet的系統(tǒng)應(yīng)用來說,我們只需做到應(yīng)用層+網(wǎng)絡(luò)層就可以了,不要被協(xié)議厚厚的書嚇到,我們用到的,很少。
好了,現(xiàn)在知道我們要干什么了,就是拿到BACNet設(shè)備進(jìn)行網(wǎng)絡(luò)層以上的應(yīng)用。
資料選擇:
BACNet協(xié)議,中英文網(wǎng)絡(luò)上都可以找到,如果網(wǎng)絡(luò)沒搜過到,我的資源里也提供了下載。還推薦一本書,《智能樓宇BACNet原理與應(yīng)用》董春橋?qū)懙模怀霭媪?000冊,如果能搞到,慶幸吧!
知識儲備:
既然是網(wǎng)絡(luò)開發(fā),必備網(wǎng)絡(luò)編程一點(diǎn)小小的經(jīng)驗(yàn),尤其是UDP。
開發(fā)工具:
工欲善其事,必先利其器??磪f(xié)議可以了然于胸,但如果有個(gè)智能點(diǎn)的開發(fā)工具,效率可以乘以10倍,推薦VTS,網(wǎng)絡(luò)上應(yīng)該可以下載到,我的資源里也提供了下載。
軟件架構(gòu):
對于UDP,相信做這個(gè)的不需我多說。
對于BACNet編碼,一句話,NPCI+BCLCI+APDU,唯一難一點(diǎn)的,就只有APDU,不過,有VTS的話,輕松很多。
好了,隨手涂鴉的幾句話,希望對大家有點(diǎn)幫助吧,QQ:404536204,愿與同仁共同進(jìn)步!
如果上面提到的資料比較難找的話,我的資源里也有提供,開發(fā)源碼:
VTS:
中文協(xié)議:
英文協(xié)議:
第二篇:NDIS網(wǎng)絡(luò)防火墻開發(fā)經(jīng)驗(yàn)總結(jié)
NDIS網(wǎng)絡(luò)防火墻開發(fā)實(shí)踐經(jīng)驗(yàn)總結(jié)
一、window軟件防火墻開發(fā)概述:
在window下開發(fā)軟件防火墻可以實(shí)現(xiàn):NDIS數(shù)據(jù)包的截獲、NDIS數(shù)據(jù)包的抓取、NDIS數(shù)據(jù)包的分析、NDIS數(shù)據(jù)包過濾、NDIS 驅(qū)動(dòng)對IP與port的過濾、NDIS中間層驅(qū)動(dòng)安裝技術(shù)等。本文對NDIS開發(fā)基本流程、NDIS開發(fā)注意事項(xiàng)、NDIS安裝過程中出現(xiàn)的各種問題都給予詳細(xì)說明,希望對做NDIS開發(fā)程序員有所幫助。
目前可以實(shí)現(xiàn)軟件防火墻的方法有:
(1)SOCKET端口形式。
(2)NDIS中間驅(qū)動(dòng)IPHOOK形式(xp/2003)。
(3)NDIS中間驅(qū)動(dòng)miniport形式(xp/2003/vista/win7/win2008)。
三種形式從開發(fā)難度到使用范圍都有自身的特點(diǎn)。
(4)SOCKET形式是面向應(yīng)用層開發(fā)的,在代碼及調(diào)試方面相對后兩種簡單的多,但
SOCKET形式不能捕獲所有數(shù)據(jù)包,所以用socket開發(fā)防火墻不是最好的選擇。
(5)后兩種屬于NDIS中間驅(qū)動(dòng)程序開發(fā),是面向驅(qū)動(dòng)層(底層)開發(fā),代碼編寫及調(diào)試較
socket形式上難。(說明:可能大部分采用高級語言程序員根本都沒接觸過驅(qū)動(dòng)開發(fā))但NDIS形式可以捕獲到所有通過網(wǎng)卡的數(shù)據(jù)包(NDIS中間驅(qū)動(dòng)是插入到協(xié)議層與網(wǎng)卡驅(qū)動(dòng)層的中間驅(qū)動(dòng)程序所以數(shù)據(jù)必須通過)。所以本文作者建議采用NDIS開發(fā)軟件網(wǎng)絡(luò)防火墻。
二、DNIS中間驅(qū)動(dòng)開發(fā)注意事項(xiàng):
NDIS中間驅(qū)動(dòng)程序開發(fā)window防火墻要注意window版本問題,因?yàn)槟壳坝脩羰褂玫膚indow版本有window200、window200 server、window xp、window2003、window vistawindow
7、windown 2008 server。你采用的NDIS開發(fā)技術(shù)直接決定是否能在不同window版本上運(yùn)行,這是很關(guān)鍵的問題。目前作者知道的NDIS防火墻技術(shù)有兩種:
2.1.IP_FIREWALL_HOOK(NDIS防火墻鉤子技術(shù)適合XP/2003)。
(1)這種技術(shù)的特點(diǎn):相對miniport的開發(fā)、測試、安裝簡單些。
(2)安裝步驟簡單見四:可以采用注冊表注冊后用net start啟動(dòng),也可以采用:
OpenService、CreateService、StartService等函數(shù)創(chuàng)建服務(wù)形式啟動(dòng)驅(qū)動(dòng)具體用法請查詢msdn幫助)
(3)比較典型的案例: ewall-Hook-Driv此種方法對window vista 之前window 2000之后的操作系統(tǒng)是沒有任何問題。通過作者的開發(fā)測試,對于window vista 之后的產(chǎn)品向window 7 window 2008是不支持的(這點(diǎn)一定要注意)。
這里網(wǎng)上有許多評論有人說還支持,但本文作者給出答案是不支持,理由 msdn(http://msdn.microsoft.com/en-us/library/windows/hardware/ff546487(v=vs.8
5).aspx中有這樣一句話: Note: Starting with Windows Vista, do not implement filter-hook or firewall-hook drivers.Use Windows Filtering Platform Callout Drivers instead.翻譯成中文大概意思:從vista以后不再支持” filter-hook”,請使用…)。
(4)你可以在window 7或window2008測試下你的鉤子防火墻在status=IoCallDriver加入dbprint代碼用 dbgview.exe截獲status的值你會(huì)發(fā)現(xiàn)
在2000、xp、2003下返回0一切正常,在vista、win7、2008下返回0xc0000002-
0xc000000d的任意值。所以鉤子防火墻在vista及以后的版本是不能實(shí)現(xiàn)的。
所以作者建議在vista以后的版本就要用IP HOOK(ipfirewall)浪費(fèi)時(shí)間啦。
2.2.NDIS(miniport –protocol)中間驅(qū)動(dòng)技術(shù)(XP/2003/vista/win7/2008)。
這種形式在2000、xp、2003、vista、win7、2008下都可以現(xiàn)實(shí),但原理和代碼實(shí)現(xiàn)上 要比鉤子復(fù)雜的多,安裝測試也比較麻煩。典型列子是ddk源文件路徑下的passthru項(xiàng) 目。但我開發(fā)這個(gè)項(xiàng)目后,總結(jié)下NDIS開發(fā)其實(shí)并不是很難只是以前對這方面知識缺 乏已。
三、NDIS程序結(jié)構(gòu):
3.1.DriverEntry函數(shù):這個(gè)函數(shù)必須存在,它是window驅(qū)動(dòng)的入口函數(shù)(IPHOOK
與miniport都必須定義的函數(shù),在驅(qū)動(dòng)安裝啟動(dòng)是執(zhí)行)。
3.1.1.這個(gè)函數(shù)有兩個(gè)參數(shù):
IN PDRIVER_OBJECTDriverObject,IN PUNICODE_STRINGRegistryPath。
3.1.2.DriverEntry內(nèi)部常用代碼:
NdisMInitializeWrapper(中間驅(qū)動(dòng)miniport):初始化小端口時(shí)會(huì)用到這連個(gè)參數(shù)。IoCreateDevice(鉤子驅(qū)動(dòng)IPHOOK):建立IO設(shè)備時(shí)會(huì)用到。
3.1.3.建立miniport與protocol端口(中間驅(qū)動(dòng)miniport):
NDIS_PROTOCOL_CHARACTERISTICSPChars;
NDIS_MINIPORT_CHARACTERISTICSMChars;
并分別設(shè)置PChars、MChars一系列屬性參數(shù)指定處理函數(shù)。
這里有幾個(gè)很重要的屬性在開發(fā)防火墻程序中很重要我說明下其它參數(shù)見DDK幫助文檔。
MChars.CancelSendPacketsHandler = 自定義截獲發(fā)送函數(shù);
PChars.ReceivePacketHandler =自定義截獲接受函數(shù)1;
PChars.ReceiveHandler =自定義截獲接受函數(shù)2;
(說明:ReceivePacketHandler與ReceiveHandler區(qū)別:是針對不同型號網(wǎng)卡分別采用這兩個(gè)屬性接受數(shù)據(jù)的建議全部設(shè)置上你自定義的接受函數(shù)。)
3.1.4.如果是IPHOOK驅(qū)動(dòng)需要綁定鉤子(鉤子驅(qū)動(dòng)IPHOOK):
IP_SET_FIREWALL_HOOK_INFO filthook;
filthook.FirewallPtr = 鉤子函數(shù)(處理過濾/抓包函數(shù)的函數(shù));
filthook.Priority = 1;
filthook.Add = true;
應(yīng)用這個(gè)IoBuildDeviceIoControlRequest函數(shù)綁定具體見DDK文檔。
3.2.MajorFunction函數(shù)任務(wù)的指派(IPHOOK與miniport都必須定義的函數(shù)):
DriverEntry函數(shù)是驅(qū)動(dòng)與操作系統(tǒng)的接口函數(shù),MajorFunction函數(shù)是用戶通過
應(yīng)用程序控制驅(qū)動(dòng)的接口。
3.2.1.幾個(gè)常用的函數(shù)(IPHOOK與miniport都必須定義的函數(shù)):
DispatchTable[IRP_MJ_CREATE] = 創(chuàng)建函數(shù);
DispatchTable[IRP_MJ_CLEANUP] =清除函數(shù);
DispatchTable[IRP_MJ_CLOSE] = 關(guān)閉函數(shù);
DispatchTable[IRP_MJ_DEVICE_CONTROL] =用戶IO控制函數(shù)(這個(gè)函數(shù)很重要);
以上三個(gè)函數(shù)可以指向IO控制函數(shù)即:
DispatchTable[IRP_MJ_CREATE] =
DispatchTable[IRP_MJ_CLEANUP] =
DispatchTable[IRP_MJ_CLOSE] =
DispatchTable[IRP_MJ_DEVICE_CONTROL] =用戶IO控制函數(shù)(這個(gè)函數(shù)很重要);
3.2.2.用戶IO控制函數(shù)(DevIoControl):是用戶通過指定IOCTOL碼向NDIS驅(qū)動(dòng)發(fā)出指令要求驅(qū)動(dòng)為自己做事。(具體建立IO控制碼見DDK)
3.2.3.DevIoControl(NDIS是一個(gè)很重要的函數(shù),IPHOOK與miniport都必須定義這個(gè)函數(shù))函數(shù)的定義規(guī)則:
它有兩個(gè)參數(shù):
IN PDEVICE_OBJECTpDeviceObject,IN PIRPpIrp(這個(gè)是主要參數(shù),是驅(qū)動(dòng)程序與用戶的數(shù)據(jù)通信接口)
PIO_STACK_LOCATIONpIrpSp;必須定義本地IO堆棧變量。
pIrpSp = IoGetCurrentIrpStackLocation(pIrp);//返回輸入/輸出堆棧位置
ioBuffer = pIrp->AssociatedIrp.SystemBuffer;//獲得IO操作緩存區(qū)指針
IOCode = pIrpSp->Parameters.DeviceIoControl.IoControlCode;//獲得IO操作碼
下面就根據(jù)用戶發(fā)來的IO操作命令進(jìn)行處理,處理過程如下:
switch(IOCode)
{
Case IO控制碼1:
自定義操作函數(shù)1;
Break;
Case IO控制碼2:
自定義操作函數(shù)2;
Break;
Case IO控制碼3:
自定義操作函數(shù)3;
pIrp->IoStatus.Information = outputBufferLength;//這里要注意
Break;
}
最后加入下面代碼:
if(NtStatus!= STATUS_PENDING)
{ pIrp->IoStatus.Status = NtStatus;IoCompleteRequest(pIrp, IO_NO_INCREMENT);
}
這里我要說下NDIS驅(qū)動(dòng)開發(fā)IOCTRL寫入或讀取數(shù)據(jù)時(shí)要注意兩點(diǎn):
1.上面的pIrp->IoStatus.Information = outputBufferLength句用不好會(huì)出問題的。它是用在向用戶應(yīng)用程序返回?cái)?shù)據(jù)的過程體中,如果這句用不好你應(yīng)用程序可能接受不到NDIS返回給你的數(shù)據(jù)。
2.同時(shí)接受和返回如何做?
其實(shí)讀取和寫入全是在pIrp->AssociatedIrp.SystemBuffer緩存中我們操作的次序是先把用戶發(fā)來的數(shù)據(jù)讀出 把要寫的的數(shù)據(jù)寫入AssociatedIrp.SystemBuffer中。例如:
用戶EXE中IO操作是:
DeviceIoControl(devhdle, IO操作碼,輸入數(shù)據(jù)地址,輸入數(shù)據(jù)長度, 輸出數(shù)據(jù)地址, 輸出數(shù)據(jù)長度,返回值地址, NULL))
NDIS可以這樣讀取返回?cái)?shù)據(jù):
讀取數(shù)據(jù):ibuff=pIrp->AssociatedIrp.SystemBuffer;
返回?cái)?shù)據(jù):oBuffer=pIrp->AssociatedIrp.SystemBuffer;
自定義函數(shù)(oBuffer)向oBuffer寫數(shù)據(jù)。
明白啦嗎?還不明白,我還有個(gè)辦法就是你自己動(dòng)手實(shí)驗(yàn)一萬遍。其實(shí)我已經(jīng)說的很明白啦。
注意:IO操作碼: 這個(gè)碼必須是可讀寫的。至于怎么生產(chǎn)你看DDK。
3.3.驅(qū)動(dòng)卸載函數(shù)(Unload IPHOOK與miniport都必須定義的函數(shù)):這個(gè)函數(shù)只有一個(gè)
參數(shù)IN PDRIVER_OBJECTDriverObject。作用:當(dāng)驅(qū)動(dòng)卸載時(shí)釋放我們在程序中分配的內(nèi)存、miniport端口、IO設(shè)備等。
總結(jié): 從NDIS程序結(jié)構(gòu)中我們不難找出NDIS的miniport與iphook開發(fā)的區(qū)別就是在你
驅(qū)動(dòng)中是否注冊啦miniport_protocol還是綁定啦IP_SET_FIREWALL_HOOK_INFO鉤子,基本結(jié)構(gòu)是一樣。如果你在網(wǎng)上看到NDIS開發(fā)文檔感到很難時(shí)我只能說:”真正了解一門技術(shù)是有一個(gè)過程的,過程中遇到些困難是很正常的,關(guān)鍵是你能否堅(jiān)持到最后!”。
四.安裝NDIS驅(qū)動(dòng)方法:
4.1.IPHOOK驅(qū)動(dòng)安裝:相當(dāng)簡單我這里介紹兩種方法:
4.1.1.手動(dòng)注冊表建立服務(wù)
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESYSTEMControlSet001Services驅(qū)動(dòng)名]
“Type”=dword:0000000
1“Start”=dword:0000000
3“ErrorControl”=dword:00000001
“ImagePath”=system32drivers驅(qū)動(dòng)文件名.sys
“DisplayName”=“驅(qū)動(dòng)名”
“Group”=“Extended Base”
4.1.2.用”NET STRAT 服務(wù)器名”啟動(dòng)/”NET STOP服務(wù)器名”停止服務(wù)
4.1.3.安裝啟動(dòng)后可以用代碼直接使用此服務(wù):
(1)#defineMY_DEVICE_NAME “.驅(qū)動(dòng)名” //驅(qū)動(dòng)名稱
(2)HANDLEhdle=CreateFile(MY_DEVICE_NAME,GENERIC_READ |GENERIC_WRITE, 0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,(HANDLE)INVALID_HANDLE_VALUE);
(3)
4.1.4.對于(4.1.1與4.1.2)前步可以完全用代碼取代手工來完成:
(1)拷貝.SYS文件到system32drivers(具體代碼來完成不是很難)。
(2)定義SC_HANDLE hSCManager;變量。
(3)hSCManager = OpenSCManager(NULL, NULL,SC_MANAGER_ALL_ACCESS);打開服務(wù)控制管理器。
(4)如果(3)成功OpenService(hSCManager, lpszServiceName,SERVICE_ALL_ACCESS);打開服務(wù)。
(5)如果(4)失敗說明驅(qū)動(dòng)服務(wù)沒有安裝開始安裝驅(qū)動(dòng):
hService = CreateService(hSCManager, lpszServiceName, lpszServiceName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, lpszDriverPath, NULL, NULL, NULL, NULL,NULL);
建立服務(wù)。
(6)啟動(dòng)服務(wù)器StartService(hService, 0, NULL);
(7)關(guān)閉SC_HANDLE:CloseServiceHandle(hSCManager);
(8)再使用4.1.3.中代碼訪問驅(qū)動(dòng)。
以上說明啦NDIS鉤子驅(qū)動(dòng)(不含miniport-protocol端口)的安裝使用兩種方法。
4.2.NDIS中間驅(qū)動(dòng)(miniport-protocol)安裝使用方法:
4.2.1只要你掌握其實(shí)也很簡單(你可以參考DDK_SRC下的netcfg例子。其中有一個(gè)很重要的函數(shù)是HrInstallNetComponent你把它看明白安裝基本就差不多啦。
4.2.2.但這里有個(gè)很大開發(fā)安裝程序問題:就是netcfg是用ddk編譯的,我們有時(shí)要把安裝代碼集成到VC編譯器中,有人說include ddk包文件。我這里建議你用DDK編譯成dll 接口函數(shù)。
4.2.2.其次你最好對inf文件各個(gè)鍵值作用了解詳細(xì)。我這里要說明
[SourceDisksFiles]這個(gè)鍵,如果你的inf文件與sys在同一個(gè)路徑下那么
[SourceDisksFiles]鍵值為空。如下:
[SourceDisksFiles]
Passthru.sys=1 改成;Passthru.sys=1前面加分號
如果不這樣在安裝sys時(shí)可能提示你選擇sys路徑問題。
4.2.3.值得特別注意的是:無論你安裝成功或不成功你最好把用到的所有inf文件和sys
文件拷貝到 windows/inf 路徑下??截愡^去絕對沒有壞處,但不拷貝可能
安裝過程會(huì)出現(xiàn)不成功的現(xiàn)象;這點(diǎn)是本人實(shí)踐中總結(jié)出來的。
至此,本人對DDK開發(fā)軟件防火墻的兩種方法全部介紹完畢。真正想實(shí)現(xiàn)防火墻的封包、抓包等一系列功能需要你不斷總結(jié)和摸索才行。以上內(nèi)容都是作者本人通過開發(fā)過程中實(shí)踐中總結(jié)出的經(jīng)驗(yàn)可能有些地方與網(wǎng)上其它文章有很大出處,但上面思路在PC機(jī)上全部實(shí)現(xiàn)過。(本人在開發(fā)過程依據(jù)是DDK幫助文件和PASSTHRU)。在此,謝謝各位網(wǎng)友網(wǎng)上文檔給予了很大的幫助!
2012年11月29日
本文來源: http:///techntxt/20121***705291
第三篇:單片機(jī)開發(fā)經(jīng)驗(yàn)總結(jié)
單片機(jī)開發(fā)經(jīng)驗(yàn)總結(jié) 單片機(jī)開發(fā) 2010-07-20 00:54:19 閱讀77 評論0字號:大中小 訂閱
1、與發(fā)光二極管串聯(lián)的電阻(排阻)的計(jì)算和選取,一般發(fā)光二極管的正常發(fā)光的電流是3~10mA,在發(fā)光二極管上產(chǎn)生的壓降是1.7
V(軌管)R=(5-1.7)/3~10(k)
2、單片機(jī)TTL電平高電平:+5V;低電平:0V。
RS232串口電平高電平:—12V ;低電平:+12V??梢酝ㄟ^MAX232電平轉(zhuǎn)換芯片,轉(zhuǎn)換之間的電平。
3、單片機(jī)上電IO口的寄存器為高電平,其余寄存器為低電平。
4、三極管的開關(guān)作用:在B、E間接正向電壓,E、C是導(dǎo)通的。
5、蜂鳴器:
1)有源蜂鳴器直接接上額定電壓就可以連續(xù)發(fā)聲。
2)無源蜂鳴器和電磁揚(yáng)聲器一樣,需要接在音頻輸出電路中才能發(fā)聲。
3)有源蜂鳴器帶振蕩源,無源的不帶。
4)有源蜂鳴器的理想信號是直流電。
5)無源蜂鳴器的理想信號為方波信號。
方波發(fā)聲函數(shù):void beep()
{fmq=0;
delay 500us();
fmq=1;
delay 500us();
}
6、計(jì)算單片機(jī)指令周期:
指令周期(us)=12 /晶振頻率(Mhz)
選用12M的晶振,一個(gè)指令周期為1us7、89C51的芯片最高支持24M的晶振
目前介紹單片機(jī)應(yīng)用的文章很多,但介紹單片機(jī)開發(fā)工具制作的文章卻較少。由于單片機(jī)是一門實(shí)踐性很強(qiáng)的課程,如果采用傳統(tǒng)的開發(fā)模式,則要購買價(jià)格昂貴的仿真器、編程器等開發(fā)工具來作實(shí)驗(yàn)。其實(shí)由于芯片功能的日益完善,我們可以利用芯片的在系統(tǒng)編程(ISP)功能制作出實(shí)用而低價(jià)的開發(fā)工具。本文旨在幫助DIY愛好者開發(fā)制作出適合自己的開發(fā)工具。
1當(dāng)前常用開發(fā)模式
目前,基本上有兩種開發(fā)模式可供選擇:用仿真器、用編程器。
①用仿真器。優(yōu)點(diǎn):方便,可以設(shè)置斷點(diǎn),可以觀察存儲器及寄存器的內(nèi)容。缺點(diǎn):價(jià)格昂貴,不同類型的單片機(jī)要購買不同的仿真器;仿真器終究不是單片機(jī),有時(shí)代碼在仿真器上能通過,但在單片機(jī)中不能正常工作,反而增加了調(diào)試的難度。
②用編程器。優(yōu)點(diǎn):價(jià)格相對便宜,通常一款編程器可編程多種器件。缺點(diǎn):操作相當(dāng)不便,每次要將芯片在目標(biāo)板與編程器之間轉(zhuǎn)移,并且還要在編譯操作界面與編程器操作界面之間切換,大部分時(shí)間在做簡單的重復(fù)工作。
2新的開發(fā)模式介紹及芯片選擇
本文介紹的開發(fā)工具采用一種新的開發(fā)模式(類似于編程器開發(fā)模式)。由于利用了芯片的在系統(tǒng)編程功能,因此不需要移動(dòng)芯片。在軟件設(shè)計(jì)時(shí)設(shè)計(jì)成:一旦代碼文件被重新編過,即自動(dòng)下載到芯片,并自動(dòng)復(fù)位運(yùn)行,是真正的“所編即所得”。
目前很多單片機(jī)都支持在系統(tǒng)編程。8051系列單片機(jī)支持在系統(tǒng)編程的也很多,但大多數(shù)是支持通過PC機(jī)的串口對單片機(jī)進(jìn)行編程。這樣有四個(gè)不方便的地方:一是項(xiàng)目本身與PC機(jī)串行通信不方便;二是要增加1片MAX232電平轉(zhuǎn)換芯片;三是有的芯片要按特定的步驟進(jìn)入下載模式,編程過程需要手工干預(yù);四是有的芯片需要固件(定制的程序)的支持,如果不小心損壞了固件,則芯片的在系統(tǒng)編程功能也沒有了。
經(jīng)過比較,Atmel公司生產(chǎn)的AT89S8252是一種比較理想的芯片,適合制作開發(fā)工具。此芯片有如下特點(diǎn):
◆ 與8051兼容;
◆ 內(nèi)含8KB可擦寫1000次的程序存儲器,2KB可擦寫超過100 000次的數(shù)據(jù)存儲器及256字節(jié)8位寬內(nèi)部RAM;
◆ 可通過SPI接口在系統(tǒng)串行編程,與8051兼容
◆ 串行編程時(shí)有自動(dòng)擦寫周期,在調(diào)試大程序時(shí)可以分段下載,節(jié)約時(shí)間;
◆ 低電壓下載,無需12V編程電壓。
3AT89S8252串行編程
(1)AT89S8252串行編程模式
當(dāng)芯片的RST引腳置高電平時(shí),所有程序和數(shù)據(jù)存儲器可以通過SPI總線接口[SCK,MOSI(input),MISO(output)]編程。RST變高以后,在編程或擦除操作之前必須首先發(fā)送一條編程允許命令。在串行編程模式下,芯片會(huì)在字節(jié)編程之前自動(dòng)插入一個(gè)擦除周期。因此,除非芯片的代碼保護(hù)位被編程,編程之前不需要執(zhí)行全片擦除命令。SPI接口之SCK時(shí)鐘頻率須低于晶振頻率的1/40。
(2)AT89S8252串行編程步驟
①在XTAL1與XTAL2之間連接一個(gè)3~24MHz的晶振;在VCC與GND之前加上電源電壓,將RST置高,等待10ms。
②發(fā)送串行編程允許命令。
③發(fā)送寫/讀/擦除等命令及數(shù)據(jù),串行數(shù)據(jù)高位在前,低位在后,數(shù)據(jù)在時(shí)鐘的上升沿鎖定。④如果上一步是寫命令,至少等待2.5ms。
⑤需要時(shí)重復(fù)③、④兩步。
⑥將RST置低,芯片開始運(yùn)行。
(3)AT89S8252串行編程命令
AT89S8252串行編程命令如表1所列。
表
(4)AT89S8252串行編程時(shí)序圖
AT89S8252串行編程時(shí)序如圖1所示。
圖
14硬件設(shè)計(jì)
①通過計(jì)算機(jī)并口與單片機(jī)SPI口連接;
②為了保護(hù)計(jì)算機(jī)并口,需要增加1片74HC244作為隔離。
實(shí)用的原理圖如圖2所示。(已經(jīng)過實(shí)踐檢驗(yàn),可放心使用。)
圖
25用VB編程進(jìn)行并口控制
打印端口的基地址一般為0x278、0x378或0x3BC,可以從控制面板中查到。為了方便讀者,表2列出了常用打印端口引腳及寄存器位元的說明。
表
在Windows環(huán)境下最簡單易學(xué)的語言恐怕非VB莫屬,所以我們的開發(fā)工具也選用VB作為編程語言。但由于Windows的保護(hù),VB無法直接讀寫打印端口,因此我們需要另外的程序模塊來實(shí)現(xiàn)打印端口的直接讀寫。在Internet網(wǎng)上可以找到許多此類模塊,并且相當(dāng)多的模塊可以免費(fèi)使用。經(jīng)過試用,筆者推薦使用Winio v2.0。該模塊支持Win9X/NT/2000/XP(http:// Yariv Kaplan),并且?guī)в性敿?xì)的幫助、例子程序及源碼。使用時(shí),將Winio.sys、Winio.dll、Winio.vxd
及Winio.bas四個(gè)文件拷貝到工作目錄下,在VB中直接添加Winio.bas模塊即可。本例中用到的函數(shù)有四個(gè),分別說明如下。
①Initialize():允許端口控制函數(shù)。在使用端口輸入輸出函數(shù)之前調(diào)用一次,成功返回“1”,失敗返回“0”。
②Shutdown():關(guān)閉端口控制函數(shù)。在退出程序時(shí)執(zhí)行一次,成功返回“1”,失敗返回“0”。③GetPortVal(ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte)As Boolean:讀取端口函數(shù),PortAddr 為端口地址, Portval為端口值,bSize為要讀取的字節(jié)數(shù)。讀取成功時(shí)返回“1”,失敗時(shí)返回“0”。
④SetPortVal(ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte)As Boolean:寫端口函數(shù)。PortAddr 為端口地址, Portval為要寫的值,bSize為要寫入的字節(jié)數(shù)。寫入成功返回“1”,失敗返回“0”。
四個(gè)函數(shù)在Winio.bas模塊中的聲明如下:
Declare Function InitializeWinIo Lib “WinIo.dll”()As Boolean
Declare Function ShutdownWinIo Lib “WinIo.dll”()As Boolean
Declare Function GetPortVal Lib “WinIo.dll”(ByVal PortAddr As Integer, ByRef Portval As Long, ByVal bSize As Byte)As Boolean
Declare Function SetPortVal Lib “WinIo.dll”(ByVal PortAddr As Integer, ByVal Portval As Long, ByVal bSize As Byte)As Boolean
6Intel HEX 格式文件
由于一般編譯軟件產(chǎn)生的用于寫入芯片的文件都是Intel HEX格式的文件。Intel HEX文件屬于文本文件,可以用記事本查看。一個(gè)Intel HEX文件的一行稱為一個(gè)記錄,每個(gè)記錄都是由十六進(jìn)制字符組成的,兩個(gè)字符表示一個(gè)字節(jié)的值。Intel HEX文件通常由若干條記錄組成,每個(gè)記錄都具有如下的形式:
:LLAAAATTDD...DDCC
“:”——記錄的起始標(biāo)志;
LL——記錄長度,表示該記錄中的數(shù)據(jù)字節(jié)數(shù);
AAAA——數(shù)據(jù)裝入的首地址(16位);
TT——記錄類型,00表示數(shù)據(jù)記錄,01表示文件結(jié)束;(注意:有的編譯軟件會(huì)產(chǎn)生大于01的記錄類型,本應(yīng)用中對大于01記錄類型的記錄忽略掉即可。)
DD——數(shù)據(jù)值(字節(jié));
CC——校驗(yàn)和。(將其本身與記錄中除起始標(biāo)志外的所有字節(jié)相加應(yīng)為0,不為0則有錯(cuò)。)
VB編程詳細(xì)說明見本刊網(wǎng)絡(luò)補(bǔ)充版(http://.cn)。(由于各子程序的流程都較簡單,所以直接給出源碼,而未畫出流程圖。程序采用由底至頂?shù)脑O(shè)計(jì)方法。)
結(jié)語
雖然上述程序能實(shí)現(xiàn)各種基本的功能,但并不完善,并未考慮各種異常情況,讀者可根據(jù)實(shí)際情況進(jìn)行完善。編程功力較差的朋友可直接到筆者的網(wǎng)站(http: //)下載相對較完善的應(yīng)用程序。如果充分理解了上述程序,那么DIY一個(gè)AVR或PIC單片機(jī)的開發(fā)工具也非難事。在筆者的網(wǎng)站也有制作完成的“MCS51/AVR/PIC三合一下載器資料”供愛好者下載。
由于AT89S8252的價(jià)格還是較貴,所以現(xiàn)在市場上較難買,不過Atmel公司推出的替代
AT89C51/52的AT89S51/52也有在系統(tǒng)編程功能,且價(jià)格便宜。其在系統(tǒng)編程的實(shí)現(xiàn)方法與
AT89S8252類似,對本例部分程序稍作修改即可支持該器件。筆者制作的“MCS51/AVR/PIC三合一下載器”增加了對AT89S51/52的支持。
文章來源:http:///wz_17380.htmPowerd by laogu
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
再來幾點(diǎn):
先從最簡單的AT89C5X(51,52,55等等)說起吧,做這個(gè)的時(shí)間最長,知道的可能多些,書本上的東西這里我不多說,主要談些實(shí)際應(yīng)用中的經(jīng)驗(yàn)與教訓(xùn)。書可以參看北航出的一本專門講AT89系列的,還不錯(cuò),建議大家購買。
AT89C51我認(rèn)為是一個(gè)非常標(biāo)準(zhǔn)的51單片機(jī)了,4個(gè)P口,1個(gè)串口,RAM只有標(biāo)準(zhǔn)的128Byte,F(xiàn)lash也只有4K,功能還算齊全,我就以它為基礎(chǔ),所以開發(fā)過程中遇到的問題吧。
第一個(gè)問題:復(fù)位源的問題
大家最常用的復(fù)位方式就是電阻加電容吧,AT89C51是高電平復(fù)位,這種方式不穩(wěn)定,在產(chǎn)品調(diào)試時(shí)可以使用,因?yàn)樵谡{(diào)試時(shí)我們一般使用了仿真器,而許多仿真器都會(huì)自己輸出復(fù)位信號,而屏蔽掉目標(biāo)板產(chǎn)生的復(fù)位信號,所以調(diào)試時(shí)復(fù)位信號是沒有問題的,我們公司使用的是長沙菊陽的仿真器,用的是比較先進(jìn)的技術(shù),還算可以,仿真AT89系列的芯片一點(diǎn)問題沒有,還很穩(wěn)定的說。這里有一個(gè)非常重要的問題要說下,大家有時(shí)候會(huì)遇到這樣的一個(gè)問題:自己的程序在仿真時(shí)運(yùn)行一點(diǎn)問題也沒有,但燒錄后卻不行了。結(jié)合我的經(jīng)驗(yàn)有兩種原因。一是時(shí)序可能變了,這個(gè)大家都知道,我不多說,還有一個(gè)原因就是復(fù)位信號的問題。具體情況如下:
(1)復(fù)位電路有問題,不能正常產(chǎn)生復(fù)位信號。因?yàn)檎{(diào)試時(shí)仿真器可能給你提供了復(fù)位信號,而脫離仿真器后就沒有了;
(2)看門狗的問題。有些51芯片帶有看門狗復(fù)位功能,如At89c55WD,當(dāng)程序開啟了看門狗后,有時(shí)候程序的初始化內(nèi)容太多了,往往會(huì)產(chǎn)生了復(fù)位信號,特別是用C語言編程功能時(shí),有時(shí)候雖然你明明在程序開始時(shí)某個(gè)地方關(guān)閉了看門狗,但程序依然會(huì)復(fù)位,這是因?yàn)镃語言執(zhí)行效率比匯編低,看似幾行代碼,有時(shí)候要很長時(shí)間的,所以在使用開門狗時(shí)一定要注意這個(gè)問題。而這個(gè)問題在使用仿真器時(shí)容易被忽視,因?yàn)榧词鼓愕某绦蚶锟撮T狗復(fù)位了,但是仿真器(菊陽仿真器可以開啟/屏蔽這個(gè)功能)往往會(huì)屏蔽了這個(gè)復(fù)位信號,所以程序仍然會(huì)正常運(yùn)行的。當(dāng)你把程序燒好后再運(yùn)行時(shí),你卻為發(fā)現(xiàn)剛調(diào)試好的程序卻無法正常運(yùn)行了,那是因?yàn)槟愕某绦蛞恢痹诓煌?fù)位了,注意用示波器觀察RST腳可能看不到復(fù)位信號的,因?yàn)榭撮T狗復(fù)位并不影響RST腳的電平。再一種情況就是芯片內(nèi)部不帶看門狗,但是電路中有CPU監(jiān)控芯片的,它往往是可以提供復(fù)位信號的,而且是多種原因的復(fù)位信號,如果你發(fā)現(xiàn)上述情況,就可以用示波器查看RST腳看是否有電平變化。
所以建議大家做51產(chǎn)品開發(fā)時(shí)盡量使用CPU監(jiān)控芯片,向X5045就是非常好用的,因?yàn)樗€帶有Eprom功能,這在很多場合使用的到的,也可以用MAX708等專用復(fù)位芯片了,既穩(wěn)定又方便。
第四篇:WEB前端開發(fā)經(jīng)驗(yàn)總結(jié)
ASP.NET前端開發(fā)經(jīng)驗(yàn)總結(jié)
通過此次大作業(yè)的設(shè)計(jì)到完成,我負(fù)責(zé)的是web前端的開發(fā),經(jīng)過此次作業(yè)和結(jié)合W3C上的自學(xué),我漸漸有了一些對前端開發(fā)的小小經(jīng)驗(yàn)(僅為個(gè)人意見)。WEB標(biāo)準(zhǔn)是什么?
說是WEB標(biāo)準(zhǔn),不過我這里主要是對HTML5 和 CSS3.0的一些經(jīng)驗(yàn)總結(jié)。因?yàn)閃EB含蓋的內(nèi)容實(shí)在是太多了,“WEB標(biāo)準(zhǔn)”是一系列標(biāo)準(zhǔn)的總稱,包括HTML5.0、HTML4.0、XHTML1.1、CSS3.0、CSS2.1、XML1.0、RSS2.0、ECMAScript1.1、DOM1.0等等。所以這里要跟大家指出來一下,WEB標(biāo)準(zhǔn)不是我們所說的DIV+CSS。剛剛上面提到了――DIV+CSS,這里要說明下,這樣說其實(shí)是不正確的。DIV+CSS準(zhǔn)確的說法(個(gè)人的理解)應(yīng)該是:采用W3C推薦的WEB標(biāo)準(zhǔn)中的HTML5結(jié)合CSS3.0樣式表制作頁面的方法,DIV應(yīng)該指的是HTML標(biāo)簽,而CSS顯示是指的CSS樣式表了。
采用WEB標(biāo)準(zhǔn)開發(fā)的好處
那么W3C為什么會(huì)推薦這樣的頁面制作方法呢?下面我們就簡單的看看采用WEB標(biāo)準(zhǔn)開發(fā)(個(gè)人理解的)相對以前TABLE布局的優(yōu)勢有哪些?
1、節(jié)約運(yùn)營成本
看看我們的WEB標(biāo)準(zhǔn)制作方法是如何做到的?
采用WEB標(biāo)準(zhǔn)制作,我們可以做到表現(xiàn)很形式的分離,我們用XHTML來表現(xiàn)(數(shù)據(jù)),用CSS來控制(頁面元素呈現(xiàn)的)形式。寫的好的頁面,XHTML代碼中基本上都是用戶要看的數(shù)據(jù),還其他修飾性的東西,全部由我們的CSS來控制。這樣一來我們的(XHTML)頁面的體積就大大減小了,這樣你在帶寬上的費(fèi)用就會(huì)大家降低了,這個(gè)怎么降低的,你可以想象一下,YAHOO的首頁小1K,100W個(gè)人一起訪問,那么帶寬節(jié)約了多少?而且可以更充分的利用帶寬。
而我們的CSS控制了,所有的頁面元素的樣式,現(xiàn)在想改網(wǎng)站的整體風(fēng)格,你只需要花幾分鐘修改一下一個(gè)CSS文件,就可以輕松搞定了。維護(hù)的成本也下來了,省了不少錢了吧?還有,你開這個(gè)頁面的速度會(huì)快很多啊,一個(gè)讓你等半分鐘的頁面,除非里面的信息對你很有用,不然我們大家基本都沒有太多的時(shí)間去用來等待的。
2、對用戶友好更友好,且有機(jī)會(huì)獲得更多的用戶 現(xiàn)在來說說用戶友好。首先我想把我們的用戶來分下類。第一類:普通用戶(每個(gè)訪問我們網(wǎng)站的人); 第二類:搜索引擎;
采用WEB標(biāo)準(zhǔn)開發(fā)的頁面,結(jié)構(gòu)清晰,頁面體積小,瀏覽器兼容性好。普通用戶訪問的時(shí)候,頁面打開速度快,而且不管用戶使用那種瀏覽器,都能夠正常訪問(顯示)頁面,且頁面的結(jié)構(gòu)清晰,要找的數(shù)據(jù)可以很方便的瀏覽到。
而對搜索引擎來說,一個(gè)好的采用WEB標(biāo)準(zhǔn)開發(fā)的頁面,都是做過SEO優(yōu)化的,它訪問起來很友好,很容易理解你的頁面中哪里是標(biāo)題(H1~H6標(biāo)簽),哪里是段落(p標(biāo)簽),哪里是段落里要強(qiáng)調(diào)的內(nèi)容(strong標(biāo)簽)等,它可以很容易的分析出來。而一個(gè)SEO好的站點(diǎn),大家都知道,被搜索引擎收錄的機(jī)會(huì)更多,這個(gè)也意味著您的網(wǎng)站會(huì)被更多的普通用戶訪問到,給你的站點(diǎn)帶來更多的用戶。
一個(gè)能幫我們省下大筆費(fèi)用,提高工作效率。同時(shí)又能夠提高頁面瀏覽速度,對用戶友好,甚至能夠不花錢宣傳,就能給你帶來更多用戶的技術(shù)。你說你會(huì)不會(huì)去使用它?這個(gè)也正式我們的W3C推薦使用WEB標(biāo)準(zhǔn)開放網(wǎng)站的原因啊。而這個(gè)技術(shù)也得到了我們廣大用戶的認(rèn)可,所以現(xiàn)在需要學(xué)習(xí)WEB標(biāo)準(zhǔn)啊。合理的布局
前面我提到了一些知識點(diǎn)――“結(jié)構(gòu)清晰、SEO優(yōu)化、頁面體積小、HTML代碼中基本上都是用戶要看的數(shù)據(jù)”。這些東西,都是我做了合理布局的結(jié)果。而且我個(gè)人覺得,我們采用WEB標(biāo)準(zhǔn)制作的一切都是從這個(gè)知識點(diǎn)開始的,所以我這里就先來說這個(gè)話題。
也許有人會(huì)問,怎樣的一個(gè)頁面,才算是合理的布局的呢?這個(gè)問題問題問得好,也是我們大家剛開始學(xué)用WEB標(biāo)準(zhǔn)的問得最多的問題之一,我也曾經(jīng)常被這個(gè)問題所困擾,這里就說說我對合理布局的一些理解。
在開始講合理布局的頁面要達(dá)到的要素前,我們還是用個(gè)實(shí)例來講解會(huì)更直觀些。先來看看這個(gè)圖片:
不錯(cuò),這個(gè)是一個(gè)文章詳細(xì)頁,沒有左右兩欄布局,不過這里我重點(diǎn)要講的是合理的布局。
這是此次實(shí)驗(yàn)中customer(前端的一項(xiàng))部分的完整代碼:
<%@ Page Language=“C#” AutoEventWireup=“true” CodeFile=“Customer.aspx.cs” Inherits=“Customer” %> <%@ Register Src=“Controllers/Bottom.ascx” TagName=“Bottom” TagPrefix=“uc4” %> <%@ Register Src=“Controllers/Top.ascx” TagName=“Top” TagPrefix=“uc1” %> <%@ Register Src=“Controllers/Left.ascx” TagName=“Left” TagPrefix=“uc2” %>
” name=“description”/> ” name=“keywords” />