機電之家資源網(wǎng)
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
用單片機實現(xiàn)溫度遠程顯示
用單片機實現(xiàn)溫度遠程顯示
 更新時間:2010-1-15 16:48:41  點擊數(shù):0
【字體: 字體顏色

摘  要:文章介紹了用AT89S8252單片機的串行接口與智能溫度巡回檢測儀(XJ-08S)通過RS—485總線相互通訊實現(xiàn)熱水溫度遠程顯示的一種低成本解決方案,內(nèi)容涉及RS—485總線通訊、單片機驅(qū)動數(shù)碼管顯示、數(shù)據(jù)轉(zhuǎn)換以及鍵盤處理軟硬件設計等內(nèi)容。

關鍵詞:單片機  RS—485總線  數(shù)碼管顯示  數(shù)據(jù)轉(zhuǎn)換  鍵盤處理

一、前  言
目前檢測溫度一般采用熱電偶或熱敏電阻作為傳感器,這種傳感器至儀表之間一般都要用專用的溫度補償導線,而溫度補償導線價格很貴,并且線路太長也會影響測量精度。在實際應用中往往需要對較遠處(1KM左右)的溫度信號進行監(jiān)視,F(xiàn)有的解決方案有很多,例如:

1、  在現(xiàn)場用智能儀表對溫度信號進行測量,用計算機作上位機與智能儀表進行通訊來實現(xiàn)遠程溫度監(jiān)測(采用這種方案要增加計算機設備及相關計算機軟件)。

2、  NCU+DDC實現(xiàn)遠程溫度監(jiān)測。用兩個DDC,一個安裝在現(xiàn)場測量溫度,另一個安裝在監(jiān)視地,兩個DDC通過NCU進行通訊從而實現(xiàn)遠程溫度監(jiān)測。

但以上方案都存在成本高的問題,有沒有低成本的解決方案呢?其實,在單片機應用日益廣泛的今天,完全可以用單片機以極低的成本來實現(xiàn)遠程溫度監(jiān)測。

二、問題的提出
我單位管理的鍋爐房同時給兩棟建筑物內(nèi)的兩家酒店供應蒸汽,由安裝在兩棟建筑物地下室的熱交換器進行熱交換后產(chǎn)生熱水送給客房。從鍋爐房至兩個熱交換站的距離分別約600米,值班人員要不停地奔波于兩個熱交換站與鍋爐房之間進行設備巡視,檢查熱水溫度是否控制在規(guī)定的范圍,這樣不僅增加了值班人員的勞動強度,同時也使鍋爐房經(jīng)常無人(因每班1人值班)。如果能在鍋爐房顯示兩個熱交換站內(nèi)各熱交換器的熱水溫度,則值班人員僅在熱水溫度異常時才需到各熱交換站檢查設備,這樣便可解決上述問題。我公司曾就此問題找專業(yè)公司作過方案,其報價在人民幣10萬元左右,后因種種原因該項目未實施。經(jīng)過分析,本人發(fā)現(xiàn)可以用單片機+智能儀表以低成本實現(xiàn)溫度遠程顯示,并且經(jīng)過實驗取得了成功,現(xiàn)將設計方案簡述如下:

三、控制要求及解決方案選擇
1、 兩個熱交換站分高低區(qū)共安裝有8個熱交換器,正常水溫在45oC至65oC之間;兩個熱交換站與鍋爐房的距離分別為500米和600米左右。

2、  要求在鍋爐房能以巡回及定點兩種方式顯示8個熱交換器的熱水溫度,巡回方式以3秒為周期輪流更新及顯示各熱交換器熱水溫度。定點方式時每按上鍵或下鍵一次則顯示上或下一個熱交換器熱水溫度,每3秒自動更新數(shù)據(jù)一次。

3、  根據(jù)控制要求選擇單片機+智能儀表的解決方案:用帶通訊接口的智能儀表安裝在現(xiàn)場測量溫度,設計制作一個單片機裝置完成與智能儀表的通訊及數(shù)據(jù)顯示。

四、通訊協(xié)議、智能儀表選擇及其參數(shù)介紹
因熱水溫度信號變化較慢,因而對通信的速度要求不高,對于這種低速率遠距離的通訊選用RS-485總線適宜。RS-485是EIA(美國電子工業(yè)聯(lián)合會)在1983年公布的新的平衡傳輸標準,是工業(yè)界使用最為廣泛的雙向、平衡傳輸線標準接口,它以半雙工方式通信,支持多點連接,傳統(tǒng)驅(qū)動器允許創(chuàng)建多達32個節(jié)點的網(wǎng)絡,且其具有傳輸距離遠(最大傳輸距離為1200M),傳輸速度快(1200M時為100KBPS)等優(yōu)點。其連接方法如下圖所示。


 

 

 

 

 

 
D-發(fā)送器

R-接收器

T-接收/發(fā)送器
 
120Ω
 
120Ω
 

為了滿足現(xiàn)場溫度檢測及與單片機裝置通訊的要求,必須選擇至少有5個溫度檢測點及具有RS—485通訊端口的智能儀表。經(jīng)過對市場上常用的溫度檢測儀進行分析,選擇由重慶川儀十八廠生產(chǎn)的XJ-08S型巡回檢測儀作現(xiàn)場測量儀表。

(一)該儀表主要特點如下:

1、  多量程方式,熱電偶、熱電阻,1-5V標準信號混合輸入,可通過鍵盤進行設置;

2、  最多8個測量通道(能測量8個溫度信號);

3、  采用RS-485通訊標準,可將各通道最新數(shù)據(jù)向上位機傳送。

 

重要的是,該儀表的說明書詳細介紹了與該儀表進行數(shù)據(jù)交換的命令及格式,其通訊協(xié)議也相對較簡單,這給我們用單片機實現(xiàn)溫度遠程顯示降減低了難度(雖然有RS-485端口的儀表很多,但大多沒有通訊命令的詳細說明,給我們用單片機編程增加了難度)。

(二)XJ-08S巡回檢測儀通訊協(xié)議

1、通訊口設置

l         通訊方式:RS-485標準電平

l         同步方式:起停同步方式

l         波特率:9600BPS

l         通訊距離:不大于1200M

l         通訊線:二線

l         數(shù)據(jù)代碼:ASCII碼

l         數(shù)據(jù)格式:每字符10位,1個起始位,8個數(shù)據(jù)位,1個停止位

2、  數(shù)據(jù)傳輸格式

l         地址:2字節(jié)(高字節(jié)在前,低字節(jié)在后);

l         數(shù)據(jù):按地址順序,儀表數(shù)據(jù)傳輸格式為十六進制2字節(jié)定點數(shù);

              2字節(jié)定點數(shù)=低字節(jié)高4位(ASCII碼)+低字節(jié)低4位(ASCII碼)

高字節(jié)高4位(ASCII碼)+高字節(jié)低4位(ASCII碼)

              若數(shù)據(jù)為負數(shù),則采用補碼方式傳輸;

l         在傳輸實時測量值時,傳輸完2字節(jié)定點數(shù)后,緊接著又傳輸2字節(jié)定點數(shù),其中高字節(jié)低4位為小數(shù)點位數(shù)。

