|
下面是我写的一个测试程序,测试的遥控器是SAA3010(资料上说是使用RC-5编码)。
多少现在我按同一个键,比喻数字键“1”,串口得到48个数据,并且么此按数字“1”或者其他相同按键,得到的着48个数据都不一样。
所以就有了下面的问题。
1,SAA3310的数据格式如下,应该是32位。怎么串口会收到48个数据呢?.
SAA3010是使用RC-5编码,有2位起始位、1位控制位、系统码占5位、指令码占6位,
一帧数据共占14位。在第一次按下遥控按键后芯片要经过16位的防抖动时间和2位的扫描时
间才会发送第一帧数据。
2,为什么按同一个键,每次串口收到的数据不一样呢?
3,程序中putchar(pulse_clocks);//串口发送脉冲宽度 */ ,这里发送的宽度是实际时间吗?
请教大家,谢谢了,由于手上没有示波器,另外对于学习型的遥控器,接受和发送思路的理解还有点问题。
谢谢,下面是我写的接收的测试程序,我想用数组IR[]将所有高低电平的时间宽度保存下来。
#include <mega16.h>
#include <stdio.h> // 使用CVAVR的标准 Input/Output 函数
#include <delay.h> // 使用CVAVR的延时函数
#define ICP1 PIND.6 //脉冲输入由ICP1(Pind.6)输入
sfrw ICR1=0x26; //补充定义16位寄存器ICR1地址为0X26(mega16.h中未定义)
unsigned char ov_counter;
unsigned int ICP_new,ICP_old;
unsigned long pulse_clocks;
unsigned int IR[100];
interrupt [TIM1_OVF] void timer1_ovf_isr(void) // T/C1溢出中断
{
ov_counter++; //记录溢出次数
}
interrupt [TIM1_CAPT] void timer1_capt_isr(void) // T/C1捕捉中断
{ unsigned char i=0;
ICP_old = ICR1;
TCCR1B = TCCR1B ^ 0x40; //改变触发方向
pulse_clocks = (unsigned long)ICP_old - (unsigned long)ICP_new + (unsigned long)ov_counter * 0x10000 / 500; //计算脉冲宽度ms
IR[i++]=pulse_clocks;//只记录脉冲维持的宽度,单位MS
if(i==79)i=0;
ICP_new=ICP_old ;
putchar(pulse_clocks);//串口发送脉冲宽度 */ 请问这里发送的宽度是实际时间吗?
}
void main(void)
{ unsigned char j;
UCSRA=0x00; // USART initialization
UCSRB=0x18; // Communication Parameters: 8 Data, 1 Stop, No Parity
UCSRC=0x86; // USART Receiver: On,USART Transmitter: On
UBRRH=0x00; // USART Mode: Asynchronous ,USART Baud Rate: 9600
UBRRL=0x19;
//TCCR1B=0x42; //初始化T/C1,1/8分频,上升沿触发捕捉
TCCR1B=0x02; //初始化T/C1,1/8分频,下降沿触发
TIMSK=0x24; //允许T/C1溢出和捕捉中断
#asm("sei")
while (1)
{};
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|