51单片机实用汇编程序库(word)

51 单片机实用程序库

4.1 流水灯

程序介绍:利用P1 口通过一定延时轮流产生低电平

输出,以达到发光二极管轮流亮的效果。实际应用中例如: 广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP.ASM)

ORG 0000H

AJMP MAIN

ORG 0030H

MAIN:

9

MOV A,#00H

MOV P1,A ;灭所有的灯

MOV A,#11111110B

MAIN1:

MOV P1,A ;开最左边的灯

ACALL DELAY ;延时

RL A ;将开的灯向右边移

AJMP MAIN ;循环

DELAY:

MOV 30H,#0FFH

D1: MOV 31H,#0FFH

D2: DJNZ 31H,D2

DJNZ 30H,D1

RET

END

4.2 方波输出

程序介绍:P1.0 口输出高电平,延时后再输出低电

平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM):

ORG 0000H

MAIN:

;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY

SETB P1.0

ACALL DELAY

10

CLR P1.0

AJMP MAIN

;////////////////////////////////////////////////// DELAY:

MOV R1,#0FFH

DJNZ R1,$

RET

五、定时器功能实例

5.1 定时1 秒报警

程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。 程序实例(DIN1.ASM):

ORG 0000H

AJMP MAIN

ORG 000BH

AJMP DIN0 ;定时器0 入口

MAIN:

TFLA G EQU 34H ;时间秒标志,判是否到50 个

0.2 秒,即50*0.2=1 秒

MOV TMOD,#00000001B;定时器0 工作于方式

1

MOV TL0,#0AFH

MOV TH0,#3CH ;设定时时间为0.05 秒,定时

20 次则一秒

11

SETB EA ;开总中断

SETB ET0 ;开定时器0 中断允许

SETB TR0 ;开定时0 运行

SETB P1.0

LOOP: AJMP LOOP

DIN0:

;是否到一秒//////////////////////////////////////// INCC: INC TFLAG

MOV A,TFLAG

CJNE A,#20,RE

MOV TFLAG,#00H

CPL P1.0

;////////////////////////////////////////////////// RE:

MOV TL0,#0AFH

MOV TH0,#3CH ;设定时时间为0.05 秒,定时

20 次则一秒

RETI

END

5.2 频率输出公式

介绍:f=1/t

s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为 例:

200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电

平或低电平的时间为2500 微秒。这样,定时值应设为 65535-2500=63035,将它转换为十六进制则为:F63B。 具体程序请看f200.asm

频率递增:

200HZ:63035:F63B

250HZ:63535:F82F

300HZ:63868:F97C

5.3 200HZ 频率输出

程序介绍:利用定时器定时,在P1.0 口产生200HZ 的频率输出。实际应用例如:传感器前级推动。

程序实例(F200.ASM):

ORG 0000H

AJMP MAIN

ORG 001BH

AJMP DIN0

MAIN:

CLR P1.0 ;产生一个低电平,实际上

是从p1.0 口产生频率

MOV TMOD,#00010000B ;定时器1 工作于方式0

MOV TH1,#0F6H

MOV TL1,#3BH ;频率产生的时间,详细请

见频率公式

SETB EA ;开总中断

13

SETB TR1 ;开定时器1 运行

SETB ET1 ;开定时器1 允许

LOOP: AJMP LOOP ;无限循环

DIN0: CPL P1.0 ;产生一个高电平,

下次来就是低电平(因为取反),一个高电平和一个低电平 形成一个周期

MOV TH1,#0F6H

MOV TL1,#3BH ;重置频率产生时间

RETI ;返回

END

5.4 200——250HZ 变化频率输出

程序介绍:利用定时器定时时间的变化,由P1.0 口 产生200——250HZ 变化的频率。实际应用例如:传感器 前级推动、频率发生器。

程序实例(F250.ASM):

ORG 0000H

AJMP MAIN

ORG 001BH

AJMP DIN1

MAIN:

;定义频率200 和300////////////////////////////////// F2H EQU 30H

F2L EQU 31H

F3H EQU 32H

F3L EQU 33H

14

;////////////////////////////////////////////////// ;定义频率保持初值////////////////////////////////// MOV R1,#50

MOV R2,#02H

;////////////////////////////////////////////////// ;频率赋初值//////////////////////////////////////// MOV F2H,#0F6H

MOV F2L,#3BH

MOV F3H,#0F8H

MOV F3L,#2FH

;////////////////////////////////////////////////// CLR P1.0 ;在P1.0 口产生一个低

电平,一个脉冲是由一个高电平和一个低电平组成的 MOV TMOD,#00010000B ;定时器工作于方式1

MOV TH1,F2H

MOV TL1,F2L ;200HZ 输出

SETB EA ;开总中断

SETB TR1 ;开定时器1 运行

SETB ET1 ;开定时器1 允许

LOOP: AJMP LOOP

DIN1:

CPL P1.0 ;取反P1.0 口,实际

是为了不断的将p1.0 的电平关系转换,即产生了频率 ;频率保持时间////////////////////////////////////// DJNZ R1,RE

MOV R1,#50

DJNZ R2,RE

MOV R2,#02H

15

;////////////////////////////////////////////////// MOV A,F2H

CJNE A,F3H,XIA ;频率高位到300HZ

的高位了吗?

AJMP JIA ;频率高位没到

300HZ 的高位值,直接将低位值加1

XIA: INC F2L

MOV A,F2L

CJNE A,#00H,RE

INC F2H

MOV A,F2H

CJNE A,F3H,RE

;/////////////////////////////////////////////

;频率高位加到300HZ 的高位值了,低位加一,到300HZ 的低 位值了吗,没到出去,到了关定时器

JIA:

INC F2L ;到了将200HZ 频率的低位加1

MOV A,F2L

CJNE A,#F3L,RE

CLR TR1

;///////////////////////////////////////////// RE:

MOV TH1,F2H

MOV TL1,F2L

RETI

END

16

六、数显

0——9999 显示

程序介绍:利用S51 的串行口功能,实现数码管0— —9999 的循环显示。实际应用例如:电子计分牌。 程序实例(9999.ASM):

ORG 0000H

MAIN:

GEE EQU 30H

SHI EQU 31H

BEI EQU 32H

QIAN EQU 33H ;定义个十百千

MOV GEE,#00H

MOV SHI,#00H

MOV BEI,#00H

MOV QIAN,#00H ;赋初值

MOV SCON,#00H ;串行口工作于方式

0.同步移位

;显示个,十,百,千////////////////////////////////// DISPLAY:

ACALL DELAY ;延时

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

;///////////////////////////////////////////// ;个,十,百,千的依次加一///////////////////// 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

;////////////////////////////////////////////////// ;延时////////////////////////////////////////////// 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 ;数显代码

END

七、AD 转换

7.1 AD 转换(数码显示)

程序介绍:利用ADC0809 模拟通道3 输入电压,经单片机 19

处理后在数码管上用相对应的16 进制数显示出来,0—5V 对 应为0--0FFH,实际应用例如:数据采集。

程序操作:程序写完上电运行后,用本机配带的专用起微调 图15 所示电位器,会在数码管上看到随不同电压而变化的对 应16 进制值。也可以用

万用表实ADC0809IN3 脚

电压,来检验所对应显

示的16 进制数。

图15

程序实例(ad.asm):

ORG 0000H

MAIN1:

ACALL DELAY ;延时

ACALL AD ;呼叫AD 子程序

;将转换的数字量屏蔽高位低位送显//////////////////// 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

;////////////////////////////////////////////////// ;将转换的数字量屏蔽低位高位送显//////////////////// 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 ;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV R1,#64H

D3: DJNZ R1,D3 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV 30H,A ;转换的值给30H

RET

DELAY: ;延时

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 十六进制两位数加法器(数码显示)

程序介绍:将ADC0809 输入的两个不同电压(相同电 压也可相加,只是为举例说明,所以取不同电压)所对应 的16 进制数相加显示出来。实际应用例如:取代加法运放 电路。

程序操作:程序写完上电运行后,用本机配带的钟表

起微调图16 所示电位器,输入两个不同电压,数码管会显 示两个不同的对应16 进制数,随后数码管会显示两个16 进制数相加的值。

程序实例(add2.asm):

ORG 0000H

MAIN:

ADNUMBER EQU 30H ;AD 转换值

ADDNUMBER EQU 31H ;加数值1

ADL EQU 32H ;//

ADH EQU 33H ;ADL 转换高低位值

DISL EQU 34H ;//

DISH EQU 35H ;显示高低位值

ADDTOTAL EQU 36H ;第一次AD 转换值

ADDJW EQU 37H ;加法进位数

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 ;延时

ACALL CAIFEN ;呼叫AD 值拆分为高

低的程序

ACALL DISPLAY ;呼叫显示子程序

MOV A,ADNUMBER ;取AD 值

CJNE A,ADDHOLD,ADD3 ;与上次AD 值比

较,不相等,即输入了新的AD 值,去AD3 执行

AJMP MAIN1 ;是相等的,证

明没有输入新的AD 值,回去显示老的AD 值

ADD3: MOV A,ADDHOLD

CJNE A,#00H,ADD4

MOV ADDHOLD,ADNUMBER ;有一种情况就

是是第一次进来,AD 保持值里面是放的初值00,与取的AD 值 不同,是这种情况,也返回去

AJM MAIN1

ADD4: MOV ADDNUMBER,ADDHOLD ;是真的输入

了新的AD 值,将上次AD 值给加数,为调加法程序做准备 MOV ADDHOLD,ADNUMBER ;将这次的AD

值也保持起来。准备与上一个AD 值相加

;显示这次输入的AD 值//////////////////////////////// ACALL DELAY

ACALL CAIFEN

23

ACALL DISPLAY

;////////////////////////////////////////////////// DISPLAY1:

ACALL DELAY ;延时

ACALL ADD1 ;呼叫加法子程序

ACALL DISPLAY ;显示

LOOP: AJMP LOOP ;返回主程序

;///////////////////////////////////////AD 转换

AD:

MOV DPTR,#7F00H;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV R1,#64H

D1: DJNZ R1,D1 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV ADNUMBER,A ;转换的值给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 ;有无进位?

INC ADDJW ;有进位,进位值给

ADDJW

ADDJW1: ANL A,#0FH

MOV DISL,A ;加值取低位

MOV A,ADDTOTAL

ANL A,#0F0H

SWAP A

MOV DISH,A ;加值取高位

RET

;////////////////////////////////////////////////// DELAY: ;延时

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):您如果接触过模电就知道, 在采集电压量时经常会碰到干扰,而在模电中经常所采用 的方法就是加电容滤波,这是用硬件实现的。实际上软件 完全可以达到滤波的效果,现在介绍的是一种最经典的方 法。在一次电压量的采集中,在很短的时间内对它进行6

次采集,将它转换为数字量后求和(7.31),分析出6 次 输入中的最大值和最小值(7.32),然后减去最大值和最 小值(7.33),除以4(7.44)得到平均值。这样实际上 就完成了一次软件滤波。省去了复杂的硬件,而且取得了 好而精确的效果。实际应用例如:精确数据采集。 程序操作:程序写入上电运行后,用本实验仪自带的

钟表起微调电位器依次输入6 个电压量。7.31 程序会显示 和值,7.32 会继续显示最大和最小值,7.33 程序会继续显 示减后所剩的值,7.34 程序会继续显示除4 后的值。 算法说明:为什么要选择取6 个数进行计算呢?因为 在汇编中做计算是非常麻烦的,取6 个数,减去最大值和 最小值后,取平均值是除4.计算机的内部计算都是二进 制,而二进制每除一个2,实际上是向右移一次。所以为 了计算方便,我们选择取6 个数,最后在算除法的时候, 只需要用单片机自带的右移位命令移2 次就行了。 27

7.31 十六进制六位数加法(数码显示)

程序实例(add6.asm):

ORG 0000H

MAIN:

ADNUMBER EQU 30H ;AD 转换值

ADDNUMBER EQU 31H ;加数值1

ADL EQU 32H ;//

ADH EQU 33H ;ADL 转换高低位值

DISL EQU 34H ;//

DISH EQU 35H ;显示高低位值

ADDTOTAL EQU 36H ;第一次AD 转换值

ADDJW EQU 37H ;加法进位数

ADDHOLD EQU 38H

ADDFLAG EQU 39H ;加标志

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 值,并判是否加了六次,是的话就进入死循环 ACALL DELAY

ACALL ADD1

ACALL DISPLAY

INC ADDFLAG

MOV A,ADDFLAG

CJNE A,#06H,MAIN2

LOOP: AJMP LOOP

;////////////////////////////////////////////////// ;没有加到六次,继续取值加,如果没有来新AD 值,还是去 显示上次加的值,有新AD 值来了,显示这次AD 值,并加上上 次AD 值,显示/////////////////////////////////////// MAIN2: ACALL DELAY

ACALL AD

MOV A,ADNUMBER

CJN A,ADDTOTAL,MAIN3

AJM MAIN2

;////////////////////////////////////////////////// ;////////////////////////////////////////////AD 转换 AD:

29

MOV DPTR,#7F00H ;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV R1,#64H

D1: DJNZ R1,D1 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV ADNUMBER,A ;转换的值给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: ;延时

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 求六位和中的最大值和最小值(数码显示) 程序实例(add61.asm):

ORG 0000H

MAIN:

ADNUMBER EQU 30H ;AD 转换值

ADL EQU 32H ;//

32

ADH EQU 33H ;ADL 转换高低位值

DISL EQU 34H ;//

DISH EQU 35H ;显示高低位值

ADDTOTAL EQU 36H ;第一次AD 转换值

ADDJW EQU 37H ;加法进位数

ADDHOLD EQU 38H

ADDFLAG EQU 39H ;加标志

ENDFLAG EQU 40H

ADH1 EQU 41H ;AD 中最大的值

ADL1 EQU 42H ;AD 中最小的值

ADHOLDH EQU 43H

ADHOLDL EQU 44H ;求AD 最大值与最小

值时AD 的比较值,即以此两个值为比较中转

FOUR EQU 45H

SUB EQU 46H ;减去高低位后的值

JWHOLD EQU 47H ;保存进位值

;赋初值//////////////////////////////////////////// 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

;判有没有来新AD 值,没有显示以前,有显示现在的/////// MAIN2:

ACALL DELAY

ACALL AD

MOV A,ADNUMBER

CJNE A,ADDTOTAL,MAIN3

AJMP MAIN2

;////////////////////////////////////////////////// ;AD 转换//////////////////////////////////////////// AD: MOV DPTR,#7F00H ;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV R1,#64H

D1: DJNZ R1,D1 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV ADNUMBER,A ;转换的值给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 最小值的个,十位//////////////////////////// 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 最大值的个,十位/////////////////////// 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: ;延时

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 求减去最大和最小值后的值(数码显示) 程序实例(add62.asm)

ORG 0000H

MAIN:

ADNUMBER EQU 30H ;AD 转换值

ADL EQU 32H ;//

ADH EQU 33H ;ADL 转换高低位值

DISL EQU 34H ;//

DISH EQU 35H ;显示高低位值

ADDTOTAL EQU 36H ;第一次AD 转换值

ADDJW EQU 37H ;加法进位数

ADDHOLD EQU 38H

ADDFLAG EQU 39H ;加标志

ENDFLAG EQU 40H

ADH1 EQU 41H ;AD 中最大的值

40

ADL1 EQU 42H ;AD 中最小的值

ADHOLDH EQU 43H

ADHOLDL EQU 44H ;求AD 最大值与最小

值时AD 的比较值,即以此两个值为比较中转

FOUR EQU 45H

SUB EQU 46H ;减去高低位后的值

JWHOLD EQU 47H ;保存进位值

;赋初值/////////////////////////////////////////// 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

;判有没有来新AD 值,没有显示以前,有显示现在的/// MAIN2:

ACALL DELAY

ACALL AD

MOV A,ADNUMBER

CJNE A,ADDTOTAL,MAIN3

AJMP MAIN2

;///////////////////////////////////////////////// ;AD 转换/////////////////////////////////////////// AD:

MOV DPTR,#7F00H ;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV R1,#64H

D1: DJNZ R1,D1 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV ADNUMBER,A ;转换的值给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 最小值的个,十位//////////////////////////// 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 最大值的个,十位/////////////////////////// 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

;////////////////////////////////////////////////// ;分解减去最高位和最低位的数//////////////////////// 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 ;有进位,高位减一

JIAN2:

CLR C

SUBB A,ADL1 ;减低位

JNC TUI ;无进位出去,有进

位高位减一

48

DEC ADDJW

TUI: MOV SUB,A ;取减的值给SUB

RET

;////////////////////////////////////////////////// ;滤波////////////////////////////////////////////// DELAY: ;延时

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 所得软件滤波值(数码显示)

程序实例(add63.asm):

ORG 0000H

MAIN:

ADNUMBER EQU 30H ;AD 转换值

ADL EQU 32H ;//

ADH EQU 33H ;ADL 转换高低位值

DISL EQU 34H ;//

49

DISH EQU 35H ;显示高低位值

ADDTOTAL EQU 36H ;第一次AD 转换值

ADDJW EQU 37H ;加法进位数

ADDHOLD EQU 38H

ADDFLAG EQU 39H ;加标志

ENDFLAG EQU 40H

ADH1 EQU 41H ;AD 中最大的值

ADL1 EQU 42H ;AD 中最小的值

ADHOLDH EQU 43H

ADHOLDL EQU 44H ;求AD 最大值与最小

值时AD 的比较值,即以此两个值为比较中转

FOUR EQU 45H

SUB EQU 46H ;减去高低位后的值

JWHOLD EQU 47H ;保存进位值

;赋初值////////////////////////////////////////// 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

;判有没有来新AD 值,没有显示以前,有显示现在的/////// MAIN2:

ACALL DELAY

ACALL AD

MOV A,ADNUMBER

CJNE A,ADDTOTAL,MAIN3

AJMP MAIN2

;////////////////////////////////////////////////// 52

;AD 转换//////////////////////////////////////////// AD:

MOV DPTR,#7F00H ;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV R1,#64H

D1: DJNZ R1,D1 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV ADNUMBER,A ;转换的值给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 最小值的个,十位//////////////////////////// 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 最大值的个,十位////////////////////////// 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

;////////////////////////////////////////////////// ;分解减去最高位和最低位的数//////////////////////// 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 ;有进位,高位减一

JIAN2:

CLR C

SUBB A,ADL1 ;减低位

JNC TUI ;无进位出去,有进位高位

减一

DEC ADDJW

TUI: MOV SUB,A ;取减的值给SUB

RET

;////////////////////////////////////////////////// ;滤波////////////////////////////////////////////// LUBO:

;除2//利用二进制右移位来实现/////////////////////// CLR C

MOV A,ADDJW

RRC A

MOV ADDJW,A

MOV A,SUB

RRC A

MOV SUB,A

;////////////////////////////////////////////////// ;再除一次2,达到除4 的效果//// ////////////////////// CLR C

MOV A,ADDJW

RRC A

58

MOV ADDJW,A

MOV A,SUB

RRC A

MOV SUB,A

;////////////////////////////////////////////////// RET

;////////////////////////////////////////////////// DELAY: ;延时

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 过程检定

程序介绍(7.41—7.43):本程序用软件模拟了一个振 动传感器软件搜频的全过程。振动传感器是通过在激励端 给传感器一定频率的电压,在感应端感应一定频率的电压 值。所以它能测很多东西,比如不同的压力所感应不同电 压值,不同油品粘度也可以感应不同电压值,等等。但是 59

这存在一个问题?就是传感器何时才能达到谐振状态呢, 于是这就要给激励端变化的频率来测感应端的电压,感应 端的电压在这个变化频率内何时最大,这时所给的频率就 是所搜到的谐振频率。以前没有单片机软件控制时,我们 只能通过硬件不断的给激励端变化频率电压,然后测感应 端电压,来搜到谐振频率。7.41 是在p1.0 口输出并显示变 化的频率200-250hz(省略了2 的显示),7.42 在7.41 的基础 上增加了AD 输入量的显示。

7.43 将会在您输入变化AD 值后,将搜到的AD 值与 频率值显示出来。实际应用如压力检测,粘度检测。 程序操作:因为7.41 和7.42 只是7.43 的铺垫。所以在 将7.43 程序写入并上电后,您将会在数码管左两位看到 200-250HZ 变化频率的显示(省略2),右边看到输入AD 值的显示。您可以用钟表起微调AD 输入的电位器,使AD 值上升,下降。在变化频率显示完后,程序将会把您所输 入的最大的AD 值与其所对应的频率一起显示出来,这就是 软件模拟的全过程。

7.41 P1.0 口产生200——250HZ 变化频率输出(数 码显示)