例    :(50.0)10 表示為 46  34  30  31  30  30  30  31

                                          低字節(jié)  高字節(jié)              小數(shù)位數(shù)

3、  儀表通訊格式:

@            DE          幀類型           幀數(shù)據(jù)           CRC              CR

l         @           :通訊起始符

l         DE          :儀表設備號(地址)

l         幀類型    :操作命令

l         幀數(shù)據(jù)    :各種操作命令所對應的命令及數(shù)據(jù)

l         CRC       :校驗字節(jié)(除@外CRC之前的其他幾個字節(jié)的異或值)

l         CR          :結(jié)束符(回車符)

              4、應用中用到的命令及數(shù)據(jù)格式:

l         讀儀表全部動態(tài)數(shù)據(jù)命令幀       @ DE RD CRC CR

l         命令回送幀           正確       @DE RD 幀數(shù)據(jù)  CRC CR

                                                 錯誤       @DE * * CRC CR

                     例:讀28號儀表的全部動態(tài)數(shù)據(jù)

                            命令:’@1CRD64’,0D(ASCII碼40 31 43 52 44 36 34 0d)

                     錯誤返回碼    ‘@1C**72’,0D(ASCII碼40 31 43 2A 2A 37 32 0D)

                     正確返回數(shù)據(jù)’@ 1C RD XXXX  XXXX  XXXX  XXXX  XXXX  XXXX

                                                               第0通道           第1通道       第2通道

XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX  XXXX

第3通道              第4通道              第5通道              第6通道

XXXX  XXXX  XX’,0D

第7通道       校驗

五、單片機選擇及硬件電路設計
1、  選用ATMEL公司生產(chǎn)的AT89S8252-24PC單片機,其主要參數(shù)及特點如下:

l         與MCS-51產(chǎn)品兼容(其引腳圖見原理圖)

l         具有8K字節(jié)可擦寫的FLASH內(nèi)部程序存儲器,可擦寫1000次;2K字節(jié)EEPROM,可擦寫100,000次,SPI口(用PC機的并口連接5條線即可通過SPI口下載程序,下載軟件可從網(wǎng)上下載,這樣可節(jié)省購買編程器的費用;)。

注:筆者現(xiàn)已制作成了ISP2000三合一燒寫器,詳情見http://www.mcudiy.com

l         256字節(jié)RAM,32根可編程I/O線,可編程串行口,內(nèi)置看門狗。

與看門狗有關的特殊功能寄存器WMCON 地址= 96H,與看門狗有關的控制位為96h第0、1、5、6、7位,第5、6、7位用于設置看門狗定時時間(具體見第5頁表格),本應用中第5、6、7位均置1,設置看門狗溢出時間為2048ms,第0位為看門狗使能控制位,該位置1將使能看門狗,其第1位為復用位,向第1位寫1將復位看門狗定時器,具體操作如下:

a,使能看門狗,并將其溢出時間設定為2048ms:ORL  96H, #0E1H;

b,看門狗定時器清0:ORL  96H, #2

2、按鍵設計:

為方便使用,設計了三個按鍵,分別為巡回/定點切換鍵、上鍵、下鍵。切換鍵用于巡檢與定點模式的切換,上鍵向上切換通道,下鍵向下切換通道;其中巡檢/定點切換鍵通過外部中斷1以中斷方式工作,中斷程序?qū)⒀不?定點標志取反后直接跳到主程序中巡回/定點標志判斷程序前運行,由判斷程序完成巡回/定點的切換。按鍵信號由單片機P3.3,P3.4,P3.5引腳輸入。

3、顯示電路設計

為方便觀察,選用三個二位共陽級8段數(shù)碼顯示管(TOD5201AE)動態(tài)顯示,一位顯示儀表地址(從A至F),一位顯示通道號(從0至7通道),其余四位用來顯示實時溫度值;用單片機P1口驅(qū)動一片74HC244以吸收電流的方式控制段碼,用單片機P0.0至P0.5引腳驅(qū)動六個PNP三極管(9012)控制位選。

4、電源選用5V/1A市售成品開關電源。

巡回/定點
 

 
儀表

地址
 
通道號
 
實時溫度
 
 
 
巡回/定點
 

 
儀表

地址
 
通道號
 
實時溫度
 
A     B     Gnd
 

 
熱水溫度遠程顯示器
 
A       B  Gnd

120Ω
 
XJ-08S 巡回檢測儀A
 
A       B  Gnd

120Ω
 
XJ-08S 巡回檢測儀B
 
5、 根據(jù)智能儀表通訊協(xié)議的要求,串行口定義為方式1工作,一幀10位:1個起始位、8個數(shù)據(jù)位、一個停止位;用一片75176完成數(shù)據(jù)的發(fā)送與接收,由于RS-485為半雙工,故用單片機P3.2引腳控制發(fā)送與接收的切換;兩個智能儀表處于RS-485總線的兩個端點,為提高可靠性,在RS-485總線的兩個端點上分別并聯(lián)一個120Ω、1/4W終端電阻。

l         系統(tǒng)方框圖如右示:

l         單片機裝置電原理圖見下頁:

 

7     6     5     定時值

0     0     0     16ms

0     0     1     32ms

0     1     0     64ms

0     1     1     128ms

1     0     0     256ms

1     0     1     512ms

1     1     0     1024ms

1     1     1     2048ms
 
看門狗溢出時間表
 
 

 

 

 

 

 

 

 

 

 

 

六、單片機軟件設計說明及程序流程圖
為方便調(diào)試,采用模塊化編程,共分1個主模塊及5個子模塊,各模塊功能說明及流程圖如下(源程序見附錄):

1、主模塊(rand_main.a51)

上電后程序顯示初始化標志并等待3秒,然后進入巡回模式,自動檢測地址為A(10)至F(15)的智能儀表,對在線的儀表及已使用通道以3秒為周期自動巡回讀取實時溫度并送數(shù)碼管顯示,儀表未在線或未用通道則自動跳過;定點模式時根據(jù)上、下按鍵情況自動向前或向后移動一個通道后等待下一次按鍵(向上至最高通道號時跳到上一個儀表的最低在用通道,向下至最低通道號時跳到下一個儀表的最高在用通道);等待期間以3秒為周期讀取當前儀表當前通道實時溫度并送數(shù)碼管顯示,另外,為了區(qū)分巡回、定點工作模式,定點工作模式時最低位數(shù)碼管以約0.5Hz的頻率閃爍顯示。當檢測到巡回/定點切換鍵按下時自動在巡回及定點模式間轉(zhuǎn)換,當檢測到溫度值低于-199.9度時顯示-199.9度。

       主模塊流程圖見下頁:

 

YD_N100=儀表地址

TD_N=通道號
 
Y
 
N
 
開始
 
上電初始化
 
置SP
 
巡回/定點標志=1?
 
#0ah=>yd_n100,#0=>td_n
 
清閃爍、調(diào)用命令發(fā)送模塊
 
接收正確嗎?
 
調(diào)用數(shù)據(jù)轉(zhuǎn)換程序
 
正常嗎?
 
Y
 
N
 
送顯示并延時3秒
 
Td_n+1=>td_n
 
Td_n=8?
 
Y
 
N
 
0=>Td_n
 
N
 
Y
 
Yd_n100+1=>yd_n100
 
