DZ068用單片機實現(xiàn)溫度遠程顯示
DZ068用單片機實現(xiàn)溫度遠程顯示,DZ068,單片機,實現(xiàn),溫度,遠程,顯示
www.sfmcu.com www.sf-edu.cn 盛方整理用單片機實現(xiàn)溫度遠程顯示作者:劉楚浩*發(fā)表于單片機與嵌入式系統(tǒng)應用2002年第9期 摘 要:文章介紹了用AT89S8252單片機的串行接口與智能溫度巡回檢測儀(XJ-08S)通過RS485總線相互通訊實現(xiàn)熱水溫度遠程顯示的一種低成本解決方案,內容涉及RS485總線通訊、單片機驅動數(shù)碼管顯示、數(shù)據轉換以及鍵盤處理軟硬件設計等內容。關鍵詞:單片機 RS485總線 數(shù)碼管顯示 數(shù)據轉換 鍵盤處理一、前 言目前檢測溫度一般采用熱電偶或熱敏電阻作為傳感器,這種傳感器至儀表之間一般都要用專用的溫度補償導線,而溫度補償導線價格很貴,并且線路太長也會影響測量精度。在實際應用中往往需要對較遠處(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)測。二、問題的提出我單位管理的鍋爐房同時給兩棟建筑物內的兩家酒店供應蒸汽,由安裝在兩棟建筑物地下室的熱交換器進行熱交換后產生熱水送給客房。從鍋爐房至兩個熱交換站的距離分別約600米,值班人員要不停地奔波于兩個熱交換站與鍋爐房之間進行設備巡視,檢查熱水溫度是否控制在規(guī)定的范圍,這樣不僅增加了值班人員的勞動強度,同時也使鍋爐房經常無人(因每班1人值班)。如果能在鍋爐房顯示兩個熱交換站內各熱交換器的熱水溫度,則值班人員僅在熱水溫度異常時才需到各熱交換站檢查設備,這樣便可解決上述問題。我公司曾就此問題找專業(yè)公司作過方案,其報價在人民幣萬元左右,后因種種原因該項目未實施。經過分析,本人發(fā)現(xiàn)可以用單片機+智能儀表以低成本實現(xiàn)溫度遠程顯示,并且經過實驗取得了成功,現(xiàn)將設計方案簡述如下:三、控制要求及解決方案選擇 1、 兩個熱交換站分高低區(qū)共安裝有8個熱交換器,正常水溫在45oC至65oC之間;兩個熱交換站與鍋爐房的距離分別為500米和600米左右。2、 要求在鍋爐房能以巡回及定點兩種方式顯示8個熱交換器的熱水溫度,巡回方式以3秒為周期輪流更新及顯示各熱交換器熱水溫度。定點方式時每按上鍵或下鍵一次則顯示上或下一個熱交換器熱水溫度,每3秒自動更新數(shù)據一次。3、 根據控制要求選擇單片機+智能儀表的解決方案:用帶通訊接口的智能儀表安裝在現(xiàn)場測量溫度,設計制作一個單片機裝置完成與智能儀表的通訊及數(shù)據顯示。四、通訊協(xié)議、智能儀表選擇及其參數(shù)介紹因熱水溫度信號變化較慢,因而對通信的速度要求不高,對于這種低速率遠距離的通訊選用RS-485總線適宜。RS-485是EIA(美國電子工業(yè)聯(lián)合會)在1983年公布的新的平衡傳輸標準,是工業(yè)界使用最為廣泛的雙向、平衡傳輸線標準接口,它以半雙工方式通信,支持多點連接,傳統(tǒng)驅動器允許創(chuàng)建多達32個節(jié)點的網絡,且其具有傳輸距離遠(最大傳輸距離為1200M),傳輸速度快(1200M時為100KBPS)等優(yōu)點。其連接方法如下圖所示。發(fā)送器接收器接收發(fā)送器120120為了滿足現(xiàn)場溫度檢測及與單片機裝置通訊的要求,必須選擇至少有5個溫度檢測點及具有RS485通訊端口的智能儀表。經過對市場上常用的溫度檢測儀進行分析,選擇由重慶川儀十八廠生產的XJ-08S型巡回檢測儀作現(xiàn)場測量儀表。(一)該儀表主要特點如下:1、 多量程方式,熱電偶、熱電阻,1-5V標準信號混合輸入,可通過鍵盤進行設置;2、 最多8個測量通道(能測量8個溫度信號);3、 采用RS-485通訊標準,可將各通道最新數(shù)據向上位機傳送。重要的是,該儀表的說明書詳細介紹了與該儀表進行數(shù)據交換的命令及格式,其通訊協(xié)議也相對較簡單,這給我們用單片機實現(xiàn)溫度遠程顯示降減低了難度(雖然有RS-485端口的儀表很多,但大多沒有通訊命令的詳細說明,給我們用單片機編程增加了難度)。(二)XJ-08S巡回檢測儀通訊協(xié)議1、通訊口設置l 通訊方式:RS-485標準電平l 同步方式:起停同步方式l 波特率:9600BPSl 通訊距離:不大于1200Ml 通訊線:二線l 數(shù)據代碼:ASCII碼l 數(shù)據格式:每字符10位,1個起始位,8個數(shù)據位,1個停止位2、 數(shù)據傳輸格式l 地址:2字節(jié)(高字節(jié)在前,低字節(jié)在后);l 數(shù)據:按地址順序,儀表數(shù)據傳輸格式為十六進制2字節(jié)定點數(shù);2字節(jié)定點數(shù)=低字節(jié)高4位(ASCII碼)+低字節(jié)低4位(ASCII碼)高字節(jié)高4位(ASCII碼)+高字節(jié)低4位(ASCII碼)若數(shù)據為負數(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ù)據CRCCRl :通訊起始符l DE:儀表設備號(地址)l 幀類型:操作命令l 幀數(shù)據:各種操作命令所對應的命令及數(shù)據l CRC:校驗字節(jié)(除外CRC之前的其他幾個字節(jié)的異或值)l CR:結束符(回車符)4、應用中用到的命令及數(shù)據格式:l 讀儀表全部動態(tài)數(shù)據命令幀 DE RD CRC CRl 命令回送幀正確DE RD 幀數(shù)據 CRC CR錯誤DE * * CRC CR例:讀28號儀表的全部動態(tài)數(shù)據命令:1CRD64,0D(ASCII碼40 31 43 52 44 36 34 0d)錯誤返回碼1C*72,0D(ASCII碼40 31 43 2A 2A 37 32 0D)正確返回數(shù)據 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公司生產的AT89S8252-24PC單片機,其主要參數(shù)及特點如下:l 與MCS-51產品兼容(其引腳圖見原理圖)l 具有8K字節(jié)可擦寫的FLASH內部程序存儲器,可擦寫1000次;2K字節(jié)EEPROM,可擦寫100,000次,SPI口(用PC機的并口連接條線即可通過SPI口下載程序,下載軟件可從網上下載,這樣可節(jié)省購買編程器的費用;)。注:筆者現(xiàn)已制作成了ISP2000三合一燒寫器,詳情見http:/www.mcudiy.coml 256字節(jié)RAM,32根可編程I/O線,可編程串行口,內置看門狗。與看門狗有關的特殊功能寄存器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以中斷方式工作,中斷程序將巡回/定點標志取反后直接跳到主程序中巡回/定點標志判斷程序前運行,由判斷程序完成巡回/定點的切換。按鍵信號由單片機P3.3,P3.4,P3.5引腳輸入。3、顯示電路設計為方便觀察,選用三個二位共陽級8段數(shù)碼顯示管(TOD5201AE)動態(tài)顯示,一位顯示儀表地址(從A至F),一位顯示通道號(從0至7通道),其余四位用來顯示實時溫度值;用單片機P1口驅動一片74HC244以吸收電流的方式控制段碼,用單片機P0.0至P0.5引腳驅動六個三極管(9012)控制位選。4、電源選用5V/1A市售成品開關電源。巡回/定點下儀表地址通道號實時溫度巡回/定點下儀表地址通道號實時溫度ABGnd上熱水溫度遠程顯示器A B Gnd120XJ-08S 巡回檢測儀AA B Gnd120XJ-08S 巡回檢測儀B5、 根據智能儀表通訊協(xié)議的要求,串行口定義為方式1工作,一幀10位:1個起始位、8個數(shù)據位、一個停止位;用一片75176完成數(shù)據的發(fā)送與接收,由于RS-485為半雙工,故用單片機P3.2引腳控制發(fā)送與接收的切換;兩個智能儀表處于RS-485總線的兩個端點,為提高可靠性,在RS-485總線的兩個端點上分別并聯(lián)一個120、1/4W終端電阻。l 系統(tǒng)方框圖如右示:l 單片機裝置電原理圖見下頁:765定時值00016ms00132ms01064ms011128ms100256ms101512ms1101024ms1112048ms看門狗溢出時間表6六、單片機軟件設計說明及程序流程圖為方便調試,采用模塊化編程,共分1個主模塊及5個子模塊,各模塊功能說明及流程圖如下(源程序見附錄):1、 主模塊(rand_main.a51)上電后程序顯示初始化標志并等待3秒,然后進入巡回模式,自動檢測地址為A(10)至F(15)的智能儀表,對在線的儀表及已使用通道以3秒為周期自動巡回讀取實時溫度并送數(shù)碼管顯示,儀表未在線或未用通道則自動跳過;定點模式時根據上、下按鍵情況自動向前或向后移動一個通道后等待下一次按鍵(向上至最高通道號時跳到上一個儀表的最低在用通道,向下至最低通道號時跳到下一個儀表的最高在用通道);等待期間以3秒為周期讀取當前儀表當前通道實時溫度并送數(shù)碼管顯示,另外,為了區(qū)分巡回、定點工作模式,定點工作模式時最低位數(shù)碼管以約0.5Hz的頻率閃爍顯示。當檢測到巡回/定點切換鍵按下時自動在巡回及定點模式間轉換,當檢測到溫度值低于199.9度時顯示-199.9度。主模塊流程圖見下頁:YD_N100=儀表地址TD_N=通道號YN開始上電初始化置SP巡回/定點標志=1? #0ah=yd_n100,#0=td_n清閃爍、調用命令發(fā)送模塊接收正確嗎?調用數(shù)據轉換程序 正常嗎?YN送顯示并延時3秒Td_n+1=td_nTd_n=8?YN0=Td_nNYYd_n100+1=yd_n100Yd_n100=10h?0ah=yd_n100startTd_n=0?開外部中斷1并置最低位閃爍清軟硬看門狗2秒定時到?下鍵?上鍵?NNNYYY調用命令發(fā)送程序調用數(shù)據轉換程序正確嗎?正確嗎?送顯示YNNY7=td_nYd_n100-1=yd_100Yd_n100=9?0fh=yd_100NNYYTd_n-1=td_n調用命令發(fā)送程序正確嗎?正確嗎?調用數(shù)據轉換程序NYYN送顯示、置2S定時初值上鍵處理流程與下鍵相似,此處從略。NY2、數(shù)據轉換子模塊(rand_data.a51)功能:本模塊先將ASCII碼轉換成BIN碼,然后將BIN碼轉換成BCD碼并將數(shù)據轉換成可直接顯示的格式入口:a=通道號出口:r1=個位,r2=十位,r3=百位,r4=千位(顯示數(shù)據)a=非0表示該通道未用注:本子模塊中直接將小數(shù)點信息加到相應位數(shù)據上,如需在某位顯示小數(shù)點,則將該位數(shù)據加10H,顯示子模塊根據此信息顯示小數(shù)點。各子程序功能介紹:l bcd2_bcd1:將r3,r4中的4位bcd碼由低至高分別存入r1,r2,r3,r4中;l ascii4_bcd3:將(r0)為首地址的字節(jié)ascii碼轉換成bcd碼并將bcd碼由低至高依次存放在r3,r4,r5中,r3,r4中各存放2位bcd碼,r5中存放一位bcd碼;l bin_bcd:將r1,r2中的bin碼轉換成bcd碼并將bcd碼由低至高依次存放在r3,r4,r5中,r3,r4中各存放2位bcd碼,r5中存放一位bcd碼;l ascii4_bin2:將(r0)為首地址的字節(jié)ascii碼轉換成2位bin碼存放在r1(低字節(jié)),r2(高字節(jié))中;注:(r0)指r0中內容l ascii_bin:將(r0)為地址的一位ascii碼轉換成bin碼存中。(高級子程序調用低級子程序以實現(xiàn)更強的功能,源程序中對各子程序有較詳細的注釋,故此處僅畫出主流程圖)開始計算通道數(shù)據首地址調用數(shù)據轉換程序還原小數(shù)位數(shù)存R6BCD碼超過5位嗎? 該通道數(shù)據為0X0ffff嗎?返回該通道未用信息YYNN退出轉換成可顯示數(shù)據存R1-R4有效位前的零消除處理返回數(shù)據正確信息負數(shù)處理,當數(shù)據小于-199.9時顯示-199.93、顯示、軟件看門狗、20ms定時器子程序(rand_disp.a51)功能:通過定時器0以1MS為周期動態(tài)顯示緩沖區(qū)中的內容;同時完成20ms定時器及軟件看門狗計數(shù);當軟件看門狗定時器溢出時自動復位。入口:以disp_buf為首地址依次存放從個位至十萬位待顯示數(shù)據,以disp_wc為首地址(位地址)依次存放個位至千位閃爍控制位信息,為0常亮,為1閃爍.T0中斷入口保護現(xiàn)場顯示碼表地址=dptrDisp_s_c取反Disp_c+1=disp_cDisp_c=R0Disp_s-1=disp_s,Disp_s=0?YN個位數(shù)據及閃爍信息=A,Ca閃閃爍 NR0=1?Y十位數(shù)據及閃爍信息=A,Ca閃閃爍 百位數(shù)據及閃爍信息=A,Ca閃閃爍 千位數(shù)據及閃爍信息=A,Ca閃閃爍 萬位數(shù)據=A a閃閃爍 十萬位數(shù)據=A a閃閃爍 百萬位數(shù)據=A (未用)a閃閃爍 千萬位數(shù)據=A (未用)a閃閃爍 NR0=2?YNR0=3?YNR0=4?YNR0=5?YNR0=6?YNR0=7?YNR0=8?YDisp_s:閃爍控制計數(shù)器Disp_s_c:閃爍控制標志Disp_c:顯示控制計數(shù)器出口:wdt中存放軟件看門狗計數(shù)值,time_20ms中存放20ms的計數(shù)值。Wdt溢出時跳至程序存儲器0000單元輸出處理a閃閃爍 Disp_c=10?NY0=disp_c20ms計數(shù)處理軟看門狗計數(shù)溢出YN跳至0000Ha閃閃爍 恢復現(xiàn)場閃閃爍 T0中斷返回l 將定時器0設定為模式1定時工作,每ms產生一次中斷,即顯示一位,每10ms 6位數(shù)據輪流顯示1ms;為進一步提高可靠性,在該模塊中設計了軟件看門狗,實現(xiàn)方法見源程序。模塊流程圖如本頁所示:、命令發(fā)送及接收控制子模塊(rand_send.a51)功能:發(fā)送命令緩沖區(qū)中命令并等待接收完畢,然后檢查接收到的數(shù)據,接收錯誤則重發(fā)命令,達到設定的次數(shù)仍錯則存入錯誤碼后退出.入口:A=儀表地址開始清除命令及接收緩沖區(qū)設置允許錯誤次數(shù)計算儀表命令偏移地址,取出命令及送入命令緩沖區(qū)校驗通過?YN發(fā)送命令在80ms內檢測到正在接收標志?YN在200ms內檢測到接收結束標志?YN接收到命令錯信息? YN返回命令錯信息允許錯誤次數(shù)-1允許錯誤次數(shù)=0?YN緩沖區(qū)結束標志符正確?YN清正在接收標志返回錯誤信息校驗接收緩沖區(qū)中數(shù)據返回正確信息退出返回校驗錯信息出口:A=0 表示接收正確 1 表示校驗錯 *表示命令錯N表示無回應模塊流程圖如下:、串行接收子模塊(rand_rec.a51)功能:串行接收模塊通過中斷自動執(zhí)行,程序檢測到時置ri_f標志并開始接收,檢測到回車符時清ri_f后退出,接收到的數(shù)據存放在以rec_buf為首地址的緩沖區(qū)中。外部中斷1入口斷按鍵釋放?NY延時40ms去抖延時40ms去抖清看門狗定時器關中斷巡回/定點標志取反跳至主程序start處斷串行中斷入口斷接收中斷?接收緩沖區(qū)首地址=rec_buf_zYRI_F:正在接收標志REC_BUF_Z:接收指針中斷返回斷返NRI_F=0?接收到?1=RI_F數(shù)據存入接收緩沖區(qū)接收到0dh?YYYNNN0=RI_F接收緩沖區(qū)溢出?YN0=RI_F保護現(xiàn)場恢復現(xiàn)場清RI串行中斷(rand_rec.a51)流程圖巡回/定點鍵中斷(rand_key.a51)流程圖、巡回定點轉換檢測模塊(rand_key.a51)功能:模塊通過外部中斷自動執(zhí)行,檢測到巡回定點按鍵后先延時去抖動,并等待按鍵釋放后將巡回定點標志位取反,然后自動跳至主模塊中start處,并不返回原中斷點。模塊流程圖如見本頁:七、調測及運行情況介紹1、 調試步驟:l 硬件連接:將各芯片插在面包板上并用導線按原理圖連接l 軟件開發(fā)環(huán)境:Keil uVision2 for Windows ,該軟件的模擬調試器支持C語言及匯編語言源代碼調試,其匯編程序支持宏匯編及模塊化編程,使用方便。l 首先在模擬調試器中調試各子模塊,各子模塊調試正常后再將各子模塊及主模塊全部匯編連接成目標文件,最后將目標代碼下載到單片機中并連接智能儀表進行統(tǒng)調。2、 該系統(tǒng)軟件部分除報警子模塊外已全部開發(fā)完成并實際測試通過,測試時用一對長度約1100M的0.5mm2 普通電話線作為單片機裝置與兩個智能儀表的通訊線,經過一個多星期的連續(xù)運行觀察,運行可靠穩(wěn)定,完全滿足使用要求。注:報警子模塊的開發(fā)及硬件制版工作正在進行中。八、結束語用單片機+智能儀表構成的溫度遠程顯示系統(tǒng)總造價約人民幣7000元(兩塊智能儀表+溫度傳感器約3500元,通訊電纜約2000元,單片機裝置及施工費用約1500元),與采用其它方案的系統(tǒng)比較造價較低,其硬件及軟件的設計、制作都較簡單,有一定的電子及單片機知識便可完成。同時對該裝置軟件稍加修改即可與其他帶有RS-485通訊端口的儀器儀表通訊(如變頻器、電路傳感器等),實現(xiàn)遠程測量、監(jiān)視及控制。與發(fā)達國家相比,我國單片機應用的普及程度較低。通過該實例說明,我們完全可以把我們學到的單片機知識應用到實際工作中,直接創(chuàng)造經濟效益。九、參考資料電子工業(yè)出版社徐愛鈞彭秀華編著電子工業(yè)出版社余永權主編電子工業(yè)出版社ATMEL公司重慶川儀十八廠清華大學出版社孫廷才 王杰 孫中健 編著2001年11期十、附錄(源程序)、主模塊(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ù)據段1byte_buffI segment idata ;定義字節(jié)數(shù)據段2bit_buff segment data bitaddressable;定義位數(shù)據段bit_flag segment bitstack segment idata;定義堆棧數(shù)據段 rseg stack;為堆棧保留20個字節(jié)ds 20 CSEG AT 00H;定義絕對代碼段USING 0;選擇工作寄存器組第0組lJMP rand;復位時程序執(zhí)行執(zhí)行點CSEG AT 03H;外部中斷0RETICSEG AT 0BH;定時器0中斷l(xiāng)JMP I_T0CSEG AT 13H;外部中斷1ljmp keyRETICSEG AT 1BH;定時器1中斷RETICSEG AT 23H;串行中斷l(xiāng)jmp rec_siRSEG BYTE_BUFFtd_temp: ds 1TD_n: DS 1;通道號YD_n100: ds 1;儀表地址;-rseg bit_flagkey_work:dbit 1ri_f: dbit 1;串行口正在接收標志;-主程序RSEG prog;-符號定義key_f equ p3.3key_up equ p3.4key_down equ p3.5wdt_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 0FCHTL0_L EQU 06BH;設定定時器0為1MS中斷初值;-初始化代碼clear_wdt macro;清硬看門狗宏定義orl 96h,#2ENDM rand:ORL 96H,#0E1H;啟動硬件看門狗mov p0,#0ffhmov r0,#20hmov a,#0start_300:mov r0,ainc r0cjne r0,#128,start_300setb key_work;置巡回定點標志mov p3,#0ffhmov p2,#0ffhmov disp_wc,#0;初始化閃爍控制位mov ip,#ip_n;設置串行,定時器0中斷為高級中斷mov scon,#scon_cMOV TMOD,#tmod_nMOV TH0,#TH0_H;設定定時器初值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;清接收中標志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;清看門狗定時器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_20mscjne 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;清看門狗定時器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秒鐘定時設定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_wdtjnb 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秒鐘定時設定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,$retend、數(shù)據轉換子模塊(rand_data.a51);-2-rand_data.a51-name rand_dataextrn idata (rec_buf)public ascii_bcdprog SEGMENT CODE;定義代碼段byte_buff segment data;定義字節(jié)數(shù)據段1byte_buffI segment idata ;定義字節(jié)數(shù)據段2bit_buff segment data bitaddressable;定義位尋址區(qū)字節(jié)數(shù)據段rseg progusing 0;-ASCII_BCD:mov b,#8;計算該通道數(shù)據偏移首地址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;為負數(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,r4dec ajnz asc_100;數(shù)據小于-199.9時顯示-199.9mov r4,#23hajmp asc_swasc_100:mov r4,#23hmov r3,#9mov r2,#19hmov r1,#9ajmp asc_sw_1asc_ok:acall bcd2_bcd1;正常數(shù)據處理程序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碼轉換為每字節(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,#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ù)點信息jz bcd2_outadd a,#ar1mov r0,amov a,r0add a,#10hmov r0,abcd2_out:ret;-ASCii4_BCD3轉換子程序;入口: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轉換子程序;入口: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,#0mov r5,#0mov r6,#16;設置二進制數(shù)位數(shù)clr cbin_0:mov a,r1rlc amov r1,amov a,r2rlc amov r2,amov r0,#ar3mov r7,#3;設置BCD字節(jié)數(shù)bin_1:mov a,r0addc a,r0da amov r0,ainc r0djnz r7,bin_1djnz r6,bin_0POP PSWPOP ACCret;-ASCII4_BIN2轉換子程序;入口: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轉換子程序;入口:R0=ASCII地址;出口:A=BIN碼ascii_bin:mov a,r0clr csubb a,#3ahjnc ascii_0add a,#7ascii_0:add a,#3retend、顯示、軟件看門狗及20ms定時器子模塊(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,wdt prog SEGMENT CODE;定義代碼段 BYTE_BUFF segment data;定義字節(jié)數(shù)據段1 byte_buffI segment idata ;定義字節(jié)數(shù)據段2 bit_buff segment data bitaddressable;定義位數(shù)據段 RSEG BYTE_BUFFwdt: ds 1time_s_c: ds 1time_20ms: ds 1DISP_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_buffdisp_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 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顯示個位mov c,disp_c_1mov A,disp_bufmov p1,#0FFHmov 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;顯示通道號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計數(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;-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 ou c h a -1; 1a 1b 1c1d 1e 1f 20 21 2223END、命令發(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正在接收標志PUBLIC send_orderprog SEGMENT CODE;定義代碼段byte_buff segment data;定義字節(jié)數(shù)據段1byte_buffI segment idata ;定義字節(jié)數(shù)據段2bit_buff segment data bitaddressable;定義位數(shù)據段rseg byte_buffsend_n:ds 1order_buf:ds 10rseg progdd_c equ 4;等待回應20m數(shù)cw_n equ 7;設置允許錯誤次數(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 R0DJNZ DPL,SEND_A;-發(fā)送命令控制程序mov send_n,#cw_n;設置允許錯誤次數(shù)mov b,#10clr csubb a,bmov b,#8mul abmov dptr,#a_ordermov r0,#order_buf-1mov r1
收藏