OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16787|回复: 36

KS103超声波模块

[复制链接]

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-5-31
在线时间
0 小时
发表于 2014-6-24 18:05:53 | 显示全部楼层 |阅读模式
[mw_shl_code=c,true]/*KS10X.c*/ #include"I2C2init.h" #include"sys.h" #include"delay.h" #include"usart.h" #include"math.h" #include"KS10X.h" #define uchar unsigned char #define uint unsigned int u16 sum; /*************************************************************************** *******************************************************************************/ void Single_WriteI2C(u8 SlaveAddress,u8 REG_Address,u8 REG_data) { IIC_Start(); //起始信号 IIC_Send_Byte(SlaveAddress); //发送设备地址+写信号 while(IIC_Wait_Ack()); IIC_Send_Byte(REG_Address); //内部寄存器地址 while(IIC_Wait_Ack()); /**********************/ IIC_Send_Byte(REG_data); //内部寄存器数据 while(IIC_Wait_Ack()); /**********************/ IIC_Stop(); //发送停止信号 } //************************************** //从I2C设备读取一个字节数据 //************************************** u8 Single_ReadI2C(u8 SlaveAddress,u8 REG_Address) { u8 REG_data=0; IIC_Start(); IIC_Send_Byte(SlaveAddress); while(IIC_Wait_Ack()); IIC_Send_Byte(REG_Address); while(IIC_Wait_Ack()); /**********************/ IIC_Start(); IIC_Send_Byte(SlaveAddress+1); while(IIC_Wait_Ack()); delay_us(50); REG_data=IIC_Read_Byte(0); // IIC_NAck(); // delay_us(2); IIC_Stop(); return REG_data; } u32 Read_KS10X(u8 SlaveAddress) { // delay_ms(80); sum=Single_ReadI2C(SlaveAddress,0x02); //高8位 sum<<=8; sum+=Single_ReadI2C(SlaveAddress,0x03); //低8位 return sum; } void Change_Addr(u8 OldAdddr,u8 NewAddr) { // delay_ms(500); Single_WriteI2C(OldAdddr,0x02,0x9a); //默认原地址是0x00; delay_ms(1); Single_WriteI2C(OldAdddr,0x02,0x92); delay_ms(1); Single_WriteI2C(OldAdddr,0x02,0x9e); delay_ms(1); Single_WriteI2C(OldAdddr,0x02,NewAddr); delay_ms(100); // Single_WriteI2C(NewAddr,0x02,0xb0); // delay_ms(80); } float Read_KS10X_Data(u8 SlaveAddress) { float sumx; float sum_x; Single_WriteI2C(SlaveAddress,0x02,0xb0); delay_ms(80); sumx=Read_KS10X(SlaveAddress); //读出第一个超声波的数据 sum_x=(float)sumx/10; // printf("%lf\r\n",sum_x); return sum_x; } void KS10X_Change_Addr_Init(u8 OldAddr,u8 NewAddr) //此函数用来实现选择超声波的地址 { Change_Addr(OldAddr,NewAddr); delay_ms(80); } /*KS10X.h*/ #ifndef Mpu6050_H #define Mpu6050_H //**************************************** // 定义KS10X内部地址 //**************************************** #define SlaveAddress1 0xE8 //IIC写入时的地址字节数据,+1为读取 #define SlaveAddress2 0xd0 #define SlaveAddress3 0xd2 #define SlaveAddress4 0xd4 #define SlaveAddress5 0xd6 #define SlaveAddress6 0xd8 #define SlaveAddress7 0xda #define SlaveAddress8 0xdc #define SlaveAddress9 0xde #define SlaveAddress10 0xe0 #define SlaveAddress11 0xe2 #define SlaveAddress12 0xe4 #define SlaveAddress13 0xe6 #define SlaveAddress14 0xea #define SlaveAddress15 0xec #define SlaveAddress16 0xee #define SlaveAddress17 0xf8 #define SlaveAddress18 0xfa #define SlaveAddress19 0xfc #define SlaveAddress20 0xfe #include"sys.h" u8 Single_ReadI2C(u8 SlaveAddress,u8 REG_Address); void Single_WriteI2C(u8 SlaveAddress,u8 REG_Address,u8 REG_data); u32 Read_KS10X(u8 SlaveAddress); void Change_Addr(u8 OldAdddr,u8 NewAddr); float Read_KS10X_Data(u8 SlaveAddress); void KS10X_Change_Addr_Init(u8 OldAddr,u8 NewAddr); #endif /*I2C2init.c*/ #include"I2C2init.h" #include"sys.h" #include"usart.h" #include"delay.h" #include"math.h" void I2C2_Init() { RCC->APB2ENR|=1<<3; //GPIOB时钟使能 GPIOB->CRH&=0xff00ffff; GPIOB->CRH|=0x00330000; //PB12,PB13设置为复用开漏输出 GPIOB->ODR|=1<<12; GPIOB->ODR|=1<<13; } void IIC_Start(void) { SDA_OUT(); //sda线输出 SDA=1; SCL=1; delay_us(10); SDA=0; //START:when CLK is high,DATA change form high to low delay_us(10); SCL=0; //钳住I2C总线,准备发送或接收数据 } //产生IIC停止信号 void IIC_Stop(void) { SDA_OUT(); //sda线输出 SCL=0; SDA=0; delay_us(10); SCL=1; //STOP:when CLK is high DATA change form low to high SDA=1; //发送I2C总线结束信号 delay_us(10); } //等待应答信号到来 //返回值:1,接收应答失败 // 0,接收应答成功 u8 IIC_Wait_Ack(void) { u8 ucErrTime=0; SDA_IN(); //SDA设置为输入 SDA=1;delay_us(6); SCL=1;delay_us(6); while(READ_SDA) { ucErrTime++; if(ucErrTime>250) { IIC_Stop(); return 1; } } SCL=0; //时钟输出0 return 0; } //产生ACK应答 void IIC_Ack(void) { SCL=0; SDA_OUT(); SDA=0; delay_us(10); SCL=1; delay_us(10); SCL=0; } //不产生ACK应答 void IIC_NAck(void) { SCL=0; SDA_OUT(); SDA=1; delay_us(10); SCL=1; delay_us(10); SCL=0; } //IIC发送一个字节 //返回从机有无应答 //1,有应答 //0,无应答 void IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); SCL=0; //拉低时钟开始数据传输 for(t=0;t<8;t++) { SDA=(txd&0x80)>>7; txd<<=1; delay_us(10); //对TEA5767这三个延时都是必须的 SCL=1; delay_us(10); SCL=0; delay_us(10); } } //读1个字节,ack=1时,发送ACK,ack=0,发送nACK u8 IIC_Read_Byte(unsigned char ack) { unsigned char i,receive=0; SDA_IN(); //SDA设置为输入 for(i=0;i<8;i++ ) { SCL=0; delay_us(10); SCL=1; receive<<=1; if(READ_SDA)receive++; delay_us(5); } if (!ack) IIC_NAck(); //发送nACK else IIC_Ack(); //发送ACK return receive; } /*I2C2init.h*/ #ifndef I2C2_H #define I2C2_H #include"sys.h" #define SCL PBout(12) #define SDA PBout(13) #define READ_SDA PBin(13) #define SDA_IN() {GPIOB->CRH&=0xff0fffff;GPIOB->CRH|=0x00800000;/*GPIOB->ODR|=1<<11;*/} #define SDA_OUT() {GPIOB->CRH&=0xff0fffff;GPIOB->CRH|=0x00300000;} void I2C2_Init(void); void IIC_Start(void); //发送IIC开始信号 void IIC_Stop(void); //发送IIC停止信号 void IIC_Send_Byte(u8 txd); //IIC发送一个字节 u8 IIC_Read_Byte(unsigned char ack); //IIC读取一个字节 u8 IIC_Wait_Ack(void); //IIC等待ACK信号 void IIC_Ack(void); //IIC发送ACK信号 void IIC_NAck(void); //IIC不发送ACK信号 //void Change_Addr(u8 NewAddr); #endif /*main.c*/ #include"sys.h" #include"delay.h" #include"usart.h" #include"I2C2init.h" #include"KS10X.h" u32 sum1,sum2,sum3,sum4,sum5,sum6,sum7,sum8,sum9,sum10,sum11,sum12,sum13,sum14,sum15, sum16,sum17,sum18,sum19,sum20; float sum_1,sum_2; int main() { Stm32_Clock_Init(9); delay_init(72); uart_init(72,9600); I2C2_Init(); // KS10X_Change_Addr_Init(SlaveAddress3,SlaveAddress2); //在换了KS10X后才执行,且执行一次 ,执行完一次后就消去 //这样这个模块将有固定的地址 while(1) { sum_2=Read_KS10X_Data(SlaveAddress2); sum_1=Read_KS10X_Data(SlaveAddress1); printf("%lf\r\n",sum_1); printf("%lf\r\n\r\n",sum_2); } }[/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true]这个是我今天读出来的KS103超声波数据的程序,主要是在一根总线上搭多个模块,用 [/mw_shl_code]