Yd_n100=10h?
 
0ah=>yd_n100
 
start
 
Td_n=0?
 
開外部中斷1并置最低位閃爍
 
清軟硬看門狗
 
2秒定時到?
 
下鍵?
 
上鍵?
 
N
 
N
 
N
 
Y
 
Y
 
Y
 
 
 
調(diào)用命令發(fā)送程序
 
調(diào)用數(shù)據(jù)轉(zhuǎn)換程序
 
正確嗎?
 
正確嗎?
 
送顯示
 
Y
 
N
 
N
 
Y
 
7=>td_n
 
Yd_n100-1=>yd_100
 
Yd_n100=9?
 
0fh=>yd_100
 
N
 
N
 
Y
 
Y
 
Td_n-1=>td_n
 
調(diào)用命令發(fā)送程序
 
正確嗎?
 
正確嗎?
 
調(diào)用數(shù)據(jù)轉(zhuǎn)換程序
 
N
 
Y
 
Y
 
N
 
送顯示、置2S定時初值
 
上鍵處理流程與下鍵相似,此處從略。
 
N
 
Y
 

2、數(shù)據(jù)轉(zhuǎn)換子模塊(rand_data.a51)

功能:         本模塊先將ASCII碼轉(zhuǎn)換成BIN碼,然后將BIN碼轉(zhuǎn)換成BCD碼并將數(shù)據(jù)轉(zhuǎn)換成可直接顯示的格式

入口:         a=通道號

出口:  r1=個位,r2=十位,r3=百位,r4=千位(顯示數(shù)據(jù))

a=非0表示該通道未用

注:本子模塊中直接將小數(shù)點信息加到相應位數(shù)據(jù)上,如需在某位顯示小數(shù)點,則將該位數(shù)據(jù)加10H,顯示子模塊根據(jù)此信息顯示小數(shù)點。

各子程序功能介紹:

l           bcd2_bcd1:將r3,r4中的4位bcd碼由低至高分別存入r1,r2,r3,r4中;

l           ascii4_bcd3:將(r0)為首地址的4字節(jié)ascii碼轉(zhuǎn)換成bcd碼并將bcd碼由低至高依次存放在r3,r4,r5中,r3,r4中各存放2位bcd碼,r5中存放一位bcd碼;

l           bin_bcd:將r1,r2中的bin碼轉(zhuǎn)換成bcd碼并將bcd碼由低至高依次存放在r3,r4,r5中,r3,r4中各存放2位bcd碼,r5中存放一位bcd碼;

l           ascii4_bin2:將(r0)為首地址的4字節(jié)ascii碼轉(zhuǎn)換成2位bin碼存放在r1(低字節(jié)),r2(高字節(jié))中;

注:[(r0)指r0中內(nèi)容]

l           ascii_bin:將(r0)為地址的一位ascii碼轉(zhuǎn)換成bin碼存A中。

(高級子程序調(diào)用低級子程序以實現(xiàn)更強的功能,源程序中對各子程序有較詳細的注釋,故此處僅畫出主流程圖)

開始
 
計算通道數(shù)據(jù)首地址
 
調(diào)用數(shù)據(jù)轉(zhuǎn)換程序
 
還原小數(shù)位數(shù)存R6
 
BCD碼超過5位嗎?
 
該通道數(shù)據(jù)為0X0ffff嗎?
 
返回該通道未用信息
 
Y
 
Y
 
N
 
N
 
退出
 
轉(zhuǎn)換成可顯示數(shù)據(jù)存R1-R4
 
有效位前的零消除處理


 
返回數(shù)據(jù)正確信息
 
負數(shù)處理,當數(shù)據(jù)小于-199.9時顯示-199.9
 

3、顯示、軟件看門狗、20ms定時器子程序(rand_disp.a51)

功能:         通過定時器0以1MS為周期動態(tài)顯示緩沖區(qū)中的內(nèi)容;同時完成20ms定時器及軟件看門狗計數(shù);當軟件看門狗定時器溢出時自動復位。

入口:           以disp_buf為首地址依次存放從個位至十萬位待顯示數(shù)據(jù),以disp_wc為首地址(位地址)依次存放個位至千位閃爍控制位信息,為'0'常亮,為'1'閃爍.

T0中斷入口
 
保護現(xiàn)場
 
顯示碼表地址=>dptr
 
Disp_s_c取反
 
Disp_c+1=>disp_c

Disp_c=>R0
 
Disp_s-1=>disp_s,Disp_s=0?
 
Y
 
N
 
個位數(shù)據(jù)及閃爍信息=>A,C
a

閃閃爍
 
N
 
R0=1?
 
Y
 
十位數(shù)據(jù)及閃爍信息=>A,C
a

閃閃爍
 
百位數(shù)據(jù)及閃爍信息=>A,C
a

閃閃爍
 
千位數(shù)據(jù)及閃爍信息=>A,C
a

閃閃爍
 
萬位數(shù)據(jù)=>A
a

閃閃爍
 
十萬位數(shù)據(jù)=>A
a

閃閃爍
 
百萬位數(shù)據(jù)=>A (未用)
a

閃閃爍
 
千萬位數(shù)據(jù)=>A (未用)
a

閃閃爍
 
N
 
R0=2?
 
Y
 
N
 
R0=3?
 
Y
 
N
 
R0=4?
 
Y
 
N
 
R0=5?
 
Y
 
N
 
R0=6?
 
Y
 
N
 
R0=7?
 
Y
 
N
 
R0=8?
 
Y
 

Disp_s:閃爍控制計數(shù)器

Disp_s_c:閃爍控制標志

Disp_c:顯示控制計數(shù)器
 
出口:           wdt中存放軟件看門狗計數(shù)值,time_20ms中存放20ms的計數(shù)值。Wdt溢出時跳至程序存儲器0000H單元

l           輸出處理
a

閃閃爍
 
Disp_c=10?
 
N
 
Y
 
0=>disp_c

20ms計數(shù)處理
 
軟看門狗計數(shù)溢出


 
Y
 
N
 
跳至0000H
a

閃閃爍
 
恢復現(xiàn)場

閃閃爍
 
T0中斷返回
 
將定時器0設定為模式1定時工作,每ms產(chǎn)生一次中斷,即顯示一位,每10ms 6位數(shù)據(jù)輪流顯示1ms;為進一步提高可靠性,在該模塊中設計了軟件看門狗,實現(xiàn)方法見源程序。

模塊流程圖如本頁所示:

 

 

         4、命令發(fā)送及接收控制子模塊(rand_send.a51)

功能:         發(fā)送命令緩沖區(qū)中命令并等待接收完畢,然后檢查接收到的數(shù)據(jù),接收錯誤則重發(fā)命令,達到設定的次數(shù)仍錯則存入錯誤碼后退出.

入口:  A=儀表地址

開始
 
清除命令及接收緩沖區(qū)
 
設置允許錯誤次數(shù)
 
計算儀表命令偏移地址,取出命令及送入命令緩沖區(qū)
 
校驗通過?
 
Y
 
N
 
發(fā)送命令
 
在80ms內(nèi)檢測到正在接收標志?
 
Y
 
N
 
在200ms內(nèi)檢測到接收結(jié)束標志?
 
Y
 
N
 
接收到命令錯信息?
 
