硬件设计

(末尾附文件)

方案:
数字电子罗盘3大模块分别是:传感器模块、数据采集模块和MCU模块。需要硬件有: 磁阻传感器、 双轴加速度传感器、AD转换器以及单片机的磁阻式电子罗盘。硬件总体框图如下:

采用三轴磁阻传感器进行地球磁场矢量测量,双轴加速传感器可以传感地球重力场中测量载体的姿态,然后通过姿态坐标变换将磁阻传感器得到载体坐标的测量信号变换到地平坐标系。其磁阻式传感器HMC5883包含输出为3路的差分模拟电压值,差分值大约为几毫伏,信号经过传感器内置的ASIC放大器把信号进行放大,再进行模数转换器进行放大和模数转换;再由有单片机处理数字信号,经由处理后得到航向角由显示屏来显示;复位电路用于恢复磁阻传感器在强磁干扰后的灵敏度;电源模块分别为复位电路和信号处理电路供电。

原理图:

程序设计

方案:
系统软件除了完成初始化、信号采集、信号调理、A/D转换,再到单片机中进行信号处理分析,然后判断能否输出。其框图如下所示:

单片机对传感器失调、温度漂移等干扰造成的误差进行调整。失调和温度漂移会在传感器敏感信号上面叠加一个直流偏置电路,单片机通过将传感器在置位和复位情况下得到的信号进行分析,算出平均值。就可以得到由于失调和漂移造成的直流偏置信号,在方向角计算前对该偏置信号进行补偿即可消除其影响。再判断能否输出,如果不能输出,则再采集一次;能输出则把数据送到显示屏显示。

