单片机电子指南针系统.doc

上传人:PIYPING 文档编号:11689548 上传时间:2021-08-30 格式:DOC 页数:27 大小:1.51MB
返回 下载 相关 举报
单片机电子指南针系统.doc_第1页
第1页 / 共27页
单片机电子指南针系统.doc_第2页
第2页 / 共27页
单片机电子指南针系统.doc_第3页
第3页 / 共27页
单片机电子指南针系统.doc_第4页
第4页 / 共27页
单片机电子指南针系统.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《单片机电子指南针系统.doc》由会员分享,可在线阅读,更多相关《单片机电子指南针系统.doc(27页珍藏版)》请在三一文库上搜索。

1、第 27 页 共 27 页四川理工学院自动化与电子信息学院大学生创新基金技术报告项目名称:基于单片机的指南针设计一、 本项目的目标和任务目标:通过我们的“基于单片机的指南针设计”,实现将微弱的地磁信号,实时、准确的以12864液晶显示的形式,让用户知道当地的具体地理方向。任务:能够实时精确稳定的显示地理位置,同时具有基本时钟功能。二、项目的关键技术和主要技术指标(理科)或本课题研究的主要思路(包括视角、方法、途径、目的)和重要观点(文科)关键技术:地磁采集 单片机控制 人机交互重要技术指标:测量范围0-360度、显示分辨率1度、精度2度、响应频率大于10HZ、电压3.7-5.5V、工作温度-2

2、070摄氏度。研究的主要思路:1. 项目视角:指南针无论在古代还是现在都有很高的地位,早期的指南针采用了磁化指针和方位盘的组合方式,整个指南针从便携性、指示灵敏度上都有一定不足。现在的指南针技术也已经比较成熟,大到航天技术,小到电子手表,很多高科技产品上都集成了指南针功能,但是他们往往都比较昂贵,不利于大面积的普及和一些电子初学者的研究。2设计思路:(1)KMZ52模块简介:本模块中Philips公司生产的磁阻传感器KMZ52为核心芯片,它是利用坡莫合金薄片的磁阻效应测量磁场的高灵敏度磁阻传感器。该磁阻传感器内置两个正交磁敏电阻桥、完整的补偿线圈和设置复位线圈。补偿线圈的输出与当前测量结果形成

3、闭环反馈,使传感器的灵敏度不受地域限制。这种磁阻传感器主要应用于导航、通用地磁测量和交通检测。 该磁阻传感器在金属铝的表面沉积了一定厚度的高磁导率的坡莫合金,在翻转线圈和外界磁场两个力的作用下,电子改变运动方向,使得磁敏电阻的阻值发生变化。同时KMZ52的斑马条电阻成45放置,这使得电子在正反向磁场力作用下有较好的对称性。由于加入了翻转磁场,KMZ52的变化曲线与普通的磁敏电阻不同,更加线性化。KMZ52磁阻传感器的核心部分是惠斯通电桥,是由4个磁敏感元件组成的磁阻桥臂。磁敏感元件由长而薄的坡莫合金薄膜制成。在外加磁场的作用下,磁阻的变化引起输出电压的变化。右图为KMZ52磁阻传感器的等效电路

4、,其中,R1R4的阻值均为R,供电电源为U。在外加偏置磁场H的作用下,R1和R4的磁化方向背向电流方向转动引起阻值减小。而R2和R3的磁化方向朝向电流方向转动,阻值增大R。计算得:(公式在图上标明) 。在KMZ52芯片里面集成的翻转线圈和补偿线圈能够更好的对微弱的地磁信号进行校正和补偿。下面分别介绍这两部分的原理翻转电路:在翻转线圈的电流脉冲的时间要求十分短 只有几十微秒 输出信号首先经过预放大器 然后进入高通滤波器滤去偏置电压,最后经过一个与翻转信号的相位同步处理后输出测量电压。翻转电路的各点电压波形如如图二所示. 图2 翻转电路的各点输出波形在上图中, 用正反两次测量出来的值就可以计算出偏

5、置电压和输出的电压如右图所示:补偿电路:补偿电路通过正反馈的作用将输出的信号进行反馈比较,偏移信号加到补偿线圈上面,通过电磁的作用对输出进行补偿,从而让采集进度更高。(2)硬件设计此系统主要由信号采集模块,键盘模块、单片机处理器和液晶显示模块构成。采集模块采集到的信号经过放大滤波后送至数据处理单元。经过处理后得到方向角信号,传送至单片机处理交由显示器显示,磁电子罗盘设计总体结构如图2所示。单片机处理器(STC89C52)键 盘信号采集模块液晶显示模块(TS12864A)用户输入信号送地磁信号送命令,数据送读信号指令图3 指南针设计总体结构图3. 解决方法:1. (电源解决方案)电源是电子系统的