Y
 
N
 
返回命令錯信息
 
允許錯誤次數(shù)-1

允許錯誤次數(shù)=0?


 
Y
 
N
 
緩沖區(qū)結(jié)束標志符正確?
 
Y
 
N
 
清正在接收標志
 
返回錯誤信息
 
校驗接收緩沖區(qū)中數(shù)據(jù)
 
返回正確信息
 
退出
 
返回校驗錯信息
 

出口:  A=0 表示接收正確  1 表示校驗錯 '*'表示命令錯  'N'表示無回應

模塊流程圖如下:

 

5、串行接收子模塊(rand_rec.a51)

功能:         串行接收模塊通過中斷自動執(zhí)行,程序檢測到@時置ri_f標志并開始接收,檢測到回車符時清ri_f后退出,接收到的數(shù)據(jù)存放在以rec_buf為首地址的緩沖區(qū)中。

 

 

外部中斷1入口


 
按鍵釋放?
 
N
 
Y
 
延時40ms去抖


 
延時40ms去抖


 
清看門狗定時器
 
關中斷


 
巡回/定點標志取反


 
跳至主程序start處


 
串行中斷入口


 
接收中斷?
 
接收緩沖區(qū)首地址=>rec_buf_z
 
Y
 
RI_F:正在接收標志

REC_BUF_Z:接收指針
 
中斷返回

斷返
 
N
 
RI_F=0?
 
接收到@?
 
1=>RI_F
 
數(shù)據(jù)存入接收緩沖區(qū)
 
接收到0dh?
 
Y
 
Y
 
Y
 
N
 
N
 
N
 
0=>RI_F
 
接收緩沖區(qū)溢出?
 
Y
 
N
 
0=>RI_F
 
保護現(xiàn)場
 
恢復現(xiàn)場
 
清RI
 

串行中斷(rand_rec.a51)流程圖                    巡回/定點鍵中斷(rand_key.a51)流程圖

 

6、巡回/定點轉(zhuǎn)換檢測模塊(rand_key.a51)

功能:         模塊通過外部中斷1自動執(zhí)行,檢測到巡回/定點按鍵后先延時去抖動,并等待按鍵釋放后將巡回/定點標志位取反,然后自動跳至主模塊中start處,并不返回原中斷點。

模塊流程圖如見本頁:

七、調(diào)測及運行情況介紹
1、     調(diào)試步驟:

l           硬件連接:將各芯片插在面包板上并用導線按原理圖連接

l           軟件開發(fā)環(huán)境:Keil uVision2 for Windows ,該軟件的模擬調(diào)試器支持C語言及匯編語言源代碼調(diào)試,其匯編程序支持宏匯編及模塊化編程,使用方便。

l           首先在模擬調(diào)試器中調(diào)試各子模塊,各子模塊調(diào)試正常后再將各子模塊及主模塊全部匯編連接成目標文件,最后將目標代碼下載到單片機中并連接智能儀表進行統(tǒng)調(diào)。

2、     該系統(tǒng)軟件部分除報警子模塊外已全部開發(fā)完成并實際測試通過,測試時用一對長度約1100M的0.5mm2 普通電話線作為單片機裝置與兩個智能儀表的通訊線,經(jīng)過一個多星期的連續(xù)運行觀察,運行可靠穩(wěn)定,完全滿足使用要求。

[注:報警子模塊的開發(fā)及硬件制版工作正在進行中。]

八、結(jié)束語
用單片機+智能儀表構成的溫度遠程顯示系統(tǒng)總造價約人民幣7000元(兩塊智能儀表+溫度傳感器約3500元,通訊電纜約2000元,單片機裝置及施工費用約1500元),與采用其它方案的系統(tǒng)比較造價較低,其硬件及軟件的設計、制作都較簡單,有一定的電子及單片機知識便可完成。同時對該裝置軟件稍加修改即可與其他帶有RS-485通訊端口的儀器儀表通訊(如變頻器、電路傳感器等),實現(xiàn)遠程測量、監(jiān)視及控制。

與發(fā)達國家相比,我國單片機應用的普及程度較低。通過該實例說明,我們完全可以把我們學到的單片機知識應用到實際工作中,直接創(chuàng)造經(jīng)濟效益。

九、參考資料
<<單片機高級語言C51Windows環(huán)境編程與應用>>       電子工業(yè)出版社

              徐愛鈞    彭秀華    編著

       <<ATMEL89系列Flash單片機原理與應用>>                 電子工業(yè)出版社

              余永權    主編

       <<標準集成電路數(shù)據(jù)手冊高速CMOS電路>>                電子工業(yè)出版社

       <<ATMEL  AT89S8252數(shù)據(jù)手冊>>                               ATMEL公司 

              <<XJ-08H(S)巡回檢測儀使用說明書>>                          重慶川儀十八廠

              <<工業(yè)控制計算機組成原理>>                                      清華大學出版社

                     孫廷才 王杰 孫中健 編著

<<電子技術>>2001年11期

 

十、附錄(源程序)
1、主模塊(rand_main.a51)
;------------1--------rand_main.a51----------------

name rand_main

EXTRN CODE(I_T0,send_order,rec_si,ascii_bcd,key)

extrn data (DISP_buf,disp_wc,time_20ms,wdt)

extrn idata (rec_buf)

public TH0_H,TL0_L,START,ri_f,wdt_time,key_work,key_f

prog SEGMENT CODE                          ;定義代碼段

byte_buff segment data                  ;定義字節(jié)數(shù)據(jù)段1

byte_buffI segment idata      ;定義字節(jié)數(shù)據(jù)段2

bit_buff segment data bitaddressable       ;定義位數(shù)據(jù)段

bit_flag segment bit

stack segment idata                ;定義堆棧數(shù)據(jù)段

       rseg stack            ;為堆棧保留20個字節(jié)

         ds 20

       CSEG AT 00H             ;定義絕對代碼段

         USING 0                      ;選擇工作寄存器組第0組

         lJMP rand                    ;復位時程序執(zhí)行執(zhí)行點

         CSEG AT 03H             ;外部中斷0

         RETI

         CSEG AT 0BH             ;定時器0中斷

         lJMP I_T0

         CSEG AT 13H             ;外部中斷1

         ljmp key

         RETI

         CSEG AT 1BH             ;定時器1中斷

         RETI

         CSEG AT 23H             ;串行中斷

         ljmp rec_si

         RSEG BYTE_BUFF

         td_temp: ds 1

         TD_n: DS 1                  ;通道號

         YD_n100: ds 1             ;儀表地址

;----------------------------------

         rseg bit_flag

         key_work:dbit 1

         ri_f: dbit 1           ;串行口正在接收標志

;----主程序

         RSEG prog

;------------------------------符號定義

         key_f equ p3.3

         key_up equ p3.4

         key_down equ p3.5

         wdt_time equ 100                  ;軟件看門狗定時器計數(shù)值

         scon_c equ 01010000b ;串行口設置為10位UART,允許接收

         th1_h equ 0fdh             ;晶振為11.0592M,波特率為9600時初值

         tmod_n equ 21h           ;設置定時器(T1作為波特率發(fā)生器工作在模式2,T0為模式1)

         ie_n equ 82h                          ;設置串行,定時器0中斷

         ip_n equ 12h                          ;設置串行,定時器0中斷為高級中斷

         TH0_H EQU 0FCH

         TL0_L EQU 06BH               ;設定定時器0為1MS中斷初值