//***************************************
// HMC5883 IIC测试程序
// 使用单片机STC89C51
// 晶振:11.0592M
// 显示:LCD1602//****************************************
#include  <REG51.H>
#include  <math.h>    //Keil library
#include  <stdio.h>   //Keil library
#include  <INTRINS.H>#define   uchar unsigned char
#define   uint unsigned int
//使用的端口,请按照以下接线
#define   DataPort P0   //LCD1602数据端口
sbit    SCL=P3^4;      //IIC时钟引脚定义
sbit    SDA=P3^5;      //IIC数据引脚定义
sbit    LCM_RS=P2^5;   //LCD1602命令端口
sbit    LCM_RW=P2^6;   //LCD1602命令端口
sbit    LCM_EN=P2^7;   //LCD1602命令端口 #define   SlaveAddress   0x3C   //定义器件在IIC总线中的从地址
typedef unsigned char BYTE;
typedef unsigned short WORD;BYTE BUF[8];                         //接收数据缓存区
uchar ge,shi,bai,qian,wan;           //显示变量
int  dis_data;                       //变量
double angle;
WORD Dushu;
void delay(unsigned int k);void Init_HMC5883(void);            //初始化5883void conversion(uint temp_data);void  Single_Write_HMC5883(uchar REG_Address,uchar REG_data);   //单个写入数据
uchar Single_Read_HMC5883(uchar REG_Address);                   //单个读取内部寄存器数据
void  Multiple_Read_HMC5883();                                  //连续的读取内部寄存器数据
//以下是模拟iic使用函数-------------
void Delay5us();
void Delay5ms();
void HMC5883_Start();
void HMC5883_Stop();
void HMC5883_SendACK(bit ack);
bit  HMC5883_RecvACK();
void HMC5883_SendByte(BYTE dat);
BYTE HMC5883_RecvByte();
void HMC5883_ReadPage();
void HMC5883_WritePage();
//-----------------------------------#include  <lcd1602.H>
//*********************************************************
void conversion(uint temp_data)
{  wan=temp_data/10000+0x30 ;temp_data=temp_data%10000;   //取余运算qian=temp_data/1000 ;temp_data=temp_data%1000;    //取余运算bai=temp_data/100 ;temp_data=temp_data%100;     //取余运算shi=temp_data/10  ;temp_data=temp_data%10;      //取余运算ge=temp_data+0x30;   Dushu= qian*1000+bai*100+shi*10;
}/*******************************/
void delay(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++)
{;}}
}/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{WORD n = 560;while (n--);
}/**************************************
起始信号
**************************************/
void HMC5883_Start()
{SDA = 1;                    //拉高数据线SCL = 1;                    //拉高时钟线Delay5us();                 //延时SDA = 0;                    //产生下降沿Delay5us();                 //延时SCL = 0;                    //拉低时钟线
}/**************************************
停止信号
**************************************/
void HMC5883_Stop()
{SDA = 0;                    //拉低数据线SCL = 1;                    //拉高时钟线Delay5us();                 //延时SDA = 1;                    //产生上升沿Delay5us();                 //延时
}/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void HMC5883_SendACK(bit ack)
{SDA = ack;                  //写应答信号SCL = 1;                    //拉高时钟线Delay5us();                 //延时SCL = 0;                    //拉低时钟线Delay5us();                 //延时
}/**************************************
接收应答信号
**************************************/
bit HMC5883_RecvACK()
{SCL = 1;                    //拉高时钟线Delay5us();                 //延时CY = SDA;                   //读应答信号SCL = 0;                    //拉低时钟线Delay5us();                 //延时return CY;
}/**************************************
向IIC总线发送一个字节数据
**************************************/
void HMC5883_SendByte(BYTE dat)
{BYTE i;for (i=0; i<8; i++)         //8位计数器{dat <<= 1;              //移出数据的最高位SDA = CY;               //送数据口SCL = 1;                //拉高时钟线Delay5us();             //延时SCL = 0;                //拉低时钟线Delay5us();             //延时}HMC5883_RecvACK();
}/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE HMC5883_RecvByte()
{BYTE i;BYTE dat = 0;SDA = 1;                    //使能内部上拉,准备读取数据,for (i=0; i<8; i++)         //8位计数器{dat <<= 1;SCL = 1;                //拉高时钟线Delay5us();             //延时dat |= SDA;             //读数据               SCL = 0;                //拉低时钟线Delay5us();             //延时}return dat;
}//***************************************************void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
{HMC5883_Start();                  //起始信号HMC5883_SendByte(SlaveAddress);   //发送设备地址+写信号HMC5883_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf HMC5883_SendByte(REG_data);       //内部寄存器数据,请参考中文pdfHMC5883_Stop();                   //发送停止信号
}

.

文件仅供参考:
链接:https://pan.baidu.com/s/1JAGteF7odF1i1nV3uoCIhQ
提取码:rkou

.

