2014-3-19 22:17:05 [显示全部楼层]
6149浏览
查看: 6149|回复: 5

[已解决] 求助:SEN0158红外定位探头使用方法

[复制链接]
本帖最后由 Ricky 于 2014-3-26 13:22 编辑

最近买了一个SEN0158红外定位探头,程序根据Arduino提供的改成模拟I2C通信的STC程序,在通过串口把读到的坐标在计算机上显示,可是一直读到1023(全是FF),在红外发射管前晃来晃去没反应。发送数据都有回应,也可能是I2C程序有问题。跪求此模块datasheet或者控制指令。


另附程序:
  1. #include <STC12C5A60S2.H>
  2. #include <intrins.h>
  3. #define   uchar unsigned char
  4. #define   uint   unsigned int
  5. //int IRsensorAddress = 0xB0;
  6. //int IRsensorAddress = 0x58;
  7. int slaveAddress = 0xb0;
  8. void    Delay1us()        ;        //@11.0592MHz
  9. bit I2C_Send_Byte(uchar sla, uchar dat);
  10. bit I2C_Receive_Byte(uchar sla, uchar *dat);
  11. void RS232_Init (void);
  12. void RS232_Stop (void);
  13. void RS232_Send(unsigned char ch);
  14. void Delay1ms()                //@11.0592MHz
  15. {
  16.         unsigned char i, j;
  17.         _nop_();
  18.         i = 30;
  19.         j = 190;
  20.         do
  21.         {
  22.                 while (--j);
  23.         } while (--i);
  24. }
  25. void Delay500ms()                //@11.0592MHz
  26. {
  27.         unsigned char i, j, k;
  28.         i = 22;
  29.         j = 3;
  30.         k = 227;
  31.         do
  32.         {
  33.                 do
  34.                 {
  35.                         while (--k);
  36.                 } while (--j);
  37.         } while (--i);
  38. }
  39. void Delay10ms()                //@11.0592MHz
  40. {
  41.         unsigned char i, j;
  42.         _nop_();
  43.         _nop_();
  44.         i = 108;
  45.         j = 144;
  46.         do
  47.         {
  48.                 while (--j);
  49.         } while (--i);
  50. }
  51. void setup()
  52. {
  53.     I2C_Send_Byte(slaveAddress,0x30); Delay1ms();
  54.     I2C_Send_Byte(slaveAddress,0x01); Delay1ms();
  55.     I2C_Send_Byte(slaveAddress,0x30); Delay1ms();
  56.     I2C_Send_Byte(slaveAddress,0x08); Delay1ms();
  57.     I2C_Send_Byte(slaveAddress,0x06); Delay1ms();
  58.     I2C_Send_Byte(slaveAddress,0x90); Delay1ms();
  59.     I2C_Send_Byte(slaveAddress,0x08); Delay1ms();
  60.     I2C_Send_Byte(slaveAddress,0xC0); Delay1ms();
  61.     I2C_Send_Byte(slaveAddress,0x1A); Delay1ms();
  62.     I2C_Send_Byte(slaveAddress,0x40); Delay1ms();
  63.     I2C_Send_Byte(slaveAddress,0x33); Delay1ms();
  64.     I2C_Send_Byte(slaveAddress,0x33); Delay1ms();
  65.     Delay10ms();
  66. }
  67. void main()
  68. {
  69.     char data_buf[16];
  70.     int Ix[4];
  71.     int Iy[4];  
  72.     int i,s;
  73.     P2M0=255;
  74.     P2M1=0;
  75.     RS232_Init();
  76.     RS232_Stop();
  77.     setup();
  78.     Delay1ms();
  79.     while(1)
  80.     {
  81.         //IR sensor read
  82.         I2C_Send_Byte(slaveAddress,0x36); Delay1ms();
  83.         //Wire.requestFrom(slaveAddress, 16);        // Request the 2 byte heading (MSB comes first)
  84.         for (i=0;i<16;i++)
  85.         {
  86.             data_buf<i>=0;
  87.         }
  88.         i=0;
  89.         while(/*Wire.available() &&*/i < 16)
  90.         {
  91.             I2C_Receive_Byte(slaveAddress,&(data_buf<i>));Delay1ms();
  92.             i++;
  93.         }
  94.         Ix[0] = data_buf[1];
  95.         Iy[0] = data_buf[2];
  96.         s   = data_buf[3];
  97.         Ix[0] += (s & 0x30) <<4;
  98.         Iy[0] += (s & 0xC0) <<2;
  99.         Ix[1] = data_buf[4];
  100.         Iy[1] = data_buf[5];
  101.         s   = data_buf[6];
  102.         Ix[1] += (s & 0x30) <<4;
  103.         Iy[1] += (s & 0xC0) <<2;
  104.         Ix[2] = data_buf[7];
  105.         Iy[2] = data_buf[8];
  106.         s   = data_buf[9];
  107.         Ix[2] += (s & 0x30) <<4;
  108.         Iy[2] += (s & 0xC0) <<2;
  109.         Ix[3] = data_buf[10];
  110.         Iy[3] = data_buf[11];
  111.         s   = data_buf[12];
  112.         Ix[3] += (s & 0x30) <<4;
  113.         Iy[3] += (s & 0xC0) <<2;
  114.         RS232_Send(0XFF);Delay1ms();
  115.         for(i=0; i<16; i++)
  116.         {
  117.           RS232_Send(data_buf<i>);
  118.           Delay1ms();  Delay1ms();Delay1ms();
  119.         }
  120.         /*for(i=0; i<4; i++)
  121.         {
  122.           RS232_Send(0XFF); Delay1ms();
  123.           RS232_Send(Ix<i>>>8);Delay1ms();
  124.           RS232_Send( Ix<i>&0x0f );Delay1ms();
  125.           RS232_Send(0X00);Delay1ms();
  126.           RS232_Send(Iy<i>>>8);Delay1ms();
  127.           RS232_Send( Iy<i>&0x0f );Delay1ms();
  128.         }*/
  129.         Delay10ms();Delay10ms();
  130.     }
  131. }
  132. </i></i></i></i></i></i></i>
复制代码

Leotower  中级技师

发表于 2014-3-20 09:36:14

建议尝试一下:参考arduino的代码, 初始化的时候一次传送两个字节

Write_2bytes(0x30,0x01); delay(10);
回复

使用道具 举报

JohnnySun  学徒
 楼主|

发表于 2014-3-20 11:16:39

Leotower 发表于 2014-3-20 09:36
建议尝试一下:参考arduino的代码, 初始化的时候一次传送两个字节

Write_2bytes(0x30,0x01); delay(10); ...

改了过后还是输出一个00和15个FF,而且初始化发送代码后无应答了。。
回复

使用道具 举报

JohnnySun  学徒
 楼主|

发表于 2014-3-20 11:23:30

Leotower 发表于 2014-3-20 09:36
建议尝试一下:参考arduino的代码, 初始化的时候一次传送两个字节

Write_2bytes(0x30,0x01); delay(10); ...

噢,发送2个字节之前忘记发送地址了。。成功了,真心感谢!!!!
回复

使用道具 举报

Leotower  中级技师

发表于 2014-3-20 12:49:19

祝贺:)  如果方便,您做的应用可以发到论坛上展示一下, 期待中
回复

使用道具 举报

unoing  见习技师

发表于 2014-11-7 08:15:31

请问你是用什么单片机进行下载运行的啊?
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
关于楼主
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail