// 芯片型号: FT60F021 SOP-8
// 芯片参数: Flash 2KX14b, EEPROM 256X8b, SRAM 128X8b
// 作者:
// 公司:
// 版本:
// 日期:
/* FT60F021 SOP8
* ----------------
* VDD-----------|4(VDD) (GND)13|-----------GND
* 指示灯3------------|5(PA4) (PA6)12|------------指示灯2
* RF------------|6(PA2) (PA7)11|------------指示灯1
* 按键+指示灯------------|7(PA0) (PA1)10|------------指示灯0
* ----------------
//===========================================================*/
#include "SYSCFG.h"
//========================宏定义===========================
#define SET_SE PA0
#define RF PA2
#define LED3 PA4
#define LED2 PA6
#define LED1 PA7
#define LED0 PA1
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define T0_N 256-228
//===========================================================
//=======================函数声明==========================
void POWER_INITIAL (void); //IO口初始化
void DelayUs(uint Time); //微秒延时函数
void delay_1ms(uint Time); //毫秒延时函数
void INT_INITIAL(void); //中断初始化函数
void Eeprom_Write(uchar address, uchar value);//写数据到EEPROM
void rx_receive(void) ; //数据接收函数
void TIMER0_INITIAL (void); //定时器中断初始化函数
void interrupt ISR(void); //定时器中断初始化函数
//===========================================================
//=======================变量定义==========================
//ulong mma,mm; //接收数据保存变?
//uchar l;
uchar data1_1,data1_2,data1_3;
uchar data2_1,data2_2,data2_3;
uchar hle_w=0; //高电平时间
uchar lle_w=0; //低电平时间
uchar old_bit; //1位数据读完标记位
uchar tb_ok=0; //前导码判断完成标记位
uchar rf_ok1=0; //第一组数据接收完毕标记位
uchar rf_ok2; //第二组数据接收完毕标记位
//===========================================================
/*-------------------------------------------------
* 函数名:main
* 功能: 主函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void main(void)
{
POWER_INITIAL();//系统初始化
TIMER0_INITIAL ();//计时器中断初始化//计时50微秒中断一次
while(1)
{
LED0=0;LED1=0;LED2=0;LED3=0;
}
}
/*----------------------------------------------------
* 函数名称:rx_receive
* 功能: 接收RF数据
* 输入参数:无
* 返回参数:无
----------------------------------------------------*/
void rx_receive(void)//数据接收函数
{
uchar bma; //接收数据保存
uchar ma_n=0; //数据接收位数
if (!RF)
{
lle_w++; //数据低电平时间
old_bit=1; //一位数据接收完成标记
}
else
{
hle_w++; //数据高电平时间
if (old_bit) //数据接收完成进入
{ // LED2=1;
Eeprom_Write(0x20,ma_n); //测试用来看执行了多少位
if ((!tb_ok)&&(hle_w>=2)&&(hle_w<=8)&&(lle_w>=100)&&(lle_w<=200)) //判断前导码
{
Eeprom_Write(0x00,hle_w); Eeprom_Write(0x03,lle_w);//测试用来看高低电平时间
ma_n=0;tb_ok=1;bma=0;hle_w=0;lle_w=0;old_bit=0; //接收位数标记;前导码判断完常;数据清零
}
else if(tb_ok&&(lle_w>=10)&&(lle_w<=30))//判断数据0
{
Eeprom_Write(0x11,lle_w);LED2=1; //测试用来看低电平时间
ma_n++; //接收数据位数标记位
bma=bma<<1; //数据左移1位保存
hle_w=0;lle_w=0;old_bit=0;
}
else if(tb_ok&&(lle_w>=3)&&(lle_w<=8))//判断数据1
{
Eeprom_Write(0x12,lle_w);//测试用来看低电平时间
ma_n++;
bma=bma<<1; //数据先左移1位 //写0
bma=bma+1; //写1
hle_w=0;lle_w=0;old_bit=0;
}
else{ma_n=0;tb_ok=0;bma=0;hle_w=0;lle_w=0;rf_ok1=0;rf_ok2=0;old_bit=0;} //接收数据有误标记位全部清零
if(ma_n==8){data1_1=bma;bma=0;}
else if(ma_n==16){data1_2=bma;bma=0;}
else if(ma_n==24){data1_3=bma;bma=0;tb_ok=0;old_bit=0;}
if(ma_n==24) //数据接收够24位进入
{
if(!rf_ok1) //判断是不是接收到的第一组数据
{
LED0=1;
data2_1=data1_1; //把data1数据复制data2
data2_2=data1_2;
data2_3=data1_3;
rf_ok1=1; //第一组数据接收完毕标记位置1
ma_n=0; //接收数据位数标记位清零
}
else if(rf_ok1)
{
LED1=1;
rf_ok2=1; //第二组数据接收完毕标位置1
ma_n=0; //接收数据位数标记位清零
}
}
}
}
if(rf_ok2)//第二组数据接收完毕进入
{
if(data2_1 == data1_1&&data2_2 == data1_2&&data2_3 == data1_3) //接收的两次数据对比
{
rf_ok1 = 0; //第一组数据接收完毕标记位清零
rf_ok2 = 0; //第二组数据接收完毕标记位清零
Eeprom_Write(0x30,data2_1);//写数据
Eeprom_Write(0x31,data2_2);
Eeprom_Write(0x32,data2_3);
LED3=1;
delay_1ms(1000);//完成闪灯
LED3 = 0;
delay_1ms(1000);
LED3 = 1;
delay_1ms(1000);
LED3 = 0;
}
}
}
/*----------------------------------------------------
* 函数名:TIMER0_INITIAL
* 功能: 初始化设置定时器 Timer0
* 设置 TMR0 定时时长=(1/系统时钟频率)*指令周期*预分频值*255
(1/16000000)*2*2*(256-228)=60us//计算的时间实际测试有误差,现在的取值实际测试刚好是60US
----------------------------------------------------*/
void TIMER0_INITIAL (void)
{
OPTION = 0B00000000;
//Bit5: T0CS Timer0 时钟源选择
// 1-外部引脚电平变化 T0CKI 0-内部时钟(FOSC/2)
//Bit4: T0CKI 引脚触发方式 1-下降沿 0-上升沿
//Bit3: PSA 预分频器分配位 0-Timer0 1-WDT
//Bit[2:0]: PS 8 个预分频比 111 - 1:256
T0IF = T0_N; //清空 T0 软件中断
T0IE = 1;
GIE = 1;
}
/*-------------------------------------------------
* 函数名:interrupt ISR
* 功能: Timer0 的中断处理函数
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void interrupt ISR(void)
{
if(T0IE && T0IF) //60us 进一次
{
T0IF = 0;
TMR0 = T0_N;
// LED0 = ~LED0;
rx_receive();
}
}
/*----------------------------------------------------
* 函数名称:EEPROM_write
* 功能: 写数据到EEPROM
* 输入参数:EEAddr 需要写入数据的地址
* Data 需要写入的数据
* 返回参数:无
----------------------------------------------------*/
void Eeprom_Write(uchar address, uchar value)//EERM写数据函数
{
CLRWDT();
EEADR = address;
EEDAT = value;
EECON1 = 0x34;
WR = 1;
while(WR==1)CLRWDT();
WREN1 = 0;
WREN2 = 0;
WREN3 = 0;
}
/*-------------------------------------------------
* 函数名:POWER_INITIAL
* 功能: 上电系统初始化
* 输入: 无
* 输出: 无
--------------------------------------------------*/
void POWER_INITIAL (void)
{
OSCCON = 0B01110001; //WDT=32k IRCF=111=16M
INTCON = 0; //暂禁止所有中断
PORTA = 0B00000000;
TRISA = 0B00000101; //PA输入输出 0-输出 1-输入 //PA1,PA4,PA6,PA7,PA1,-输入 PA0-输出
//PORTC = 0B00000000;
//TRISC = 0B00000000; //PC输入输出 0-输出 1-输入
WPUA = 0B00000000; //PA端口上拉控制 1-开上拉 0-关上拉 //开PA6,PA7,PA1上拉
OPTION = 0B00001000; //Bit3=1,WDT MODE,PS=000=WDT RATE 1:1
WDTCON = 0b00000000;
//Bit4=0,禁止LVR(60F01x O版之前)
//Bit4=0,LVREN使能时,开启LVR(60F01x O版及O版之后)
//Bit4=1,LVREN使能时,工作时开启LVR,睡眠时自动关闭LVR(60F01x O版及O版后)
CMCON0 = 0B00000111; //关闭比较器,CxIN为数字IO口
}
/*----------------------------------------------------
* 函数名称:DelayUs
* 功能: 短延时函数 --16M-2T--大概快1%左右.
* 输入参数:Time延时时间长度 延时时长Time Us
* 返回参数:无
----------------------------------------------------*/
void DelayUs(uint Time)
{
uint a;
for(a=0;a<Time;a++) { NOP();}
}
/*----------------------------------------------------
* 函数名称:DelayMs
* 功能: 短延时函数
* 输入参数:Time延时时间长度 延时时长Time ms
* 返回参数:无
----------------------------------------------------*/
void delay_1ms(uint Time)
{
uchar b;//
uint a;
for(a=0;a<Time;a++)
{
for(b=0;b<5;b++) {DelayUs(197);} //快1%
}
}
|