6、关键构成部分,没有电源任何电器设备都无法正常工作,所以说电源问题也是比较重要的。此系统中12864液晶工作电压一般为5V,而这个电压51单片机也能正常使用,但是考虑到指南针一般都是在室外使用,使用的时间长,对电源的要求就相对较高,而实际生活中很难找到5V的便携电源,所以在电源上首先就要解决此问题。经过对12864和51单片机的实验测量发现4V至6V都可以使他们正常的工作,所以采用生活中的典型1.5V干电池(3-4节)就可以解决此问题,同时现在的手机都很普遍,手机电池电压一般为4.2V满足系统正常工作,而且手机电池是的容量也相对较大,因此本系统可以采用干电池供电或手机电池供电来解决电源问题。2.

7、 (地磁信号的采集解决方案)考虑到地磁信号比较微弱为0.3高斯至0.6高斯采集难度很大,用一般的地磁传感器很难准确的提取这么微弱的信号,本设计采用了由 KMZ52集成芯片构成的指南针模块作为信号的采集单元,此模块具有很高的采集灵敏度和很高的分辨率同时此模块的输出信号很简单(直接就是当前的方位角信号),所以在进行信号处理的时候非常的方便,直接提取此信号通过单片机转换为液晶需要的方位信号就可以完成系统的指南功能了。3.(51单片机I/O口解决方案) 大家都知道51单片机的I/O口只有四个也就是只有32个I/O端口,在使用的时候是很有限的,如果使用传统的并行数据传输方式的话51单片机的I/O口不够用

8、,所以说I/O口不够用问题也应该得到解决,通过对此系统中信号采集模块和12864液晶模块的学习发现,这两个模块都可以工作在串行、并行模式下面。如果采用并行方式(信号采集模块所用端口大于16个,12864液晶所用端口大于18个)51单片机的端口就大大的不够使用了,所以说在本系统中这两个模块都采用了用串行数据传输,这样就解决了51单片机I/O端口不够用的问题。图4 TS12864A液晶模块串行显示时序4.(显示部分解决方案) 为了更好的进行人机交互,让使用者直观的得到当前的位置信息,本系统采用了常用的TS12864A液晶显示模块,此模块解决了本系统的显示功能。处理器处理后的方位信号通单片机处理交由

9、12864液晶就可以显示出来。这样使用者就可以很直观的得到当前的位置信息了。三、综合评价最终作品完成情况达到了预计的设计要求,通过测试,本系统的测量范围为0-360度、显示分辨率1度、精度2度、响应频率大于10HZ,没有误码现象产生,数据能够准确、无误、实时的接收、显示。并且还具有基本时钟功能,位置报警功能。总的来说,整个项目完成情况比较成功。四、取得的主要成果图5 标定调试 图6 时钟调节 图7 位置报警设置与报警图8 指南针稳定运行中五、存在问题和建议1,由于资金的缘故,我们在主电路方只做了简单的指南针模块电路,很多扩展功能都还没有添加进去。2,由于条件的缘故,在做此系统的过程中我们感到非

10、常的吃力。没有专门的实验场地进行实验、测量,很多想到的功能都由于没有进行实验而被迫取消, 所以我建议以后再进行此类设计时学校应该给每一个小组提供一个实验场地。让我们实时的进行实验,有问题就通过实验解决。 3、在最后的调试阶段,由于采用KMZ52调试很麻烦,需要校正的太多,最后我们采用一个指南针角度指示专用芯片,可以再淘宝上面买到。它是一个专门检测角度的,只需发送命令控制,传回的是角度信息的二进制编码,因此就很方便操作了。六、附件1、电路图形图9 指南针整体原理图图10 信号采集模块图11 电路PCB图2.程序流程图主程序流程图入口判断是否有标定键按下时钟更新串口初始化12864液晶初始化是否接

11、受的角度信号进行数据处理以便在液晶上显示键盘扫描液晶显示串口初始化程序流程图:入口定时器工作方式(8位自动重载工作方式)采用9600波特率,定时器初置为0xFD串口工作方式为8位uart,波特率可变(T1的溢出率)开串口中断、开总中断返回按键扫描服务子程序流程图:入口扫描是否进行指南针标定否调用指南针操作服务程序是自动转入调节时、分、秒程序扫描是否有调节时钟按键是否调用显示程序设置报警方位扫描是否设置报警键按下是否调用显示程序返回串口中断服务子程序流程图:入口判断是发送中断(TI=1)还是接受中断(RI=1) 清除TITI=11=RI=1 不接收数据否清除RI,并判断是否为角度数据是 接收并存