基于51单片机的电子罗盘数字指南针HCM8553原理图程序设计相关推荐

  1. 基于51单片机的简易数字电压表proteus仿真原理图程序设计

    硬件电路设计 原理图: 仿真图: 单片机的时钟电路与复位电路设计 本系统采用STC系统列单片机,相比其他系列单片机具有很多优点.一般STC单片机资源比其他单片机要多,而且执行速度快:STC系列单片机使 ...

  2. 基于51单片机的智能自动晾衣架proteus仿真原理图程序设计

    硬件设计 (末尾附文件) 方案 为了实现晾衣自身能够完成对外界数据的采集与分析,集成控制环节我们采用了ATMEL公司生产的AT89C52单片机,与市面上的其他嵌入式控制单元相比较在体积与功耗方面都相当 ...

  3. 共阳极数码时钟c语言程序,基于51单片机C语言数字钟程序.doc

    基于51单片机C语言数字钟程序 基于51单片机C语言数字钟程序 数字电子钟的设计 一. 绪论 (一)引言 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地 ...

  4. 基于51单片机的手动数字时钟

    具体实现功能 实现功能: (1)利用数码管显示时分秒,显示格式为"时-分-秒": (2)利用6个按键控制时.分.秒: (3)设置秒复位按键,可实现秒钟复位. 单片机介绍 51单片是 ...

  5. 【资料分享】基于51单片机的智能指纹考勤系统设计-原理图-PCB-程序-报告、基于51单片机和MAX1898的智能手机充电器设计

    1661[毕设课设]基于51单片机的智能指纹考勤系统设计-原理图-PCB-程序-报告 摘 要 随着科学技术的不断发展带动着电子行业的地位越来越重,现在电子产品几乎在社会的各个领域都可以见到.这些技术的 ...

  6. 基于51单片机的简易数字计算器Proteus仿真(源码+仿真+全套资料)

     资料编号:115 全套资料齐全,功能说明: 该计算器系统51 系列的单片机进行的数字计算器系统设计,可以完成计算器的键盘输入, 进行加. 减.乘.除的简单四则运算,并在 LCD屏幕上相应的显示结果. ...

  7. 【毕业设计】基于51单片机的智能窗帘设计(原理图+原理图+仿真+论文)

    按键1:加(手动开启窗帘 按键2:减(手动关闭窗帘) 按键3:进入定时模式开启时间和光控阈值数值大小的开启 按键4:进入当前时间的设置(年.月.日.时.分的设置) 按键5:切换模式(在手动模式.定时模 ...

  8. 基于51单片机无线恒温箱恒温控制系统(原理图+源代码+PCB+参考论文)

    本设计: 基于51单片机无线恒温箱恒温控制系统(全套资料+原理图+源代码+PCB+参考论文) 原理图:Altium Designer 程序编译器:keil 4 编程语言:C语言 编号C0020 下载链 ...

  9. 基于51单片机锂电池电压电量检测(原理图+PCB+程序)

    资料编号:198  下面是该资料仿真演示视频: 198-基于51单片机锂电池电压电量检测(原理图+PCB+程序+全套资料) 功能介绍: 采用51系列自带AD的单片机stc12c5a60s2型号单片机( ...

  10. (毕业设计资料)基于51单片机的FM数字收音机系统电路设计

    单片机FM收音机采用51单片机+LCD1602液晶+TEA5767模块+LM386+喇叭设计而成. 1.主控芯片采用51单片机系列 2.LCD1602液晶显示当前所收听的FM频道,可以通过按键进行调换 ...

最新文章

  1. html语言分行,Markdown内嵌Html语言
  2. eBay是如何进行大数据集元数据发现的
  3. crossphp框架中,在模板中加载其他模板
  4. SPOJ1812 LCS2
  5. qlabel可以选中吗_惊现凡尔赛式排版!原来微信公众号排版样式还可以“变装”?...
  6. 小程序制作预算_小程序商城制作多少钱
  7. nodepad++快捷键收集
  8. 【转】关于23种设计模式的有趣见解
  9. 谷歌邮箱无法显示使用 Base64 处理的图片的解决方法
  10. c语言相反数补码,求一个数的相反数的补码
  11. 服务机器人工程师(ROS)要求汇总220331
  12. 面向万物智联的云原生网络
  13. 【Soul】用户运营策略分析报告
  14. 2021年中国房地产行业发展现状分析(附房地产开发投资额、房屋施工面积、商品房销售情况及企业排名统计)[图]
  15. SpringBoot使用tkmapper
  16. Android代码混淆技术
  17. 关于 WPC发布了Qi 1.3版本标准
  18. java guice_如何在Guice中进行需要注入实例的动态绑定?
  19. 2012-2020蓝桥C++ B组蓝桥杯省赛真题(第二题)
  20. 数据分析--缺失值填充的几种方法

热门文章

  1. Python中的注释和文档
  2. 9008刷机工具_黔隆科技刷机教程OPPOR11忘记密码免刷机保资料解屏幕锁教程
  3. 禁用驱动程序强制签名(终极办法)
  4. Redis 菜鸟教程学习笔记- Redis 配置
  5. JDBC驱动(类型)
  6. IDEA导入JDBC驱动的jar包
  7. 设置ie默认版本为ie7
  8. 一步步学习java后台(一)(IDEA, Spring, Maven, MyBatis)
  9. 易语言pc微信hook最新版本
  10. php银行学生助学贷款管理系统