;------------------初始化代碼

clear_wdt macro                    ;清硬看門狗宏定義

         orl 96h,#2

         ENDM

rand: ORL 96H,#0E1H                  ;啟動硬件看門狗

         mov p0,#0ffh

         mov r0,#20h

         mov a,#0

start_300:mov @r0,a

         inc r0

         cjne r0,#128,start_300

         setb key_work             ;置巡回/定點標志

         mov p3,#0ffh

         mov p2,#0ffh

         mov disp_wc,#0           ;初始化閃爍控制位

         mov ip,#ip_n                ;設置串行,定時器0中斷為高級中斷

         mov scon,#scon_c

         MOV TMOD,#tmod_n       

         MOV TH0,#TH0_H             ;設定定時器初值

         MOV TL0,#TL0_L

         mov th1,#th1_h

         mov tl1,#th1_h

         mov ie,#ie_n

         mov pcon,#0

         SETB tr1

         SETB TR0

;-------顯示初始化提示

         acall chuhao

         CLEAR_WDT            

start: clr ea

         mov sp,#stack-1

         setb ea

         clr ri_f                 ;清接收中標志

         clr p3.2                ;置75176為接收狀態(tài)

         jnb key_work,db_work

;-----------------------------------

         setb ex1

         mov yd_n100,#0ah

         mov td_n,#0

s_0:   anl disp_wc,#0f0h

         mov wdt,#0                  ;清看門狗定時器

         clear_wdt

         mov a,yd_n100

         lcall send_order

         JNZ s_1

         mov disp_buf+5,yd_n100

         mov a,td_n

         lcall ascii_bcd

         jnz s_2

         mov disp_buf+4,td_n

         acall mov_to_disp

         mov wdt,#0

         clear_wdt

         mov a,#75

         add a,time_20ms

         cjne a,time_20ms,$

         mov wdt,#0

         clear_wdt

         mov a,#75

         add a,time_20ms

         cjne a,time_20ms,$

s_2:   inc td_n

         mov a,td_n

         cjne a,#8,s_0

         mov td_n,#0

s_1:   inc yd_n100

         MOV A,YD_N100

         cjne a,#10h,s_0

         mov yd_n100,#0ah

         ajmp s_0

;-----------------------------

db_work:setb ex1

         orl disp_wc,#01h

d_3:  mov wdt,#0                  ;清看門狗定時器

         clear_wdt

         jb key_up,d_4

         mov a,#2

         add a,time_20ms

         cjne a,time_20ms,$

         jb key_up,d_4

d_5:  mov wdt,#0

         clear_wdt

         jnb key_up,d_5            ;等待向上鍵松開

;------------------------------------------------

d_53:          mov a,td_n

         cjne a,#7,d_50

         mov td_n,#0

d_52:          inc yd_n100

         mov a,yd_n100

         cjne a,#10h,d_51

         mov yd_n100,#0ah

         ajmp d_51

d_50:          inc td_n

d_51:          mov a,yd_n100

         lcall send_order

         JNZ d_52

         mov disp_buf+5,yd_n100

         mov a,td_n

         lcall ascii_bcd

         jnz d_53

         mov disp_buf+4,td_n

         acall mov_to_disp

         mov a,#100                   ;2秒鐘定時設定

         add a,time_20ms

         ajmp d_3

;------------------------------------------------

d_4:  jb key_down,d_10

         mov a,#2

         add a,time_20ms

         cjne a,time_20ms,$

         jb key_down,d_3

d_6:  mov wdt,#0

         clear_wdt

         jnb key_down,d_6       ;等待向下鍵松開

;-----------------------------------------------

d_43:          mov a,td_n

         cjne a,#0,d_40

         mov td_n,#7

d_42:          dec yd_n100

         mov a,yd_n100

         cjne a,#9h,d_41

         mov yd_n100,#0fh

         ajmp d_41

d_40:          dec td_n

d_41:          mov a,yd_n100

         lcall send_order

         JNZ d_42

         mov disp_buf+5,yd_n100

         mov a,td_n

         lcall ascii_bcd

         jnz d_43

         mov disp_buf+4,td_n

         acall mov_to_disp

         mov a,#100                   ;2秒鐘定時設定

         add a,time_20ms

         ajmp d_3

;----------------------------------

d_10:          cjne a,time_20ms,d_30

         mov a,yd_n100

         lcall send_order

         jnz d_30

         mov a,td_n

         lcall ascii_bcd

         jnz d_30

         acall mov_to_disp

mov a,#100

         add a,time_20ms

d_30:ajmp d_3

;----------------------------------

mov_to_disp:mov disp_buf,r1

         mov disp_buf+1,r2

         mov disp_buf+2,r3

         mov disp_buf+3,r4

         ret

chuhao:      mov r1,#1eh                 ;初始化等待提示

         mov r2,#22h

         mov r3,#21h

         mov r4,#1fh

         mov disp_buf+4,#21h

         mov disp_buf+5,#20h

         acall mov_to_disp

         mov a,#75

         add a,time_20ms

         cjne a,time_20ms,$

         mov wdt,#0

         clear_wdt

         mov a,#75

         add a,time_20ms

         cjne a,time_20ms,$

         ret

         end

2、數(shù)據(jù)轉(zhuǎn)換子模塊(rand_data.a51)
;-----------2-------rand_data.a51----------------

name  rand_data

extrn idata (rec_buf)

public ascii_bcd

prog SEGMENT CODE                          ;定義代碼段

byte_buff segment data                  ;定義字節(jié)數(shù)據(jù)段1

byte_buffI segment idata      ;定義字節(jié)數(shù)據(jù)段2

bit_buff segment data bitaddressable       ;定義位尋址區(qū)字節(jié)數(shù)據(jù)段

         rseg prog

         using 0

;-------------------------------------

ASCII_BCD:mov b,#8          ;計算該通道數(shù)據(jù)偏移首地址

         mul ab

         add a,#5

         mov r0,#rec_buf

         add a,r0

         mov b,a

         mov r0,a

         acall ascii4_bcd3

         mov a,b                         ;還原小數(shù)位數(shù)

         add a,#7

         mov r0,a

         acall ascii_bin

         mov r6,a                       ;小數(shù)位數(shù)暫存在R6中

         mov a,r5

         jz asc_oK  

         mov a,dpl  

         cpl a

         clr c

         inc a

         mov dpl,a

         mov a,dph

         cpl a

         addc a,#0

         mov dph,a

         jnz asc_b

asc_0:         mov a,dpl

         dec a

         jnz asc_b

         mov r1,#0fh

         mov r2,#0fh

         mov r3,#0fh

         mov r4,#0fh

         mov a,#0fh

         ajmp asc_out

asc_b:         mov r1,dpl          ;為負數(shù)處理

         mov r2,dph

         acall bin_bcd

         mov a,b                         ;還原小數(shù)位數(shù)

         add a,#7

         mov r0,a

         acall ascii_bin

         mov r6,a                       ;小數(shù)位數(shù)暫存r6

         acall bcd2_bcd1

         mov a,r4

         dec a

         jnz asc_100                  ;數(shù)據(jù)小于-199.9時顯示-199.9

         mov r4,#23h

         ajmp asc_sw

