//*********************************************************
/* 文件名:TEST_61F02x_Timer2.c
* 功能: FT61F02x-Time2功能演示
* IC: FT61F023 SOP16
* 晶振: 16M/2T
* 说明: 当DemoPortIn悬空或者高电平时,
* DemoPortOut输出5KHz占空比50%的波形-Tm2实现
* 当DemoPortIn接地时,DemoPortOut输出高电平.关定时器
* FT61F023 SOP16
* ----------------
* VDD-----------|1(VDD) (VSS)16|-----------GND
* NC------------|2(PA7) (PA0)15|------------NC
* NC------------|3(PA6) (PA1)14|------------NC
* NC------------|4(PA5) (PA2)13|------------NC
* DemoPortIn----|5(PC3) (PA3)12|---DemoPortOut
* NC------------|6(PC2) (PC0)11|------------NC
* NC------------|7(PA4) (PC1)10|------------NC
* NC------------|8(PC5) (PC4)09|------------NC
* ----------------
*/
//*********************************************************
#include "SYSCFG.h"
//#include "Infrared_Rece_5104.h"
//**********************************************************
#define REC PA4 //红外接收IO,用户请将相应IO设置为输入
#define BootCode 0x0D //引导码
typedef union
{
unsigned char all;
struct
{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
}one;
}bits;
volatile unsigned char RecCode; //5104码除去引导码 后的用户码
volatile bits RecWork; //工作位域
#define Rflag RecWork.all
#define Flag_RecOne RecWork.one.b0 //收到5104码标志位
void RecServer();
void InfraredReception(); //接收函数,在中断中调用
//***********************宏定义*****************************
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
//#define GREEN RA7 //0开 1关
#define Led1 PA7
#define Led2 PC3 //1开 0关
volatile bit B_MainLoop;
/*-------------------------------------------------
* 函数名:POWER_INITIAL
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
//********************************************************
//**************中断处理**********************************
void interrupt ISR(void) //PIC_HI-TECH使用
{
static unsigned char times;
//定时器2的中断处理**********************
if(TMR2IE && TMR2IF) //100us中断一次
{
TMR2IF = 0;
if(++times >= 20)//20*125us = 2.5ms
{
times = 0;
B_MainLoop = 1;
}
InfraredReception(); //调用红外接收函数
}
}
/*-------------------------------------------------
* 函数名:POWER_INITIAL
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void POWER_INITIAL (void)
{
OSCCON = 0B01110001; //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
//Bit0=1,系统时钟为内部振荡器
//Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择
INTCON = 0; //暂禁止所有中断
PORTA = 0B00000000;
TRISA = 0B00010000; //PA输入输出 0-输出 1-输入
//PA3->输出
PORTC = 0B00000000;
TRISC = 0B00000000; //PC输入输出 0-输出 1-输入
WPUA = 0B00010000; //PA端口上拉控制 1-开上拉 0-关上拉
WPUC = 0B00000000; //PC端口上拉控制 1-开上拉 0-关上拉
OPTION = 0B00001000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
//Bit3 预分频器分配位 0-Timer0 1-WDT
//Bit7(PAPU)=0 ENABLED PULL UP PA
MSCKCON = 0B00000000; //Bit6->0,禁止PA4,PC5稳压输出
//Bit5->0,TIMER2时钟为Fosc
//Bit4->0,禁止LVR
CMCON0 = 0B00000111; //关闭比较器,CxIN为数字IO口
}
/*-------------------------------------------------
* 函数名称: TIMER2_INITIAL
* 功能: 初始化设置定时器2
* 相关寄存器: T2CON TMR2 PR2 TMR2IE TMR2IF PEIE GIE
-------------------------------------------------*/
void TIMER2_INITIAL (void)
{
T2CON = 0B00000001; //Bit[1,0]=01,T2时钟分频 1:4
//Bit[6-3]=0000,T2输出时钟分频1:1
TMR2 = 0; //TMR2赋初值
PR2 = 200; //设置TMR2输出比较值定时100us=(1/16000000)*2*4*200(PR2)
//16M-2T-4分频
TMR2IF = 0; //清TIMER2中断标志
TMR2IE = 1; //使能TIMER2的中断
TMR2ON = 1; //使能TIMER2启动
PEIE=1; //使能外设中断
GIE = 1; //使能全局中断
}
/***********************************************
函数名称:RecServer
函数功能:5104红外接收按键处理
入口参数:无
出口参数:无
备注:
************************************************/
void RecServer()
{
if(1 == Flag_RecOne)
{
Flag_RecOne = 0;
switch(RecCode)
{
case 0x0A: Led1 = ~Led1; break;//测试
case 0x15: Led1 = ~Led1; break;//测试
case 0x19: Led1 = ~Led1; break;//测试
//case 0x82: Led1 = ~Led1; break;//开/风速
//case 0x81: Led1 = ~Led1; break;//关机
// case 0x90: Led2 = ~Led2; break;//摇头
// case 0x84: Led1 = ~Led1; break;//风类
// case 0xc3: Led1 = ~Led1; break;//彩灯
//case 0x88: Led2 = ~Led2; break;// 定时
default:break;
}
}
}
/***********************************************
函数名称:InfraredReception
函数功能:5104红外接收解码
入口参数:无
出口参数:无
备注:
************************************************/
void InfraredReception()
{
static unsigned char rlow = 0,rhigh = 0,rcount = 0,rdata = 0;
if(!REC)
rlow++; //低电平计时
else if(0 == rlow)
{
rhigh++; //高电平计时
if(rhigh & (0x20)) //持续4ms高电平,重新接受引导码
{
Rflag &= 0b11101111;
rdata = 0;
if(rhigh & (0x80)) //持续20ms高电平,重新收码
{
RecCode = 0;
rhigh = 0;
Rflag &= 0b01111111;
}
}
}
else
{
rdata <<= 1;
if(rlow >= (0x8)) //上升沿,判断码值,低电平大于1ms为1,否则为0
rdata |= 0x01;
rlow = 0;
rhigh = 0;
if(0 == (Rflag & 0x10)) //是否已经收到了引导码
{
if(BootCode == (rdata & 0x0f)) //还未收到引导码,判断是否是正确的引导码
{
Rflag |= 0x10; //收到引导码标志
rcount = 0; //准备接收数据码
rdata = 0;
}
}
else
{
rcount++;
if(rcount & 0x8) //8位数据码接收完成
{
if(RecCode == rdata) //收到2帧相同的码才处理
{
if(0 == (Rflag & 0x80)) //已经响应过了,不再重复处理
{
Rflag |= 0x01; //收到按键码标志
Rflag |= 0x80; //用于判断长按键的标志,持续20ms高电平才清零
}
}
else
RecCode = rdata;
}
}
}
}
/*-------------------------------------------------
* 函数名: main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main()
{
POWER_INITIAL(); //系统初始化
TIMER2_INITIAL(); //初始化T2
while(1)
{
if(B_MainLoop) //2.5ms执行一次
{
B_MainLoop = 0;
RecServer(); //红外接收处理
//Led2 = 1;
}
}
}
|