1 Star 0 Fork 0

仁矜羽/C52

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
qmc.lst 14.79 KB
一键复制 编辑 原始数据 按行查看 历史
仁矜羽 提交于 2021-04-24 20:20 . 2.0电子指南针定版
C51 COMPILER V9.60.0.0 QMC 04/24/2021 19:39:46 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE QMC
OBJECT MODULE PLACED IN qmc.obj
COMPILER INVOKED BY: E:\Keil_v5\C51\C51\BIN\C51.EXE SRC\qmc.c LARGE OPTIMIZE(8,SPEED) BROWSE INCDIR(.\SRC) DEBUG OBJECTE
-XTEND PRINT(.\qmc.lst) TABS(2) OBJECT(qmc.obj)
line level source
1 //***************************************
2 // HMC5883 51串口测试程序
3 // 使用单片机STC89C51
4 // 晶振:11.0592M
5 // 显示:PC串口
6 // 编译环境 Keil uVision2
7 // 参考宏晶网站24c04通信程序
8 // 时间:2011年3月1日
9 //****************************************
10 #include <REG51.H>
11 #include <math.h> //Keil library
12 #include <stdio.h> //Keil library
13 #include <INTRINS.H>
14
15 #include "includes.h"
16 #include "qmc.h"
17 #define uchar unsigned char
18 #define uint unsigned int
19 //使用的端口,请按照以下接线
20 #define DataPort P0 //LCD1602数据端口
21 sbit SCL=P2^0; //IIC时钟引脚定义
22 sbit SDA=P2^1; //IIC数据引脚定义
23
24
25 #define SlaveAddress 0x3C //定义器件5883在IIC总线中的从地址
26 typedef unsigned char BYTE;
27 typedef unsigned short WORD;
28
29 BYTE BUF[8]; //接收数据缓存区
30 uchar ge,shi,bai,qian,wan; //显示变量
31 int dis_data; //变量
32 //************
33
34 //************
35 void delay(unsigned int k);
36 void Init_HMC5883(void); //初始化5883
37 void conversion(uint temp_data);
38
39 void Single_Write_HMC5883(uchar REG_Address,uchar REG_data); //单个写入数据
40 //uchar Single_Read_HMC5883(uchar REG_Address); //单个读取内部寄存器数据
41 void Multiple_Read_HMC5883(); //连续的读取内部寄存器数据
42 //以下是模拟iic使用函数-------------
43 void Delay5us();
44 void Delay5ms();
45 void HMC5883_Start();
46 void HMC5883_Stop();
47 void HMC5883_SendACK(bit ack);
48 bit HMC5883_RecvACK();
49 void HMC5883_SendByte(BYTE dat);
50 BYTE HMC5883_RecvByte();
51 void HMC5883_ReadPage();
52 void HMC5883_WritePage();
53 //-----------------------------------
54
C51 COMPILER V9.60.0.0 QMC 04/24/2021 19:39:46 PAGE 2
55 //*********************************************
56 //串口初始化
57 //9600 bps @ 11.059 MHz
58 /*
59 void init_uart()
60 {
61 TMOD=0x21;
62 TH1=0xfd;
63 TL1=0xfd;
64 SCON=0x50;
65 PS=1; //串口中断设为高优先级别
66 TR0=1; //启动定时器
67 TR1=1;
68 ET0=1; //打开定时器0中断
69 ES=1;
70 }
71 */
72 //*********串口数据发送******************
73 void SeriPushSend(uchar send_data)
74 {
75 1 SBUF=send_data;
76 1 while(!TI);TI=0;
77 1 }
78 //*********************************************************
79 void conversion(uint temp_data)
80 {
81 1 wan=temp_data/10000+0x30 ;
82 1 temp_data=temp_data%10000; //取余运算
83 1 qian=temp_data/1000+0x30 ;
84 1 temp_data=temp_data%1000; //取余运算
85 1 bai=temp_data/100+0x30 ;
86 1 temp_data=temp_data%100; //取余运算
87 1 shi=temp_data/10+0x30 ;
88 1 temp_data=temp_data%10; //取余运算
89 1 ge=temp_data+0x30;
90 1 }
91
92 /*******************************/
93 void delay(unsigned int k)
94 {
95 1 unsigned int i,j;
96 1 for(i=0;i<k;i++)
97 1 {
98 2 for(j=0;j<121;j++)
99 2 {;}}
100 1 }
101
102
103 /**************************************
104 延时5微秒(STC90C52RC@12M)
105 不同的工作环境,需要调整此函数,注意时钟过快时需要修改
106 当改用1T的MCU时,请调整此延时函数
107 **************************************/
108 void Delay5us()
109 {
110 1 _nop_();_nop_();_nop_();_nop_();
111 1 _nop_();_nop_();_nop_();_nop_();
112 1 _nop_();_nop_();_nop_();_nop_();
113 1 _nop_();_nop_();_nop_();_nop_();
114 1 _nop_();_nop_();_nop_();_nop_();
115 1 }
116
C51 COMPILER V9.60.0.0 QMC 04/24/2021 19:39:46 PAGE 3
117 /**************************************
118 延时5毫秒(STC90C52RC@12M)
119 不同的工作环境,需要调整此函数
120 当改用1T的MCU时,请调整此延时函数
121 **************************************/
122 void Delay5ms()
123 {
124 1 WORD n = 560;
125 1
126 1 while (n--);
127 1 }
128
129 /**************************************
130 起始信号
131 **************************************/
132 void HMC5883_Start()
133 {
134 1 SDA = 1; //拉高数据线
135 1 SCL = 1; //拉高时钟线
136 1 Delay5us(); //延时
137 1 SDA = 0; //产生下降沿
138 1 Delay5us(); //延时
139 1 SCL = 0; //拉低时钟线
140 1 }
141
142 /**************************************
143 停止信号
144 **************************************/
145 void HMC5883_Stop()
146 {
147 1 SDA = 0; //拉低数据线
148 1 SCL = 1; //拉高时钟线
149 1 Delay5us(); //延时
150 1 SDA = 1; //产生上升沿
151 1 Delay5us(); //延时
152 1 }
153
154 /**************************************
155 发送应答信号
156 入口参数:ack (0:ACK 1:NAK)
157 **************************************/
158 void HMC5883_SendACK(bit ack)
159 {
160 1 SDA = ack; //写应答信号
161 1 SCL = 1; //拉高时钟线
162 1 Delay5us(); //延时
163 1 SCL = 0; //拉低时钟线
164 1 Delay5us(); //延时
165 1 }
166
167 /**************************************
168 接收应答信号
169 **************************************/
170 bit HMC5883_RecvACK()
171 {
172 1 SCL = 1; //拉高时钟线
173 1 Delay5us(); //延时
174 1 CY = SDA; //读应答信号
175 1 SCL = 0; //拉低时钟线
176 1 Delay5us(); //延时
177 1
178 1 return CY;
C51 COMPILER V9.60.0.0 QMC 04/24/2021 19:39:46 PAGE 4
179 1 }
180
181 /**************************************
182 向IIC总线发送一个字节数据
183 **************************************/
184 void HMC5883_SendByte(BYTE dat)
185 {
186 1 BYTE i;
187 1
188 1 for (i=0; i<8; i++) //8位计数器
189 1 {
190 2 dat <<= 1; //移出数据的最高位
191 2 SDA = CY; //送数据口
192 2 SCL = 1; //拉高时钟线
193 2 Delay5us(); //延时
194 2 SCL = 0; //拉低时钟线
195 2 Delay5us(); //延时
196 2 }
197 1 HMC5883_RecvACK();
198 1 }
199
200 /**************************************
201 从IIC总线接收一个字节数据
202 **************************************/
203 BYTE HMC5883_RecvByte()
204 {
205 1 BYTE i;
206 1 BYTE dat = 0;
207 1
208 1 SDA = 1; //使能内部上拉,准备读取数据,
209 1 for (i=0; i<8; i++) //8位计数器
210 1 {
211 2 dat <<= 1;
212 2 SCL = 1; //拉高时钟线
213 2 Delay5us(); //延时
214 2 dat |= SDA; //读数据
215 2 SCL = 0; //拉低时钟线
216 2 Delay5us(); //延时
217 2 }
218 1 return dat;
219 1 }
220
221 //***************************************************
222
223 void Single_Write_HMC5883(uchar REG_Address,uchar REG_data)
224 {
225 1 HMC5883_Start(); //起始信号
226 1 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号
227 1 HMC5883_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf
228 1 HMC5883_SendByte(REG_data); //内部寄存器数据,请参考中文pdf
229 1 HMC5883_Stop(); //发送停止信号
230 1 }
231 /*
232 //********单字节读取内部寄存器*************************
233 uchar Single_Read_HMC5883(uchar REG_Address)
234 { uchar REG_data;
235 HMC5883_Start(); //起始信号
236 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号
237 HMC5883_SendByte(REG_Address); //发送存储单元地址,从0开始
238 HMC5883_Start(); //起始信号
239 HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号
240 REG_data=HMC5883_RecvByte(); //读出寄存器数据
C51 COMPILER V9.60.0.0 QMC 04/24/2021 19:39:46 PAGE 5
241 HMC5883_SendACK(1);
242 HMC5883_Stop(); //停止信号
243 return REG_data;
244 }
245 */
246 //******************************************************
247 //
248 //连续读出HMC5883内部角度数据,地址范围0x3~0x5
249 //
250 //******************************************************
251 void Multiple_read_HMC5883(void)
252 { uchar i;
253 1 HMC5883_Start(); //起始信号
254 1 HMC5883_SendByte(SlaveAddress); //发送设备地址+写信号
255 1 HMC5883_SendByte(0x03); //发送存储单元地址,从0x3开始
256 1 HMC5883_Start(); //起始信号
257 1 HMC5883_SendByte(SlaveAddress+1); //发送设备地址+读信号
258 1 for (i=0; i<7; i++) //连续读取6个地址数据,存储中BUF
259 1 {
260 2 BUF[i] = HMC5883_RecvByte(); //BUF[0]存储0x32地址中的数据
261 2 if (i == 6)
262 2 {
263 3 HMC5883_SendACK(1); //最后一个数据需要回NOACK
264 3 }
265 2 else
266 2 {
267 3 HMC5883_SendACK(0); //回应ACK
268 3 }
269 2 }
270 1 HMC5883_Stop(); //停止信号
271 1 Delay5ms();
272 1 }
273
274 //初始化HMC5883,根据需要请参考pdf进行修改****
275 void Init_HMC5883()
276 {
277 1 Single_Write_HMC5883(0x02,0x00); //
278 1 Single_Write_HMC5883(0x01,0xE0); //
279 1 }
280
281 void QMC_Init(void)
282 {
283 1 delay(100);
284 1 //init_uart();
285 1 Init_HMC5883();
286 1 }
287
288 extern bit UPINFO;
289 int QMC_Read(unsigned char *buf)
290 {
291 1 int x,y,z;
292 1 double angle;
293 1
294 1 Multiple_Read_HMC5883(); //连续读出数据,存储在BUF中
295 1 x = BUF[0] << 8 | BUF[1];
296 1 y = BUF[4] << 8 | BUF[5];
297 1 z = BUF[2] << 8 | BUF[3];
298 1 angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees
299 1 conversion(angle); //计算数据和显示
300 1 /*
301 1 if(UPINFO)
302 1 {
C51 COMPILER V9.60.0.0 QMC 04/24/2021 19:39:46 PAGE 6
303 1 SeriPushSend(bai);
304 1 SeriPushSend(shi);
305 1 SeriPushSend(ge);
306 1
307 1 SeriPushSend(0x0d);
308 1 SeriPushSend(0x0a);
309 1 }
310 1 */
311 1 buf[0] = bai;
312 1 buf[1] = shi;
313 1 buf[2] = ge;
314 1 return (bai-'0')*100+(shi-'0')*10+(ge-'0');
315 1 }
316
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 699 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 15 7
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/yjr_ty/C52.git
git@gitee.com:yjr_ty/C52.git
yjr_ty
C52
C52
master

搜索帮助