?? 38k.c
字號(hào):
/*******************************************************
38K載波接收程序 T1產(chǎn)生波特率 T0用于精確定時(shí) *
數(shù)據(jù)格式 起始位(9ms 高 4.5ms 低)+8位數(shù)據(jù) *
(0.560ms 高 0.565 低:0 1.685ms 高 0.565ms 低:1) *
write by wisdom 2008-8 *
*******************************************************/
#include <AT89X51.h>
#define IR_IN P3_4
unsigned char IR_Data;
//#define _MHz_ 11.0592
void Init_INT0(void)
{
IT0=1; //INT0為負(fù)邊沿觸發(fā), (1:負(fù)邊沿觸發(fā),0:低電平觸發(fā))
EX0=1; //外部中斷INT0開, (1:開, 0:關(guān) )
EA=1; //開所有中斷
}
//T0 精確定時(shí) T1產(chǎn)生波特率 初始化串口
void Init_Timer(void)
{
TMOD=0x21; //T0 mode 1 T1 mode 2
SCON=0x50; //mode 1 8位 允許接受
PCON|=0x80; //smod=1 波特率=2^SMOD/32 * fosc/(12*(256-X)
TH1=250; //256-11.0592/12.0/9600/16*1000000;
TL1=TH1;
TR1=1;
}
void Delay10ms(void)
{
TH0=220; //(65536-us/12*11.0592)/256;
TL0=0; //(65536-us/12*11.0592)%256;
TR0=1;
while(!TF0);
TF0=0;
}
void Delay0_8ms(void)
{
}
void main(void)
{
Init_INT0();
Init_Timer();
IR_IN=1; //set IR_IN as i
while(1)
{
TI=0;
SBUF=IR_Data;
while(!TI);
TI=0;
Delay10ms();
}
}
//-----------------------------------------------------------------------
//INT0 ISR
void INT0_ISR(void) interrupt IE0_VECTOR using 1
{
unsigned char i;
EA=0;
IR_Data=0;
for(i=0;i<4;i++)
{
Delay0_8ms();
if(IR_IN==1) //0.8ms后位1,不是起始位
{
i=5;
break;
}
else if(i==3) //3.2ms后,判斷是起始位
{
while(IR_IN==1);
}
}
for(i=0;i<8;i++)
{
Delay0_8ms();
IR_Data=IR_Data<<1;
if(IR_IN==1)
IR_Data=IR_Data|0x01; //接收1
else
IR_Data=IR_Data & 0xFE; //接收0
}
EA=1;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -