数字指南针Word下载.docx
《数字指南针Word下载.docx》由会员分享,可在线阅读,更多相关《数字指南针Word下载.docx(40页珍藏版)》请在冰豆网上搜索。
16点阵)汉字。
与外部MCU接口可采用并行或串行方式控制,在数字指南针中采用串口驱动。
4控制程序的设计
数字指南针控制程序主要有液晶、串口等的初始化程序、硬铁校正程序、磁阻信号数字转换及方位角计算程序和串口数据发送与液晶显示程序。
4.1液晶、串口等的初始化程序
初始化程序将串口设为方式1,波特率为19200。
对中文液晶显示器的初始化主要是清显示内存、点功能设定、开显示屏、清屏等工作。
4.2硬铁校正程序
当一个铁质放在一个磁场中,会产生磁干扰,从而改变地磁场的方向。
因此在使用数字指南针时,附近的铁质材料都会对磁角产生影响。
当两轴磁传感器在水平磁场中旋转时,一个理想的、无干扰的磁输出曲线是一个以(Xb0,Yb0)为圆心的圆(见图5),此时,输出的航向会发生从Oo到360o的线性变化。
硬铁干扰产生于永久磁铁和被磁化的金属,或使用钢的平台上。
这些干扰会保持大小恒定,与指南针的相对位置固定,而与指南针指向无关,硬铁干扰在磁阻传感器的每个输出轴向加了一个定值,输出曲线图的圆心被移动了(见图6),对于运动方位角的影响则是一个周期性的误差。
要消除硬铁干扰,必须得到磁输出的圆心偏移量。
通常是将指南针和平台旋转一周,得到圆上足够的点,再通过计算得到圆心值,圆心值(Xb0,Yb0)会存在EEPROM中,每次指南针读数计算中都会减去偏移量,因此,航向计算时可以消除硬铁干扰。
在指南针运行程序中,有为求硬磁干扰时的圆心程序,在初次使用时,数字指南针需同金属平台一起慢慢旋转1周以上。
4.3磁阻信号数字转换及航向角计算程序
从磁阻传感器输出的电压信号经过200~300倍的放大后,成为0~5V的直流电压送入单片机进行A/D转换。
STC12C5410AD单片机内带8路10位A/D转换器,转换后的磁阻电压最大数字值为1024。
根据图5中已知的X方向与y方向的最大值与最小值及实时测得的2个方向的数据,就可算出运动方位角θ。
图7所示为数字指南针主程序流程图。
图7数字指南针主程序流程图
5调试及性能分析
由于磁阻传感器引脚较细密,焊接时须特别小心,元器件焊接完成后应进行硬件的加电测试。
运放器的放大量输出以正南或正北时每路的输出电压最大不超过5V(尽量接近5V)为宜。
LCD液晶显示程序调试完成后可将实时磁阻强度在LCD上直观显示出来,对后续的程序编写调试有很大的帮助。
在所有程序编写完成后可进行校正操作,其方法是打开校正开关,然后通电,将电路板放置在水平的台面上,然后慢慢地旋转2周以上,最后将校正开关关闭,指南针就能正常工作了。
通过对数字指南针的比对测试,数字指南针读数误差小于1O。
6控制源程序清单
以下是数字指南针汇编程序清单:
;
********************************************
*电子指南针演示程序*
*STC12C2052AD-12MHZ晶振*
显示缓冲单元在40H-43H,使用内存44H、45H、46H用于计算
RESETEQUP3.7;
磁感应器复位,2微秒高电平脉冲.
ADC_CONTREQU0C5H;
ADC控制
ADC_DATAEQU0C6H;
ADC结果中的最高8位
ADC_LOW2EQU0BEH;
ADC结果中的最低2位
P1M0EQU91H;
I/O设置
P1M1EQU92H;
P3M0EQU0B1H;
P3M1EQU0B2H;
ADC0HEQU30H;
0路ADC结果高2位
ADC0LEQU31H;
0路ADC结果低8位
ADC1HEQU32H;
1路ADC结果高2位
ADC1LEQU33H;
1路ADC结果低8位
DELDATAEQU34H;
100us延时参数
DISPADDDATA40H;
显示用连续8个单元(40-47),用作X方向及Y方向的磁场强度显示
DIVDATADATA50H;
除法移位控制数据用
*************************************************
LAMPBLAKEQUP1.4;
背光灯控制,=0时开,=1时关.
CSEQUP1.5;
液晶使能,=1操作,=0禁止.
SIDEQUP1.6;
液晶串行数据输入口
SCLKEQUP1.7;
液晶串行操作时钟口
LAMPEQUP1.2;
LED指示灯
*中断入口程序*
ORG0000H
LJMPSTART
ORG0003H
RETI
ORG000BH
ORG0013H
RETI
ORG001BH
ORG0023H
ORG002BH
RETI
*主程序*
START:
MOVSP,#80H
CLRCS;
液晶操作禁止
CLRLAMP
CLRRESET;
磁感应器复位,平时为低
LCALLSETUP;
LCD初始化
LCALLLOGON;
开机显示画面
MOVR0,#DISPADD;
显示数据存放单元清零
MOVR7,#08H
CLEARDISP:
MOV@R0,#08H
INCR0
DJNZR7,CLEARDISP;
LCALLDATAUP;
显示X:
0000Y:
0000
CPLLAMP
LCALLINI_RS232;
初始化串口
LCALLADC_POW_ON;
开ADC电源
LCALLSET_P10P11_OP;
设P1.0P1.1为开源输出
MOVP3M0,#00000000B;
P3.7为推挽输出
MOVP3M1,#10000000B;
MAIN:
LCALLRESETS;
磁感应器复位
MOVADC_CONTR,#11100000B;
选P1.0ADC转换口
LCALLP10_ADC_CHANNEL;
转换
MOVADC0H,B;
第0路结果保存(10位数高2位)
MOVADC0L,A;
第0路结果保存(10位数低8位)
LCALLBCDCON0
MOVADC_CONTR,#11100001B;
选P1.1ADC转换口
MOVADC1H,B;
第1路结果保存(10位数高2位)
MOVADC1L,A;
第1路结果保存(10位数低8位)
LCALLBCDCON1
LCALLDATAUP
LCALLDELAY5S
AJMPMAIN
RESETS:
SETBRESET
NOP
CLRRESET
RET
****************************************************
**
BCDCON0:
;
MOVPSW,#18h
MOVR7,#00H
MOVR6,#00H
MOVR5,B
MOVR4,A
MOVR3,#03H
MOVR2,#0E8H
LCALLDIV4BY2;
/1000
MOVDISPADD,R4;
千位数BCD
MOVA,R1
MOVR5,A
MOVA,R0
MOVR3,#00H
MOVR2,#64H
/100
MOVDISPADD+1,R4;
MOVA,R0
MOVB,#10
DIVAB
MOVDISPADD+2,A
MOVDISPADD+3,B
POPPSW
BCDCON1:
MOVPSW,#18h
MOVDISPADD+4,R4;
MOVDISPADD+5,R4;
MOVDISPADD+6,A
MOVDISPADD+7,B
POPPSW
*四字节/两字节无符号数除法程序*
R7R6R5R4/R3R2=R7R6R5R4(商)...R1R0(余数)
DIV4BY2:
MOVDIVDATA,#20H
MOVR0,#00H
MOVR1,#00H
DIVLOOP1:
MOVA,R4
RLCA
MOVA,R5
MOVA,R6
MOVR6,A
MOVA,R7
MOVR7,A
MOVR0,A
MOVR1,A
CLRC
SUBBA,R2
MOVB,A
SUBBA,R3
JCDIVLOOP2
MOVR0,B
DIVLOOP2:
CPLC
DJNZDIVDATA,DIVLOOP1
**********以下数据显示程序**************
DATAUP:
MOVA,#91H;
显示X数据
LCALLWRITE_COM
MOVR1,#DISPADD;
将X数据查出字码写入LCD
MOVDPTR,#TABLE1
MOVR2,#04H;
查4次
MOVA,#00H
MOVCLOP:
MOVA,@R1;
MOVCA,@A+DPTR
LCALLWRITE_DAT
INCR1
DJNZR2,MOVCLOP;
MOVA,#95H;
显示Y数据
MOVR1,#DISPADD+4;
将Y数据查出字码写入LCD
MOVCLOPY:
DJNZR2,MOVCLOPY;
***************开机显示画面***********************
LOGON:
MOVA,#80H;
第一行左第一个字开始
MOVDPTR,#CHINESE;
WORD16*16点阵TEST
LCALLWRITE_HZ
MOVA,#90H;
第二行左第一个字开始
MOVDPTR,#CHINESE1;
CLRLAMPBLAK;
开背光灯
LCALLDELAY5S;
显示5秒
SETBLAMPBLAK;
关背光灯
MOVDPTR,#CHINESE2;
显示x:
Y:
**********液晶初始化程序*************
SETUP:
MOVA,#01H;
CLEARDISPLAY
MOVA,#00110000B;
FUNCTIONSETTING
MOVA,#00000010B;
DDRAMSETTO'
00H'
MOVA,#00000100B;
MOVA,#00001100B;
DISPLAYON
MOVA,#00000001B;
CLEARINGSCREEN
MOVA,#10000000B;
SETDDRAMADDRESS
LCALLDELAY
************液晶串行命令写入子程序****************
写入命令字在A中
WRITE_COM:
LCALLDELAY1;
SETBCS
PUSHACC
MOVR0,#8
MOVA,#11111000B
COMM1:
RLCA
MOVSID,C
CLRSCLK
SETBSCLK
DJNZR0,COMM1
POPACC
MOVR5,A
ANLA,#0F0H
COMM2:
SETBSCLK
DJNZR0,COMM2
MOVA,R5
SWAPA
COMM3:
DJNZR0,COMM3
CLRCS
***********液晶串行数据写入子程序****************
写入数据字在A中
WRITE_DAT:
LCALLDELAY1
MOVA,#11111010B
DATA1:
DJNZR0,DATA1
DATA2:
DJNZR0,DATA2
DATA3:
DJNZR0,DATA3
**************延时子程序**********************
0.544ms
DELAY1:
MOVR7,#160;
#010H;
普通单片机用010H
D11:
MOVR6,#010H
DJNZR6,$
DJNZR7,D11
0.13s
DELAY:
MOVR1,#00H
D2:
MOVR2,#00H
DJNZR2,$
DJNZR1,D2
5.2s
DELAY5S:
MOVR3,#28H
DE5S:
DJNZR3,DE5S
DELAY1S:
MOVR3,#9
DE1S:
DJNZR3,DE1S
************16*8一行点阵字写入子程序共16个******************
WRITE_ASCII:
MOVR4,#16
DDDD:
CLRA
MOVCA,@A+DPTR
LCALLWRITE_DAT
INCDPTR
DJNZR4,DDDD
RET
************16*8点阵字写入子程序共7个******************
WRITE_ASCII7:
MOVR4,#7
DDDD7:
MOVA,@R0
INCR0
DJNZR4,DDDD7
************16*16点阵汉字写入子程序一行共7个***********
WRITE_HZ:
;
WRITE7CHINESETOLCD
DD:
CLRA
DJNZR4,DD
************16*16点阵汉字写入子程序共2个***********
WRITE_HZ2:
WRITE8CHINESETOLCD
MOVR4,#2
DD4:
DJNZR4,DD4
*****************************16*8点阵的字符代码表**********************************
TABLE1:
DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,3AH,3BH,3CH,3DH,3EH,20H
012345