12、储数据返回操作指南针传感器服务子程序流程图:入口指南针传感器指令发送操作正北指令结束标定指令标定指令读数据指令指令发送程序返回越境检测服务子程序流程图入口判断是否大于设置角度值返回发出警报是否时钟更新服务子程序流程图:入口时钟数据不更新否延时是否到达给定置是秒是否到60否秒加1是秒等于0,分是否到60否分加1是否分等于0,时是否到24是时加1时等于0数据处理并调用液晶显示程序 返回串口接收数据处理子程序流程图:入口否判断是否接收结束是否判断是否接收角度数据是转换成整型数据angle调用检测越境服务程序调用方向偏转服务程序转换角度数据angle成液晶显示所需数据返回 方向偏转服务子程序流程图:入

13、口angle=0 南方判别angle值方位区域angle0&angle45&angle90&angle135&angle180&angle225&angle270&angle315&angle360 南偏西,angle=360-angle3.相关程序#include#define uchar unsigned char #define uint unsigned intsbit KEY0=P10; /校验开始sbit KEY1=P11; /校验结束sbit KEY2=P12; /设置报警角度sbit spk=P27;uchar send_buf5;/串口发送缓冲区uchar rece_buf5

14、;/串口接收缓冲区uchar dis_buf4;/显a示缓冲区uchar dis_bj4;uchar rece_num;bit rece_ok;/串口接收结束标志uchar send_flag;/串口发送标志uint angle,bj;/当前角度uint wrap_angle;/ 磁偏角bit bd_flag=0;/校准标志位bit sz_flag=0;/调节标志位uchar tim,S,M,H,S0,S1,M0,M1,H0,H1; /第二行显示时间 uchar IC_DAT210;/存放时间/*/sbit std = P17; /原名R/W 串行数据输入1.7 sbit sclk = P16

15、; /原名E 使能信号 脉冲输入1.6 sbit PSB=P15; /H:8位或4位并口方式,L:串口方式1.5 sbit keyEn=P13;/功能按键sbit keyT=P14;/调节按键uchar En; /定义功能键变量uchar code ROW1=当前时间:;uchar code ROW3=当前位置: ;/*-*/void delay_us(uint i) while(i-);void delay_ms(uint i) while(i-)delay_us(500);void scon_initi(void) /串口初始化 TMOD=0X20; TH1=0XFD; TL1=0XFD;

16、 TR1=1; SCON=0X50; ES=1; EA=1;void scon_inter(void)interrupt 4 uchar n; if(RI) RI=0; n=SBUF; if(send_flag&0x01)/接收到的是罗盘的角度数据 if(rece_num=0)/第一个数据rece_bufrece_num+=n; else if(rece_num=1)rece_num=0;rece_ok=1;rece_buf1=n;/第二个数据,接收数据完毕. 存储角度 else rece_num=0;rece_ok=0; else if(send_flag&0x02)/接收到的是罗盘校准开始

