今天下午老师讲了红外遥控器。用延时取值的方式,把信号解码成数字。
红外传送:
1.平时常1,当有信号时先有9000us的下拉,再有4500us的上拉作为(引导头)握手。
2.一个位用一个周期脉冲表示。
0: 先下拉560us,再上拉560us; 实际测量有几次微妙的误差
1: 先下拉560us,再上拉1680us; 实际测量有几次微妙的误差
3.按键:一个按键4个字节,1.用户码 2.用户反码 3.键值码 4.键值反码
void setup() {
pinMode(3,INPUT_PULLUP);
Serial.begin(9600);
}
char bit_val(void)
{
int i;
delayMicroseconds(570);
while(digitalRead(3) != 1);
delayMicroseconds(500);
for(i=0;i<10;i++)
{
delayMicroseconds(10);
if(digitalRead(3) == 0)
return 0;
}
delayMicroseconds(1040);
return 1;
}
char byte_val(void)
{
int i;
char data = 0x00;
for(i=0;i<8;i++)
{
data |=(bit_val()<<i);
}
return data;
}
void loop() {
int mydata[4]={0,0,0,0};
int i;
if(digitalRead(3) == 0)
{for(i=1;i<=8&&(digitalRead(3) == 0);i++)
{delayMicroseconds(1000);
if(i==8)
{delayMicroseconds(5500);
for(i=0;i<4;i++)
{
mydata[i] = byte_val();
}
Serial.print("DATA:");
Serial.print(mydata[0],HEX);
Serial.print(" ");
Serial.print(mydata[1],HEX);
Serial.print(" ");
Serial.print(mydata[2],HEX);
Serial.print(" ");
Serial.println(mydata[3],HEX);
delay(100);
}
}}
}
网友评论