程序实例(f25dis.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 ;显示标志

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 口产生一个低电

平,一个脉冲是由一个高电平和一个低电平组成的 MOV TMOD,#00010000B;定时器工作于方式1

MOV TH1,F2H

MOV TL1,F2L ;200HZ 输出

SETB EA ;开总中断

61

SETB TR1 ;开定时器1 运行

SETB ET1 ;开定时器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 口,实际是为了不断

的将p1.0 的电平关系转换,即产生了频率

;频率保持时间////////////////////////////////////// 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

;频率高位没到300HZ 的高位值,直接将低位值加1/////// XIA: INC F2L

MOV A,F2L

CJNE A,#00H,RE

INC F2H

MOV A,F2H

CJNE A,F3H,RE

;////////////////////////////////////////////////// ;频率高位加到300HZ 的高位值了,低位加一,到300HZ 的低 63

位值了吗,没到出去,到了关定时器/////////////////// 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 ;数显代码

END

7.42 在显示频率输出的同时显示AD 值(数码显示) 程序实例(ad25dis.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 ;显示标志

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 转换数初值

;显示高低位初值/////////////////////////////// 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 口产生一

个低电平,一个脉冲是由一个高电平和一个低电平组成的 MOV TMOD,#00010000B;定时器工作于方式1

MOV TH1,F2H

MOV TL1,F2L ;200HZ 输出

SETB EA ;开总中断

SETB TR1 ;开定时器1 运行

SETB ET1 ;开定时器1 允许

ADDIS:

ACALL AD ;呼叫AD 子程序

;将转换的数字量屏蔽高位低位送DISADL 保存//////////// MOV A,ADNUMBER

ANL A,#0FH

MOV DISADL,A

;////////////////////////////////////////////////// ;将转换的数字量屏蔽低位,将高位送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 口,实际是为了

不断的将p1.0 的电平关系转换,即产生了频率;频率保持时间//////////////////////////////////////

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

;频率高位没到300HZ 的高位值,直接将低位值加1/////// XIA: INC F2L

MOV A,F2L

CJNE A,#00H,RE

INC F2H

MOV A,F2H

68

CJNE A,F3H,RE

;////////////////////////////////////////////////// ;频率高位加到300HZ 的高位值了,低位加一,到300HZ 的低 位值了吗,没到出去,到了关定时器/////////////////// 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 ;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV 40H,#64H

D6: DJNZ 40H,D6 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV ADNUMBER,A ;转换的值给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 ;数显代码

END

51 单片机实用程序库

4.1 流水灯

程序介绍:利用P1 口通过一定延时轮流产生低电平

输出,以达到发光二极管轮流亮的效果。实际应用中例如: 广告灯箱彩灯、霓虹灯闪烁。

程序实例(LAMP.ASM)

ORG 0000H

AJMP MAIN

ORG 0030H

MAIN:

9

MOV A,#00H

MOV P1,A ;灭所有的灯

MOV A,#11111110B

MAIN1:

MOV P1,A ;开最左边的灯

ACALL DELAY ;延时

RL A ;将开的灯向右边移

AJMP MAIN ;循环

DELAY:

MOV 30H,#0FFH

D1: MOV 31H,#0FFH

D2: DJNZ 31H,D2

DJNZ 30H,D1

RET

END

4.2 方波输出

程序介绍:P1.0 口输出高电平,延时后再输出低电

平,循环输出产生方波。实际应用中例如:波形发生器。 程序实例(FAN.ASM):

ORG 0000H

MAIN:

;直接利用P1.0 口产生高低电平地形成方波////////////// ACALL DELAY

SETB P1.0

ACALL DELAY

10

CLR P1.0

AJMP MAIN

;////////////////////////////////////////////////// DELAY:

MOV R1,#0FFH

DJNZ R1,$

RET

五、定时器功能实例

5.1 定时1 秒报警

程序介绍:定时器1 每隔1 秒钟将p1.o 的输出状态改变1 次,以达到定时报警的目的。实际应用例如:定时报警器。 程序实例(DIN1.ASM):

ORG 0000H

AJMP MAIN

ORG 000BH

AJMP DIN0 ;定时器0 入口

MAIN:

TFLA G EQU 34H ;时间秒标志,判是否到50 个

0.2 秒,即50*0.2=1 秒

MOV TMOD,#00000001B;定时器0 工作于方式

1

MOV TL0,#0AFH

MOV TH0,#3CH ;设定时时间为0.05 秒,定时

20 次则一秒

11

SETB EA ;开总中断

SETB ET0 ;开定时器0 中断允许

SETB TR0 ;开定时0 运行

SETB P1.0

LOOP: AJMP LOOP

DIN0:

;是否到一秒//////////////////////////////////////// INCC: INC TFLAG

MOV A,TFLAG

CJNE A,#20,RE

MOV TFLAG,#00H

CPL P1.0

;////////////////////////////////////////////////// RE:

MOV TL0,#0AFH

MOV TH0,#3CH ;设定时时间为0.05 秒,定时

20 次则一秒

RETI

END

5.2 频率输出公式

介绍:f=1/t

s51 使用12M 晶振,一个周期是1 微秒使用定时器1 工作于方式0,最大值为65535,以产生200HZ 的频率为 例:

200=1/t:推出t=0.005 秒,即5000 微秒,即一个高电

平或低电平的时间为2500 微秒。这样,定时值应设为 65535-2500=63035,将它转换为十六进制则为:F63B。 具体程序请看f200.asm

频率递增:

200HZ:63035:F63B

250HZ:63535:F82F

300HZ:63868:F97C

5.3 200HZ 频率输出

程序介绍:利用定时器定时,在P1.0 口产生200HZ 的频率输出。实际应用例如:传感器前级推动。

程序实例(F200.ASM):

ORG 0000H

AJMP MAIN

ORG 001BH

AJMP DIN0

MAIN:

CLR P1.0 ;产生一个低电平,实际上

是从p1.0 口产生频率

MOV TMOD,#00010000B ;定时器1 工作于方式0

MOV TH1,#0F6H

MOV TL1,#3BH ;频率产生的时间,详细请

见频率公式

SETB EA ;开总中断

13

SETB TR1 ;开定时器1 运行

SETB ET1 ;开定时器1 允许

LOOP: AJMP LOOP ;无限循环

DIN0: CPL P1.0 ;产生一个高电平,

下次来就是低电平(因为取反),一个高电平和一个低电平 形成一个周期

MOV TH1,#0F6H

MOV TL1,#3BH ;重置频率产生时间

RETI ;返回

END

5.4 200——250HZ 变化频率输出

程序介绍:利用定时器定时时间的变化,由P1.0 口 产生200——250HZ 变化的频率。实际应用例如:传感器 前级推动、频率发生器。

程序实例(F250.ASM):

ORG 0000H

AJMP MAIN

ORG 001BH

AJMP DIN1

MAIN:

;定义频率200 和300////////////////////////////////// F2H EQU 30H

F2L EQU 31H

F3H EQU 32H

F3L EQU 33H

14

;////////////////////////////////////////////////// ;定义频率保持初值////////////////////////////////// MOV R1,#50

MOV R2,#02H

;////////////////////////////////////////////////// ;频率赋初值//////////////////////////////////////// MOV F2H,#0F6H

MOV F2L,#3BH

MOV F3H,#0F8H

MOV F3L,#2FH

;////////////////////////////////////////////////// CLR P1.0 ;在P1.0 口产生一个低

电平,一个脉冲是由一个高电平和一个低电平组成的 MOV TMOD,#00010000B ;定时器工作于方式1

MOV TH1,F2H

MOV TL1,F2L ;200HZ 输出

SETB EA ;开总中断

SETB TR1 ;开定时器1 运行

SETB ET1 ;开定时器1 允许

LOOP: AJMP LOOP

DIN1:

CPL P1.0 ;取反P1.0 口,实际

是为了不断的将p1.0 的电平关系转换,即产生了频率 ;频率保持时间////////////////////////////////////// DJNZ R1,RE

MOV R1,#50

DJNZ R2,RE

MOV R2,#02H

15

;////////////////////////////////////////////////// MOV A,F2H

CJNE A,F3H,XIA ;频率高位到300HZ

的高位了吗?

AJMP JIA ;频率高位没到

300HZ 的高位值,直接将低位值加1

XIA: INC F2L

MOV A,F2L

CJNE A,#00H,RE

INC F2H

MOV A,F2H

CJNE A,F3H,RE

;/////////////////////////////////////////////

;频率高位加到300HZ 的高位值了,低位加一,到300HZ 的低 位值了吗,没到出去,到了关定时器

JIA:

INC F2L ;到了将200HZ 频率的低位加1

MOV A,F2L

CJNE A,#F3L,RE

CLR TR1

;///////////////////////////////////////////// RE:

MOV TH1,F2H

MOV TL1,F2L

RETI

END

16

六、数显

0——9999 显示

程序介绍:利用S51 的串行口功能,实现数码管0— —9999 的循环显示。实际应用例如:电子计分牌。 程序实例(9999.ASM):

ORG 0000H

MAIN:

GEE EQU 30H

SHI EQU 31H

BEI EQU 32H

QIAN EQU 33H ;定义个十百千

MOV GEE,#00H

MOV SHI,#00H

MOV BEI,#00H

MOV QIAN,#00H ;赋初值

MOV SCON,#00H ;串行口工作于方式

0.同步移位

;显示个,十,百,千////////////////////////////////// DISPLAY:

ACALL DELAY ;延时

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

;///////////////////////////////////////////// ;个,十,百,千的依次加一///////////////////// 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

;////////////////////////////////////////////////// ;延时////////////////////////////////////////////// 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 ;数显代码

END

七、AD 转换

7.1 AD 转换(数码显示)

程序介绍:利用ADC0809 模拟通道3 输入电压,经单片机 19

处理后在数码管上用相对应的16 进制数显示出来,0—5V 对 应为0--0FFH,实际应用例如:数据采集。

程序操作:程序写完上电运行后,用本机配带的专用起微调 图15 所示电位器,会在数码管上看到随不同电压而变化的对 应16 进制值。也可以用

万用表实ADC0809IN3 脚

电压,来检验所对应显

示的16 进制数。

图15

程序实例(ad.asm):

ORG 0000H

MAIN1:

ACALL DELAY ;延时

ACALL AD ;呼叫AD 子程序

;将转换的数字量屏蔽高位低位送显//////////////////// 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

;////////////////////////////////////////////////// ;将转换的数字量屏蔽低位高位送显//////////////////// 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 ;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV R1,#64H

D3: DJNZ R1,D3 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV 30H,A ;转换的值给30H

RET

DELAY: ;延时

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 十六进制两位数加法器(数码显示)

程序介绍:将ADC0809 输入的两个不同电压(相同电 压也可相加,只是为举例说明,所以取不同电压)所对应 的16 进制数相加显示出来。实际应用例如:取代加法运放 电路。

程序操作:程序写完上电运行后,用本机配带的钟表

起微调图16 所示电位器,输入两个不同电压,数码管会显 示两个不同的对应16 进制数,随后数码管会显示两个16 进制数相加的值。

程序实例(add2.asm):

ORG 0000H

MAIN:

ADNUMBER EQU 30H ;AD 转换值

ADDNUMBER EQU 31H ;加数值1

ADL EQU 32H ;//

ADH EQU 33H ;ADL 转换高低位值

DISL EQU 34H ;//

DISH EQU 35H ;显示高低位值

ADDTOTAL EQU 36H ;第一次AD 转换值

ADDJW EQU 37H ;加法进位数

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 ;延时

ACALL CAIFEN ;呼叫AD 值拆分为高

低的程序

ACALL DISPLAY ;呼叫显示子程序

MOV A,ADNUMBER ;取AD 值

CJNE A,ADDHOLD,ADD3 ;与上次AD 值比

较,不相等,即输入了新的AD 值,去AD3 执行

AJMP MAIN1 ;是相等的,证

明没有输入新的AD 值,回去显示老的AD 值

ADD3: MOV A,ADDHOLD

CJNE A,#00H,ADD4

MOV ADDHOLD,ADNUMBER ;有一种情况就

是是第一次进来,AD 保持值里面是放的初值00,与取的AD 值 不同,是这种情况,也返回去

AJM MAIN1

ADD4: MOV ADDNUMBER,ADDHOLD ;是真的输入

了新的AD 值,将上次AD 值给加数,为调加法程序做准备 MOV ADDHOLD,ADNUMBER ;将这次的AD

值也保持起来。准备与上一个AD 值相加

;显示这次输入的AD 值//////////////////////////////// ACALL DELAY

ACALL CAIFEN

23

ACALL DISPLAY

;////////////////////////////////////////////////// DISPLAY1:

ACALL DELAY ;延时

ACALL ADD1 ;呼叫加法子程序

ACALL DISPLAY ;显示

LOOP: AJMP LOOP ;返回主程序

;///////////////////////////////////////AD 转换

AD:

MOV DPTR,#7F00H;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV R1,#64H

D1: DJNZ R1,D1 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV ADNUMBER,A ;转换的值给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 ;有无进位?

INC ADDJW ;有进位,进位值给

ADDJW

ADDJW1: ANL A,#0FH

MOV DISL,A ;加值取低位

MOV A,ADDTOTAL

ANL A,#0F0H

SWAP A

MOV DISH,A ;加值取高位

RET

;////////////////////////////////////////////////// DELAY: ;延时

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):您如果接触过模电就知道, 在采集电压量时经常会碰到干扰,而在模电中经常所采用 的方法就是加电容滤波,这是用硬件实现的。实际上软件 完全可以达到滤波的效果,现在介绍的是一种最经典的方 法。在一次电压量的采集中,在很短的时间内对它进行6

次采集,将它转换为数字量后求和(7.31),分析出6 次 输入中的最大值和最小值(7.32),然后减去最大值和最 小值(7.33),除以4(7.44)得到平均值。这样实际上 就完成了一次软件滤波。省去了复杂的硬件,而且取得了 好而精确的效果。实际应用例如:精确数据采集。 程序操作:程序写入上电运行后,用本实验仪自带的

钟表起微调电位器依次输入6 个电压量。7.31 程序会显示 和值,7.32 会继续显示最大和最小值,7.33 程序会继续显 示减后所剩的值,7.34 程序会继续显示除4 后的值。 算法说明:为什么要选择取6 个数进行计算呢?因为 在汇编中做计算是非常麻烦的,取6 个数,减去最大值和 最小值后,取平均值是除4.计算机的内部计算都是二进 制,而二进制每除一个2,实际上是向右移一次。所以为 了计算方便,我们选择取6 个数,最后在算除法的时候, 只需要用单片机自带的右移位命令移2 次就行了。 27

7.31 十六进制六位数加法(数码显示)

程序实例(add6.asm):

ORG 0000H

MAIN:

ADNUMBER EQU 30H ;AD 转换值

ADDNUMBER EQU 31H ;加数值1

ADL EQU 32H ;//

ADH EQU 33H ;ADL 转换高低位值

DISL EQU 34H ;//

DISH EQU 35H ;显示高低位值

ADDTOTAL EQU 36H ;第一次AD 转换值

ADDJW EQU 37H ;加法进位数

ADDHOLD EQU 38H

ADDFLAG EQU 39H ;加标志

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 值,并判是否加了六次,是的话就进入死循环 ACALL DELAY

ACALL ADD1

ACALL DISPLAY

INC ADDFLAG

MOV A,ADDFLAG

CJNE A,#06H,MAIN2

LOOP: AJMP LOOP

;////////////////////////////////////////////////// ;没有加到六次,继续取值加,如果没有来新AD 值,还是去 显示上次加的值,有新AD 值来了,显示这次AD 值,并加上上 次AD 值,显示/////////////////////////////////////// MAIN2: ACALL DELAY

ACALL AD

MOV A,ADNUMBER

CJN A,ADDTOTAL,MAIN3

AJM MAIN2

;////////////////////////////////////////////////// ;////////////////////////////////////////////AD 转换 AD:

29

MOV DPTR,#7F00H ;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV R1,#64H

D1: DJNZ R1,D1 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV ADNUMBER,A ;转换的值给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: ;延时

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 求六位和中的最大值和最小值(数码显示) 程序实例(add61.asm):

ORG 0000H

MAIN:

ADNUMBER EQU 30H ;AD 转换值

ADL EQU 32H ;//

32

ADH EQU 33H ;ADL 转换高低位值

DISL EQU 34H ;//

DISH EQU 35H ;显示高低位值

ADDTOTAL EQU 36H ;第一次AD 转换值

ADDJW EQU 37H ;加法进位数

ADDHOLD EQU 38H

ADDFLAG EQU 39H ;加标志

ENDFLAG EQU 40H

ADH1 EQU 41H ;AD 中最大的值

ADL1 EQU 42H ;AD 中最小的值

ADHOLDH EQU 43H

ADHOLDL EQU 44H ;求AD 最大值与最小

值时AD 的比较值,即以此两个值为比较中转

FOUR EQU 45H

SUB EQU 46H ;减去高低位后的值

JWHOLD EQU 47H ;保存进位值

;赋初值//////////////////////////////////////////// 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

;判有没有来新AD 值,没有显示以前,有显示现在的/////// MAIN2:

ACALL DELAY

ACALL AD

MOV A,ADNUMBER

CJNE A,ADDTOTAL,MAIN3

AJMP MAIN2

;////////////////////////////////////////////////// ;AD 转换//////////////////////////////////////////// AD: MOV DPTR,#7F00H ;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV R1,#64H

D1: DJNZ R1,D1 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV ADNUMBER,A ;转换的值给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 最小值的个,十位//////////////////////////// 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 最大值的个,十位/////////////////////// 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: ;延时

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 求减去最大和最小值后的值(数码显示) 程序实例(add62.asm)

ORG 0000H

MAIN:

ADNUMBER EQU 30H ;AD 转换值

ADL EQU 32H ;//

ADH EQU 33H ;ADL 转换高低位值

DISL EQU 34H ;//

DISH EQU 35H ;显示高低位值

ADDTOTAL EQU 36H ;第一次AD 转换值

ADDJW EQU 37H ;加法进位数

ADDHOLD EQU 38H

ADDFLAG EQU 39H ;加标志

ENDFLAG EQU 40H

ADH1 EQU 41H ;AD 中最大的值

40

ADL1 EQU 42H ;AD 中最小的值

ADHOLDH EQU 43H

ADHOLDL EQU 44H ;求AD 最大值与最小

值时AD 的比较值,即以此两个值为比较中转

FOUR EQU 45H

SUB EQU 46H ;减去高低位后的值

JWHOLD EQU 47H ;保存进位值

;赋初值/////////////////////////////////////////// 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

;判有没有来新AD 值,没有显示以前,有显示现在的/// MAIN2:

ACALL DELAY

ACALL AD

MOV A,ADNUMBER

CJNE A,ADDTOTAL,MAIN3

AJMP MAIN2

;///////////////////////////////////////////////// ;AD 转换/////////////////////////////////////////// AD:

MOV DPTR,#7F00H ;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV R1,#64H

D1: DJNZ R1,D1 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV ADNUMBER,A ;转换的值给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 最小值的个,十位//////////////////////////// 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 最大值的个,十位/////////////////////////// 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

;////////////////////////////////////////////////// ;分解减去最高位和最低位的数//////////////////////// 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 ;有进位,高位减一

JIAN2:

CLR C

SUBB A,ADL1 ;减低位

JNC TUI ;无进位出去,有进

位高位减一

48

DEC ADDJW

TUI: MOV SUB,A ;取减的值给SUB

RET

;////////////////////////////////////////////////// ;滤波////////////////////////////////////////////// DELAY: ;延时

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 所得软件滤波值(数码显示)

程序实例(add63.asm):

ORG 0000H

MAIN:

ADNUMBER EQU 30H ;AD 转换值

ADL EQU 32H ;//

ADH EQU 33H ;ADL 转换高低位值

DISL EQU 34H ;//

49

DISH EQU 35H ;显示高低位值

ADDTOTAL EQU 36H ;第一次AD 转换值

ADDJW EQU 37H ;加法进位数

ADDHOLD EQU 38H

ADDFLAG EQU 39H ;加标志

ENDFLAG EQU 40H

ADH1 EQU 41H ;AD 中最大的值

ADL1 EQU 42H ;AD 中最小的值

ADHOLDH EQU 43H

ADHOLDL EQU 44H ;求AD 最大值与最小

值时AD 的比较值,即以此两个值为比较中转

FOUR EQU 45H

SUB EQU 46H ;减去高低位后的值

JWHOLD EQU 47H ;保存进位值

;赋初值////////////////////////////////////////// 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

;判有没有来新AD 值,没有显示以前,有显示现在的/////// MAIN2:

ACALL DELAY

ACALL AD

MOV A,ADNUMBER

CJNE A,ADDTOTAL,MAIN3

AJMP MAIN2

;////////////////////////////////////////////////// 52

;AD 转换//////////////////////////////////////////// AD:

MOV DPTR,#7F00H ;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV R1,#64H

D1: DJNZ R1,D1 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV ADNUMBER,A ;转换的值给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 最小值的个,十位//////////////////////////// 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 最大值的个,十位////////////////////////// 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

;////////////////////////////////////////////////// ;分解减去最高位和最低位的数//////////////////////// 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 ;有进位,高位减一

JIAN2:

CLR C

SUBB A,ADL1 ;减低位

JNC TUI ;无进位出去,有进位高位

减一

DEC ADDJW

TUI: MOV SUB,A ;取减的值给SUB

RET

;////////////////////////////////////////////////// ;滤波////////////////////////////////////////////// LUBO:

;除2//利用二进制右移位来实现/////////////////////// CLR C

MOV A,ADDJW

RRC A

MOV ADDJW,A

MOV A,SUB

RRC A

MOV SUB,A

;////////////////////////////////////////////////// ;再除一次2,达到除4 的效果//// ////////////////////// CLR C

MOV A,ADDJW

RRC A

58

MOV ADDJW,A

MOV A,SUB

RRC A

MOV SUB,A

;////////////////////////////////////////////////// RET

;////////////////////////////////////////////////// DELAY: ;延时

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 过程检定

程序介绍(7.41—7.43):本程序用软件模拟了一个振 动传感器软件搜频的全过程。振动传感器是通过在激励端 给传感器一定频率的电压,在感应端感应一定频率的电压 值。所以它能测很多东西,比如不同的压力所感应不同电 压值,不同油品粘度也可以感应不同电压值,等等。但是 59

这存在一个问题?就是传感器何时才能达到谐振状态呢, 于是这就要给激励端变化的频率来测感应端的电压,感应 端的电压在这个变化频率内何时最大,这时所给的频率就 是所搜到的谐振频率。以前没有单片机软件控制时,我们 只能通过硬件不断的给激励端变化频率电压,然后测感应 端电压,来搜到谐振频率。7.41 是在p1.0 口输出并显示变 化的频率200-250hz(省略了2 的显示),7.42 在7.41 的基础 上增加了AD 输入量的显示。

7.43 将会在您输入变化AD 值后,将搜到的AD 值与 频率值显示出来。实际应用如压力检测,粘度检测。 程序操作:因为7.41 和7.42 只是7.43 的铺垫。所以在 将7.43 程序写入并上电后,您将会在数码管左两位看到 200-250HZ 变化频率的显示(省略2),右边看到输入AD 值的显示。您可以用钟表起微调AD 输入的电位器,使AD 值上升,下降。在变化频率显示完后,程序将会把您所输 入的最大的AD 值与其所对应的频率一起显示出来,这就是 软件模拟的全过程。

7.41 P1.0 口产生200——250HZ 变化频率输出(数 码显示)

程序实例(f25dis.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 ;显示标志

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 口产生一个低电

平,一个脉冲是由一个高电平和一个低电平组成的 MOV TMOD,#00010000B;定时器工作于方式1

MOV TH1,F2H

MOV TL1,F2L ;200HZ 输出

SETB EA ;开总中断

61

SETB TR1 ;开定时器1 运行

SETB ET1 ;开定时器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 口,实际是为了不断

的将p1.0 的电平关系转换,即产生了频率

;频率保持时间////////////////////////////////////// 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

;频率高位没到300HZ 的高位值,直接将低位值加1/////// XIA: INC F2L

MOV A,F2L

CJNE A,#00H,RE

INC F2H

MOV A,F2H

CJNE A,F3H,RE

;////////////////////////////////////////////////// ;频率高位加到300HZ 的高位值了,低位加一,到300HZ 的低 63

位值了吗,没到出去,到了关定时器/////////////////// 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 ;数显代码

END

7.42 在显示频率输出的同时显示AD 值(数码显示) 程序实例(ad25dis.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 ;显示标志

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 转换数初值

;显示高低位初值/////////////////////////////// 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 口产生一

个低电平,一个脉冲是由一个高电平和一个低电平组成的 MOV TMOD,#00010000B;定时器工作于方式1

MOV TH1,F2H

MOV TL1,F2L ;200HZ 输出

SETB EA ;开总中断

SETB TR1 ;开定时器1 运行

SETB ET1 ;开定时器1 允许

ADDIS:

ACALL AD ;呼叫AD 子程序

;将转换的数字量屏蔽高位低位送DISADL 保存//////////// MOV A,ADNUMBER

ANL A,#0FH

MOV DISADL,A

;////////////////////////////////////////////////// ;将转换的数字量屏蔽低位,将高位送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 口,实际是为了

不断的将p1.0 的电平关系转换,即产生了频率;频率保持时间//////////////////////////////////////

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

;频率高位没到300HZ 的高位值,直接将低位值加1/////// XIA: INC F2L

MOV A,F2L

CJNE A,#00H,RE

INC F2H

MOV A,F2H

68

CJNE A,F3H,RE

;////////////////////////////////////////////////// ;频率高位加到300HZ 的高位值了,低位加一,到300HZ 的低 位值了吗,没到出去,到了关定时器/////////////////// 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 ;指向转换地址

MOV A,#03H ;指向转换口

MOVX @DPTR,A ;转换

MOV 40H,#64H

D6: DJNZ 40H,D6 ;等100 微秒转换完

MOVX A,@DPTR ;转换后的值给A

MOV ADNUMBER,A ;转换的值给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 ;数显代码

END


相关文章

  • 大学几乎所有学科的课本答案[2]
  • 大学几乎所有学科的课本答案! 来源: 任明嘉的日志 经济金融 [PDF格式]<会计学原理>同步练习题答案 [Word格式]<成本会计>习题及答案(自学推荐,23页) [Word格式]<成本会计>配套习题集 ...查看


  • 北邮单片机实验报告(电子密码锁)
  • xx 班 xx 号 xx 单片机设计实验报告 2015 年小学期单片机设计实验报告 题目:基于 PIC 单片机的电子密码锁 班 级: 班内序号: 实验组号: 学生姓名: 指导教师: xx 班 xx 号 xx 单片机设计实验报告 期中检查 教 ...查看


  • 电子报合订本2009索引
  • 电子报合订本2009索引 2009(上)目录 一.新闻言论与专题类 狠抓文章"有用度"„„„„„„„„1 形影不离<电子报>„„„„„„„„41 读书成才用知识改变命运„„„„„211 高校需要<电子报 ...查看


  • 光电转速传感器分布式监控系统的设计
  • 光电转速传感器分布式监控系统的设计 姚彩虹, 等 光电转速传感器分布式监控系统的设计 姚彩虹, 蒋兴加, 胡玉霞 (兰州城市学院工学系机电测试研究所 甘肃兰州, 730070) 摘 要:针对光电转速传感器性能指标测试必要性和传统测试仪的局限 ...查看


  • 史上最全 最实用的 个人简历模板(word版)
  • 个人简历 个人资料 姓 名: 性 学 专 别: 历: 业: 出生日期: 毕业院校: ) 工作经验: 申请职位: 联系方式: 现任职位: 薪资要求: 自我评价 幽默.刚直率真.对人生的看法富含哲学性,希望能将自身所散发的火热生命力及快感,感染 ...查看


  • 单片机实用技术
  • 单片机实用技术 作者:shenxq301 1 首先介绍经济使用的单片机AVR 使用学习板快速入门,尤其实用于在校学生和刚刚工作的工程技术人员. AVR mega16学习板 单价:240 元 该学习板可以从正规途径买到正版,当然也可从旧货市场 ...查看


  • 太原理工大学毕业设计题目及任务书
  • 毕业设计(论文)任务书-1 设计(论文)题目:温度调节仪表设计(液晶显示) 题目性质:一般设计 指导教师:牛昱光 毕业设计(论文)要求及原始数据(资料): 本题目属单片机应用开发类型.选题学生需自行购置一款带有液晶显示模块的单片机开发板和测 ...查看


  • 程控滤波器
  • 目 录 1 引言 . ............................................................................................................. ...查看


  • 基于NRF905的无线温度采集系统的设计
  • 目录 中英文摘要 . ................................................................ II 引言 . .................................... ...查看


热门内容