久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
HMC5883L電子指南針單片機程序
[打印本頁]
作者:
偉民電子
時間:
2016-12-19 21:19
標題:
HMC5883L電子指南針單片機程序
HMC5883L電子指南針
完整的單片機源程序下載:
2014年6月7日 指南針 1602.rar
(45.92 KB, 下載次數: 187)
2016-12-19 21:17 上傳
點擊文件名下載附件
HMC5883L
下載積分: 黑幣 -5
預覽:
#include <reg52.h> //調用單片機頭文件
#define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
#define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
#include <math.h> //Keil library
#include <stdio.h> //Keil library
#include <INTRINS.H>
sbit rs=P2^3; //寄存器選擇信號 H:數據寄存器 L:指令寄存器
sbit rw=P2^4; //寄存器選擇信號 H:數據寄存器 L:指令寄存器
sbit e =P2^5; //片選信號 下降沿觸發
sbit SCL=P1^1; //IIC時鐘引腳定義
sbit SDA=P1^0; //IIC數據引腳定義
#define SlaveAddress 0x3C //定義器件在IIC總線中的從地址
uchar BUF[8]; //接收數據緩存區
uchar ge,shi,bai,qian,wan; //顯示變量
int dis_data; //變量
/******************1ms 延時函數*******************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/***********************延時函數************************/
void delay_uint(uint q)
{
while(q--);
}
/**************************************
延時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_();
}
/***********************lcd1602寫命令函數************************/
void write_com(uchar com)
{
e=0;
rs=0;
rw=0;
P0=com;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************lcd1602寫數據函數************************/
void write_data(uchar dat)
{
e=0;
rs=1;
rw=0;
P0=dat;
delay_uint(3);
e=1;
delay_uint(25);
e=0;
}
/***********************lcd1602上顯示特定的字符************************/
void write_zifu(uchar hang,uchar add,uchar date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(date);
}
/***********************lcd1602上顯示這字符函數************************/
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '\0') break;
write_data(*p);
p++;
}
}
/***********************lcd1602初始化設置************************/
void init_1602() //lcd1602初始化設置
{
write_com(0x38); //
write_com(0x0c);
write_com(0x06);
delay_uint(1000);
write_string(1,0," zhi nan zhen ");
write_string(2,0," ");
write_zifu(2,11,0xdf); //顯示度
}
/***********************lcd1602上顯示兩位十進制數************************/
void write_jiaodu(uchar hang,uchar add,uint date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/1000%10);
write_data(0x30+date/100%10);
write_data(0x30+date/10%10);
write_data('.');
write_data(0x30+date%10);
}
/**************************************
起始信號
**************************************/
void HMC5883_Start()
{
SDA = 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(uchar dat)
{
uchar i;
for (i=0; i<8; i++) //8位計數器
{
dat <<= 1; //移出數據的最高位
SDA = CY; //送數據口
SCL = 0; //拉高時鐘線
Delay5us(); //延時
SCL = 1; //拉低時鐘線
Delay5us(); //延時
}
HMC5883_RecvACK();
}
/**************************************
從IIC總線接收一個字節數據
**************************************/
uchar HMC5883_RecvByte()
{
uchar i;
uchar 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_SendByte(SlaveAddress); //發送設備地址+寫信號
HMC5883_SendByte(REG_Address); //內部寄存器地址,請參考中文pdf
HMC5883_SendByte(REG_data); //內部寄存器數據,請參考中文pdf
}
//******************************************************
//
//連續讀出HMC5883內部角度數據,地址范圍0x3~0x8
//
//******************************************************
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; i<6; i++) //連續讀取6個地址數據,存儲中BUF
{
BUF[i] = HMC5883_RecvByte(); //BUF[0]存儲數據
if (i == 5)
{
HMC5883_SendACK(0); //最后一個數據需要回NOACK
}
else
{
HMC5883_SendACK(1); //回應ACK
}
}
delay_1ms(5);
}
//初始化HMC5883,根據需要請參考pdf進行修改****
void Init_HMC5883()
{
Single_Write_HMC5883(0x02,0x00); //
}
/*****************主函數********************/
void main()
{
int x,y,z,jiadu;
double angle;
P0 = P1 = P2 = P3 = 0xff; //單片機IO口初始化為1
Init_HMC5883();
init_1602(); //lcd1602初始化
while(1)
{
Multiple_read_HMC5883(); //連續讀出數據,存儲在BUF中
//---------顯示X軸
x=BUF[0] << 8 | BUF[2]; //Combine MSB and LSB of X Data output register
z=BUF[2] << 8 | BUF[4]; //Combine MSB and LSB of Z Data output register
angle= atan2((double)y,(double)x) * (180 / 3.14); // angle in degrees
jiadu = angle;
write_jiaodu(2,6,angle); //顯示角度
if((angle >= 3380) || (angle <= 220)) //北 N
write_string(2,0," N ");
if((angle >= 230) && (angle <= 670)) //東 北
write_string(2,0," E N ");
if((angle >= 680) && (angle <= 1120)) //東 E
write_string(2,0," E ");
if((angle >= 1130) && (angle <= 1570)) //東 南
write_string(2,0," E S ");
if((angle >= 1580) && (angle <= 2010)) //南 S
write_string(2,0," S ");
if((angle >= 2020) && (angle <= 2460)) //西 南
write_string(2,0," W S ");
if((angle >= 2470) && (angle <= 2910)) //西 W
write_string(2,0," W ");
if((angle >= 2920) && (angle <= 3360)) //西 北
write_string(2,0," W N ");
delay_1ms(300);
}
}
復制代碼
作者:
admin
時間:
2017-1-3 00:01
51黑有你更精彩!!!
作者:
誰的智商掉了
時間:
2017-5-8 14:58
大神您好,能幫忙解釋一下如下程序中,角度值為什么這樣設置嗎?
angle= atan2((double)y,(double)x) * (180 / 3.14); // angle in degrees
jiadu = angle;
write_jiaodu(2,6,angle); //顯示角度
if((angle >= 3380) || (angle <= 220)) //北 N
write_string(2,0," N ");
if((angle >= 230) && (angle <= 670)) //東 北
write_string(2,0," E N ");
if((angle >= 680) && (angle <= 1120)) //東 E
write_string(2,0," E ");
if((angle >= 1130) && (angle <= 1570)) //東 南
write_string(2,0," E S ");
if((angle >= 1580) && (angle <= 2010)) //南 S
write_string(2,0," S ");
if((angle >= 2020) && (angle <= 2460)) //西 南
write_string(2,0," W S ");
if((angle >= 2470) && (angle <= 2910)) //西 W
write_string(2,0," W ");
if((angle >= 2920) && (angle <= 3360)) //西 北
write_string(2,0," W N ");
delay_1ms(300);
作者:
誰的智商掉了
時間:
2017-5-8 15:02
大神麻煩解釋一下如下程序中,東西南北角度值為何這樣設呢?
angle= atan2((double)y,(double)x) * (180 / 3.14); // angle in degrees
jiadu = angle;
write_jiaodu(2,6,angle); //顯示角度
if((angle >= 3380) || (angle <= 220)) //北 N
write_string(2,0," N ");
if((angle >= 230) && (angle <= 670)) //東 北
write_string(2,0," E N ");
if((angle >= 680) && (angle <= 1120)) //東 E
write_string(2,0," E ");
if((angle >= 1130) && (angle <= 1570)) //東 南
write_string(2,0," E S ");
if((angle >= 1580) && (angle <= 2010)) //南 S
write_string(2,0," S ");
if((angle >= 2020) && (angle <= 2460)) //西 南
write_string(2,0," W S ");
if((angle >= 2470) && (angle <= 2910)) //西 W
write_string(2,0," W ");
if((angle >= 2920) && (angle <= 3360)) //西 北
write_string(2,0," W N ");
delay_1ms(300);
作者:
jbandtsgky
時間:
2017-5-24 22:37
貌似這個程序不好用!
作者:
AAAAAA666666
時間:
2017-9-12 19:55
感謝 您對資源的分享!!!!!
作者:
simplelife1
時間:
2018-3-31 11:27
非常66666,正好用得到
作者:
cqu_zrx
時間:
2018-5-6 17:34
為什么那個顯示的角度不會變呢
作者:
風癲白
時間:
2018-5-9 18:12
有用!
作者:
lzb1989666
時間:
2020-4-12 13:58
角度竟然是固定的18度,怎么轉動傳感器都不會變啊,這程序有問題啊
作者:
foldous
時間:
2020-5-11 16:50
請問我按上面程序載入,只顯示 18度,值不會變
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲视频在线播放
|
1204国产成人精品视频
|
美国一级黄色片
|
成人在线视频免费观看
|
国产精品欧美一区喷水
|
国产乱码精品一品二品
|
97精品超碰一区二区三区
|
成人国产精品久久久
|
国产美女在线观看
|
91一区二区
|
成年视频在线观看福利资源
|
国产成人a亚洲精品
|
在线看日韩av
|
精品一区二区三区免费毛片
|
性生生活大片免费看视频
|
女朋友的闺蜜3韩国三级
|
91p在线观看
|
黄网站免费入口
|
欧美福利在线
|
国内精品久久久久久
|
亚洲午夜精品在线观看
|
亚洲一区二区三区免费在线观看
|
美女视频网站久久
|
国产精品久久久久无码av
|
精品国产一区一区二区三亚瑟
|
天天综合久久网
|
在线观看免费国产
|
色综合久久久
|
一级毛片免费完整视频
|
亚洲91精品
|
亚洲啪啪
|
久久久久久国产精品免费免费
|
在线成人免费视频
|
欧美亚洲一区二区三区
|
亚洲午夜三级
|
精品在线一区
|
亚洲精品一区二区三区四区高清
|
亚洲精品福利在线
|
国产资源在线视频
|
欧美国产日韩在线观看
|
亚洲国产第一页
|