asc_100:mov r4,#23h

         mov r3,#9

         mov r2,#19h

         mov r1,#9

         ajmp asc_sw_1

asc_ok:       acall bcd2_bcd1            ;正常數(shù)據(jù)處理程序

asc_sw:      mov a,r4              ;清除有效位前面的0

         jnz asc_sw_1

         mov r4,#1ch

         mov a,r3

         jnz asc_sw_1

         mov r3,#1ch

asc_sw_1:clr a

asc_out:ret

;------------每字節(jié)兩位BCD碼轉(zhuǎn)換為每字節(jié)一位BCD碼子程序

;入口:r3=個位及十位BCD碼,r4=百位及千位BCD碼,r6=小數(shù)位數(shù)

;出口:r1=個位BCD碼,r2=十位BCD碼,r3=百位BCD碼,r4=千位BCD碼

bcd2_bcd1:mov a,r3              ;個位及十位BCD數(shù)處理

         anl a,#0fh

         mov r1,a

         mov a,r3

         anl a,#0f0h

         swap a

         mov r2,a

         mov a,r4              ;百位及千位BCD數(shù)處理

         anl a,#0fh

         mov r3,a

         mov a,r4

         anl a,#0f0h

         swap a

         mov r4,a

         mov a,r6              ;加入小數(shù)點信息

         jz bcd2_out

         add a,#ar1

         mov r0,a

         mov a,@r0

         add a,#10h

         mov @r0,a

bcd2_out:ret

;---------------ASCii4_BCD3轉(zhuǎn)換子程序

;入口:r0=四字節(jié)ASCII碼首地址

;出口:r5,r4,r3從高至低依次存放BCD碼(r3,r4各存2位,r5存1位)

ascii4_bcd3:acall ascii4_bin2

         mov dpl,r1

         mov dph,r2

         acall bin_bcd

         ret

;---------------BIN_BCD轉(zhuǎn)換子程序

;入口:r1=BIN低字節(jié),r2=BIN高字節(jié) 共2字節(jié)

;出口:r3=低2位BCD碼,r4=高2位BCD碼,r5=可能的最高位BCD碼    

bin_bcd:PUSH ACC

         PUSH PSW

         mov r3,#0  ;BCD單元清0

         mov r4,#0

         mov r5,#0

         mov r6,#16          ;設置二進制數(shù)位數(shù)

         clr c

bin_0:         mov a,r1

         rlc a

         mov r1,a

         mov a,r2

         rlc a

         mov r2,a

         mov r0,#ar3

         mov r7,#3            ;設置BCD字節(jié)數(shù)

bin_1:         mov a,@r0

         addc a,@r0

         da a

         mov @r0,a

         inc r0

         djnz r7,bin_1

         djnz r6,bin_0

         POP PSW

         POP ACC

         ret

;---------------ASCII4_BIN2轉(zhuǎn)換子程序

;入口:R0=ASCII碼首地址(共四字節(jié)ASCII碼)

;出口:r1=BIN碼低字節(jié),R2=BIN碼高字節(jié)

ascii4_bin2:PUSH ACC

         acall ascii_bin

         anl a,#0fh

         swap a

         mov r1,a

         inc r0

         acall ascii_bin

         anl a,#0fh

         orl ar1,a

         inc r0

         acall ascii_bin

         anl a,#0fh

         swap a

         mov r2,a

         inc r0

         acall ascii_bin

         anl a,#0fh

         orl ar2,a

         POP ACC

         ret

;---------------ASCII_BIN轉(zhuǎn)換子程序

;入口:R0=ASCII地址

;出口:A=BIN碼

ascii_bin:mov a,@r0

         clr c

         subb a,#3ah

         jnc ascii_0

         add a,#7

ascii_0:add a,#3

         ret

         end

3、顯示、軟件看門狗及20ms定時器子模塊(rand_disp.a51)
;--------3--------rand_disp.a51-------------------------

name  rand_disp

         extrn number(TH0_H,TL0_L,wdt_time)

         PUBLIC I_T0,disp_buf,disp_wc,time_20ms,wdt

  prog SEGMENT CODE            ;定義代碼段

  BYTE_BUFF segment data        ;定義字節(jié)數(shù)據(jù)段1

  byte_buffI segment idata ;定義字節(jié)數(shù)據(jù)段2

  bit_buff segment data bitaddressable            ;定義位數(shù)據(jù)段

 

          RSEG BYTE_BUFF

         wdt: ds 1

         time_s_c: ds 1

         time_20ms: ds 1

         DISP_C: ds 11             ;顯示位

       disp_buf data disp_c+1         ;個位緩沖區(qū),此個位并非真正的個位,指最右一位,以下類推

        disp_2 data disp_c+2   ;十個位緩沖區(qū)

         disp_3 data disp_c+3          ;百位緩沖區(qū)

         disp_4 data disp_c+4         ;千位緩沖區(qū)

         disp_5 data disp_c+5   ;通道位緩沖區(qū)

         disp_6 data disp_c+6 ;地址位緩沖區(qū)  

         disp_7 data disp_c+7   ;無

         disp_8 data disp_c+8   ;無

         disp_s data disp_c+9   ;閃爍計數(shù)器

        

         rseg bit_buff

         disp_wc: ds 1

         disp_c_1 bit disp_wc.0         ;個位閃爍標志位 1-閃爍

         disp_c_2 bit disp_wc.1         ;十位閃爍標志位

         disp_c_3 bit disp_wc.2         ;百位閃爍標志位       

         disp_c_4 bit disp_wc.3         ;千位閃爍標志位

         disp_s_c bit disp_wc.4        ;閃爍控制位       1-閃爍

                           

         RSEG PROG     

         using 0      

         dsb equ p3.4

         cr_not equ p3.5

         cp equ p3.6

I_T0:          push acc

         push ar0

         push dph

         push dpl

         push psw

         mov th0,#th0_h

         mov tl0,#tl0_l

         mov dptr,#tab

;---------------------------------------------   

         djnz disp_s,d_20

         cpl disp_s_c

;---------------------------------------------

d_20:          INC DISP_C

         MOV R0,DISP_C

         CJNE R0,#1,DISP2     ;r0=1顯示個位

         mov c,disp_c_1

         mov A,disp_buf

         mov p1,#0FFH

         mov p0,#0feh

         ajmp d_10

DISP2:       CJNE R0,#2,DISP3     ;顯示十位

         setb p0.0

         mov c,disp_c_2

         mov A,disp_2

         mov p1,#0FFH

         mov p0,#0fdh

         ajmp d_10

DISP3:       CJNE R0,#3,DISP4     ;顯示百位

         mov c,disp_c_3

         mov A,disp_3

         mov p1,#0FFH

         mov p0,#0fbh

         ajmp d_10

DISP4:       CJNE R0,#4,DISP5     ;顯示千位

         mov c,disp_c_4

         mov A,disp_4

         mov p1,#0FFH

         mov p0,#0f7h

         ajmp d_10

DISP5:       CJNE R0,#5,DISP6     ;顯示通道號

         mov A,disp_5

         mov p1,#0FFH

         mov p0,#0efh

         ajmp d_10