KS10X_Change_Addr_Init(u8 OldAddr,u8 NewAddr)

这个函数来实现改变器件地址

其他的函数直接用我写的就行了,只要在主函数里面修改即可

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-8-13
在线时间
8 小时
发表于 2017-8-13 20:48:16 | 显示全部楼层
正点原子 发表于 2014-7-13 23:24
回复【7楼】wang123:
---------------------------------
就是取1/10的结果
可能是取平均值吧.

不是取平均值,0xb0指令返回的是mm,所以要除以10所得到的是单位为cm。


QQ图片20170813204707.png
回复 支持 1 反对 0

使用道具 举报

8

主题

222

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2013-11-21
在线时间
0 小时
发表于 2014-6-24 18:34:18 | 显示全部楼层
谢谢分享。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-24 23:10:47 | 显示全部楼层
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-6-11
在线时间
0 小时
发表于 2014-7-13 10:46:18 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
这个程序可以用么?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-13 16:15:24 | 显示全部楼层
回复【4楼】wang123:
---------------------------------
我没测试....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-6-11
在线时间
0 小时
发表于 2014-7-13 19:30:03 | 显示全部楼层
回复【5楼】正点原子:
原子哥,你有这个程序么?
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-6-11
在线时间
0 小时
发表于 2014-7-13 20:26:24 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
SUM/10请问有什么作用?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-13 23:24:53 | 显示全部楼层
回复【7楼】wang123:
---------------------------------
就是取1/10的结果
可能是取平均值吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2014-5-31
在线时间
0 小时
 楼主| 发表于 2014-7-14 11:33:58 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
