// 芯片型號: 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%
}
}
|