//***************************************
// HMC5883 IIC测试程序
// 使用单片机STC89C52
// 晶振:12M
// 显示:串口输出,波特率4800
// 编译环境 Keil uVision3
#include "reg52.h"
#include <math.h> //Keil library
#include <stdio.h> //Keil library
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P3^6; //IIC时钟引脚定义
sbit SDA=P3^7; //IIC数据引脚定义
sbit RING=P3^5;
#define SlaveAddress 0x3C //定义器件在IIC总线中的从地址
typedef unsigned char BYTE;
typedef unsigned short WORD;
BYTE BUF[8]; //接收数据缓存区
uchar ge,shi,bai,qian,wan; //显示变量
int dis_data; //变量
void delay(unsigned int k);
void Init_HMC5883(void); //初始化5883
void 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();
//-----------------------------------
//*********************************************************
void conversion(uint temp_data)
{
wan=temp_data/10000+0x30 ;
temp_data=temp_data%10000; //取余运算
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000; //取余运算
bai=temp_data/100+0x30 ;
temp_data=temp_data%100; //取余运算
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余运算
ge=temp_data+0x30;
}
/*******************************/
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_();
_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_();
_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); //内部寄存器数据,请参考中文pdf
HMC5883_Stop(); //发送停止信号
}
//********单字节读取内部寄存器*************************
//为消除编译器警告,可将此函数注释掉
uchar Single_Read_HMC5883(uchar REG_Address)
{ uchar REG_data;
HMC5883_Start(); //起始信号
HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号
HMC5883_SendByte(REG_Address); //发送存储单元地址,从0开始
HMC5883_Start(); //起始信号
HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号
REG_data=HMC5883_RecvByte(); //读出寄存器数据
HMC5883_SendACK(1);
HMC5883_Stop(); //停止信号
return REG_data;
}
//******************************************************
//连续读出HMC5883内部角度数据,地址范围0x3~0x5
//
//******************************************************
void Multiple_read_HMC5883(void)
{ uchar i;
HMC5883_Start(); //起始信号
HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号
HMC5883_SendByte(0x03); //发送存储单元地址,从0x32开始
HMC5883_Start(); //起始信号
HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号
for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF
{
BUF[i] = HMC5883_RecvByte(); //BUF[0]存储0x32地址中的数据
if (i == 5)
{
HMC5883_SendACK(1); //最后一个数据需要回NOACK
}
else
{
HMC5883_SendACK(0); //回应ACK
}
}
HMC5883_Stop(); //停止信号
Delay5ms();
}
//初始化HMC5883,根据需要请参考pdf进行修改****
void Init_HMC5883()
{
Single_Write_HMC5883(0x02,0x00); //
}
void uart_init()
{
TMOD=0x20; //TMOD=0
TH1=0xf3; //12MHZ ,
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于51单片机的指南针 (157个子文件)
compass_Opt.Bak 974B
compass_Uv2.Bak 0B
main.c 11KB
compass 21KB
compass.hex 10KB
指南.jpg 300KB
指南针.jpg 235KB
QQ图片20140120182532.jpg 174KB
QQ图片20140120182356.jpg 112KB
QQ图片20140120182308.jpg 97KB
QQ图片20140120182417.jpg 94KB
QQ图片20140120182259.jpg 94KB
QQ图片20140120182431.jpg 87KB
QQ图片20140120182238.jpg 87KB
QQ图片20140120182440.jpg 85KB
QQ图片20140120182537.jpg 85KB
QQ图片20140120182633.jpg 85KB
QQ图片20140120182421.jpg 64KB
compass.lnp 43B
指南针 PCB ECO 2014-1-15 18-15-45.LOG 6KB
指南针 PCB ECO 2014-1-15 18-24-02.LOG 736B
指南针 PCB ECO 2014-1-15 18-19-16.LOG 442B
指南针 PCB ECO 2014-1-15 18-51-23.LOG 274B
指南针 PCB ECO 2014-1-15 18-30-12.LOG 95B
指南针 PCB ECO 2014-1-15 18-22-16.LOG 25B
指南针 PCB ECO 2014-1-15 18-32-57.LOG 25B
指南针 PCB ECO 2014-1-15 18-42-33.LOG 25B
指南针 PCB ECO 2014-1-15 18-41-34.LOG 25B
指南针 PCB ECO 2014-1-15 18-45-19.LOG 25B
指南针 PCB ECO 2014-1-15 18-34-01.LOG 25B
指南针 PCB ECO 2014-1-15 18-31-26.LOG 25B
main.LST 19KB
compass.M51 26KB
main.OBJ 23KB
compass.Opt 962B
指南针.PCBDOC 130KB
指南针.~(71).PCBDOC 20KB
指南针.~(69).PCBDOC 20KB
指南针.~(70).PCBDOC 20KB
指南针.~(75).PCBDOC 20KB
指南针.~(74).PCBDOC 20KB
指南针.~(73).PCBDOC 20KB
指南针.~(66).PCBDOC 20KB
指南针.~(67).PCBDOC 20KB
指南针.~(68).PCBDOC 20KB
指南针.~(72).PCBDOC 20KB
指南针.~(65).PCBDOC 20KB
指南针.~(64).PCBDOC 20KB
指南针.~(63).PCBDOC 20KB
指南针.~(62).PCBDOC 20KB
指南针.~(61).PCBDOC 20KB
指南针.~(60).PCBDOC 20KB
指南针.~(59).PCBDOC 20KB
指南针.~(58).PCBDOC 20KB
指南针.~(57).PCBDOC 20KB
指南针.~(56).PCBDOC 20KB
指南针.~(55).PCBDOC 20KB
指南针.~(54).PCBDOC 20KB
指南针.~(52).PCBDOC 19KB
指南针.~(51).PCBDOC 19KB
指南针.~(53).PCBDOC 19KB
指南针.~(49).PCBDOC 19KB
指南针.~(50).PCBDOC 19KB
指南针.~(48).PCBDOC 19KB
指南针.~(45).PCBDOC 19KB
指南针.~(47).PCBDOC 19KB
指南针.~(46).PCBDOC 19KB
指南针.~(44).PCBDOC 19KB
指南针.~(43).PCBDOC 19KB
指南针.~(42).PCBDOC 19KB
指南针.~(32).PCBDOC 19KB
指南针.~(40).PCBDOC 19KB
指南针.~(39).PCBDOC 19KB
指南针.~(34).PCBDOC 19KB
指南针.~(33).PCBDOC 19KB
指南针.~(41).PCBDOC 19KB
指南针.~(35).PCBDOC 19KB
指南针.~(38).PCBDOC 19KB
指南针.~(37).PCBDOC 19KB
指南针.~(31).PCBDOC 19KB
指南针.~(36).PCBDOC 19KB
指南针.~(30).PCBDOC 19KB
指南针.~(29).PCBDOC 19KB
指南针.~(28).PCBDOC 19KB
指南针.~(27).PCBDOC 19KB
指南针.~(25).PCBDOC 18KB
指南针.~(24).PCBDOC 18KB
指南针.~(26).PCBDOC 18KB
指南针.~(23).PCBDOC 18KB
指南针.~(22).PCBDOC 18KB
指南针.~(21).PCBDOC 17KB
指南针.~(20).PCBDOC 17KB
指南针.~(11).PCBDOC 17KB
指南针.~(17).PCBDOC 17KB
指南针.~(18).PCBDOC 17KB
指南针.~(19).PCBDOC 17KB
指南针.~(16).PCBDOC 17KB
指南针.~(15).PCBDOC 17KB
指南针.~(8).PCBDOC 16KB
指南针.~(13).PCBDOC 16KB
共 157 条
- 1
- 2
资源评论
number007cool
- 粉丝: 7
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C语言基础-C语言编程基础之Leetcode编程题解之第30题串联所有单词的子串.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第29题两数相除.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第28题找出字符串中第一个匹配项的下标.zip
- 实验报告模板(1).docx
- C语言基础-C语言编程基础之Leetcode编程题解之第26题删除有序数组中的重复项.zip
- C语言基础-C语言编程基础之Leetcode编程题解之第25题K个一组翻转链表.zip
- hnu计算机系统作业-计算机系统基础课程大作业.zip
- 树莓派app.apk
- C++的基于同态加密技术的匿名电子投票系统源码.zip
- SW建模格式图.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功