单片机实践汇编Word文档格式.docx
《单片机实践汇编Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机实践汇编Word文档格式.docx(32页珍藏版)》请在冰豆网上搜索。
//////////////////////////////////////////////////DELAY:
MOVR1,#0FFH
DJNZR1,$
五、定时器功能实例
5.1定时1秒报警
定时器1每隔1秒钟将p1.o的输出状态改变1次,以达到定时报警的目的。
实际应用例如:
定时报警器。
程序实例(DIN1.ASM):
ORG000BH
AJMPDIN0;
定时器0入口
TFLAGEQU34H;
时间秒标志,判是否到50个
0.2秒,即50*0.2=1秒
MOVTMOD,#00000001B;
定时器0工作于方式
1
MOVTL0,#0AFH
MOVTH0,#3CH;
设定时时间为0.05秒,定时
20次则一秒
11
SETBEA;
开总中断
SETBET0;
开定时器0中断允许
SETBTR0;
开定时0运行
LOOP:
AJMPLOOP
DIN0:
是否到一秒////////////////////////////////////////INCC:
INCTFLAG
MOVA,TFLAG
CJNEA,#20,RE
MOVTFLAG,#00H
CPLP1.0
//////////////////////////////////////////////////RE:
RETI
5.2频率输出公式
介绍:
f=1/t
s51使用12M晶振,一个周期是1微秒使用定时器1
工作于方式0,最大值为65535,以产生200HZ的频率为
例:
200=1/t:
推出t=0.005秒,即5000微秒,即一个高电12
平或低电平的时间为2500微秒。
这样,定时值应设为65535-2500=63035,将它转换为十六进制则为:
F63B。
具体程序请看f200.asm
频率递增:
200HZ:
63035:
F63B
250HZ:
63535:
F82F
300HZ:
63868:
F97C
5.3200HZ频率输出
利用定时器定时,在P1.0口产生200HZ的频率输出。
传感器前级推动。
程序实例(F200.ASM):
ORG001BH
AJMPDIN0
CLRP1.0;
产生一个低电平,实际上
是从p1.0口产生频率
MOVTMOD,#00010000B;
定时器1工作于方式0
MOVTH1,#0F6H
MOVTL1,#3BH;
频率产生的时间,详细请
见频率公式
13
SETBTR1;
开定时器1运行
SETBET1;
开定时器1允许
AJMPLOOP;
无限循环
CPLP1.0;
产生一个高电平,
下次来就是低电平(因为取反),一个高电平和一个低电平形成一个周期
重置频率产生时间
RETI;
返回
5.4200——250HZ变化频率输出
利用定时器定时时间的变化,由P1.0口
产生200——250HZ变化的频率。
传感器
前级推动、频率发生器。
程序实例(F250.ASM):
AJMPDIN1
定义频率200和300//////////////////////////////////F2HEQU30H
F2LEQU31H
F3HEQU32H
F3LEQU33H
14
//////////////////////////////////////////////////;
定义频率保持初值//////////////////////////////////MOVR1,#50
MOVR2,#02H
频率赋初值////////////////////////////////////////MOVF2H,#0F6H
MOVF2L,#3BH
MOVF3H,#0F8H
MOVF3L,#2FH
//////////////////////////////////////////////////CLRP1.0;
在P1.0口产生一个低
电平,一个脉冲是由一个高电平和一个低电平组成的
定时器工作于方式1
MOVTH1,F2H
MOVTL1,F2L;
200HZ输出
DIN1:
CPLP1.0;
取反P1.0口,实际
是为了不断的将p1.0的电平关系转换,即产生了频率
频率保持时间//////////////////////////////////////DJNZR1,RE
MOVR1,#50
DJNZR2,RE
15
//////////////////////////////////////////////////MOVA,F2H
CJNEA,F3H,XIA;
频率高位到300HZ
的高位了吗?
AJMPJIA;
频率高位没到
300HZ的高位值,直接将低位值加1
XIA:
INCF2L
MOVA,F2L
CJNEA,#00H,RE
INCF2H
MOVA,F2H
CJNEA,F3H,RE
/////////////////////////////////////////////
频率高位加到300HZ的高位值了,低位加一,到300HZ的低位值了吗,没到出去,到了关定时器
JIA:
INCF2L;
到了将200HZ频率的低位加1
CJNEA,#F3L,RE
CLRTR1
RE:
MOVTL1,F2L
16
六、数显
0——9999显示
利用S51的串行口功能,实现数码管0—
—9999的循环显示。
电子计分牌。
程序实例(9999.ASM):
GEEEQU30H
SHIEQU31H
BEIEQU32H
QIANEQU33H;
定义个十百千
MOVGEE,#00H
MOVSHI,#00H
MOVBEI,#00H
MOVQIAN,#00H;
赋初值
MOVSCON,#00H;
串行口工作于方式
0.同步移位
显示个,十,百,千//////////////////////////////////DISPLAY:
MOVDPTR,#SETTAB
MOVA,GEE
MOVCA,@A+DPTRMOVSBUF,A
JNBTI,D1
17
CLRTI
MOVDPTR,#SETTABMOVA,SHI
JNBTI,D2CLRTI
MOVDPTR,#SETTABMOVA,BEI
D3:
JNBTI,D3CLRTI
MOVDPTR,#SETTABMOVA,QIANMOVCA,@A+DPTRMOVSBUF,A
D4:
JNBTI,D4
个,十,百,千的依次加一/////////////////////
INCGEE
CJNEA,#0AH,DISPLAY
INCSHI
MOVA,SHI
18
INCBEI
MOVA,BEI
INCQIAN
MOVA,QIAN
MOVQIAN,#00H
AJMPDISPLAY
//////////////////////////////////////////////////
延时//////////////////////////////////////////////DELAY:
MOVR1,#0FFH
E1:
MOVR2,#0FFH
DJNZR2,$
DJNZR1,E1
/////////////////////////////////////////////SETTAB:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,
F6H,0EEH,3EH,9CH,7AH,9EH,8EH;
数显代码
七、AD转换
7.1AD转换(数码显示)
利用ADC0809模拟通道3输入电压,经单片机
19
处理后在数码管上用相对应的16进制数显示出来,0—5V对应为0--0FFH,实际应用例如:
数据采集。
程序操作:
程序写完上电运行后,用本机配带的专用起微调图15所示电位器,会在数码管上看到随不同电压而变化的对应16进制值。
也可以用
万用表实ADC0809IN3脚
电压,来检验所对应显
示的16进制数。
图15
程序实例(ad.asm):
ACALLAD;
呼叫AD子程序
将转换的数字量屏蔽高位低位送显////////////////////MOV31H,30H
MOVA,30H
ANLA,#0FH
MOVCA,@A+DPTR
MOVSBUF,A
将转换的数字量屏蔽低位高位送显////////////////////MOVA,30H
20
ANLA,#0F0H
SWAPA
JNBTI,D2
//////////////////////////////////////////////////AJMPMAIN1;
返回主程序
AD:
MOVDPTR,#7F00H;
指向转换地址
MOVA,#03H;
指向转换口
MOVX@DPTR,A;
转换
MOVR1,#64H
DJNZR1,D3;
等100微秒转换完
MOVXA,@DPTR;
转换后的值给A
MOV30H,A;
转换的值给30H
;
MOVR2,#0FFH
D14:
MOVR3,#0FFH
D12:
DJNZR3,D12
DJNZR2,D14
SETTAB:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB0EEH,3EH,9CH,7AH,9EH,8EH
21
7.2十六进制两位数加法器(数码显示)
将ADC0809输入的两个不同电压(相同电
压也可相加,只是为举例说明,所以取不同电压)所对应的16进制数相加显示出来。
取代加法运放电路。
程序写完上电运行后,用本机配带的钟表
起微调图16所示电位器,输入两个不同电压,数码管会显示两个不同的对应16进制数,随后数码管会显示两个16进制数相加的值。
程序实例(add2.asm):
ADNUMBEREQU30H;
AD转换值
ADDNUMBEREQU31H;
加数值1
ADLEQU32H;
//
ADHEQU33H;
ADL转换高低位值
DISLEQU34H;
DISHEQU35H;
显示高低位值
ADDTOTALEQU36H;
第一次AD转换值
ADDJWEQU37H;
加法进位数
ADDHOLDEQU38H
赋初值////////////////////////////////////////////MOVADDHOLD,#00H
MOVADDNUMBER,#00H
MOVADL,#00H
MOVADH,#00H
MOVDISL,#00H
22
MOVDISH,#00H
MOVADDJW,#00H
MOVADDTOTAL,#00H
//////////////////////////////////////////////////MAIN1:
ACALLCAIFEN;
呼叫AD值拆分为高
低的程序
ACALLDISPLAY;
呼叫显示子程序
MOVA,ADNUMBER;
取AD值
CJNEA,ADDHOLD,ADD3;
与上次AD值比
较,不相等,即输入了新的AD值,去AD3执行
AJMPMAIN1;
是相等的,证
明没有输入新的AD值,回去显示老的AD值
ADD3:
MOVA,ADDHOLD
CJNEA,#00H,ADD4
MOVADDHOLD,ADNUMBER;
有一种情况就
是是第一次进来,AD保持值里面是放的初值00,与取的AD值不同,是这种情况,也返回去
AJMMAIN1
ADD4:
MOVADDNUMBER,ADDHOLD;
是真的输入
了新的AD值,将上次AD值给加数,为调加法程序做准备MOVADDHOLD,ADNUMBER;
将这次的AD
值也保持起来。
准备与上一个AD值相加
显示这次输入的AD值////////////////////////////////ACALLDELAY
ACALLCAIFEN
23
ACALLDISPLAY
//////////////////////////////////////////////////DISPLAY1:
ACALLADD1;
呼叫加法子程序
显示
///////////////////////////////////////AD转换
MOVDPTR,#7F00H;
DJNZR1,D1;
MOVADNUMBER,A;
拆分AD值程序//////////////////////////////////////CAIFEN:
MOVA,ADNUMBER
MOVADL,A;
取低位
MOVADH,A;
取高位
MOVDISL,ADL
24
MOVDISH,ADH;
给显示值
显示//////////////////////////////////////////////DISPLAY:
MOVA,DISL
JNBTI,D3
MOVA,DISH
MOVA,ADDJW
D5:
JNBTI,D5
MOVSBUF,#00H
D6:
JNBTI,D6
//////////////////////////////////////////////////25
加法程序//////////////////////////////////////////ADD1:
CLRC
MOVA,ADDNUMBER;
取上次AD值
ADDCA,ADDHOLD;
与这次AD值相加
MOVADDTOTAL,A;
将此次加的值给和
值
JNCADDJW1;
有无进位?
INCADDJW;
有进位,进位值给
ADDJW
ADDJW1:
ANLA,#0FH
MOVDISL,A;
加值取低位
MOVA,ADDTOTAL
MOVDISH,A;
加值取高位
MOVR3,#0AH
DD1:
D2:
DJNZR1,D2
DJNZR3,DD1
26
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):
ADDFLAGEQU39H;
加标志
ENDFLAGEQU40H
MOVADDFLAG,#00H
MOVENDFLAG,#00H
28
显示AD值//////////////////////////////////////////ACALLDELAY
ACALLAD
MAIN3:
加这次的AD值,并判是否加了六次,是的话就进入死循环ACALLDELAY
ACALLADD1
INCADDFLAG
MOVA,ADDFLAG
CJNEA,#06H,MAIN2
没有加到六次,继续取值加,如果没有来新AD值,还是去