NXC程序:
//===========================================================================================
#define IRPORT IN_1 //定义红外接收使用的端口
task main()
{
unsigned char x,y;
ClearScreen(); //启动程序清屏
TextOut(0, LCD_LINE1,"---- NXT IR ----"); //显示前2行
TextOut(0, LCD_LINE2,"RECEIVING ......");
while (TRUE)
{
SetSensor(IN_1,SENSOR_TOUCH); //端口1设置为 触感
while(SensorValue(S1)==0) //等待接收代码
{
;
}
SetSensorLowspeed(IRPORT); //端口1设置为 I2C
y=ReadI2CRegister(IRPORT,0xa0,12,x); //读取遥控器地址码,放在12位置
TextOut(0,LCD_LINE4," "); //擦除显示行
TextOut(0,LCD_LINE4,"IRADD:"); //显示提示文本
NumOut(64,LCD_LINE4,x); //显示读取数据 ,下同
y=ReadI2CRegister(IRPORT,0xa0,13,x); //读取遥控器地址码反码
TextOut(0,LCD_LINE5," ");
TextOut(0,LCD_LINE5,"IRADDN:");
NumOut(64,LCD_LINE5,x);
y=ReadI2CRegister(IRPORT,0xa0,14,x); //读取按键码
TextOut(0,LCD_LINE6," ");
TextOut(0,LCD_LINE6,"IRDATA:");
NumOut(64,LCD_LINE6,x);
y=ReadI2CRegister(IRPORT,0xa0,15,x); //读取按键码反码
TextOut(0,LCD_LINE7," ");
TextOut(0,LCD_LINE7,"IRDATAN:");
NumOut(64,LCD_LINE7,x);
PlayToneEx(1000,100,1,false); //播放声音
Wait(100);
PlayToneEx(1200,100,1,false);
Wait(100);
PlayToneEx(1400,100,1,false);
Wait(100);
}
}
//============================== end =================================================
测试照片
使用遥控器
只要使用单片机将各种传感器的数据放到指定的I2C数据数组地址上
(所以只要单片机读到数据,任何物理量都可传输到NXT),
就可以使用I2C接口读取到NXT中,读取后怎么处理就是NXT的事情了
超声波传感器就是不停读取测距数据,其实当数据不变的时候可以不读,
变化了才读,关键NXT不知道变了没有,只好不停地读。
本实验实现了一个端口 2种传感器的效果,并且具有类似中断的原理,
利用analog电平变化通知NXT读取数据,提高了NXT的效率。
如果不是远程,尽量使用I2C,而不是485.
I2C是飞利浦发明的,现在的芯片以NXP(恩智浦)冠名,
飞利浦的51有I2C slave
常见的51是没有硬件I2C的,软件模拟slave很耗资源。
到AVR中更名为TWI(2线接口),PIC有,ST的有,大家去选用吧。
使用NXG也比较好弄