DISP6:  CJNE R0,#6,DISP7        ;顯示儀表地址

         mov A,disp_6

         mov p1,#0FFH

         mov p0,#0dfh

         ajmp d_10

DISP7:       CJNE R0,#7,DISP8     ;無

         mov A,disp_7

         mov p1,#0FFH

         mov p0,#0bfh

         ajmp d_10

DISP8:       CJNE R0,#8,d_10                 ;無

         mov A,disp_8

         mov p1,#0FFH

         mov p0,#7fh

d_10:          acall disp_w

         mov r0,disp_c

         cjne r0,#10,d_12           ;若disp_c=10則清disp_c

         mov disp_c,#0

         inc time_s_c                 ;MS,S計數(shù)處理程序

         mov a,time_s_c

         cjne a,#2,d_12

         mov time_s_c,#0

         inc time_20ms

         inc wdt                         ;軟看門狗處理程序

         mov a,wdt

         cjne a,#wdt_time,d_12

         mov wdt,#0

         mov a,#0

         push acc

         push acc

         reti

;-----------------------

d_12:          pop psw

         pop dpl

         pop dph

         pop ar0

         pop acc

         RETI

disp_w:      jnc d_0

         jnb disp_s_c,d_0

         mov p1,#0FFH

         ajmp d_1

d_0:  movc a,@a+dptr

         cpl a

         mov p1,a

D_1: ret

;---------------------------------------------------------

TAB:          DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

      ;  0   1    2   3   4   5   6   7   8   9

         db 77H,7CH,39H,5EH,79H,71H

         ;   A   B   C   D   E   F

 

         DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH

         ;   0.   1.  2.   3.   4.   5.   6.   7.   8.  9.

         db 40H,80H,00H,37h,5ch,1ch,58h,74h,0dch,46h

         ;   -   .   空     n   o     u   c    h   a   -1

         ;   1a  1b  1c  1d  1e 1f  20  21  22       23

                  END

4、命令發(fā)送及接收控制子模塊(rand_send.a51)
;----------4--------rand_send.a51----------------

name send_order

extrn idata (rec_buf)     ;rec_buff    接收緩沖區(qū)

extrn data (time_20ms)

extrn bit (ri_f)              ;ri_f            正在接收標志

PUBLIC send_order

prog SEGMENT CODE                                   ;定義代碼段

byte_buff segment data                            ;定義字節(jié)數(shù)據(jù)段1

byte_buffI segment idata               ;定義字節(jié)數(shù)據(jù)段2

bit_buff segment data bitaddressable       ;定義位數(shù)據(jù)段

         rseg byte_buff

         send_n:ds 1

         order_buf:ds 10

         rseg prog

         dd_c equ 4           ;等待回應20m數(shù)

         cw_n equ 7                   ;設置允許錯誤次數(shù)

         using 0

;---------------------清命令緩沖區(qū)

send_order:

         mov dpl,#8

         mov r0,#order_buf

send_0:      mov @r0,#0

         inc r0

         djnz dpl,send_0

         MOV DPL,#72            ;清接收緩沖區(qū)

         MOV R0,#REC_BUF

SEND_A:  MOV @R0,#0

         INC R0

         DJNZ DPL,SEND_A          

;----------------------發(fā)送命令控制程序  

         mov send_n,#cw_n      ;設置允許錯誤次數(shù)

         mov b,#10

         clr c

         subb a,b

         mov b,#8                                                 

         mul ab                          

         mov dptr,#a_order

         mov r0,#order_buf-1

         mov r1,#10

start_mov:inc r0

         push acc

         movc a,@a+dptr

         mov @r0,a

         inc dptr

         pop acc

         cjne @r0,#0dh,start_mov

;----------------------發(fā)送命令子程序

send_start:setb p3.2              ;切換75176至發(fā)送狀態(tài)

         mov r0,#order_buf-1

send_10:inc r0    

         mov sbuf,@r0

         jnb ti,$                 ;等待一幀數(shù)據(jù)發(fā)完

         CLR TI

            cjne @r0,#0dh,send_10         ;檢測到結(jié)束標志退出

;------------------------檢測接收標志

         mov r0,#30                   ;延時60uS等待停止位發(fā)送完畢

         djnz r0,$             

         setb es

         clr p3.2                ;切換75176至接收狀態(tài)

         mov a,#dd_c                 ;延時檢測儀表有無回應

         add a,time_20ms

send_21:jb ri_f,send_20

         cjne a,time_20ms,send_21

         mov a,#'N'

         ajmp send_23

;-------------------------檢測接收是否正確

send_20:mov a,#10                ;延時200MS等待接收結(jié)束

         add a,time_20ms

send_28:jnb ri_f,send_29

         cjne a,time_20ms,send_28

         clr ri_f                          ;200MS仍未結(jié)束清接收中標志

send_29:mov r0,#rec_buf+4

         cjne @r0,#'*',send_22

         mov a,#'*'

send_23:djnz send_n,send_start     ;達到允許錯誤次數(shù)退出

         ajmp send_out

send_22:mov r0,#rec_buf+71

         cjne @r0,#0dh,send_23         ;接收緩沖區(qū)第72字節(jié)不為回車符轉(zhuǎn)出錯處理

;------------------------------還原校驗碼

         mov r0,#rec_buf+70

         mov a,@r0

         clr c

         subb a,#3ah

         jnc SEND_25

         add a,#7

send_25:add a,#3

         mov @r0,a

         dec r0

         mov a,@r0

         clr , c

         subb a,#3ah

         jnc SEND_26

         add a,#7

send_26:ADD A,#3

         swap a

         inc r0

         xchd a,@r0

         dec r0

         xch a,@r0

         inc r0

         mov @r0,#0dh             ;檢驗碼后加回車符

;------------------------------檢驗接收緩沖區(qū)數(shù)據(jù)      

         mov r0,#rec_buf+1

         mov a,@r0

         inc r0

send_24:xrl a,@r0

         inc r0

         cjne @r0,#0dh,send_24

         cjne a,#0,send_200       ;接收校驗未通過轉(zhuǎn)出錯處理

send_out:clr es

         ret

send_200:mov a,#1

         ajmp send_23     

;----------------------------------------------------

a_order: db '@0ARD67',0DH       ;讀A表全部動態(tài)數(shù)據(jù)命令

b_order: db '@0BRD64',0DH       ;讀B表全部動態(tài)數(shù)據(jù)命令

c_order: db '@0CRD65',0DH        ;讀c表全部動態(tài)數(shù)據(jù)命令

d_order: db '@0DRD62',0DH       ;讀d表全部動態(tài)數(shù)據(jù)命令

e_order: db '@0ERD63',0DH        ;讀e表全部動態(tài)數(shù)據(jù)命令

f_order: db '@0FRD60',0DH        ;讀f表全部動態(tài)數(shù)據(jù)命令

         END

5、串行接收子模塊(rand_rec.a51)
;-------5----------rand_rec.a51

name rec_si

extrn bit (ri_f)

public rec_si,rec_buf

prog SEGMENT CODE                          ;定義代碼段

byte_buff segment data                            ;定義字節(jié)數(shù)據(jù)段1

byte_buffI segment idata               ;定義字節(jié)數(shù)據(jù)段2