17、的数据 else if(send_flag&0x04)/接收到的是罗盘校准结束的数据 else TI=0;void send_data(uchar *sp,uchar m)/ uchar i; ES=0; TI=0; for(i=0;i8; send_buf2=wrap_angle; send_data(send_buf,3); break;case 4:/正北设定 send_flag|=0x20; send_buf0=0xB0; send_data(send_buf,1); break; default:break; /*12864显示模块*/在读指令码的时候,程序先调用了6位的低电平,然再

18、在1调用了10位的指令码 。总共调用了16位的数据。具体看时序图void wr_lcd (uchar DI,uchar date)/传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据. uchar in,i,j; delay_us (50); in=date; /in表示输入数据 sclk=0; std=1; for(i=0;i5;i+)/先是5个脉冲 sclk=1; sclk=0; std=0; /5个脉冲结束后STD置0 sclk=1; /再是一个脉冲 sclk=0; if(DI) /第6个脉冲结束后判断是数据还是命令 std=1; /数据 else std=0; /命令 sc

19、lk=1; sclk=0; std=0; /第8个脉冲时置0 sclk=1; sclk=0; for(j=0;j2;j+) /开始写数据 for(i=0;i4;i+) in=in; in=in1; std=CY; sclk=1; sclk=0; std=0; for(i=0;i0) wr_lcd (1,*s); s+; delay_us(50); /*-12864显示程序-*/void init_12864 () PSB=0; init_lcd (); /液晶初始化 clrscreen(); delay_us(50); wr_lcd (0,0x80);/为节约显示时间 chn_disp (RO

20、W1); delay_us(10); wr_lcd (0,0x88); chn_disp (ROW3); /为节约显示时间 delay_us(10);/方向偏转判断 void fxpz() if(angle=0) wr_lcd (0,0x98); chn_disp(南方 ) ;else if(angle0&angle45&angle90&angle135&angle180&angle225&angle270&angle315&anglebj) wr_lcd (0,0x8E); /设定显示角度位置 chn_disp(越境) ; /显示角度 spk=!spk; delay_ms(50); wr_l

21、cd (0,0x8E); /设定显示角度位置 chn_disp( ) ; /显示角度 else wr_lcd (0,0x8E); /设定显示角度位置 chn_disp( ) ; /显示角度 spk=1; void scon_process(void)/串口接收数据处理 if(rece_ok)/接收数据结束 rece_ok=0; if(send_flag&0x01)/接收到的是角度数据 angle=rece_buf0*256+rece_buf1; send_flag&=0xfe; yjbj(); fxpz(); dis_buf0=angle/100+0x30; /数转字符转换 dis_buf1=

22、angle/10%10+0x30; dis_buf2=angle%10+0x30; dis_buf3= ; /*/void key() if (keyEn=0) delay_ms(10); if(keyEn=0) En+; if(En=5) En=0;switch (En) case 1: wr_lcd(0,0x95);/第95处显示 chn_disp(调节秒); if(keyT=0) delay_ms(20); if(keyT=0) S=0; break; case 2: wr_lcd(0,0x95);/第95处显示 chn_disp(调节分); if(keyT=0) delay_ms(20

23、); if(keyT=0) M+; if(M=60) M=0; break; case 3: wr_lcd(0,0x95);/第95处显示 chn_disp(调节时); if(keyT=0) delay_ms(20); if(keyT=0) H+; if(H=24) H=0; break; case 4: wr_lcd(0,0x95);/第95处显示 chn_disp( ); break; if(KEY2=0) delay_ms(20); spk=1; wr_lcd(0,0x88); chn_disp(报警角度:); if(keyT=0) delay_ms(5); if(bj=359) bj=

24、0; if(keyT=0) bj+; dis_bj0=bj/100+0x30; /数转字符转换 dis_bj1=bj/10%10+0x30; dis_bj2=bj%10+0x30; dis_buf3= ;wr_lcd(0,0x8C); chn_disp(dis_bj); while(!keyEn); void key_scan(void) if(!KEY0)/标定按键按下 delay_ms(10);if(!KEY0) compass_operate(1); wr_lcd(0,0x98); chn_disp(标定中*); bd_flag=1; if(!KEY1&bd_flag)/结束标定按键按下

25、 delay_ms(10); if(!KEY1) wr_lcd(0,0x98); chn_disp( ); compass_operate(2); bd_flag=0; while(!KEY1); void timer() tim+; if (tim=45) tim=0; S+; if(S=60) S=0; M+; if(M=60) M=0; H+; if(H=24) H=0; S0=S%10+0,S1=S/10+0,M0=M%10+0, M1=M/10+0,H0=H%10+0,H1=H/10+0; IC_DAT20=H1,IC_DAT21=H0,IC_DAT22=:, IC_DAT23=M1

26、,IC_DAT24=M0,IC_DAT25=:, IC_DAT26=S1,IC_DAT27=S0; void main (void) uchar i; spk=1; bj=135; clrscreen(); scon_initi(); init_12864 (); /12864 初始化 while(1) timer();wr_lcd(0,0x90); chn_disp(IC_DAT2); if(!bd_flag) /判断是否进行了标定 0 scon_process();/未标定则进行数据采集处理 if(i20) i=0; compass_operate(0); /读取罗盘角度 else i+;

27、 key_scan(); key();if(KEY2) wr_lcd (0,0x88); chn_disp (ROW3); /为节约显示时间 delay_us(10); wr_lcd (0,0x8F); chn_disp ( ); wr_lcd (0,0x9c); /设定显示角度位置chn_disp(dis_buf) ; /显示角度wr_lcd(0,0x9E);chn_disp( ); 七、设计感言:通过这次制作的基于单片机的指南针,我们收获很大,在我们共同的努力之下,于今年4月10号前,完成了所有工作,并且调试成功,这将是对我们单片机知识的考核,也是对我们的一次鼓励。通过对此系统的设计、研究不仅加深了对单片机的理解,也使我们产生了更高的学习兴趣。我们相信,只要我们坚持学习、不断努力,单片机这条路我们会走得更远。- 27 -

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1