六、數(shù)顯
0——9999顯示
程序介紹:利用S51的串行口功能,實(shí)現(xiàn)數(shù)碼管0—
—9999 的循環(huán)顯示。實(shí)際應(yīng)用例如:電子計(jì)分牌。
程序?qū)嵗?999.ASM):
ORG 0000H
MAIN:
GEE EQU 30H
SHI EQU 31H
BEI EQU 32H
QIAN EQU 33H ;定義個(gè)十百千
MOV GEE,#00H
MOV SHI,#00H
MOV BEI,#00H
MOV QIAN,#00H ;賦初值
MOV SCON,#00H ;串行口工作于方式
0.同步移位
;顯示個(gè),十,百,千//////////////////////////////////
DISPLAY:
ACALL DELAY ;延時(shí)
MOV DPTR,#SETTAB
MOV A,GEE
MOVC A,@A+DPTR
MOV SBUF,A
D1: JNB TI,D1
17
CLR TI
MOV DPTR,#SETTAB
MOV A,SHI
MOVC A,@A+DPTR
MOV SBUF,A
D2: JNB TI,D2
CLR TI
MOV DPTR,#SETTAB
MOV A,BEI
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV DPTR,#SETTAB
MOV A,QIAN
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
;/////////////////////////////////////////////
;個(gè),十,百,千的依次加一/////////////////////
INC GEE
MOV A,GEE
CJNE A,#0AH,DISPLAY
MOV GEE,#00H
INC SHI
MOV A,SHI
CJNE A,#0AH,DISPLAY
18
MOV SHI,#00H
INC BEI
MOV A,BEI
CJNE A,#0AH,DISPLAY
MOV BEI,#00H
INC QIAN
MOV A,QIAN
CJNE A,#0AH,DISPLAY
MOV QIAN,#00H
AJMP DISPLAY
;//////////////////////////////////////////////////
;延時(shí)//////////////////////////////////////////////
DELAY: MOV R1,#0FFH
E1: MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,E1
RET
;/////////////////////////////////////////////
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,
F6H,0EEH,3EH,9CH,7AH,9EH,8EH ;數(shù)顯代碼
END
七、AD 轉(zhuǎn)換
7.1 AD轉(zhuǎn)換(數(shù)碼顯示)
程序介紹:利用ADC0809模擬通道3輸入電壓,經(jīng)單片機(jī)
19
處理后在數(shù)碼管上用相對(duì)應(yīng)的16進(jìn)制數(shù)顯示出來(lái),0—5V對(duì)
應(yīng)為0--0FFH,實(shí)際應(yīng)用例如:數(shù)據(jù)采集。
程序操作:程序?qū)懲晟想娺\(yùn)行后,用本機(jī)配帶的專用起微調(diào)
圖15所示電位器,會(huì)在數(shù)碼管上看到隨不同電壓而變化的對(duì)
應(yīng)16進(jìn)制值。也可以用
萬(wàn)用表實(shí)ADC0809IN3腳
電壓,來(lái)檢驗(yàn)所對(duì)應(yīng)顯
示的16進(jìn)制數(shù)。
圖15
程序?qū)嵗╝d.asm):
ORG 0000H
MAIN1:
ACALL DELAY ;延時(shí)
ACALL AD ;呼叫AD子程序
;將轉(zhuǎn)換的數(shù)字量屏蔽高位低位送顯////////////////////
MOV 31H,30H
MOV A,30H
ANL A,#0FH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D1: JNB TI,D1
CLR TI
;//////////////////////////////////////////////////
;將轉(zhuǎn)換的數(shù)字量屏蔽低位高位送顯////////////////////
MOV A,30H
20
ANL A,#0F0H
SWAP A
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D2: JNB TI,D2
CLR TI
;//////////////////////////////////////////////////
AJMP MAIN1 ;返回主程序
AD: MOV DPTR,#7F00H ;指向轉(zhuǎn)換地址
MOV A,#03H ;指向轉(zhuǎn)換口
MOVX @DPTR,A ;轉(zhuǎn)換
MOV R1,#64H
D3: DJNZ R1,D3 ;等100微秒轉(zhuǎn)換完
MOVX A,@DPTR ;轉(zhuǎn)換后的值給A
MOV 30H,A ;轉(zhuǎn)換的值給30H
RET
DELAY: ;延時(shí)
MOV R2,#0FFH
D14: MOV R3,#0FFH
D12: DJNZ R3,D12
DJNZ R2,D14
RET
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH
21
7.2 十六進(jìn)制兩位數(shù)加法器(數(shù)碼顯示)
程序介紹:將ADC0809輸入的兩個(gè)不同電壓(相同電
壓也可相加,只是為舉例說(shuō)明,所以取不同電壓)所對(duì)應(yīng)
的16進(jìn)制數(shù)相加顯示出來(lái)。實(shí)際應(yīng)用例如:取代加法運(yùn)放
電路。
程序操作:程序?qū)懲晟想娺\(yùn)行后,用本機(jī)配帶的鐘表
起微調(diào)圖16所示電位器,輸入兩個(gè)不同電壓,數(shù)碼管會(huì)顯
示兩個(gè)不同的對(duì)應(yīng)16進(jìn)制數(shù),隨后數(shù)碼管會(huì)顯示兩個(gè)16
進(jìn)制數(shù)相加的值。
程序?qū)嵗╝dd2.asm):
ORG 0000H
MAIN:
ADNUMBER EQU 30H ;AD轉(zhuǎn)換值
ADDNUMBER EQU 31H ;加數(shù)值1
ADL EQU 32H ;//
ADH EQU 33H ;ADL轉(zhuǎn)換高低位值
DISL EQU 34H ;//
DISH EQU 35H ;顯示高低位值
ADDTOTAL EQU 36H ;第一次AD轉(zhuǎn)換值
ADDJW EQU 37H ;加法進(jìn)位數(shù)
ADDHOLD EQU 38H
;賦初值////////////////////////////////////////////
MOV ADDHOLD,#00H
MOV ADDNUMBER,#00H
MOV ADL,#00H
MOV ADH,#00H
MOV DISL,#00H
22
MOV DISH,#00H
MOV ADDJW,#00H
MOV ADDTOTAL,#00H
;//////////////////////////////////////////////////
MAIN1:
ACALL AD ;呼叫AD子程序
ACALL DELAY ;延時(shí)
ACALL CAIFEN ;呼叫AD值拆分為高
低的程序
ACALL DISPLAY ;呼叫顯示子程序
MOV A,ADNUMBER ;取AD值
CJNE A,ADDHOLD,ADD3 ;與上次AD值比
較,不相等,即輸入了新的AD值,去AD3執(zhí)行
AJMP MAIN1 ;是相等的,證
明沒(méi)有輸入新的AD值,回去顯示老的AD值
ADD3: MOV A,ADDHOLD
CJNE A,#00H,ADD4
MOV ADDHOLD,ADNUMBER ;有一種情況就
是是第一次進(jìn)來(lái),AD保持值里面是放的初值00,與取的AD值
不同,是這種情況,也返回去
AJM MAIN1
ADD4: MOV ADDNUMBER,ADDHOLD ;是真的輸入
了新的AD值,將上次AD值給加數(shù),為調(diào)加法程序做準(zhǔn)備
MOV ADDHOLD,ADNUMBER ;將這次的AD
值也保持起來(lái)。準(zhǔn)備與上一個(gè)AD值相加
;顯示這次輸入的AD值////////////////////////////////
ACALL DELAY
ACALL CAIFEN
23
ACALL DISPLAY
;//////////////////////////////////////////////////
DISPLAY1:
ACALL DELAY ;延時(shí)
ACALL ADD1 ;呼叫加法子程序
ACALL DISPLAY ;顯示
LOOP: AJMP LOOP ;返回主程序
;///////////////////////////////////////AD轉(zhuǎn)換
AD:
MOV DPTR,#7F00H;指向轉(zhuǎn)換地址
MOV A,#03H ;指向轉(zhuǎn)換口
MOVX @DPTR,A ;轉(zhuǎn)換
MOV R1,#64H
D1: DJNZ R1,D1 ;等100微秒轉(zhuǎn)換完
MOVX A,@DPTR ;轉(zhuǎn)換后的值給A
MOV ADNUMBER,A ;轉(zhuǎn)換的值給30H
RET
;//////////////////////////////////////////////////
;拆分AD值程序//////////////////////////////////////
CAIFEN:
MOV A,ADNUMBER
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADNUMBER
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
24
MOV DISH,ADH ;給顯示值
RET
;//////////////////////////////////////////////////
;顯示//////////////////////////////////////////////
DISPLAY:
MOV A,DISL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV A,DISH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
MOV A,ADDJW
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D5: JNB TI,D5
CLR TI
MOV SBUF,#00H
D6: JNB TI,D6
CLR TI
RET
;//////////////////////////////////////////////////
25
;加法程序//////////////////////////////////////////
ADD1:
CLR C
MOV A,ADDNUMBER ;取上次AD值
ADDC A,ADDHOLD ;與這次AD值相加
MOV ADDTOTAL,A ;將此次加的值給和
值
JNC ADDJW1 ;有無(wú)進(jìn)位?
INC ADDJW ;有進(jìn)位,進(jìn)位值給
ADDJW
ADDJW1: ANL A,#0FH
MOV DISL,A ;加值取低位
MOV A,ADDTOTAL
ANL A,#0F0H
SWAP A
MOV DISH,A ;加值取高位
RET
;//////////////////////////////////////////////////
DELAY: ;延時(shí)
MOV R3,#0AH
DD1: MOV R1,#0FFH
D2 : MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,D2
DJNZ R3,DD1
RET
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
26
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH
END
7.3 軟件濾波
程序介紹(7.31—7.34):您如果接觸過(guò)模電就知道,
在采集電壓量時(shí)經(jīng)常會(huì)碰到干擾,而在模電中經(jīng)常所采用
的方法就是加電容濾波,這是用硬件實(shí)現(xiàn)的。實(shí)際上軟件
完全可以達(dá)到濾波的效果,現(xiàn)在介紹的是一種最經(jīng)典的方
法。在一次電壓量的采集中,在很短的時(shí)間內(nèi)對(duì)它進(jìn)行6
次采集,將它轉(zhuǎn)換為數(shù)字量后求和(7.31),分析出6次
輸入中的最大值和最小值(7.32),然后減去最大值和最
小值(7.33),除以4(7.44)得到平均值。這樣實(shí)際上
就完成了一次軟件濾波。省去了復(fù)雜的硬件,而且取得了
好而精確的效果。實(shí)際應(yīng)用例如:精確數(shù)據(jù)采集。
程序操作:程序?qū)懭肷想娺\(yùn)行后,用本實(shí)驗(yàn)儀自帶的
鐘表起微調(diào)電位器依次輸入6個(gè)電壓量。7.31程序會(huì)顯示
和值,7.32會(huì)繼續(xù)顯示最大和最小值,7.33程序會(huì)繼續(xù)顯
示減后所剩的值,7.34程序會(huì)繼續(xù)顯示除4后的值。
算法說(shuō)明:為什么要選擇取6個(gè)數(shù)進(jìn)行計(jì)算呢?因?yàn)?br>
在匯編中做計(jì)算是非常麻煩的,取6個(gè)數(shù),減去最大值和
最小值后,取平均值是除4.計(jì)算機(jī)的內(nèi)部計(jì)算都是二進(jìn)
制,而二進(jìn)制每除一個(gè)2,實(shí)際上是向右移一次。所以為
了計(jì)算方便,我們選擇取6個(gè)數(shù),最后在算除法的時(shí)候,
只需要用單片機(jī)自帶的右移位命令移2次就行了。
27
7.31 十六進(jìn)制六位數(shù)加法(數(shù)碼顯示)
程序?qū)嵗?add6.asm):
ORG 0000H
MAIN:
ADNUMBER EQU 30H ;AD轉(zhuǎn)換值
ADDNUMBER EQU 31H ;加數(shù)值1
ADL EQU 32H ;//
ADH EQU 33H ;ADL轉(zhuǎn)換高低位值
DISL EQU 34H ;//
DISH EQU 35H ;顯示高低位值
ADDTOTAL EQU 36H ;第一次AD轉(zhuǎn)換值
ADDJW EQU 37H ;加法進(jìn)位數(shù)
ADDHOLD EQU 38H
ADDFLAG EQU 39H ;加標(biāo)志
ENDFLAG EQU 40H
;賦初值////////////////////////////////////////////
MOV ADDHOLD,#00H
MOV ADDNUMBER,#00H
MOV ADL,#00H
MOV ADH,#00H
MOV DISL,#00H
MOV DISH,#00H
MOV ADDJW,#00H
MOV ADDFLAG,#00H
MOV ENDFLAG,#00H
MOV ADDTOTAL,#00H
;//////////////////////////////////////////////////
MAIN1:
28
;顯示AD值//////////////////////////////////////////
ACALL DELAY
ACALL DELAY
ACALL AD
MAIN3:
ACALL CAIFEN
ACALL DISPLAY
;//////////////////////////////////////////////////
;加這次的AD值,并判是否加了六次,是的話就進(jìn)入死循環(huán)
ACALL DELAY
ACALL ADD1
ACALL DISPLAY
INC ADDFLAG
MOV A,ADDFLAG
CJNE A,#06H,MAIN2
LOOP: AJMP LOOP
;//////////////////////////////////////////////////
;沒(méi)有加到六次,繼續(xù)取值加,如果沒(méi)有來(lái)新AD值,還是去
顯示上次加的值,有新AD值來(lái)了,顯示這次AD值,并加上上
次AD值,顯示///////////////////////////////////////
MAIN2: ACALL DELAY
ACALL AD
MOV A,ADNUMBER
CJN A,ADDTOTAL,MAIN3
AJM MAIN2
;//////////////////////////////////////////////////
;////////////////////////////////////////////AD轉(zhuǎn)換
AD:
29
MOV DPTR,#7F00H ;指向轉(zhuǎn)換地址
MOV A,#03H ;指向轉(zhuǎn)換口
MOVX @DPTR,A ;轉(zhuǎn)換
MOV R1,#64H
D1: DJNZ R1,D1 ;等100微秒轉(zhuǎn)換完
MOVX A,@DPTR ;轉(zhuǎn)換后的值給A
MOV ADNUMBER,A ;轉(zhuǎn)換的值給30H
RET
;//////////////////////////////////////////////////
;拆分AD值程序//////////////////////////////////////
CAIFEN:
MOV A,ADNUMBER
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADNUMBER
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
MOV DISH,ADH ;給顯示值
RET
;//////////////////////////////////////////////////
;顯示//////////////////////////////////////////////
DISPLAY:
MOV A,DISL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
30
D3: JNB TI,D3
CLR TI
MOV A,DISH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
MOV A,ADDJW
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D5: JNB TI,D5
CLR TI
MOV SBUF,#00H
D6: JNB TI,D6
CLR TI
RET
;//////////////////////////////////////////////////
;加法程序//////////////////////////////////////////
ADD1:
CLR C
MOV ADDTOTAL,ADNUMBER
MOV A,ADNUMBER
ADDC A,ADDHOLD
MOV ADDHOLD,A
JNC ADDJW1
INC ADDJW
31
ADDJW1: ANL A,#0FH
MOV DISL,A ;加值取低位
MOV A,ADDHOLD
ANL A,#0F0H
SWAP A
MOV DISH,A ;加值取高位
RET
;///////////////////////////////////////////////
DELAY: ;延時(shí)
MOV R3,#0AH
DD1: MOV R1,#0FFH
D2 : MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,D2
DJNZ R3,DD1
RET
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH
END
7.32 求六位和中的最大值和最小值(數(shù)碼顯示)
程序?qū)嵗╝dd61.asm):
ORG 0000H
MAIN:
ADNUMBER EQU 30H ;AD轉(zhuǎn)換值
ADL EQU 32H ;//
32
ADH EQU 33H ;ADL轉(zhuǎn)換高低位值
DISL EQU 34H ;//
DISH EQU 35H ;顯示高低位值
ADDTOTAL EQU 36H ;第一次AD轉(zhuǎn)換值
ADDJW EQU 37H ;加法進(jìn)位數(shù)
ADDHOLD EQU 38H
ADDFLAG EQU 39H ;加標(biāo)志
ENDFLAG EQU 40H
ADH1 EQU 41H ;AD中最大的值
ADL1 EQU 42H ;AD中最小的值
ADHOLDH EQU 43H
ADHOLDL EQU 44H ;求AD最大值與最小
值時(shí)AD的比較值,即以此兩個(gè)值為比較中轉(zhuǎn)
FOUR EQU 45H
SUB EQU 46H ;減去高低位后的值
JWHOLD EQU 47H ;保存進(jìn)位值
;賦初值////////////////////////////////////////////
MOV ADDHOLD,#00H
MOV ADL,#00H
MOV ADH,#00H
MOV DISL,#00H
MOV DISH,#00H
MOV ADDJW,#00H
MOV ADDFLAG,#00H
MOV ENDFLAG,#00H
MOV ADDTOTAL,#00H
MOV ADH1,#00H
MOV ADL1,#00H
33
MOV ADHOLDH,#00H
MOV FOUR,#00H
MOV ADHOLDL,#00H
MOV JWHOLD,#00H
MOV SUB,#00H
;//////////////////////////////////////////////////
MAIN1:
ACALL DELAY
ACALL DELAY
ACALL AD ;取AD值
MAIN3: ACALL CAIFEN
ACALL DISPLAY ;顯示
ACALL DELAY
ACALL DELAY
;算最大值和最小值//////////////////////////////////
ACALL ADDH
ACALL ADDL
;//////////////////////////////////////////////////
;加和值顯示///////////////////////////////////////
ACALL ADD1
ACALL DISPLAY
;//////////////////////////////////////////////////
;判是否加到了6次///////////////////////////////////
INC ADDFLAG
MOV A,ADDFLAG
CJNE A,#06H,MAIN2
;/////////////////////////////////////////////////
ACALL DELAY
34
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL CAIFEN1 ;拆最小值
ACALL CAIFEN2 ;拆最大值
ACALL DISPLAY ;顯示最大值最小值
LOOP: AJMP LOOP
;判有沒(méi)有來(lái)新AD值,沒(méi)有顯示以前,有顯示現(xiàn)在的///////
MAIN2:
ACALL DELAY
ACALL AD
MOV A,ADNUMBER
CJNE A,ADDTOTAL,MAIN3
AJMP MAIN2
;//////////////////////////////////////////////////
;AD轉(zhuǎn)換////////////////////////////////////////////
AD: MOV DPTR,#7F00H ;指向轉(zhuǎn)換地址
MOV A,#03H ;指向轉(zhuǎn)換口
MOVX @DPTR,A ;轉(zhuǎn)換
MOV R1,#64H
D1: DJNZ R1,D1 ;等100微秒轉(zhuǎn)換完
MOVX A,@DPTR ;轉(zhuǎn)換后的值給A
MOV ADNUMBER,A ;轉(zhuǎn)換的值給30H
RET
;//////////////////////////////////////////////////
;拆分AD值程序//////////////////////////////////////
35
CAIFEN:
MOV A,ADNUMBER
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADNUMBER
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
MOV DISH,ADH ;給顯示值
RET
;//////////////////////////////////////////////////
;顯示//////////////////////////////////////////////
DISPLAY:
MOV A,DISL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV A,DISH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
MOV A,ADDJW
MOV DPTR,#SETTAB
36
MOVC A,@A+DPTR
MOV SBUF,A
D5: JNB TI,D5
CLR TI
MOV A,FOUR
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D6: JNB TI,D6
CLR TI
RET
;////////////////////////////////////////////////
;加法程序////////////////////////////////////////
ADD1:
CLR C
MOV ADDTOTAL,ADNUMBER
MOV A,ADNUMBER
ADDC A,ADDHOLD
MOV ADDHOLD,A
JNC ADDJW1
INC ADDJW
ADDJW1: ANL A,#0FH
MOV DISL,A ;加值取低位
MOV A,ADDHOLD
ANL A,#0F0H
SWAP A
MOV DISH,A ;加值取高位
RET
37
;//////////////////////////////////////////////////
;AD值中的最大值////////////////////////////////////
ADDH:
MOV A,ADH1
CJNE A,#00H,ADDH1
MOV ADH1,ADNUMBER
AJMP RE
ADDH1: MOV A,ADNUMBER
CLR C
SUBB A,ADH1
JC RE
MOV ADH1,ADNUMBER
RE: RET
;//////////////////////////////////////////////////
;AD值中的最小值////////////////////////////////////
ADDL:
MOV A,ADL1
CJNE A,#00H,ADDL1
MOV ADL1,ADNUMBER
AJMP RE1
ADDL1: MOV A,ADNUMBER
CLR C
SUBB A,ADL1
JNC RE1
MOV ADL1,ADNUMBER
RE1: RET
;//////////////////////////////////////////////////
;分解AD最小值的個(gè),十位////////////////////////////
38
CAIFEN1:
MOV A,ADL1
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADL1
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
MOV DISH,ADH ;給顯示值
RET
;/////////////////////////////////////////////
;分解AD最大值的個(gè),十位///////////////////////
CAIFEN2:
MOV A,ADH1
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADH1
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV JWHOLD,ADDJW
MOV ADDJW,ADL
MOV FOUR,ADH ;給顯示值
RET
;//////////////////////////////////////////////////
DELAY: ;延時(shí)
MOV R3,#0AH
39
DD1: MOV R1,#0FFH
D2 : MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,D2
DJNZ R3,DD1
RET
;//////////////////////////////////////////////////
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH
END
7.33 求減去最大和最小值后的值(數(shù)碼顯示)
程序?qū)嵗╝dd62.asm)
ORG 0000H
MAIN:
ADNUMBER EQU 30H ;AD轉(zhuǎn)換值
ADL EQU 32H ;//
ADH EQU 33H ;ADL轉(zhuǎn)換高低位值
DISL EQU 34H ;//
DISH EQU 35H ;顯示高低位值
ADDTOTAL EQU 36H ;第一次AD轉(zhuǎn)換值
ADDJW EQU 37H ;加法進(jìn)位數(shù)
ADDHOLD EQU 38H
ADDFLAG EQU 39H ;加標(biāo)志
ENDFLAG EQU 40H
ADH1 EQU 41H ;AD中最大的值
40
ADL1 EQU 42H ;AD中最小的值
ADHOLDH EQU 43H
ADHOLDL EQU 44H ;求AD最大值與最小
值時(shí)AD的比較值,即以此兩個(gè)值為比較中轉(zhuǎn)
FOUR EQU 45H
SUB EQU 46H ;減去高低位后的值
JWHOLD EQU 47H ;保存進(jìn)位值
;賦初值///////////////////////////////////////////
MOV ADDHOLD,#00H
MOV ADL,#00H
MOV ADH,#00H
MOV DISL,#00H
MOV DISH,#00H
MOV ADDJW,#00H
MOV ADDFLAG,#00H
MOV ENDFLAG,#00H
MOV ADDTOTAL,#00H
MOV ADH1,#00H
MOV ADL1,#00H
MOV ADHOLDH,#00H
MOV FOUR,#00H
MOV ADHOLDL,#00H
MOV JWHOLD,#00H
MOV SUB,#00H
;//////////////////////////////////////////////////
MAIN1:
ACALL DELAY
ACALL DELAY
41
ACALL AD ;取AD值
MAIN3: ACALL CAIFEN
ACALL DISPLAY ;顯示
ACALL DELAY
ACALL DELAY
;算最大值和最小值//////////////////////////////////
ACALL ADDH
ACALL ADDL
;//////////////////////////////////////////////////
;加和值顯示///////////////////////////////////////
ACALL ADD1
ACALL DISPLAY
;/////////////////////////////////////////////////
;判是否加到了6次//////////////////////////////////
INC ADDFLAG
MOV A,ADDFLAG
CJNE A,#06H,MAIN2
;//////////////////////////////////////////////////
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL CAIFEN1 ;拆最小值
ACALL CAIFEN2 ;拆最大值
ACALL DISPLAY ;顯示最大值最小值
ACALL DELAY
42
ACALL DELAY
ACALL JIAN1 ;呼叫減最大值最小
值程序
ACALL CAIFEN3 ;拆分
ACALL DISPLAY ;顯示減去最大值最
小值后的值
ACALL DELAY
ACALL DELAY
ACALL DELAY
LOOP: AJMP LOOP
;判有沒(méi)有來(lái)新AD值,沒(méi)有顯示以前,有顯示現(xiàn)在的///
MAIN2:
ACALL DELAY
ACALL AD
MOV A,ADNUMBER
CJNE A,ADDTOTAL,MAIN3
AJMP MAIN2
;/////////////////////////////////////////////////
;AD轉(zhuǎn)換///////////////////////////////////////////
AD:
MOV DPTR,#7F00H ;指向轉(zhuǎn)換地址
MOV A,#03H ;指向轉(zhuǎn)換口
MOVX @DPTR,A ;轉(zhuǎn)換
MOV R1,#64H
D1: DJNZ R1,D1 ;等100微秒轉(zhuǎn)換完
MOVX A,@DPTR ;轉(zhuǎn)換后的值給A
MOV ADNUMBER,A ;轉(zhuǎn)換的值給30H
RET
43
;//////////////////////////////////////////////////
;拆分AD值程序//////////////////////////////////////
CAIFEN:
MOV A,ADNUMBER
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADNUMBER
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
MOV DISH,ADH ;給顯示值
RET
;//////////////////////////////////////////////////
;顯示//////////////////////////////////////////////
DISPLAY:
MOV A,DISL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV A,DISH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
44
MOV A,ADDJW
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D5: JNB TI,D5
CLR TI
MOV A,FOUR
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D6: JNB TI,D6
CLR TI
RET
;/////////////////////////////////////////////
;加法程序/////////////////////////////////////
ADD1:
CLR C
MOV ADDTOTAL,ADNUMBER
MOV A,ADNUMBER
ADDC A,ADDHOLD
MOV ADDHOLD,A
JNC ADDJW1
INC ADDJW
ADDJW1:
ANL A,#0FH
MOV DISL,A ;加值取低位
MOV A,ADDHOLD
ANL A,#0F0H
45
SWAP A
MOV DISH,A ;加值取高位
RET
;/////////////////////////////////////////////////
;AD值中的最大值///////////////////////////////////
ADDH:
MOV A,ADH1
CJNE A,#00H,ADDH1
MOV ADH1,ADNUMBER
AJMP RE
ADDH1: MOV A,ADNUMBER
CLR C
SUBB A,ADH1
JC RE
MOV ADH1,ADNUMBER
RE: RET
;//////////////////////////////////////////////////
;AD值中的最小值////////////////////////////////////
ADDL:
MOV A,ADL1
CJNE A,#00H,ADDL1
MOV ADL1,ADNUMBER
AJMP RE1
ADDL1: MOV A,ADNUMBER
CLR C
SUBB A,ADL1
JNC RE1
MOV ADL1,ADNUMBER
46
RE1: RET
;//////////////////////////////////////////////////
;分解AD最小值的個(gè),十位////////////////////////////
CAIFEN1:
MOV A,ADL1
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADL1
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
MOV DISH,ADH ;給顯示值
RET
;/////////////////////////////////////////////////
;分解AD最大值的個(gè),十位///////////////////////////
CAIFEN2:
MOV A,ADH1
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADH1
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV JWHOLD,ADDJW
MOV ADDJW,ADL
MOV FOUR,ADH ;給顯示值
RET
47
;//////////////////////////////////////////////////
;分解減去最高位和最低位的數(shù)////////////////////////
CAIFEN3:
MOV A,SUB
ANL A,#0FH
MOV ADL,A
MOV A,SUB
ANL A,#0F0H
SWAP A
MOV ADH,A
MOV DISL,ADL
MOV DISH,ADH
RET
;//////////////////////////////////////////////////
;減去最高位和最低位////////////////////////////////
JIAN1:
MOV FOUR,#00H
MOV ADDJW,JWHOLD
MOV A,ADDHOLD ;取和值
CLR C
SUBB A,ADH1 ;減最高位
JNC JIAN2
DEC ADDJW ;有進(jìn)位,高位減一
JIAN2:
CLR C
SUBB A,ADL1 ;減低位
JNC TUI ;無(wú)進(jìn)位出去,有進(jìn)
位高位減一
48
DEC ADDJW
TUI: MOV SUB,A ;取減的值給SUB
RET
;//////////////////////////////////////////////////
;濾波//////////////////////////////////////////////
DELAY: ;延時(shí)
MOV R3,#0AH
DD1: MOV R1,#0FFH
D2 : MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,D2
DJNZ R3,DD1
RET
;//////////////////////////////////////////////////
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH
END
7.34 除4所得軟件濾波值(數(shù)碼顯示)
程序?qū)嵗╝dd63.asm):
ORG 0000H
MAIN:
ADNUMBER EQU 30H ;AD轉(zhuǎn)換值
ADL EQU 32H ;//
ADH EQU 33H ;ADL轉(zhuǎn)換高低位值
DISL EQU 34H ;//
49
DISH EQU 35H ;顯示高低位值
ADDTOTAL EQU 36H ;第一次AD轉(zhuǎn)換值
ADDJW EQU 37H ;加法進(jìn)位數(shù)
ADDHOLD EQU 38H
ADDFLAG EQU 39H ;加標(biāo)志
ENDFLAG EQU 40H
ADH1 EQU 41H ;AD中最大的值
ADL1 EQU 42H ;AD中最小的值
ADHOLDH EQU 43H
ADHOLDL EQU 44H ;求AD最大值與最小
值時(shí)AD的比較值,即以此兩個(gè)值為比較中轉(zhuǎn)
FOUR EQU 45H
SUB EQU 46H ;減去高低位后的值
JWHOLD EQU 47H ;保存進(jìn)位值
;賦初值//////////////////////////////////////////
MOV ADDHOLD,#00H
MOV ADL,#00H
MOV ADH,#00H
MOV DISL,#00H
MOV DISH,#00H
MOV ADDJW,#00H
MOV ADDFLAG,#00H
MOV ENDFLAG,#00H
MOV ADDTOTAL,#00H
MOV ADH1,#00H
MOV ADL1,#00H
MOV ADHOLDH,#00H
MOV FOUR,#00H
50
MOV ADHOLDL,#00H
MOV JWHOLD,#00H
MOV SUB,#00H
;//////////////////////////////////////////////////
MAIN1:
ACALL DELAY
ACALL DELAY
ACALL AD ;取AD值
MAIN3: ACALL CAIFEN
ACALL DISPLAY ;顯示
ACALL DELAY
ACALL DELAY
;算最大值和最小值////////////////////////////////
ACALL ADDH
ACALL ADDL
;//////////////////////////////////////////////////
;加和值顯示////////////////////////////////////////
ACALL ADD1
ACALL DISPLAY
;//////////////////////////////////////////////////
;判是否加到了6次///////////////////////////////////
INC ADDFLAG
MOV A,ADDFLAG
CJNE A,#06H,MAIN2
;/////////////////////////////////////////////////
ACALL DELAY
ACALL DELAY
ACALL DELAY
51
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL CAIFEN1 ;拆最小值
ACALL CAIFEN2 ;拆最大值
ACALL DISPLAY ;顯示最大值最小值
ACALL DELAY
ACALL DELAY
ACALL JIAN1 ;呼叫減最大值最小值程序
ACALL CAIFEN3 ;拆分
ACALL DISPLAY ;顯示減去最大值最小值后的
值
ACALL DELAY
ACALL DELAY
ACALL DELAY
ACALL LUBO ;濾波程序
ACALL DELAY
ACALL CAIFEN3
ACALL DISPLAY ;顯示
LOOP: AJMP LOOP
;判有沒(méi)有來(lái)新AD值,沒(méi)有顯示以前,有顯示現(xiàn)在的///////
MAIN2:
ACALL DELAY
ACALL AD
MOV A,ADNUMBER
CJNE A,ADDTOTAL,MAIN3
AJMP MAIN2
;//////////////////////////////////////////////////
52
;AD轉(zhuǎn)換////////////////////////////////////////////
AD:
MOV DPTR,#7F00H ;指向轉(zhuǎn)換地址
MOV A,#03H ;指向轉(zhuǎn)換口
MOVX @DPTR,A ;轉(zhuǎn)換
MOV R1,#64H
D1: DJNZ R1,D1 ;等100微秒轉(zhuǎn)換完
MOVX A,@DPTR ;轉(zhuǎn)換后的值給A
MOV ADNUMBER,A ;轉(zhuǎn)換的值給30H
RET
;//////////////////////////////////////////////
;拆分AD值程序//////////////////////////////////
CAIFEN:
MOV A,ADNUMBER
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADNUMBER
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
MOV DISH,ADH ;給顯示值
RET
;//////////////////////////////////////////////////
;顯示//////////////////////////////////////////////
DISPLAY:
MOV A,DISL
MOV DPTR,#SETTAB
53
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV A,DISH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
MOV A,ADDJW
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D5: JNB TI,D5
CLR TI
MOV A,FOUR
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D6: JNB TI,D6
CLR TI
RET
;//////////////////////////////////////////////////
;加法程序//////////////////////////////////////////
ADD1:
CLR C
MOV ADDTOTAL,ADNUMBER
54
MOV A,ADNUMBER
ADDC A,ADDHOLD
MOV ADDHOLD,A
JNC ADDJW1
INC ADDJW
ADDJW1: ANL A,#0FH
MOV DISL,A ;加值取低位
MOV A,ADDHOLD
ANL A,#0F0H
SWAP A
MOV DISH,A ;加值取高位
RET
;//////////////////////////////////////////////////
;AD值中的最大值////////////////////////////////////
ADDH:
MOV A,ADH1
CJNE A,#00H,ADDH1
MOV ADH1,ADNUMBER
AJMP RE
ADDH1: MOV A,ADNUMBER
CLR C
SUBB A,ADH1
JC RE
MOV ADH1,ADNUMBER
RE: RET
;//////////////////////////////////////////////////
;AD值中的最小值////////////////////////////////////
ADDL:
55
MOV A,ADL1
CJNE A,#00H,ADDL1
MOV ADL1,ADNUMBER
AJMP RE1
ADDL1: MOV A,ADNUMBER
CLR C
SUBB A,ADL1
JNC RE1
MOV ADL1,ADNUMBER
RE1: RET
;//////////////////////////////////////////////////
;分解AD最小值的個(gè),十位////////////////////////////
CAIFEN1:
MOV A,ADL1
ANL A,#0FH
MOV ADL,A ;取低位
MOV A,ADL1
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV DISL,ADL
MOV DISH,ADH ;給顯示值
RET
;////////////////////////////////////////////////
;分解AD最大值的個(gè),十位//////////////////////////
CAIFEN2:
MOV A,ADH1
ANL A,#0FH
56
MOV ADL,A ;取低位
MOV A,ADH1
ANL A,#0F0H
SWAP A
MOV ADH,A ;取高位
MOV JWHOLD,ADDJW
MOV ADDJW,ADL
MOV FOUR,ADH ;給顯示值
RET
;//////////////////////////////////////////////////
;分解減去最高位和最低位的數(shù)////////////////////////
CAIFEN3:
MOV A,SUB
ANL A,#0FH
MOV ADL,A
MOV A,SUB
ANL A,#0F0H
SWAP A
MOV ADH,A
MOV DISL,ADL
MOV DISH,ADH
RET
;//////////////////////////////////////////////////
;減去最高位和最低位////////////////////////////////
JIAN1:
MOV FOUR,#00H
MOV ADDJW,JWHOLD
MOV A,ADDHOLD ;取和值
57
CLR C
SUBB A,ADH1 ;減最高位
JNC JIAN2
DEC ADDJW ;有進(jìn)位,高位減一
JIAN2:
CLR C
SUBB A,ADL1 ;減低位
JNC TUI ;無(wú)進(jìn)位出去,有進(jìn)位高位
減一
DEC ADDJW
TUI: MOV SUB,A ;取減的值給SUB
RET
;//////////////////////////////////////////////////
;濾波//////////////////////////////////////////////
LUBO:
;除2//利用二進(jìn)制右移位來(lái)實(shí)現(xiàn)///////////////////////
CLR C
MOV A,ADDJW
RRC A
MOV ADDJW,A
MOV A,SUB
RRC A
MOV SUB,A
;//////////////////////////////////////////////////
;再除一次2,達(dá)到除4的效果//// //////////////////////
CLR C
MOV A,ADDJW
RRC A
58
MOV ADDJW,A
MOV A,SUB
RRC A
MOV SUB,A
;//////////////////////////////////////////////////
RET
;//////////////////////////////////////////////////
DELAY: ;延時(shí)
MOV R3,#0AH
DD1: MOV R1,#0FFH
D2 : MOV R2,#0FFH
DJNZ R2,$
DJNZ R1,D2
DJNZ R3,DD1
RET
;//////////////////////////////////////////////////
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH
END
7.4過(guò)程檢定
程序介紹(7.41—7.43):本程序用軟件模擬了一個(gè)振
動(dòng)傳感器軟件搜頻的全過(guò)程。振動(dòng)傳感器是通過(guò)在激勵(lì)端
給傳感器一定頻率的電壓,在感應(yīng)端感應(yīng)一定頻率的電壓
值。所以它能測(cè)很多東西,比如不同的壓力所感應(yīng)不同電
壓值,不同油品粘度也可以感應(yīng)不同電壓值,等等。但是
59
這存在一個(gè)問(wèn)題?就是傳感器何時(shí)才能達(dá)到諧振狀態(tài)呢,
于是這就要給激勵(lì)端變化的頻率來(lái)測(cè)感應(yīng)端的電壓,感應(yīng)
端的電壓在這個(gè)變化頻率內(nèi)何時(shí)最大,這時(shí)所給的頻率就
是所搜到的諧振頻率。以前沒(méi)有單片機(jī)軟件控制時(shí),我們
只能通過(guò)硬件不斷的給激勵(lì)端變化頻率電壓,然后測(cè)感應(yīng)
端電壓,來(lái)搜到諧振頻率。7.41是在p1.0口輸出并顯示變
化的頻率200-250hz(省略了2的顯示),7.42在7.41的基礎(chǔ)
上增加了AD輸入量的顯示。
7.43將會(huì)在您輸入變化AD值后,將搜到的AD值與
頻率值顯示出來(lái)。實(shí)際應(yīng)用如壓力檢測(cè),粘度檢測(cè)。
程序操作:因?yàn)?.41和7.42只是7.43的鋪墊。所以在
將7.43程序?qū)懭氩⑸想姾,您將?huì)在數(shù)碼管左兩位看到
200-250HZ變化頻率的顯示(省略2),右邊看到輸入AD
值的顯示。您可以用鐘表起微調(diào)AD輸入的電位器,使AD
值上升,下降。在變化頻率顯示完后,程序?qū)?huì)把您所輸
入的最大的AD值與其所對(duì)應(yīng)的頻率一起顯示出來(lái),這就是
軟件模擬的全過(guò)程。
7.41 P1.0口產(chǎn)生200——250HZ變化頻率輸出(數(shù)
碼顯示)
程序?qū)嵗╢25dis.asm):
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP DIN1
MAIN:
;定義頻率200和300//////////////////////////////////
F2H EQU 30H
60
F2L EQU 31H
F3H EQU 32H
F3L EQU 33H
;/////////////////////////////////////////////////
DISFLAG EQU 34H ;顯示標(biāo)志
DISL EQU 35H ;顯示低位
DISH EQU 36H ;顯示高位
;定義頻率保持初值//////////////////////////////////
MOV R1,#50
MOV R2,#02H
;//////////////////////////////////////////////////
;顯示賦初值////////////////////////////////////////
MOV DISFLAG,#00H
MOV DISL,#00H
MOV DISH,#00H
;//////////////////////////////////////////////////
;頻率賦初值////////////////////////////////////////
MOV F2H,#0F6H
MOV F2L,#3BH
MOV F3H,#0F8H
MOV F3L,#2FH
;/////////////////////////////////////////////////
CLR P1.0 ;在P1.0口產(chǎn)生一個(gè)低電
平,一個(gè)脈沖是由一個(gè)高電平和一個(gè)低電平組成的
MOV TMOD,#00010000B;定時(shí)器工作于方式1
MOV TH1,F2H
MOV TL1,F2L ;200HZ輸出
SETB EA ;開(kāi)總中斷
61
SETB TR1 ;開(kāi)定時(shí)器1運(yùn)行
SETB ET1 ;開(kāi)定時(shí)器1允許
DISPLAY:
MOV SBUF,#00H
D1: JNB TI,D1
CLR TI
MOV SBUF,#00H
D2: JNB TI,D2
CLR TI
MOV A,DISL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV A,DISH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
ACALL DELAY
AJMP DISPLAY
LOOP: AJMP LOOP
DIN1:
CPL P1.0 ;取反P1.0口,實(shí)際是為了不斷
的將p1.0的電平關(guān)系轉(zhuǎn)換,即產(chǎn)生了頻率
;頻率保持時(shí)間//////////////////////////////////////
62
DJNZ R1,RE
MOV R1,#50
DJNZ R2,RE
MOV R2,#02H
;//////////////////////////////////////////////////
INC DISFLAG
MOV A,DISFLAG
CJNE A,#0AH,FF
MOV DISFLAG,#00H
INC DISL
MOV A,DISL
CJNE A,#0AH,FF
MOV DISL,#00H
INC DISH
;/////////////////////////////////////////////////
FF: MOV A,F2H
CJNE A,F3H,XIA ;頻率高位到300HZ的高位
了嗎?
AJMP JIA
;頻率高位沒(méi)到300HZ的高位值,直接將低位值加1///////
XIA: INC F2L
MOV A,F2L
CJNE A,#00H,RE
INC F2H
MOV A,F2H
CJNE A,F3H,RE
;//////////////////////////////////////////////////
;頻率高位加到300HZ的高位值了,低位加一,到300HZ的低
63
位值了嗎,沒(méi)到出去,到了關(guān)定時(shí)器///////////////////
JIA:
INC F2L ;到了將200HZ頻率的低位加1
MOV A,F2L
CJNE A,#F3L,RE
CLR TR1
;//////////////////////////////////////////////////
RE:
MOV TH1,F2H
MOV TL1,F2L
RETI
DELAY:
MOV R3,#0FFH
D5: DJNZ R3,D5
RET
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH ;數(shù)顯代碼
END
7.42 在顯示頻率輸出的同時(shí)顯示AD值(數(shù)碼顯示)
程序?qū)嵗╝d25dis.asm):
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP DIN1
MAIN:
64
;定義頻率200和300//////////////////////////////////
F2H EQU 30H
F2L EQU 31H
F3H EQU 32H
F3L EQU 33H
;//////////////////////////////////////////////////
DISFLAG EQU 34H ;顯示標(biāo)志
DISL EQU 35H ;顯示低位
DISH EQU 36H ;顯示高位
ADNUMBER EQU 37H ;AD值
DISADL EQU 38H ;顯示AD低位
DISADH EQU 39H ;顯示AD高位
;定義頻率保持初值//////////////////////////////////
MOV R1,#100
MOV R2,#02H
;//////////////////////////////////////////////////
MOV ADNUMBER,#00H ;AD轉(zhuǎn)換數(shù)初值
;顯示高低位初值///////////////////////////////
MOV DISADL,#00H
MOV DISADH,#00H
;//////////////////////////////////////////////////
;顯示賦初值////////////////////////////////////////
MOV DISFLAG,#00H
MOV DISL,#00H
MOV DISH,#00H
;//////////////////////////////////////////////////
;頻率賦初值////////////////////////////////////////
MOV F2H,#0F6H
65
MOV F2L,#3BH
MOV F3H,#0F8H
MOV F3L,#2FH
;//////////////////////////////////////////////////
CLR P1.0 ;在P1.0口產(chǎn)生一
個(gè)低電平,一個(gè)脈沖是由一個(gè)高電平和一個(gè)低電平組成的
MOV TMOD,#00010000B;定時(shí)器工作于方
式1
MOV TH1,F2H
MOV TL1,F2L ;200HZ輸出
SETB EA ;開(kāi)總中斷
SETB TR1 ;開(kāi)定時(shí)器1運(yùn)行
SETB ET1 ;開(kāi)定時(shí)器1允許
ADDIS:
ACALL AD ;呼叫AD子程序
;將轉(zhuǎn)換的數(shù)字量屏蔽高位低位送DISADL保存////////////
MOV A,ADNUMBER
ANL A,#0FH
MOV DISADL,A
;//////////////////////////////////////////////////
;將轉(zhuǎn)換的數(shù)字量屏蔽低位,將高位送DISADH保存////////
MOV A,ADNUMBER
ANL A,#0F0H
SWAP A
MOV DISADH,A
;//////////////////////////////////////////////////
DISPLAY:
MOV A,DISADL
66
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D1: JNB TI,D1
CLR TI
MOV A,DISADH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D2: JNB TI,D2
CLR TI
MOV A,DISL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV A,DISH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
ACALL DELAY
AJMP ADDIS
LOOP: AJMP LOOP
DIN1:
PUSH ACC
67
CPL P1.0 ;取反P1.0口,實(shí)際是為了
不斷的將p1.0的電平關(guān)系轉(zhuǎn)換,即產(chǎn)生了頻率
;頻率保持時(shí)間//////////////////////////////////////
DJNZ R1,RE
MOV R1,#100
DJNZ R2,RE
MOV R2,#02H
;//////////////////////////////////////////////////
INC DISFLAG
MOV ` A,DISFLAG
CJNE A,#0AH,FF
MOV DISFLAG,#00H
INC DISL
MOV A,DISL
CJNE A,#0AH,FF
MOV DISL,#00H
INC DISH
;//////////////////////////////////////////////////
FF: MOV A,F2H
CJNE A,F3H,XIA ;頻率高位到300HZ的高位
了嗎?
AJMP JIA
;頻率高位沒(méi)到300HZ的高位值,直接將低位值加1///////
XIA: INC F2L
MOV A,F2L
CJNE A,#00H,RE
INC F2H
MOV A,F2H
68
CJNE A,F3H,RE
;//////////////////////////////////////////////////
;頻率高位加到300HZ的高位值了,低位加一,到300HZ的低
位值了嗎,沒(méi)到出去,到了關(guān)定時(shí)器///////////////////
JIA:
INC F2L ;到了將200HZ頻率的低位
加1
MOV A,F2L
CJNE A,#F3L,RE
CLR TR1
;//////////////////////////////////////////////////
RE:
MOV TH1,F2H
MOV TL1,F2L
POP ACC
RETI
AD: MOV DPTR,#7F00H ;指向轉(zhuǎn)換地址
MOV A,#03H ;指向轉(zhuǎn)換口
MOVX @DPTR,A ;轉(zhuǎn)換
MOV 40H,#64H
D6: DJNZ 40H,D6 ;等100微秒轉(zhuǎn)換完
MOVX A,@DPTR ;轉(zhuǎn)換后的值給A
MOV ADNUMBER,A ;轉(zhuǎn)換的值給30H
RET
DELAY:
MOV R3,#0FFH
D5: DJNZ R3,D5
RET
69
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH ;數(shù)顯代碼
END