




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/*/ HMC5883 IIC测试程序/ 使用单片机STC89C51 / 晶振:11.0592M/ 显示:串口/ 编译环境 Keil uVision5/2015/7/26/*#include #include #include #include #define uchar unsigned char#define uint unsigned int/*IIC定义*/sbitSCL=P12; /IIC时钟引脚定义sbitSDA=P13; /IIC数据引脚定义typedef unsigned short WORD;/*IIC定义*/*磁力计定义*/#define SlaveAddress0x3C /定义器件在IIC总线中的从地址(0x3c是写入的地址。7bit地址是0x1E)/*磁力计定义*/*串口定义*/unsigned char Bufer=hello n;typedef unsigned char BYTE;BYTE BUF6; /接收数据缓存区 uchar ge,shi,bai,qian,wan; /显示变量/*串口定义*/*函数声明*/延时void delay(unsigned int k);/串口void UART_init(void);void UART_send_byte(unsigned char dat);void UART_send_string(unsigned char *bufer);/转换void conversion(uint temp_data);/磁力计void Init_HMC5883(void); /初始化5883/IICvoid Single_Write_HMC5883(uchar REG_Address,uchar REG_data); /单个写入数据uchar Single_Read_HMC5883(uchar REG_Address); /单个读取内部寄存器数据void Multiple_Read_HMC5883(); /连续的读取内部寄存器数据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();/*函数声明*/*函数定义*/UART初始化 波特率:9600void UART_init(void)SCON = 0x50; / 10位uart,允许串行接受 TMOD = 0x20; / 定时器1工作在方式2(自动重装) TH1 = 0xFD; TL1 = 0xFD; TR1 = 1;/UART 发送一字节void UART_send_byte(unsigned char dat)SBUF = dat;while (TI = 0);TI = 0;/UART 发送字符串void UART_send_string(unsigned char *bufer)while (*bufer != 0)UART_send_byte(*bufer+);/延时函数 void delay(unsigned int k)unsigned int i,j;for(i=0;ik;i+)for(j=0;j121;j+);/转换函数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; /自测HMC5883 void Init_HMC5883() Single_Write_HMC5883(0x00,0x71);/Write CRA (00) send 0x3C 0x00 0x70 (8-average, 15 Hz default, normal measurement) Single_Write_HMC5883(0x01,0xA0);/Write CRB (01) send 0x3C 0x01 0xA0 (Gain=5, or any other desired gain) Single_Write_HMC5883(0x02,0x01);/Write Mode(02) send 0x3C 0x02 0x00 (Continuous-measurement mode)/离开自测HMC5883 void leave_HMC5883() Single_Write_HMC5883(0x00,0xF0);/Write CRA (00) send 0x3C 0x00 0x70 (8-average, 15 Hz default, normal measurement) Single_Write_HMC5883(0x01,0xA0);/Write CRB (01) send 0x3C 0x01 0xA0 (Gain=5, or any other desired gain) Single_Write_HMC5883(0x02,0x00);/Write Mode(02) send 0x3C 0x02 0x00 (Continuous-measurement mode)/*延时5微秒(STC90C52RC12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用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毫秒(STC90C52RC12M)不同的工作环境,需要调整此函数当改用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; i8; 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; i8; 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内部角度数据void Multiple_read_HMC5883(void) uchar i; HMC5883_Start(); /起始信号 HMC5883_SendByte(SlaveAddress); /发送设备地址+写信号 HMC5883_SendByte(0x03); /发送存储单元地址,从0x3开始 HMC5883_Start(); /起始信号 HMC5883_SendByte(SlaveAddress+1); /发送设备地址+读信号 for (i=0; i6; i+) /连续读取6个地址数据,存储中BUF BUFi = HMC5883_RecvByte(); /BUF0存储数据 if (i = 5) HMC5883_SendACK(1); /最后一个数据需要回NOACK else HMC5883_SendACK(0); /回应ACK HMC5883_Stop(); /停止信号 Delay5ms();/*主程序*/void main() unsigned int i;int x,y,z;double angle;delay(500);UART_init();Init_HMC5883();delay(600);BUF0 = Single_Read_HMC5883(0x03);BUF1 = Single_Read_HMC5883(0x04);BUF2 = Single_Read_HMC5883(0x05);BUF3 = Single_Read_HMC5883(0x06);BUF4 = Single_Read_HMC5883(0x07);BUF5 = Single_Read_HMC5883(0x08);x=BUF0 8 | BUF1; /Combine MSB and LSB of X Data output registerz=BUF2 8 | BUF3; /Combine MSB and LSB of Z Data output registery=BUF4 8 | BUF5; /Combine MSB and LSB of Y Data output registerangle= atan2(double)y,(double)x) * (180 / 3.14159265) + 180; / angle in degreesangle*=10;conversion(angle); /计算数据和显示Bufer0=(qian=,qian); Bufer1=(bai=,bai); Bufer2=(shi=,shi); Bufer3=(.); Bufer4=(ge=,ge); Bufer5=(,); UART_send_string(Bufer);for (i=0;i10000;i+); /延时 UART_send_string(Bufer);for (i=0;i10000;i+); /延时 UART_send_string(Bufer);for (i=0;i10000;i+); /延时 UART_send_str
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 剖宫产过程质量指标课件
- 个人简易租房合同范本及注意事项
- 银行信贷风险评估标准操作
- 前肠囊肿影像诊断课件
- 维修工安全操作规程及考核标准
- 前端知识培训内容
- 展览布置与施工现场管理指南
- 常州工程职业技术学院《西式调酒与果蔬雕刻》2024-2025学年第一学期期末试卷
- 西安电子科技大学长安学院《结构设计原理A课程设计》2024-2025学年第一学期期末试卷
- 景德镇艺术职业大学《学前科学教育与活动指导》2024-2025学年第一学期期末试卷
- 安全生产培训(完整版)课件
- 钢结构长廊施工方案
- 信保业务自查问题统计表
- 年产3万吨环保型铝箔容器系列产品生产线项目环境影响报告
- 安庆汇辰药业有限公司高端原料药、医药中间体建设项目环境影响报告书
- 关于术中知晓预防和脑功能监测专家共识
- 河道修防工高级工试题
- 保障农民工工资支付协调机制和工资预防机制
- GB/T 4458.3-2013机械制图轴测图
- GB/T 311.2-2013绝缘配合第2部分:使用导则
- GB/T 13912-2002金属覆盖层钢铁制件热浸镀锌层技术要求及试验方法
评论
0/150
提交评论