歡迎您光臨本站 登入註冊首頁

概述

測量轉速,使用霍爾感測器,被測軸安裝有12隻磁鋼,即轉軸每轉一周,產生12個脈衝,要求將轉速值(轉/分)顯示在數碼管上。程序如下:DISPBUFEQU5AH;顯示緩衝區從5AH開始SeCCounEQU……

測量轉速,使用霍爾感測器,被測軸安裝有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.查找等精度測量原理,試設計等精度測量的硬體設計並編寫相應軟體。

[admin via 研發互助社區 ] 用51單片機及霍爾感測器製作的測速器電路圖已經有4116次圍觀

http://cocdig.com/docs/show-post-5197.html