用單片機(jī)實(shí)現(xiàn)溫度遠(yuǎn)程顯示
用單片機(jī)實(shí)現(xiàn)溫度遠(yuǎn)程顯示,單片機(jī),實(shí)現(xiàn),溫度,遠(yuǎn)程,顯示
www.sfmcu.com www.sf-edu.cn 盛方整理1用單片機(jī)實(shí)現(xiàn)溫度遠(yuǎn)程顯示[作者:劉楚浩 *發(fā)表于 《 單片機(jī)與嵌入式系統(tǒng)應(yīng)用 》 2002 年第 9 期 ]摘 要:文章介紹了用 AT89S8252 單片機(jī)的串行接口與智能溫度巡回檢測(cè)儀( XJ-08S)通過 RS—485 總線相互通訊實(shí)現(xiàn)熱水溫度遠(yuǎn)程顯示的一種低成本解決方案,內(nèi)容涉及 RS—485 總線通訊、單片機(jī)驅(qū)動(dòng)數(shù)碼管顯示、數(shù)據(jù)轉(zhuǎn)換以及鍵盤處理軟硬件設(shè)計(jì)等內(nèi)容。關(guān)鍵詞:?jiǎn)纹瑱C(jī) RS—485 總線 數(shù)碼管顯示 數(shù)據(jù)轉(zhuǎn)換 鍵盤處理一、前 言目前檢測(cè)溫度一般采用熱電偶或熱敏電阻作為傳感器,這種傳感器至儀表之間一般都要用專用的溫度補(bǔ)償導(dǎo)線,而溫度補(bǔ)償導(dǎo)線價(jià)格很貴,并且線路太長(zhǎng)也會(huì)影響測(cè)量精度。在實(shí)際應(yīng)用中往往需要對(duì)較遠(yuǎn)處(1KM 左右)的溫度信號(hào)進(jìn)行監(jiān)視。現(xiàn)有的解決方案有很多,例如:1、 在現(xiàn)場(chǎng)用智能儀表對(duì)溫度信號(hào)進(jìn)行測(cè)量,用計(jì)算機(jī)作上位機(jī)與智能儀表進(jìn)行通訊來實(shí)現(xiàn)遠(yuǎn)程溫度監(jiān)測(cè)(采用這種方案要增加計(jì)算機(jī)設(shè)備及相關(guān)計(jì)算機(jī)軟件) 。2、 NCU+DDC 實(shí)現(xiàn)遠(yuǎn)程溫度監(jiān)測(cè)。用兩個(gè) DDC,一個(gè)安裝在現(xiàn)場(chǎng)測(cè)量溫度,另一個(gè)安裝在監(jiān)視地,兩個(gè) DDC 通過 NCU 進(jìn)行通訊從而實(shí)現(xiàn)遠(yuǎn)程溫度監(jiān)測(cè)。但以上方案都存在成本高的問題,有沒有低成本的解決方案呢?其實(shí),在單片機(jī)應(yīng)用日益廣泛的今天,完全可以用單片機(jī)以極低的成本來實(shí)現(xiàn)遠(yuǎn)程溫度監(jiān)測(cè)。二、問題的提出我單位管理的鍋爐房同時(shí)給兩棟建筑物內(nèi)的兩家酒店供應(yīng)蒸汽,由安裝在兩棟建筑物地下室的熱交換器進(jìn)行熱交換后產(chǎn)生熱水送給客房。從鍋爐房至兩個(gè)熱交換站的距離分別約 600 米,值班人員要不停地奔波于兩個(gè)熱交換站與鍋爐房之間進(jìn)行設(shè)備巡視,檢查熱水溫度是否控制在規(guī)定的范圍,這樣不僅增加了值班人員的勞動(dòng)強(qiáng)度,同時(shí)也使鍋爐房經(jīng)常無人(因每班 1 人值班) 。如果能在鍋爐房顯示兩個(gè)熱交換站內(nèi)各熱交換器的熱水溫度,則值班人員僅在熱水溫度異常時(shí)才需到各熱交換站檢查設(shè)備,這樣便可解決上述問題。我公司曾就此問題找專業(yè)公司作過方案,其報(bào)價(jià)在人民幣10萬元左右,后因種種原因該項(xiàng)目未實(shí)施。經(jīng)過分析,本人發(fā)現(xiàn)可以用單片機(jī)+智能儀表以低成本實(shí)現(xiàn)溫度遠(yuǎn)程顯示,并且經(jīng)過實(shí)驗(yàn)取得了成功,現(xiàn)將設(shè)計(jì)方案簡(jiǎn)述如下:www.sfmcu.com www.sf-edu.cn 盛方整理2三、控制要求及解決方案選擇 1、 兩個(gè)熱交換站分高低區(qū)共安裝有 8 個(gè)熱交換器,正常水溫在 45oC 至 65oC 之間;兩個(gè)熱交換站與鍋爐房的距離分別為 500 米和 600 米左右。2、 要求在鍋爐房能以巡回及定點(diǎn)兩種方式顯示 8 個(gè)熱交換器的熱水溫度,巡回方式以 3 秒為周期輪流更新及顯示各熱交換器熱水溫度。定點(diǎn)方式時(shí)每按上鍵或下鍵一次則顯示上或下一個(gè)熱交換器熱水溫度,每 3 秒自動(dòng)更新數(shù)據(jù)一次。3、 根據(jù)控制要求選擇單片機(jī)+智能儀表的解決方案:用帶通訊接口的智能儀表安裝在現(xiàn)場(chǎng)測(cè)量溫度,設(shè)計(jì)制作一個(gè)單片機(jī)裝置完成與智能儀表的通訊及數(shù)據(jù)顯示。四、通訊協(xié)議、智能儀表選擇及其參數(shù)介紹因熱水溫度信號(hào)變化較慢,因而對(duì)通信的速度要求不高,對(duì)于這種低速率遠(yuǎn)距離的通訊選用RS-485 總線適宜。RS-485 是 EIA(美國(guó)電子工業(yè)聯(lián)合會(huì))在 1983 年公布的新的平衡傳輸標(biāo)準(zhǔn),是工業(yè)界使用最為廣泛的雙向、平衡傳輸線標(biāo)準(zhǔn)接口,它以半雙工方式通信,支持多點(diǎn)連接,傳統(tǒng)驅(qū)動(dòng)器允許創(chuàng)建多達(dá) 32 個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò),且其具有傳輸距離遠(yuǎn)(最大傳輸距離為 1200M) ,傳輸速度快(1200M 時(shí)為 100KBPS)等優(yōu)點(diǎn)。其連接方法如下圖所示。為了滿足現(xiàn)場(chǎng)溫度檢測(cè)及與單片機(jī)裝置通訊的要求,必須選擇至少有 5 個(gè)溫度檢測(cè)點(diǎn)及具有RS—485 通訊端口的智能儀表。經(jīng)過對(duì)市場(chǎng)上常用的溫度檢測(cè)儀進(jìn)行分析,選擇由重慶川儀十八廠生產(chǎn)的 XJ-08S 型巡回檢測(cè)儀作現(xiàn)場(chǎng)測(cè)量?jī)x表。(一)該儀表主要特點(diǎn)如下:1、 多量程方式,熱電偶、熱電阻,1-5V 標(biāo)準(zhǔn)信號(hào)混合輸入,可通過鍵盤進(jìn)行設(shè)置;2、 最多 8 個(gè)測(cè)量通道(能測(cè)量 8 個(gè)溫度信號(hào)) ;3、 采用 RS-485 通訊標(biāo)準(zhǔn),可將各通道最新數(shù)據(jù)向上位機(jī)傳送。D TR RT DD-發(fā)送器R-接收器T-接收/發(fā)送器120Ω120Ωwww.sfmcu.com www.sf-edu.cn 盛方整理3重要的是,該儀表的說明書詳細(xì)介紹了與該儀表進(jìn)行數(shù)據(jù)交換的命令及格式,其通訊協(xié)議也相對(duì)較簡(jiǎn)單,這給我們用單片機(jī)實(shí)現(xiàn)溫度遠(yuǎn)程顯示降減低了難度(雖然有 RS-485 端口的儀表很多,但大多沒有通訊命令的詳細(xì)說明,給我們用單片機(jī)編程增加了難度) 。(二)XJ-08S 巡回檢測(cè)儀通訊協(xié)議1、通訊口設(shè)置? 通訊方式:RS-485 標(biāo)準(zhǔn)電平? 同步方式:起停同步方式? 波特率:9600BPS? 通訊距離:不大于 1200M? 通訊線:二線? 數(shù)據(jù)代碼:ASCII 碼? 數(shù)據(jù)格式:每字符 10 位,1 個(gè)起始位,8 個(gè)數(shù)據(jù)位,1 個(gè)停止位2、 數(shù)據(jù)傳輸格式? 地址:2 字節(jié)(高字節(jié)在前,低字節(jié)在后) ;? 數(shù)據(jù):按地址順序,儀表數(shù)據(jù)傳輸格式為十六進(jìn)制 2 字節(jié)定點(diǎn)數(shù);2 字節(jié)定點(diǎn)數(shù)=低字節(jié)高 4 位(ASCII 碼)+低字節(jié)低 4 位(ASCII 碼)高字節(jié)高 4 位(ASCII 碼)+高字節(jié)低 4 位(ASCII 碼)若數(shù)據(jù)為負(fù)數(shù),則采用補(bǔ)碼方式傳輸;? 在傳輸實(shí)時(shí)測(cè)量值時(shí),傳輸完 2 字節(jié)定點(diǎn)數(shù)后,緊接著又傳輸 2 字節(jié)定點(diǎn)數(shù),其中高字節(jié)低 4 位為小數(shù)點(diǎn)位數(shù)。例 :(50.0) 10 表示為 46 34 30 31 30 30 30 31低字節(jié) 高字節(jié) 小數(shù)位數(shù)3、 儀表通訊格式:@ DE 幀類型 幀數(shù)據(jù) CRC CR? @ :通訊起始符? DE :儀表設(shè)備號(hào)(地址)? 幀類型 :操作命令? 幀數(shù)據(jù) :各種操作命令所對(duì)應(yīng)的命令及數(shù)據(jù)? CRC :校驗(yàn)字節(jié)( 除@外 CRC 之前的其他幾個(gè)字節(jié)的異或值 )? CR :結(jié)束符(回車符)www.sfmcu.com www.sf-edu.cn 盛方整理44、應(yīng)用中用到的命令及數(shù)據(jù)格式:? 讀儀表全部動(dòng)態(tài)數(shù)據(jù)命令幀 @ DE RD CRC CR? 命令回送幀 正確 @DE RD 幀數(shù)據(jù) CRC CR錯(cuò)誤 @DE * * CRC CR例:讀 28 號(hào)儀表的全部動(dòng)態(tài)數(shù)據(jù)命令:’@1CRD64’,0D(ASCII 碼 40 31 43 52 44 36 34 0d)錯(cuò)誤返回碼 ‘@1C**72’,0D(ASCII 碼 40 31 43 2A 2A 37 32 0D)正確返回?cái)?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 通道 校驗(yàn)五、單片機(jī)選擇及硬件電路設(shè)計(jì)1、 選用 ATMEL 公司生產(chǎn)的 AT89S8252-24PC 單片機(jī),其主要參數(shù)及特點(diǎn)如下:? 與 MCS-51 產(chǎn)品兼容(其引腳圖見原理圖)? 具有 8K 字節(jié)可擦寫的 FLASH 內(nèi)部程序存儲(chǔ)器,可擦寫 1000 次;2K 字節(jié)EEPROM,可擦寫 100,000 次,SPI 口(用 PC 機(jī)的并口連接5條線即可通過 SPI口下載程序,下載軟件可從網(wǎng)上下載,這樣可節(jié)省購(gòu)買編程器的費(fèi)用;) 。注:筆者現(xiàn)已制作成了 ISP2000 三合一燒寫器,詳情見 http://www.mcudiy.com? 256 字節(jié) RAM,32 根可編程 I/O 線,可編程串行口,內(nèi)置看門狗。與看門狗有關(guān)的特殊功能寄存器 WMCON 地址= 96H,與看門狗有關(guān)的控制位為96h 第 0、1、5、6、7 位,第 5、6、7 位用于設(shè)置看門狗定時(shí)時(shí)間(具體見第 5 頁(yè)表格) ,本應(yīng)用中第 5、6、7 位均置 1,設(shè)置看門狗溢出時(shí)間為 2048ms,第 0 位為看門狗使能控制位,該位置 1 將使能看門狗,其第 1 位為復(fù)用位,向第 1 位寫 1 將復(fù)位看門狗定時(shí)器,具體操作如下:a,使能看門狗,并將其溢出時(shí)間設(shè)定為 2048ms:ORL 96H, #0E1H;b,看門狗定時(shí)器清 0:ORL 96H, #2 www.sfmcu.com www.sf-edu.cn 盛方整理52、按鍵設(shè)計(jì):為方便使用,設(shè)計(jì)了三個(gè)按鍵,分別為巡回/定點(diǎn)切換鍵、上鍵、下鍵。切換鍵用于巡檢與定點(diǎn)模式的切換,上鍵向上切換通道,下鍵向下切換通道;其中巡檢/定點(diǎn)切換鍵通過外部中斷 1 以中斷方式工作,中斷程序?qū)⒀不?定點(diǎn)標(biāo)志取反后直接跳到主程序中巡回/定點(diǎn)標(biāo)志判斷程序前運(yùn)行,由判斷程序完成巡回/定點(diǎn)的切換。按鍵信號(hào)由單片機(jī)P3.3,P3.4,P3.5 引腳輸入。3、顯示電路設(shè)計(jì)為方便觀察,選用三個(gè)二位共陽(yáng)級(jí) 8 段數(shù)碼顯示管(TOD5201AE)動(dòng)態(tài)顯示,一位顯示儀表地址(從 A 至 F) ,一位顯示通道號(hào)(從 0 至 7 通道) ,其余四位用來顯示實(shí)時(shí)溫度值;用單片機(jī) P1 口驅(qū)動(dòng)一片 74HC244 以吸收電流的方式控制段碼,用單片機(jī) P0.0至 P0.5 引腳驅(qū)動(dòng)六個(gè)PNP三極管(9012)控制位選。4、電源選用 5V/1A 市售成品開關(guān)電源。5、 根據(jù)智能儀表通訊協(xié)議的要求,串行口定義為方式 1 工作,一幀 10 位:1 個(gè)起始位、8個(gè)數(shù)據(jù)位、一個(gè)停止位;用一片 75176 完成數(shù)據(jù)的發(fā)送與接收,由于 RS-485 為半雙工,故用單片機(jī) P3.2 引腳控制發(fā)送與接收的切換;兩個(gè)智能儀表處于 RS-485 總線的兩個(gè)端點(diǎn),為提高可靠性,在 RS-485 總線的兩個(gè)端點(diǎn)上分別并聯(lián)一個(gè) 120Ω、1/4W 終端電阻。? 系統(tǒng)方框圖如右示:? 單片機(jī)裝置電原理圖見下頁(yè):巡回/定點(diǎn) 下儀表地址通道號(hào)實(shí)時(shí)溫度巡回/定點(diǎn) 下儀表地址通道號(hào)實(shí)時(shí)溫度A B Gnd上熱水溫度遠(yuǎn)程顯示器A B Gnd120ΩXJ-08S 巡回檢測(cè)儀 AA B Gnd120ΩXJ-08S 巡回檢測(cè)儀 B7 6 5 定時(shí)值0 0 0 16ms0 0 1 32ms0 1 0 64ms0 1 1 128ms1 0 0 256ms1 0 1 512ms1 1 0 1024ms1 1 1 2048ms看門狗溢出時(shí)間表www.sfmcu.com www.sf-edu.cn 盛方整理6www.sfmcu.com www.sf-edu.cn 盛方整理六、單片機(jī)軟件設(shè)計(jì)說明及程序流程圖為方便調(diào)試,采用模塊化編程,共分 1 個(gè)主模塊及 5 個(gè)子模塊,各模塊功能說明及流程圖如下(源程序見附錄):1、主模塊(rand_main.a51)上電后程序顯示初始化標(biāo)志并等待 3 秒,然后進(jìn)入巡回模式,自動(dòng)檢測(cè)地址為A(10)至 F( 15)的智能儀表,對(duì)在線的儀表及已使用通道以 3 秒為周期自動(dòng)巡回讀取實(shí)時(shí)溫度并送數(shù)碼管顯示,儀表未在線或未用通道則自動(dòng)跳過;定點(diǎn)模式時(shí)根據(jù)上、下按鍵情況自動(dòng)向前或向后移動(dòng)一個(gè)通道后等待下一次按鍵(向上至最高通道號(hào)時(shí)跳到上一個(gè)儀表的最低在用通道,向下至最低通道號(hào)時(shí)跳到下一個(gè)儀表的最高在用通道) ;等待期間以 3 秒為周期讀取當(dāng)前儀表當(dāng)前通道實(shí)時(shí)溫度并送數(shù)碼管顯示,另外,為了區(qū)分巡回、定點(diǎn)工作模式,定點(diǎn)工作模式時(shí)最低位數(shù)碼管以約 0.5Hz 的頻率閃爍顯示。當(dāng)檢測(cè)到巡回/定點(diǎn)切換鍵按下時(shí)自動(dòng)在巡回及定點(diǎn)模式間轉(zhuǎn)換,當(dāng)檢測(cè)到溫度值低于-199.9 度時(shí)顯示-199.9 度。主模塊流程圖見下頁(yè):www.sfmcu.com www.sf-edu.cn 盛方整理YD_N100=儀表地址TD_N=通道號(hào)YN開始上電初始化置 SP巡回/定點(diǎn)標(biāo)志=1? #0ah=>yd_n100,#0=>td_n清閃爍、調(diào)用命令發(fā)送模塊接收正確嗎?調(diào)用數(shù)據(jù)轉(zhuǎn)換程序 正常嗎?YN送顯示并延時(shí) 3 秒Td_n+1=>td_nTd_n=8?YN0=>Td_nNYYd_n100+1=>yd_n100Yd_n100=10h?0ah=>yd_n100startTd_n=0?開外部中斷 1 并置最低位閃爍清軟硬看門狗2 秒定時(shí)到?下鍵?上鍵?NNNYYY調(diào)用命令發(fā)送程序調(diào)用數(shù)據(jù)轉(zhuǎn)換程序正確嗎?正確嗎?送顯示YNNY7=>td_nYd_n100-1=>yd_100Yd_n100=9?0fh=>yd_100NNYYTd_n-1=>td_n調(diào)用命令發(fā)送程序正確嗎?正確嗎?調(diào)用數(shù)據(jù)轉(zhuǎn)換程序NYYN送顯示、置 2S 定時(shí)初值上鍵處理流程與下鍵相似,此處從略。NYwww.sfmcu.com www.sf-edu.cn 盛方整理2、數(shù)據(jù)轉(zhuǎn)換子模塊(rand_data.a51)功能: 本模塊先將 ASCII 碼轉(zhuǎn)換成 BIN 碼,然后將 BIN 碼轉(zhuǎn)換成 BCD 碼并將數(shù)據(jù)轉(zhuǎn)換成可直接顯示的格式入口: a=通道號(hào)出口: r1=個(gè)位,r2=十位,r3=百位,r4=千位(顯示數(shù)據(jù))a=非 0 表示該通道未用注:本子模塊中直接將小數(shù)點(diǎn)信息加到相應(yīng)位數(shù)據(jù)上,如需在某位顯示小數(shù)點(diǎn),則將該位數(shù)據(jù)加 10H,顯示子模塊根據(jù)此信息顯示小數(shù)點(diǎn)。各子程序功能介紹:? bcd2_bcd1:將 r3,r4 中的 4 位 bcd 碼由低至高分別存入 r1,r2,r3,r4 中;? ascii4_bcd3:將(r0)為首地址的4字節(jié) ascii 碼轉(zhuǎn)換成 bcd 碼并將 bcd 碼由低至高依次存放在 r3,r4,r5 中,r3,r4 中各存放 2 位 bcd 碼,r5 中存放一位 bcd 碼;? bin_bcd:將 r1,r2 中的 bin 碼轉(zhuǎn)換成 bcd 碼并將 bcd 碼由低至高依次存放在 r3,r4,r5 中,r3,r4 中各存放 2 位 bcd 碼,r5 中存放一位 bcd 碼;? ascii4_bin2:將(r0)為首地址的4字節(jié) ascii 碼轉(zhuǎn)換成 2 位 bin 碼存放在r1(低字節(jié)),r2(高字節(jié))中;注:[(r0)指 r0 中內(nèi)容]? ascii_bin:將(r0)為地址的一位 ascii 碼轉(zhuǎn)換成 bin 碼存A中。(高級(jí)子程序調(diào)用低級(jí)子程序以實(shí)現(xiàn)更強(qiáng)的功能,源程序中對(duì)各子程序有較詳細(xì)的注釋,故此處僅畫出主流程圖)3、顯示、軟件看門狗、20ms 定時(shí)器子程序(rand_disp.a51)功能: 通過定時(shí)器 0 以 1MS 為周期動(dòng)態(tài)顯示緩沖區(qū)中的內(nèi)容;同時(shí)完成 20ms定時(shí)器及軟件看門狗計(jì)數(shù);當(dāng)軟件看門狗定時(shí)器溢出時(shí)自動(dòng)復(fù)位。開始計(jì)算通道數(shù)據(jù)首地址調(diào)用數(shù)據(jù)轉(zhuǎn)換程序還原小數(shù)位數(shù)存 R6BCD 碼超過5 位嗎? 該通道數(shù)據(jù)為0X0ffff 嗎?返回該通道未用信息YYNN退出轉(zhuǎn)換成可顯示數(shù)據(jù)存R1-R4有效位前的零消除處理返回?cái)?shù)據(jù)正確信息負(fù)數(shù)處理,當(dāng)數(shù)據(jù)小于-199.9 時(shí)顯示 -199.9www.sfmcu.com www.sf-edu.cn 盛方整理入口: 以 disp_buf 為首地址依次存放從個(gè)位至十萬位待顯示數(shù)據(jù),以 disp_wc為首地址(位地址)依次存放個(gè)位至千位閃爍控制位信息,為'0'常亮,為'1'閃爍.出口: wdt 中存放軟件看門狗計(jì)數(shù)值,time_20ms 中存放 20ms 的計(jì)數(shù)值。Wdt溢出時(shí)跳至程序存儲(chǔ)器 0000H單元? 將定時(shí)器 0 設(shè)定為模式 1 定時(shí)工作,每 ms 產(chǎn)生一次中斷,即顯示一位,每 10ms 6 位數(shù)據(jù)輪流顯示 1ms;為進(jìn)一步提高可靠性,在該模塊中設(shè)計(jì)了軟件看門狗,實(shí)現(xiàn)方法見源程序。模塊流程圖如本頁(yè)所示:T0 中斷入口保護(hù)現(xiàn)場(chǎng)顯示碼表地址 =>dptrDisp_s_c 取反Disp_c+1=>disp_cDisp_c=>R0Disp_s-1=>disp_s,Disp_s=0?YN個(gè)位數(shù)據(jù)及閃爍信息 =>A,Ca閃閃爍 NR0=1? Y十位數(shù)據(jù)及閃爍信息 =>A,Ca閃閃爍 百位數(shù)據(jù)及閃爍信息 =>A,Ca閃閃爍 千位數(shù)據(jù)及閃爍信息 =>A,Ca閃閃爍 萬位數(shù)據(jù)=>A a閃閃爍 十萬位數(shù)據(jù)=>A a閃閃爍 百萬位數(shù)據(jù)=>A (未用)a閃閃爍 千萬位數(shù)據(jù) =>A (未用)a閃閃爍 NR0=2? YNR0=3? YNR0=4? YNR0=5? YNR0=6? YNR0=7? YNR0=8? Y輸出處理a閃閃爍 Disp_c=10? NY0=>disp_c20ms 計(jì)數(shù)處理軟看門狗計(jì)數(shù)溢出YN跳至 0000Ha閃閃爍 恢復(fù)現(xiàn)場(chǎng)閃閃爍 T0 中斷返回Disp_s:閃爍控制計(jì)數(shù)器Disp_s_c:閃爍控制標(biāo)志Disp_c:顯示控制計(jì)數(shù)器www.sfmcu.com www.sf-edu.cn 盛方整理4、命令發(fā)送及接收控制子模塊(rand_send.a51)功能: 發(fā)送命令緩沖區(qū)中命令并等待接收完畢,然后檢查接收到的數(shù)據(jù),接收錯(cuò)誤則重發(fā)命令,達(dá)到設(shè)定的次數(shù)仍錯(cuò)則存入錯(cuò)誤碼后退出.入口: A=儀表地址出口: A=0 表示接收正確 1 表示校驗(yàn)錯(cuò) '*'表示命令錯(cuò) 'N'表示無回應(yīng)模塊流程圖如下:5、串行接收子模塊(rand_rec.a51)功能: 串行接收模塊通過中斷自動(dòng)執(zhí)行,程序檢測(cè)到@時(shí)置 ri_f 標(biāo)志并開始接收,檢測(cè)到回車符時(shí)清 ri_f 后退出,接收到的數(shù)據(jù)存放在以 rec_buf 為首地址的緩沖區(qū)中。開始清除命令及接收緩沖區(qū)設(shè)置允許錯(cuò)誤次數(shù)計(jì)算儀表命令偏移地址,取出命令及送入命令緩沖區(qū)校驗(yàn)通過?YN發(fā)送命令在 80ms 內(nèi)檢測(cè)到正在接收標(biāo)志?YN在 200ms 內(nèi)檢測(cè)到接收結(jié)束標(biāo)志?YN接收到命令錯(cuò)信息? YN返回命令錯(cuò)信息允許錯(cuò)誤次數(shù)-1允許錯(cuò)誤次數(shù)=0?YN緩沖區(qū)結(jié)束標(biāo)志符正確?YN清正在接收標(biāo)志返回錯(cuò)誤信息校驗(yàn)接收緩沖區(qū)中數(shù)據(jù)返回正確信息退出返回校驗(yàn)錯(cuò)信息www.sfmcu.com www.sf-edu.cn 盛方整理串行中斷(rand_rec.a51 )流程圖 巡回/定點(diǎn)鍵中斷(rand_key.a51)流程圖6、巡回/定點(diǎn)轉(zhuǎn)換檢測(cè)模塊(rand_key.a51)功能: 模塊通過外部中斷1自動(dòng)執(zhí)行,檢測(cè)到巡回/定點(diǎn)按鍵后先延時(shí)去抖動(dòng),并等待按鍵釋放后將巡回/定點(diǎn)標(biāo)志位取反,然后自動(dòng)跳至主模塊中start 處,并不返回原中斷點(diǎn)。模塊流程圖如見本頁(yè):外部中斷 1 入口斷按鍵釋放?NY延時(shí) 40ms 去抖延時(shí) 40ms 去抖清看門狗定時(shí)器關(guān)中斷巡回/定點(diǎn)標(biāo)志取反跳至主程序 start 處斷串行中斷入口斷接收中斷?接收緩沖區(qū)首地址=>rec_buf_zYRI_F:正在接收標(biāo)志REC_BUF_Z:接收指針中斷返回?cái)喾礜RI_F=0?接收到@?1=>RI_F數(shù)據(jù)存入接收緩沖區(qū)接收到 0dh?YYYNNN0=>RI_F接收緩沖區(qū)溢出?YN0=>RI_F保護(hù)現(xiàn)場(chǎng)恢復(fù)現(xiàn)場(chǎng)清 RIwww.sfmcu.com www.sf-edu.cn 盛方整理七、調(diào)測(cè)及運(yùn)行情況介紹1、 調(diào)試步驟:? 硬件連接:將各芯片插在面包板上并用導(dǎo)線按原理圖連接? 軟件開發(fā)環(huán)境:Keil uVision2 for Windows ,該軟件的模擬調(diào)試器支持 C 語(yǔ)言及匯編語(yǔ)言源代碼調(diào)試,其匯編程序支持宏匯編及模塊化編程,使用方便。? 首先在模擬調(diào)試器中調(diào)試各子模塊,各子模塊調(diào)試正常后再將各子模塊及主模塊全部匯編連接成目標(biāo)文件,最后將目標(biāo)代碼下載到單片機(jī)中并連接智能儀表進(jìn)行統(tǒng)調(diào)。2、 該系統(tǒng)軟件部分除報(bào)警子模塊外已全部開發(fā)完成并實(shí)際測(cè)試通過,測(cè)試時(shí)用一對(duì)長(zhǎng)度約 1100M 的 0.5mm2 普通電話線作為單片機(jī)裝置與兩個(gè)智能儀表的通訊線,經(jīng)過一個(gè)多星期的連續(xù)運(yùn)行觀察,運(yùn)行可靠穩(wěn)定,完全滿足使用要求。[注:報(bào)警子模塊的開發(fā)及硬件制版工作正在進(jìn)行中。]八、結(jié)束語(yǔ)用單片機(jī)+智能儀表構(gòu)成的溫度遠(yuǎn)程顯示系統(tǒng)總造價(jià)約人民幣 7000 元(兩塊智能儀表+溫度傳感器約 3500 元,通訊電纜約 2000 元,單片機(jī)裝置及施工費(fèi)用約 1500 元) ,與采用其它方案的系統(tǒng)比較造價(jià)較低,其硬件及軟件的設(shè)計(jì)、制作都較簡(jiǎn)單,有一定的電子及單片機(jī)知識(shí)便可完成。同時(shí)對(duì)該裝置軟件稍加修改即可與其他帶有 RS-485 通訊端口的儀器儀表通訊(如變頻器、電路傳感器等) ,實(shí)現(xiàn)遠(yuǎn)程測(cè)量、監(jiān)視及控制。與發(fā)達(dá)國(guó)家相比,我國(guó)單片機(jī)應(yīng)用的普及程度較低。通過該實(shí)例說明,我們完全可以把我們學(xué)到的單片機(jī)知識(shí)應(yīng)用到實(shí)際工作中,直接創(chuàng)造經(jīng)濟(jì)效益。九、參考資料> 電子工業(yè)出版社徐愛鈞 彭秀華 編著> 電子工業(yè)出版社余永權(quán) 主編> 電子工業(yè)出版社> ATMEL 公司> 重慶川儀十八廠> 清華大學(xué)出版社www.sfmcu.com www.sf-edu.cn 盛方整理孫廷才 王杰 孫中健 編著>2001 年 11 期十、附錄(源程序)1、主模塊(rand_main.a51);------------1--------rand_main.a51----------------name rand_mainEXTRN 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_fprog SEGMENT CODE ;定義代碼段byte_buff segment data ;定義字節(jié)數(shù)據(jù)段 1byte_buffI segment idata ;定義字節(jié)數(shù)據(jù)段 2bit_buff segment data bitaddressable ;定義位數(shù)據(jù)段bit_flag segment bitstack segment idata ;定義堆棧數(shù)據(jù)段rseg stack ;為堆棧保留 20 個(gè)字節(jié)ds 20CSEG AT 00H ;定義絕對(duì)代碼段USING 0 ;選擇工作寄存器組第 0 組lJMP rand ;復(fù)位時(shí)程序執(zhí)行執(zhí)行點(diǎn)CSEG AT 03H ;外部中斷 0RETICSEG AT 0BH ;定時(shí)器 0 中斷l(xiāng)JMP I_T0CSEG AT 13H ;外部中斷 1ljmp keyRETICSEG AT 1BH ;定時(shí)器 1 中斷RETICSEG AT 23H ;串行中斷l(xiāng)jmp rec_siRSEG BYTE_BUFFtd_temp: ds 1TD_n: DS 1 ;通道號(hào)YD_n100: ds 1 ;儀表地址;----------------------------------rseg bit_flagkey_work:dbit 1ri_f: dbit 1 ;串行口正在接收標(biāo)志;----主程序RSEG prog;------------------------------符號(hào)定義key_f equ p3.3key_up equ p3.4key_down equ p3.5wdt_time equ 100 ;軟件看門狗定時(shí)器計(jì)數(shù)值scon_c equ 01010000b ;串行口設(shè)置為 10 位 UART,允許接收th1_h equ 0fdh ;晶振為 11.0592M,波特率為 9600 時(shí)初值tmod_n equ 21h ;設(shè)置定時(shí)器(T1 作為波特率發(fā)生器工作在模式 2,T0 為模式 1)ie_n equ 82h ;設(shè)置串行,定時(shí)器 0 中斷www.sfmcu.com www.sf-edu.cn 盛方整理ip_n equ 12h ;設(shè)置串行,定時(shí)器 0 中斷為高級(jí)中斷TH0_H EQU 0FCHTL0_L EQU 06BH ;設(shè)定定時(shí)器 0 為 1MS 中斷初值;------------------初始化代碼clear_wdt macro ;清硬看門狗宏定義orl 96h,#2ENDM rand: ORL 96H,#0E1H ;啟動(dòng)硬件看門狗mov p0,#0ffhmov r0,#20hmov a,#0start_300:mov @r0,ainc r0cjne r0,#128,start_300setb key_work ;置巡回/定點(diǎn)標(biāo)志mov p3,#0ffhmov p2,#0ffhmov disp_wc,#0 ;初始化閃爍控制位mov ip,#ip_n ;設(shè)置串行,定時(shí)器 0 中斷為高級(jí)中斷mov scon,#scon_cMOV TMOD,#tmod_nMOV TH0,#TH0_H ;設(shè)定定時(shí)器初值MOV TL0,#TL0_Lmov th1,#th1_hmov tl1,#th1_hmov ie,#ie_nmov pcon,#0SETB tr1SETB TR0;-------顯示初始化提示acall chuhaoCLEAR_WDTstart: clr eamov sp,#stack-1setb eaclr ri_f ;清接收中標(biāo)志clr p3.2 ;置 75176 為接收狀態(tài)jnb key_work,db_work;-----------------------------------setb ex1mov yd_n100,#0ahmov td_n,#0s_0: anl disp_wc,#0f0hmov wdt,#0 ;清看門狗定時(shí)器clear_wdtmov a,yd_n100lcall send_orderJNZ s_1mov disp_buf+5,yd_n100mov a,td_nlcall ascii_bcdjnz s_2mov disp_buf+4,td_nacall mov_to_dispmov wdt,#0clear_wdtmov a,#75add a,time_20mswww.sfmcu.com www.sf-edu.cn 盛方整理cjne a,time_20ms,$mov wdt,#0clear_wdtmov a,#75add a,time_20mscjne a,time_20ms,$s_2: inc td_nmov a,td_ncjne a,#8,s_0mov td_n,#0s_1: inc yd_n100MOV A,YD_N100cjne a,#10h,s_0mov yd_n100,#0ahajmp s_0;-----------------------------db_work:setb ex1orl disp_wc,#01hd_3: mov wdt,#0 ;清看門狗定時(shí)器clear_wdtjb key_up,d_4mov a,#2add a,time_20mscjne a,time_20ms,$jb key_up,d_4d_5: mov wdt,#0clear_wdtjnb key_up,d_5 ;等待向上鍵松開;------------------------------------------------d_53: mov a,td_ncjne a,#7,d_50mov td_n,#0d_52: inc yd_n100mov a,yd_n100cjne a,#10h,d_51mov yd_n100,#0ahajmp d_51d_50: inc td_nd_51: mov a,yd_n100lcall send_orderJNZ d_52mov disp_buf+5,yd_n100mov a,td_nlcall ascii_bcdjnz d_53mov disp_buf+4,td_nacall mov_to_dispmov a,#100 ;2 秒鐘定時(shí)設(shè)定add a,time_20msajmp d_3;------------------------------------------------d_4: jb key_down,d_10mov a,#2add a,time_20mscjne a,time_20ms,$jb key_down,d_3d_6: mov wdt,#0clear_wdtwww.sfmcu.com www.sf-edu.cn 盛方整理jnb key_down,d_6 ;等待向下鍵松開;-----------------------------------------------d_43: mov a,td_ncjne a,#0,d_40mov td_n,#7d_42: dec yd_n100mov a,yd_n100cjne a,#9h,d_41mov yd_n100,#0fhajmp d_41d_40: dec td_nd_41: mov a,yd_n100lcall send_orderJNZ d_42mov disp_buf+5,yd_n100mov a,td_nlcall ascii_bcdjnz d_43mov disp_buf+4,td_nacall mov_to_dispmov a,#100 ;2 秒鐘定時(shí)設(shè)定add a,time_20msajmp d_3;----------------------------------d_10: cjne a,time_20ms,d_30mov a,yd_n100lcall send_orderjnz d_30mov a,td_nlcall ascii_bcdjnz d_30acall mov_to_dispmov a,#100add a,time_20msd_30:ajmp d_3;----------------------------------mov_to_disp:mov disp_buf,r1mov disp_buf+1,r2mov disp_buf+2,r3mov disp_buf+3,r4retchuhao: mov r1,#1eh ;初始化等待提示mov r2,#22hmov r3,#21hmov r4,#1fhmov disp_buf+4,#21hmov disp_buf+5,#20hacall mov_to_dispmov a,#75add a,time_20mscjne a,time_20ms,$mov wdt,#0clear_wdtmov a,#75add a,time_20mscjne a,time_20ms,$retendwww.sfmcu.com www.sf-edu.cn 盛方整理2、數(shù)據(jù)轉(zhuǎn)換子模塊(rand_data.a51 );-----------2-------rand_data.a51----------------name rand_dataextrn idata (rec_buf)public ascii_bcdprog SEGMENT CODE ;定義代碼段byte_buff segment data ;定義字節(jié)數(shù)據(jù)段 1byte_buffI segment idata ;定義字節(jié)數(shù)據(jù)段 2bit_buff segment data bitaddressable ;定義位尋址區(qū)字節(jié)數(shù)據(jù)段rseg progusing 0;-------------------------------------ASCII_BCD:mov b,#8 ;計(jì)算該通道數(shù)據(jù)偏移首地址mul abadd a,#5mov r0,#rec_bufadd a,r0mov b,amov r0,aacall ascii4_bcd3mov a,b ;還原小數(shù)位數(shù)add a,#7mov r0,aacall ascii_binmov r6,a ;小數(shù)位數(shù)暫存在 R6 中mov a,r5jz asc_oKmov a,dplcpl aclr cinc amov dpl,amov a,dphcpl aaddc a,#0mov dph,ajnz asc_basc_0: mov a,dpldec ajnz asc_bmov r1,#0fhmov r2,#0fhmov r3,#0fhmov r4,#0fhmov a,#0fhajmp asc_outasc_b: mov r1,dpl ;為負(fù)數(shù)處理mov r2,dphacall bin_bcdmov a,b ;還原小數(shù)位數(shù)add a,#7mov r0,aacall ascii_binmov r6,a ;小數(shù)位數(shù)暫存 r6acall bcd2_bcd1mov a,r4www.sfmcu.com www.sf-edu.cn 盛方整理dec ajnz asc_100 ;數(shù)據(jù)小于-199.9 時(shí)顯示-199.9mov r4,#23hajmp asc_swasc_100:mov r4,#23hmov r3,#9mov r2,#19hmov r1,#9ajmp asc_sw_1asc_ok: acall bcd2_bcd1 ;正常數(shù)據(jù)處理程序asc_sw: mov a,r4 ;清除有效位前面的 0jnz asc_sw_1mov r4,#1chmov a,r3jnz asc_sw_1mov r3,#1chasc_sw_1:clr aasc_out:ret;------------每字節(jié)兩位 BCD 碼轉(zhuǎn)換為每字節(jié)一位 BCD 碼子程序;入口:r3=個(gè)位及十位 BCD 碼,r4=百位及千位 BCD 碼,r6=小數(shù)位數(shù);出口:r1=個(gè)位 BCD 碼,r2=十位 BCD 碼,r3=百位 BCD 碼,r4=千位 BCD 碼bcd2_bcd1:mov a,r3 ;個(gè)位及十位 BCD 數(shù)處理anl a,#0fhmov r1,amov a,r3anl a,#0f0hswap amov r2,amov a,r4 ;百位及千位 BCD 數(shù)處理anl a,#0fhmov r3,amov a,r4anl a,#0f0hswap amov r4,amov a,r6 ;加入小數(shù)點(diǎn)信息jz bcd2_outadd a,#ar1mov r0,amov a,@r0add a,#10hmov @r0,abcd2_out:ret;---------------ASCii4_BCD3 轉(zhuǎn)換子程序;入口:r0=四字節(jié) ASCII 碼首地址;出口:r5,r4,r3 從高至低依次存放 BCD 碼(r3,r4 各存 2 位,r5 存 1 位)ascii4_bcd3:acall ascii4_bin2mov dpl,r1mov dph,r2acall bin_bcdret;---------------BIN_BCD 轉(zhuǎn)換子程序;入口:r1=BIN 低字節(jié),r2=BIN 高字節(jié) 共 2 字節(jié);出口:r3=低 2 位 BCD 碼,r4=高 2 位 BCD 碼,r5=可能的最高位 BCD 碼bin_bcd:PUSH ACCPUSH PSWmov r3,#0;BCD 單元清 0mov r4,#0www.sfmcu.com www.sf-edu.cn 盛方整理mov r5,#0mov r6,#16 ;設(shè)置二進(jìn)制數(shù)位數(shù)clr cbin_0: mov a,r1rlc amov r1,amov a,r2rlc amov r2,amov r0,#ar3mov r7,#3 ;設(shè)置 BCD 字節(jié)數(shù)bin_1: mov a,@r0addc a,@r0da amov @r0,ainc r0djnz r7,bin_1djnz r6,bin_0POP PSWPOP ACCret;---------------ASCII4_BIN2 轉(zhuǎn)換子程序;入口:R0=ASCII 碼首地址(共四字節(jié) ASCII 碼);出口:r1=BIN 碼低字節(jié),R2=BIN 碼高字節(jié)ascii4_bin2:PUSH ACCacall ascii_binanl a,#0fhswap amov r1,ainc r0acall ascii_binanl a,#0fhorl ar1,ainc r0acall ascii_binanl a,#0fhswap amov r2,ainc r0acall ascii_binanl a,#0fhorl ar2,aPOP ACCret;---------------ASCII_BIN 轉(zhuǎn)換子程序;入口:R0=ASCII 地址;出口:A=BIN 碼ascii_bin:mov a,@r0clr csubb a,#3ahjnc ascii_0add a,#7ascii_0:add a,#3retendwww.sfmcu.com www.sf-edu.cn 盛方整理3、顯示、軟件看門狗及 20ms 定時(shí)器子模塊(rand_disp.a51);--------3--------rand_disp.a51-------------------------name rand_dispextrn number(TH0_H,TL0_L,wdt_time)PUBLIC I_T0,disp_buf,disp_wc,time_20ms,wdtprog SEGMENT CODE ;定義代碼段BYTE_BUFF segment data ;定義字節(jié)數(shù)據(jù)段 1byte_buffI segment idata ;定義字節(jié)數(shù)據(jù)段 2bit_buff segment data bitaddressable ;定義位數(shù)據(jù)段RSEG BYTE_BUFFwdt: ds 1time_s_c: ds 1time_20ms: ds 1DISP_C: ds 11 ;顯示位disp_buf data disp_c+1 ;個(gè)位緩沖區(qū),此個(gè)位并非真正的個(gè)位,指最右一位,以下類推disp_2 data disp_c+2 ;十個(gè)位緩沖區(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 ;閃爍計(jì)數(shù)器rseg bit_buffdisp_wc: ds 1 disp_c_1 bit disp_wc.0 ;個(gè)位閃爍標(biāo)志位 1-閃爍disp_c_2 bit disp_wc.1 ;十位閃爍標(biāo)志位disp_c_3 bit disp_wc.2 ;百位閃爍標(biāo)志位disp_c_4 bit disp_wc.3 ;千位閃爍標(biāo)志位disp_s_c bit disp_wc.4 ;閃爍控制位 1-閃爍RSEG PROGusing 0dsb equ p3.4cr_not equ p3.5cp equ p3.6I_T0: push accpush ar0push dphpush dplpush pswmov th0,#th0_hmov tl0,#tl0_lmov dptr,#tab;---------------------------------------------djnz disp_s,d_20cpl disp_s_c;---------------------------------------------d_20: INC DISP_CMOV R0,DISP_CCJNE R0,#1,DISP2 ;r0=1 顯示個(gè)位mov c,disp_c_1mov A,disp_bufmov p1,#0FFHwww.sfmcu.com www.sf-edu.cn 盛方整理mov p0,#0fehajmp d_10DISP2: CJNE R0,#2,DISP3 ;顯示十位setb p0.0mov c,disp_c_2mov A,disp_2mov p1,#0FFHmov p0,#0fdhajmp d_10DISP3: CJNE R0,#3,DISP4 ;顯示百位mov c,disp_c_3mov A,disp_3mov p1,#0FFHmov p0,#0fbhajmp d_10DISP4: CJNE R0,#4,DISP5 ;顯示千位mov c,disp_c_4mov A,disp_4mov p1,#0FFHmov p0,#0f7hajmp d_10DISP5: CJNE R0,#5,DISP6 ;顯示通道號(hào)mov A,disp_5mov p1,#0FFHmov p0,#0efhajmp d_10DISP6: CJNE R0,#6,DISP7 ;顯示儀表地址mov A,disp_6mov p1,#0FFHmov p0,#0dfhajmp d_10DISP7: CJNE R0,#7,DISP8 ;無mov A,disp_7mov p1,#0FFHmov p0,#0bfhajmp d_10DISP8: CJNE R0,#8,d_10 ;無mov A,disp_8mov p1,#0FFHmov p0,#7fhd_10: acall disp_wmov r0,disp_ccjne r0,#10,d_12 ;若 disp_c=10 則清 disp_cmov disp_c,#0inc time_s_c ;MS,S 計(jì)數(shù)處理程序mov a,time_s_ccjne a,#2,d_12mov time_s_c,#0inc time_20msinc wdt ;軟看門狗處理程序mov a,wdtcjne a,#wdt_time,d_12mov wdt,#0mov a,#0push accpush accreti;-----------------------www.sfmcu.com www.sf-edu.cn 盛方整理d_12: pop pswpop dplpop dphpop ar0pop accRETIdisp_w: jnc d_0jnb disp_s_c,d_0mov p1,#0FFHajmp d_1d_0: movc a,@a+dptrcpl amov p1,aD_1: ret;---------------------------------------------------------TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH; 0 1 2 3 4 5 6 7 8 9db 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 23END4、命令發(fā)送及接收控制子模塊(rand_send.a51);----------4--------rand_send.a51----------------name send_orderextrn idata (rec_buf) ;rec_buff接收緩沖區(qū)extrn data (time_20ms)extrn bit (ri_f) ;ri_f 正在接收標(biāo)志PUBLIC send_orderprog SEGMENT CODE ;定義代碼段byte_buff segment data ;定義字節(jié)數(shù)據(jù)段 1byte_buffI segment idata ;定義字節(jié)數(shù)據(jù)段 2bit_buff segment data bitaddressable ;定義位數(shù)據(jù)段rseg byte_buffsend_n:ds 1order_buf:ds 10rseg progdd_c equ 4 ;等待回應(yīng) 20m 數(shù)cw_n equ 7 ;設(shè)置允許錯(cuò)誤次數(shù)using 0;---------------------清命令緩沖區(qū)send_order:mov dpl,#8mov r0,#order_bufsend_0: mov @r0,#0inc r0djnz dpl,send_0MOV DPL,#72 ;清接收緩沖區(qū)MOV R0,#REC_BUFSEND_A: MOV @R0,#0INC R0www.sfmcu.com www.sf-edu.cn 盛方整理DJNZ DPL,SEND_A;----------------------發(fā)送命令控制程序mov send_n,#cw_n ;設(shè)置允許錯(cuò)誤次數(shù)mov b,#10clr csubb a,bmov b,#8mul abmov dptr,#a_ordermov r0,#order_buf-1mov r1,#10start_mov:inc r0push accmovc a,@a+dptrmov @r0,ainc dptrpop acccjne @r0,#0dh,start_mov;----------------------發(fā)送命令子程序send_start:setb p3.2 ;切換 75176 至發(fā)送狀態(tài)mov r0,#order_buf-1send_10:inc r0mov sbuf,@r0jnb ti,$ ;等待一幀數(shù)據(jù)發(fā)完CLR TIcjne @r0,#0dh,send_10 ;檢測(cè)到結(jié)束標(biāo)志退出;------------------------檢測(cè)接收標(biāo)志mov r0,#30 ;延時(shí) 60uS 等待停止位發(fā)送完畢djnz r0,$setb esclr p3.2 ;切換 75176 至接收狀態(tài)mov a,#dd_c ;延時(shí)檢測(cè)儀表有無回應(yīng)add a,time_20mssend_21:jb ri_f,send_20cjne a,time_20ms,send_21mov a,#'N'ajmp send_23;-------------------------檢測(cè)接收是否正確send_20:mov a,#10 ;延時(shí) 200MS 等待接收結(jié)束add a,time_20mssend_28:jnb ri_f,send_29cjne a,time_20ms,send_28clr ri_f ;200MS 仍未結(jié)束清接收中標(biāo)志send_29:mov r0,#rec_buf+4cjne @r0,#'*',send_22mov a,#'*'send_23:djnz send_n,send_start ;達(dá)到允許錯(cuò)誤次數(shù)退出ajmp send_outsend_22:mov r0,#rec_buf+71cjne @r0,#0dh,send_23 ;接收緩沖區(qū)第 72 字節(jié)不為回車符轉(zhuǎn)出錯(cuò)處理;------------------------------還原校驗(yàn)碼mov r0,#rec_buf+70mov a,@r0clr csubb a,#3ahjnc SEND_25add a,#7send_25:add a,#3www.sfmcu.com www.sf-edu.cn 盛方整理mov @r0,adec r0mov a,@r0clr csubb a,#3ahjnc SEND_26add a,#7send_26:ADD A,#3swap ainc r0xchd a,@r0dec r0xch a,@r0inc r0mov @r0,#0dh ;檢驗(yàn)碼后加回車符;------------------------------檢驗(yàn)接收緩沖區(qū)數(shù)據(jù)mov r0,#rec_buf+1mov a,@r0inc r0send_24:xrl a,@r0inc r0cjne @r0,#0dh,send_24cjne a,#0,send_200 ;接收校驗(yàn)未通過轉(zhuǎn)出錯(cuò)處理send_out:clr esretsend_200:mov a,#1ajmp send_23;----------------------------------------------------a_order: db '@0ARD67',0DH ;讀 A 表全部動(dòng)
收藏