|
发表于 2009-6-6 15:32:00
|
显示全部楼层
我用的是ATMEGA 32单片机, 4M 晶振,T1工作在输入捕获模式,下降沿解发,,全部源代码如下:
//ICC-AVR application builder : 2007-10-22 20:27:27
// Target : M32
// Crystal: 4.0000Mhz
/*数据头的时间: Th=9+4.5=13.5ms
数据“0”的时间:T0=0.565+0.56=1.125ms
数据“1”的时间:T1=1.685+0.56=2.245ms
*/
#include <iom32v.h>
#include <macros.h>
#define uint unsigned int
#define uchar unsigned char
unsigned int value=0,oldFall=0,temp=0,newFall=0,shuu=0;
unsigned int data1,data0,bitcnt;
unsigned char jia=0,JS_OK=0;
unsigned int shuju[40]={0},pj=0;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x40;
DDRD = 0x00;
}
/*//TIMER1 initialize - prescale:1
// desired value: 1mSec
// actual value: 1.000mSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xF0; //setup
TCNT1L = 0x60;
OCR1AH = 0x0F;
OCR1AL = 0xA0;
OCR1BH = 0x0F;
OCR1BL = 0xA0;
ICR1H = 0x0F;
ICR1L = 0xA0;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}*/
//TIMER1 initialize - prescale:1
// desired value: 1uSec
// actual value: 1.000uSec (0.0%)
//TIMER1 initialize - prescale:1
// desired value: 1uSec
// actual value: 1.000uSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFF; //setup
TCNT1L = 0xFC;
OCR1AH = 0x00;
OCR1AL = 0x04;
OCR1BH = 0x00;
OCR1BL = 0x04;
ICR1H = 0x00;
ICR1L = 0x04;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}
#pragma interrupt_handler timer1_capt_isr:7
void timer1_capt_isr(void)
{
uchar i;
newFall=ICR1;
temp=newFall-oldFall; //计算脉冲加间隔的时间
oldFall=newFall;
if(temp>1024 && temp<1225) // "0"信号
{
temp=0;
}
else if(temp>2145 && temp<2345) //“1”信号
{
temp=1;
}
else if(temp>13400 && temp<13600) //header信号
{
bitcnt=0;
data0=0;
data1=0;
return; //返回,等待下次开始接收
}
else ///干扰信号
{
return;
}
bitcnt++;
if(bitcnt<16) //开始接收前16位
{
data0=data0|(uint)temp;
data0=data0<<1;
}
else if(bitcnt==16)
{
data0=data0|(uint)temp;
}
else if(bitcnt<32) //开始接收后16位
{
data1=data1|(uint)temp;
data1=data1<<1;
}
else if(bitcnt==32) //接收完最后一位
{
data1=data1|(uint)temp;
bitcnt=0;
data0=0;
data1=0;
JS_OK=1;
}
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x20; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//
void main(void)
{
unsigned char i;
init_devices();
DDRC|=0x80;
PORTC|=0x80; // 一开如测试小灯不亮
while(1)
{
if(JS_OK==1) //接收完32们数据后,灯亮
PORTC&=~0x80;
NOP();
}
} |
|