基于單片機(jī)AT89S51制作的測(cè)速表電路圖

2013-10-29 13:57:00
  •   一。上圖所示是測(cè)速器的電路圖,由六位數(shù)碼管和測(cè)速接口組成。  1.測(cè)速的方法決定了測(cè)速信號(hào)的硬件連接,測(cè)速實(shí)際上就是測(cè)頻,因此,頻率測(cè)量的一些原則同樣適用于測(cè)速。  2.通常,可以用計(jì)數(shù)法、測(cè)脈寬法和等精度法來進(jìn)行測(cè)試。所謂計(jì)數(shù)法,就是給定一個(gè)閘門時(shí)間,在閘

一。上圖所示是測(cè)速器的電路圖,由六位數(shù)碼管和測(cè)速接口組成。

1.測(cè)速的方法決定了測(cè)速信號(hào)的硬件連接,測(cè)速實(shí)際上就是測(cè)頻,因此,頻率測(cè)量的一些原則同樣適用于測(cè)速。

2.通常,可以用計(jì)數(shù)法、測(cè)脈寬法和等精度法來進(jìn)行測(cè)試。所謂計(jì)數(shù)法,就是給定一個(gè)閘門時(shí)間,在閘門時(shí)間內(nèi)計(jì)數(shù)輸入的脈沖個(gè)數(shù);測(cè)脈寬法是利用待測(cè)信號(hào)的脈寬來控制計(jì)數(shù)門,對(duì)一個(gè)高精度的高頻計(jì)數(shù)信號(hào)進(jìn)行計(jì)數(shù)。由于閘門與被測(cè)信號(hào)不能同步,因此,這兩種方法都存在±1誤差的問題,第一種方法適用于信號(hào)頻率高時(shí)使用,第二種方法則在信號(hào)頻率低時(shí)使用。等精度法則對(duì)高、低頻信號(hào)都有很好的適應(yīng)性。這里為簡(jiǎn)化討論,僅采用計(jì)數(shù)法來進(jìn)行測(cè)試。

二。軟件編程

測(cè)量轉(zhuǎn)速,使用霍爾傳感器,被測(cè)軸安裝有12只磁鋼,即轉(zhuǎn)軸每轉(zhuǎn)一周,產(chǎn)生12個(gè)脈沖,要求將轉(zhuǎn)速值(轉(zhuǎn)/分)顯示在數(shù)碼管上。

程序如下:

dispbuf equ 5ah ;顯示緩沖區(qū)從5ah開始[page]

seccoun equ 59h

spcoun equ 57h ;速度計(jì)時(shí)器單元57h和58h,高位在前(57h單元中)

count equ 56h ;顯示時(shí)的計(jì)數(shù)器

spcalc bit 00h ;要求計(jì)算速度的標(biāo)志

hidden equ 16 ;消隱碼

g 0000h

ajmp start

g 1bh

jmp timer1 ;定時(shí)中斷1入口

g 30h

start: mov sp,#5fh ;設(shè)置堆棧

mov p1,#0ffh

mov p0,#0ffh

mov p2,#0ffh ;初始化,所有顯示器、led滅

mov tmod,#00010101b ;定時(shí)器t1工作于方式1,定時(shí)器0工作方式1 mov th1,#high(65536-4000)

mov tl1,#low(65536-4000)

setb tr1

setb et1 ;開定時(shí)器1中斷

setb ea

loop: jnb spcalc,loop ;如果未要求計(jì)算,轉(zhuǎn)本身循環(huán)

標(biāo)號(hào): muld功能:雙字節(jié)二進(jìn)制無符號(hào)數(shù)乘法

入口條件:被乘數(shù)在r2、r3中,乘數(shù)在r6、r7中。

出口信息:乘積在r2、r3、r4、r5中。

影響資源:psw、a、b、r2~r7

堆棧需求: 2字節(jié)

mov r2,spcoun

mov r3,spcoun+1

mov r6,#0

mov r7,#5 ;測(cè)得的數(shù)值是每秒計(jì)數(shù)值,轉(zhuǎn)為每分轉(zhuǎn)速(每一轉(zhuǎn)測(cè)12次,故乘5而非60)

call muld

標(biāo)號(hào): hb2 功能:雙字節(jié)十六進(jìn)制整數(shù)轉(zhuǎn)換成雙字節(jié)bcd碼整數(shù)

入口條件:待轉(zhuǎn)換的雙字節(jié)十六進(jìn)制整數(shù)在r6、r7中。

出口信息:轉(zhuǎn)換后的三字節(jié)bcd碼整數(shù)在r3、r4、r5中。

影響資源:psw、a、r2~r7 堆棧需求: 2字節(jié)

mov a,r4

mov r6,a

mov a,r5

mov r7,a ;將乘得的結(jié)果送r6r準(zhǔn)備轉(zhuǎn)換,這里結(jié)果不可能超過2字節(jié)

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 ;清計(jì)算標(biāo)志

jmp loop

主程序到此結(jié)束

timer1: push acc;acc入棧

push psw ;psw入棧

setb rs0 ;工作區(qū)1

jnb tr0,settr0 ;如果t0未運(yùn)行,則開啟t0

jmp go1

settr0:

setb tr0

go1:

inc seccoun ;秒計(jì)數(shù)器加1

mov a,seccoun

cjne a,#251,go2 ;如果未到1s則轉(zhuǎn)

clr tr0 ;1s到了,則停止t0的運(yùn)行

mov spcoun,th0

mov spcoun+1,tl0 ;讀取計(jì)數(shù)值

clr a

mov th0,a

mov tl0,a ;清計(jì)數(shù)器

setb spcalc ;要求主程序計(jì)算速度

mov seccoun,#0 ;清秒計(jì)數(shù)器

go2:

inc count ;用于顯示的計(jì)數(shù)器

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 ;指向當(dāng)前要顯示的顯示緩沖區(qū)

mov a,@r0 ;取第一個(gè)待顯示數(shù)

mov dptr,#disptab ;字形表首地址

movc a,@a+dptr ;取字形碼

mov p0,a ;將字形碼送p0位(段口)

mov a,count

mov dptr,#bittab ;字位表首地址

movc a,@a+dptr

l 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:db0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh,0ffh

三。程序分析

主程序在對(duì)定時(shí)器、計(jì)數(shù)器、堆棧等進(jìn)行初始化后即判斷標(biāo)志spcalc是否為1,如果為1,說明要求對(duì)數(shù)據(jù)進(jìn)行計(jì)算處理,首先將spcalc標(biāo)志清零,以保證下次能正常判斷,然后進(jìn)入數(shù)據(jù)處理程序,由于這里的閘門時(shí)間為1s,而顯示要求為轉(zhuǎn)/分,因此,要將測(cè)到的數(shù)據(jù)進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換的方法是將測(cè)得的數(shù)據(jù)乘以60,但由于轉(zhuǎn)軸上安裝有12只磁鋼,每旋轉(zhuǎn)一周可以得到12個(gè)脈沖,因此,要將測(cè)得的數(shù)據(jù)除以12,所以綜合起來,將測(cè)得的數(shù)據(jù)乘以5即可得到每分鐘的轉(zhuǎn)速。計(jì)算得到的結(jié)果是二進(jìn)制的整數(shù),要將數(shù)據(jù)送往顯示緩沖區(qū)需要將該數(shù)轉(zhuǎn)化為bcd碼。運(yùn)算得到的是壓縮bcd碼,需要將其轉(zhuǎn)換為非壓縮bcd碼,從標(biāo)號(hào)cbcd開始的一段程序即作了這樣的處理。需要說明的是,這里多位二進(jìn)制乘法和多位二進(jìn)制到bcd碼的轉(zhuǎn)換都是用了現(xiàn)成的成熟子程序,因此,首先將二進(jìn)制數(shù)轉(zhuǎn)換為壓結(jié)合實(shí)際bcd碼,然后再轉(zhuǎn)換成非壓縮bcd碼。定時(shí)器t1用作4ms定時(shí)發(fā)生器,在定時(shí)中斷程序中進(jìn)行數(shù)碼管的動(dòng)態(tài)掃描,同時(shí)產(chǎn)生1s的閘門信號(hào)。1s閘門信號(hào)的產(chǎn)生是通過一個(gè)計(jì)數(shù)器count,每次中斷時(shí)間為4ms,每計(jì)250次即為1s,到了1s后,即清除計(jì)數(shù)器count,然后關(guān)閉作為計(jì)數(shù)器用的t0,讀出th0、tl0中的數(shù)值,分別送入spcoun和spcoun+1單元,將t0中的值清空,置spcalc標(biāo)志為1,要求主程序進(jìn)行速度值的計(jì)算。這里還有一個(gè)細(xì)節(jié),用作1s閘門信號(hào)產(chǎn)生的count每次中斷都會(huì)加1,而t0卻有一個(gè)周期是被關(guān)閉的,因此,計(jì)數(shù)值是251而不是250. 來源:陰雨