#include "STC8H.H"
#include "IR.h"
#include <TIME0.H>
sbit INT = P3^2;
sbit LED = P3^3;
unsigned char Data[4];
bit IR_volunteer;
unsigned int overtime_Statistics;
unsigned int Heig_Time,Low_time;
void UartInit(void) ;
void Send_bit(unsigned char Bit);
void main()
{
P3M1=(P3M1&0xFB)|0x00; //设置IO口模式
P3M0=(P3M0&0xFB)|0x00; //设置IO口模式
/*
P3.0维持不变
P3.1维持不变
P3.2弱上拉
P3.3维持不变
P3.4维持不变
P3.5维持不变
P3.6维持不变
P3.7维持不变
*/
Timer0_Init();
INT0();
EA =1;
LED =0;
UartInit();
while(1)
{
if (IR_volunteer)
{
IR_volunteer=0;
Send_bit(Data[2]);
}
}
}
char Data_Reception()
{
unsigned char i,j;
static unsigned char Themiddle_Variables;
for ( i = 0; i < 4; i++)
{
for ( j = 0; j < 8; j++)
{
Themiddle_Variables >>= 1;
TH0 = 0;
TL0 = 0;//计数清除
TR0 = 1; //打开计数
while (INT==0);//低电平时间
TR0 = 0;//关闭计数
Low_time = TH0*256+TL0;
TH0 = 0;
TL0 = 0;//计数清除
TR0 = 1; //打开计数
while (INT);//高电平时间
TR0 = 0;//关闭计数
Heig_Time = TH0*256+TL0;
if ((Low_time>620)||(Low_time<360))
{
return 0;
}
if ((Heig_Time>450)&&(Low_time<550)) Themiddle_Variables &=0x7f;
if ((Heig_Time>1550)&&(Heig_Time<1700)) Themiddle_Variables |= 0x80;
}
Data[i] = Themiddle_Variables;
Themiddle_Variables=0;
// LED =0;
}
// return 1;
// 数据判断
if ((Data[0]+Data[1])==255)
{
// LED =1;
if ((Data[2]+Data[3])==255)
{
return 1;
}
}
return 0;
}
void UartInit(void) //115200bps@22.1184MHz
{
PCON|=0x80;
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xC7; //设置定时初始值
TH1 = 0xFE; //设置定时初始值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
TI=1; //开启打印
EA=1;
}
void Send_bit(unsigned char Bit)
{
SBUF = Bit;
while (!TI);
TI =0;
}
void INT0_Isr() interrupt 0
{
//引导码低电平时间9MS
//引导码高电平时间4.48MS
//低电平618us 高电平514us 为0
//低电平590us 高电平1.639ms 为1
static unsigned int Value;
EX0 = 0;
TH0 = 0;
TL0 = 0;//计数清除
TR0 = 1;//打开定时计数器
while (!INT);//引导码低电平时间//9MS
TR0 =0;//关闭定时计数器
Value = TH0*256 + TL0;
if (((Value>8500) && (Value < 9500))==0)
{
EX0 = 1;//打开外部中断
return;
}
TH0 = 0;
TL0 = 0;//计数清除
TR0 = 1; //打开计数
while (INT);//引导码高电平时间//4.48MS
TR0 = 0;//关闭计数
Value = TH0*256+TL0;
TH0 = 0;
TL0 = 0;//计数清除
if ((Value>4000)&&(Value<5000))
{
//引导码没问题开始接收数据
IR_volunteer=Data_Reception();
}
EX0 =1;//打开外部中断
}