回复【7楼】wang123:
---------------------------------
是的,就是取均值
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-8-17
在线时间
0 小时
发表于 2014-8-17 16:24:38 | 显示全部楼层
原子哥,这个能同时测5个ks103么
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-17 21:21:43 | 显示全部楼层
回复【10楼】哥们求救:
---------------------------------
这我不知道哦.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-5-8
在线时间
8 小时
发表于 2015-7-15 15:41:53 | 显示全部楼层
参考了 你的程序  把IIC的读时间增加了一点  程序马上就好了 谢谢
回复 支持 反对

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-2-5
在线时间
0 小时
发表于 2015-7-29 23:18:07 | 显示全部楼层
回复【12楼】莫恋&她:
---------------------------------我也是按照楼主的改的,可是读出来全是0.。。并没有改什么地方。。
回复 支持 反对

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-2-5
在线时间
0 小时
发表于 2015-7-29 23:26:44 | 显示全部楼层
回复【13楼】1194820783@qq.co:
---------------------------------
它是自带上拉的吗?
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-7-22
在线时间
0 小时
发表于 2015-9-14 17:18:39 | 显示全部楼层
回复【14楼】1194820783@qq.co:
---------------------------------
请问下你的调出来了吗?
回复 支持 反对

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2015-5-8
在线时间
8 小时
发表于 2015-9-22 16:15:39 | 显示全部楼层
回复【15楼】勤严:
---------------------------------
我的出来了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-3-20
在线时间
0 小时
发表于 2016-3-20 15:40:06 | 显示全部楼层
读出的数据不变是什么情况,求大神回复
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-1-28
在线时间
4 小时
发表于 2016-7-21 18:31:51 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-8-4
在线时间
13 小时
发表于 2016-8-4 09:41:56 | 显示全部楼层
为什么需要复位才能使用呢,
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-8-4
在线时间
13 小时
发表于 2016-8-4 09:42:48 | 显示全部楼层
我看,103需要先把地址输出,灯亮灭,之后复位才能使用
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-8-4
在线时间
13 小时
发表于 2016-8-12 08:59:24 | 显示全部楼层
为什么需要复位之后才能采集到数据呢
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2016-8-4
在线时间
13 小时
发表于 2016-8-17 10:40:30 | 显示全部楼层
wang123 发表于 2014-7-13 20:26
回复【5楼】正点原子:
---------------------------------
SUM/10请问有什么作用?

取1/10的结果 ,不是取平均
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-2-22
在线时间
8 小时
发表于 2017-2-23 00:41:40 | 显示全部楼层
莫恋&她 发表于 2015-9-22 16:15
回复【15楼】勤严:
---------------------------------
我的出来了

我的主机接收不到应答信号,不知道为什么,想请教下
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-2-22
在线时间
8 小时
发表于 2017-2-23 00:42:40 | 显示全部楼层
520endevor 发表于 2017-2-23 00:41
我的主机接收不到应答信号,不知道为什么,想请教下

我用的是DSP28335,但是程序都是对照stm32的改过来的
回复 支持 反对

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
发表于 2017-3-2 16:14:01 | 显示全部楼层
莫恋&她 发表于 2015-7-15 15:41
参考了&nbsp;你的程序&nbsp;&nbsp;把IIC的读时间增加了一点&nbsp;&nbsp;程序马上就好了&nbsp;谢谢

修改的哪里呢,我弄上去读出来一直是65535  不变
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2017-7-13
在线时间
6 小时
发表于 2017-7-14 14:45:34 | 显示全部楼层
谢谢分享.....
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2017-8-4
在线时间
4 小时
发表于 2017-8-4 15:24:41 | 显示全部楼层
为什么是65535
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2017-8-4
在线时间
4 小时
发表于 2017-8-4 15:38:59 | 显示全部楼层
我是路人甲 发表于 2017-3-2 16:14
修改的哪里呢,我弄上去读出来一直是65535  不变

你解决了吗?我的也是
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-8-13
在线时间
8 小时
发表于 2017-8-13 20:45:00 | 显示全部楼层
感谢你的分享~!
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-8-13
在线时间
8 小时
发表于 2017-8-13 20:52:16 | 显示全部楼层

65535说明取出来是FFFF,就是读数据有问题,可能是你的器件地址写错了/。
回复 支持 反对

使用道具 举报

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2017-8-3
在线时间
14 小时
发表于 2017-11-4 15:26:13 | 显示全部楼层
我用STM32写的KS103超声波模块程序,在单片机复位后KS103正常工作,背面的LED灯正常闪烁,能够检测到距离并显示出来,但是复位几秒到几十秒 不等后单片机就停止工作,我在定时器和主函数里面写的LED灯闪烁全部停止工作???想请教下有经验的,
回复 支持 反对

使用道具 举报

2

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2017-8-3
在线时间
14 小时
发表于 2017-11-4 15:42:46 | 显示全部楼层
莫恋&她 发表于 2015-7-15 15:41
参考了&nbsp;你的程序&nbsp;&nbsp;把IIC的读时间增加了一点&nbsp;&nbsp;程序马上就好了&nbsp;谢谢

我改了读取时间也能读出来了,但是为什么工作一会就罢工了,导致单片都不工作了,所有程序都停止了
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2017-9-21
在线时间
37 小时
发表于 2017-11-4 19:34:06 | 显示全部楼层
我用串口输出不出来。。
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2018-4-11
在线时间
3 小时
发表于 2018-4-11 16:23:47 | 显示全部楼层
你好,我的都出来一直是65535,什么原因??设备地址试过0xe8,0x74,都没有没有变化,是什么原因??
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2016-7-7
在线时间
14 小时
发表于 2018-8-13 19:39:42 | 显示全部楼层
dashuaihu 发表于 2018-4-11 16:23
你好,我的都出来一直是65535,什么原因??设备地址试过0xe8,0x74,都没有没有变化,是什么原因??

我也是同样的问题,你的解决了吗?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-6-17
在线时间
2 小时
发表于 2019-6-19 10:35:03 | 显示全部楼层
谢谢分享。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 17:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表