bit_buff segment data bitaddressable       ;定義位數(shù)據(jù)段

         rseg byte_buff

         rec_buf_z: ds 1 ;接收區(qū)指針

         rec_err: ds 1                  ;接收緩沖區(qū)溢出計數(shù)器

         rseg byte_buffi

         rec_buf: ds 75

         rseg prog

         using 0

rec_si:        PUSH PSW

         push ar0

         push acc

         JNB RI,REC_OUT               ;為發(fā)送中斷跳出

         clr ri

         jb ri_f,rec_0                 

         mov a,sbuf

         cjne a,#'@',rec_out       ;無效命令過濾處理

         setb ri_f                                 ;置接收中標志

         mov rec_buf_z,#rec_buf        ;接收緩沖區(qū)首地址給接收指針

         mov rec_err,#73           ;設置最大接收字節(jié)數(shù)

         ajmp rec_1

rec_0:         mov a,sbuf

         cjne a,#0dh,rec_1

         clr ri_f

rec_1:         mov r0,rec_buf_z

         mov @r0,a

         inc rec_buf_z

         djnz rec_err,rec_out     ;接收溢出清接收標志

         clr ri_f

rec_out:pop acc

         pop ar0

         POP PSW

         reti

         end

6、巡回/定點轉(zhuǎn)換檢測子模塊(rand_key.a51)
;-----------6----rand_key.a51

name key

EXTRN CODE(START)

extrn bit(key_work,key_f)

EXTRN DATA(DISP_buf,disp_wc,time_20ms,wdt)

PUBLIC KEY

prog SEGMENT CODE                ;定義代碼段

 

         RSEG PROG

;-------------------------------------

KEY: mov a,#2

         add a,time_20ms

         cjne a,time_20ms,$

key_1:        mov wdt,#0

         orl 96h,#0e1h

         jnb key_f,key_1

         mov a,#2

         add a,time_20ms

         cjne a,time_20ms,$

         jnb key_f,key_1

         clr ea

         clr ex1

         cpl key_work

;--------------------------------------

key_out:mov dptr,#start

         push dpl

         push dph

         reti

         end

 

7、            rand_js.hex


:100026007582087823760008D582FA75824878406A

:10003600760008D582FA75220775F00AC395F07521

:10004600F008A49000D07822790A08C0E093F6A3BD

:10005600D0E0B60DF5D2B278220886993099FDC265

:1000660099B60DF5781ED8FED2ACC2B27404252F0F

:10007600200907B52FFA744E0193740A252F30090B

:1000860005B52FFAC2097844B62A07742AD522C5BF

:1000960001C97887B60DF67886E6C3943A500224ED

:1000A600072403F618E6C3943A500224072403C42F

:1000B60008D618C608760D7841E6086608B60DFB20

:1000C600B40003C2AC22740101934030415244365D

:1000D600370D403042524436340D40304352443698

:1000E600350D403044524436320D40304552443688

:0A00F600330D403046524436300D01

:10010000C0E0C000C083C082C0D0758CFC758A6B13

:100110009001CDD53902B2040530A830B8010CA247

:1001200000E5317590FF7580FE218CB8020ED280FB

:10013000A201E5327590FF7580FD218CB8030CA2F9

:1001400002E5337590FF7580FB218CB8040CA20387

:10015000E5347590FF7580F7218CB8050AE5357593

:1001600090FF7580EF218CB8060AE5367590FF7513

:1001700080DF218CB8070AE5377590FF7580BF21B5

:100180008CB80808E5387590FF75807F31BEA830BF

:10019000B80A20753000052EE52EB40216752E0023

:1001A000052F052DE52DB4640A752D007400C0E0FF

:1001B000C0E032D0D0D082D083D000D0E03250081E

:1001C0003004057590FF21CC93F4F590223F065B37

:1001D0004F666D7D077F6F777C395E7971BF86DBF7

:1001E000CFE6EDFD87FFEF408000375C1C5874DCE4

:0101F00046C8

:1001F1007402252FB52FFD752D004396E130B3F71D

:100201007402252FB52FFD30B3EDC2AFC2AAB208DB

:08021100900257C082C0833245

:03000000020219E0

:0100030032CA

:03000B00020100EF

:040013000201F132C3

:01001B0032B2

:0300230002039E37

:100219004396E17580FF78207400F608B880FBD218

:100229000875B0FF75A0FF75200075B81275985054

:10023900758921758CFC758A6B758DFD758BFD75BE

:10024900A882758700D28ED28C7179439602C2AF8B

:10025900758107D2AFC209C2B2300857D2AA753D1B

:100269000A753C005320F0752D00439602E53D12B6

:1002790000267033853D36E53C1203D3701F853C5B

:10028900357170752D00439602744B252FB52FFDDE

:10029900752D00439602744B252FB52FFD053CE5BE

:1002A9003CB408C0753C00053DE53DB410B6753D4C

:1002B9000A416DD2AA432001752D0043960220B44C

:1002C900457402252FB52FFD20B43B752D004396AB

:1002D9000230B4F7E53CB4070F753C00053DE53D38

:1002E900B41007753D0A41F3053CE53D120026703F

:1002F900EB853D36E53C1203D370D9853C357170E9

:100309007464252F41C120B5457402252FB52FFDF1

:1003190020B5A5752D0043960230B5F7E53CB4002C

:100329000F753C07153DE53DB40907753D0F613B68

:10033900153CE53D12002670EB853D36E53C120380

:10034900D370D9853C3571707464252F41C1B52F9F

:1003590014E53D120026700DE53C1203D3700671B9

:10036900707464252F41C189318A328B338C3422D0

:10037900791E7A227B217C1F753521753620717093

:10038900744B252FB52FFD752D00439602744B250F

:050399002FB52FFD222D

:10039E00C0D0C000C0E0309825C29820090FE59962

:1003AE00B4401BD209753E40753F4961C2E599B410

:1003BE000D02C209A83EF6053ED53F02C209D0E0A5

:0503CE00D000D0D03288

:1003D30075F008A42405784028F5F0F8915AE5F063

:1003E3002407F891A8FEED6043E582F4C304F58287

:1003F300E583F43400F5837011E58214700C790FF2

:100403007A0F7B0F7C0F740F813CA982AA839163BF

:10041300E5F02407F891A8FE913DEC1470047C23C9

:1004230081317C237B097A197909813B913DEC70F9

:10043300077C1CEB70027B1CE422EB540FF9EB549A

:10044300F0C4FAEC540FFBEC54F0C4FCEE60072448

:1004530001F8E62410F622918889828A8391632227

:10046300C0E0C0D07B007C007D007E10C3E933F97F

:10047300EA33FA78037F03E636D4F608DFF9DEEDD4

:10048300D0D0D0E022C0E091A8540FC4F90891A8BD

:10049300540F42010891A8540FC4FA0891A8540FAD

:1004A3004202D0E022E6C3943A50022407240322F6

:00000001f


參考鏈接:http://www.picavr.com/news/2008-01/2748.htm

  • 上一篇: 基于FPGA的DDS調(diào)頻信號的研究與實現(xiàn)
  • 下一篇: 沒有了
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網(wǎng)友評論:(只顯示最新5條。)
    關于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1