測量轉速,使用霍爾感測器,被測軸安裝有12隻磁鋼,即轉軸每轉一周,產生12個脈衝,要求將轉速值(轉/分)顯示在數碼管上。 程序如下: DISPBUF EQU 5AH ;顯示緩衝區從5AH開始 SeCCoun EQU 59H SpCoun EQU 57H ;速度計時器單元57H和58H,高位在前(57H單元中) Count EQU 56H ;顯示時的計數器 SpCalc bit 00h ;要求計算速度的標誌 Hidden EQU 16 ;消隱碼 ORG 0000H AJMP START ORG 1BH JMP TIMER1 ;定時中斷1入口 ORG 30H START: MOV SP,#5FH ;設置堆棧 MOV P1,#0FFH MOV P0,#0FFH MOV P2,#0FFH ;初始化,所有顯示器、LED滅 MOV TMOD,#00010101B ;定時器T1工作於方式1,定時器0工作方式1 MOV TH1,#HIGH(65536-4000) MOV TL1,#LOW(65536-4000) SETB TR1 SETB ET1 ;開定時器1中斷 SETB EA LOOP: JNB SpCalc,LOOP ;如果未要求計算,轉本身循環 ;標號: MULD 功能:雙位元組二進位無符號數乘法 ;入口條件:被乘數在R2、R3中,乘數在R6、R7中。 ;出口信息:乘積在R2、R3、R4、R5中。 ;影響資源:PSW、A、B、R2~R7 堆棧需求: 2位元組 MOV R2,SpCoun MOV R3,SpCoun+1 MOV R6,#0 MOV R7,#5 ;測得的數值是每秒計數值,轉為每分轉速(每一轉測12次,故乘5而非60) CALL MULD ;標號: HB2 功能:雙位元組十六進位整數轉換成雙位元組BCD碼整數 ;入口條件:待轉換的雙位元組十六進位整數在R6、R7中。 ;出口信息:轉換后的三位元組BCD碼整數在R3、R4、R5中。 ;影響資源:PSW、A、R2~R7 堆棧需求: 2位元組 MOV A,R4 MOV R6,A MOV A,R5 MOV R7,A ;將乘得的結果送R6R準備轉換,這裡結果不可能超過2位元組 CALL HB2 CBCD: MOV DISPBUF,R3 ;最高位 MOV A,R4 ; ANL A,#0F0H ;去掉低4位 SWAP A ;將高4位切換到低4位 MOV DISPBUF+1,A MOV A,R4 ANL A,#0FH MOV DISPBUF+2,A MOV A,R5 ANL A,#0F0H SWAP A MOV DISPBUF+3,A MOV A,R5 ANL A,#0FH MOV DISPBUF+4,A CLR SpCalc ;清計算標誌 JMP LOOP ;主程序到此結束 TIMER1: PUSH ACC;ACC入棧 PUSH PSW ;PSW入棧 SETB RS0 ;工作區1 JNB TR0,SETTR0 ;如果T0未運行,則開啟T0 JMP GO1 SETTR0: SETB TR0 GO1: INC SecCoun ;秒計數器加1 MOV A,SecCoun CJNE A,#251,Go2 ;如果未到1s則轉 CLR TR0 ;1s到了,則停止T0的運行 MOV SpCoun,TH0 MOV SpCoun+1,TL0 ;讀取計數值 CLR A MOV TH0,A MOV TL0,A ;清計數器 SETB SpCalc ;要求主程序計算速度 MOV SecCoun,#0 ;清秒計數器 Go2: INC COUNT ;用於顯示的計數器 MOV A,COUNT CLR C SUBB A,#6 JZ N1 JMP N2 N1: MOV COUNT,#0 N2: MOV A,#DISPBUF ADD A,COUNT MOV R0,A ;指向當前要顯示的顯示緩衝區 MOV A,@R0 ;取第一個待顯示數 MOV DPTR,#DISPTAB ;字形表首地址 MOVC A,@A+DPTR ;取字形碼 MOV P0,A ;將字形碼送P0位(段口) MOV A,COUNT MOV DPTR,#BitTab ;字位表首地址 MOVC A,@A+DPTR ORL P2,#11111100B ANL P2,A MOV TH1,#HIGH(65536-4000) MOV TL1,#LOW(65536-4000) POP PSW POP ACC RETI BitTab: DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH DISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH ……其他數學運算程序(略) 主程序在對定時器、計數器、堆棧等進行初始化后即判斷標誌SpCalc是否為1,如果為1,說明要求對數據進行計算處理,首先將SpCalc標誌清零,以保證下次能正常判斷,然後進入數據處理程序,由於這裡的閘門時間為1s,而顯示要求為轉/分,因此,要將測到的數據進行轉換,轉換的方法是將測得的數據乘以60,但由於轉軸上安裝有12隻磁鋼,每旋轉一周可以得到12個脈衝,因此,要將測得的數據除以12,所以綜合起來,將測得的數據乘以5即可得到每分鐘的轉速。計算得到的結果是二進位的整數,要將數據送往顯示緩衝區需要將該數轉化為BCD碼。運算得到的是壓縮BCD碼,需要將其轉換為非壓縮BCD碼,從標號CBCD開始的一段程序即作了這樣的處理。需要說明的是,這裡多位二進位乘法和多位二進位到BCD碼的轉換都是用了現成的成熟子程序,因此,首先將二進位數轉換為壓結合實際BCD碼,然後再轉換成非壓縮BCD碼,看似多寫了些程序,實際上這對於保證程序的質量很有好處。 定時器T1用作4ms定時發生器,在定時中斷程序中進行數碼管的動態掃描,同時產生1s的閘門信號。1s閘門信號的產生是通過一個計數器Count,每次中斷時間為4ms,每計250次即為1s,到了1s后,即清除計數器Count,然後關閉作為計數器用的T0,讀出TH0、TL0中的數值,分別送入SpCoun和SpCoun+1單元,將T0中的值清空,置SpCalc標誌為1,要求主程序進行速度值的計算。這裡還有一個細節,用作1s閘門信號產生的Count每次中斷都會加1,而T0卻有一個周期是被關閉的,因此,計數值是251而不是250。 看完這一部份內容以後,請讀者自行完成以下工作: 1.試用測脈寬法測試速度(提示:80C51單片機內部有高精度信號源,而其計數器又具有門控特性),注意硬體設計要略作更改。 2.查找等精度測量原理,試設計等精度測量的硬體設計並編寫相應軟體。 |