📄 f211.#1
字号:
/*
//=========================================================================//
// //
// F O R E N T E K P R O P R I E T A R Y //
// //
// COPYRIGHT (c) 2003 BY FORENTEK CHONGQING //
// -- ALL RIGHTS RESERVED -- //
// //
// File Name: ATF211.H //
// Created: 20 Nov 2003 //
// AUTHOR: //
// Revision: V1.0 //
// //
//=========================================================================//
*/
#include <c8051f000.h> // SFR 定义
#include <atf211.h>
#include <stdio.h>
#include <INTRINS.H>
unsigned int xdata WDT_Reset_Counts=0;
bit SCK_FLAG=0;
unsigned int xdata nRX_INDEX=0; // 接收缓冲区索引
unsigned int xdata nTx_Index=0; // 发送缓冲区索引
unsigned char xdata INPUT_BUF[nLEN_INPUT]; // 接收缓冲区
unsigned char xdata OUTPUT_BUF[100]; // 发送缓冲区
unsigned char nFlag_RXSUCCESS=0; // 接收数据完毕标志
unsigned int xdata nLen_Rx_Data=0; // 接收数据的长度
unsigned int xdata nLen_Tx_Data=0; // 发送数据的长度
unsigned char level_count=0;
bit RFLAG=0; //开始接收数据标志
bit SendEndflag=0; //传输结束标志
unsigned int timer0_count=0; //定时器0计数
unsigned int timer2_count=0; //定时器2计数
void port_init();
void SYSCLK_INIT();
void rf211_init();
void rf211Trx_Register_Wr(unsigned char trx_addr,unsigned long trx_code,unsigned char trx_bits);
void rf211Send_Trx_Addr(unsigned char trx_addr);
void rf211Send_Trx_Data(unsigned long trx_code,unsigned char trx_bits);
void rf211Send_Trx_High();
void rf211Send_Trx_Low();
unsigned long rf211Read_Trx_Data(unsigned char trx_bits);
unsigned long rf211Trx_Register_Rd(unsigned char trx_addr,unsigned char trx_bits);
void systems_init();
void Uart_init();
void timer2_init();
void Make_Transmit_Mode();
void Make_Receive_Mode();
void Make_Wakeup_Mode();
void Transmit_Data_Dispose(char *In_Buf,unsigned int nLen);
bit Receive_Data_CheckProcess();
void Receiver_data_Process();
void Transmit_data_Process();
bit Wait_Answer_Message();
void Read_Wakeup_Data();
void bit_delay();
void timer0_init();
void wait_time_millisecond();
void Transmit_Information_Package();
void Transmit_Information_Process();
unsigned char Receive_Information_Package();
void Transmit_Direct_Message(unsigned int msg_code,unsigned char msg_bits);
void wait_time_100us();
void main()
{
unsigned int inde=0xffff;
WDTCN = 0xDE; //禁止看门狗定时器
WDTCN = 0xAD;
SYSCLK_INIT();
port_init(); //分配端口
timer2_init();
Uart_init();
systems_init();
while(inde--);
inde=0xffff;
while(inde--);
inde=0xffff;
rf211_init(); //配置rf211各控制寄存器
timer0_init();
Make_Receive_Mode(); //进入接收模式
Read_Wakeup_Data(); //读wakeup数据寄存器
Make_Wakeup_Mode(); //进入唤醒模式
//while(inde--);
//inde=0xffff;
//Transmit_Data_Dispose(Tx_Data,10);
while(1)
{
// Transmit_Information_Process();
if(RFLAG) Receive_Information_Package();
//while(inde--);
//inde=0xffff;
while(inde--);
inde=0xffff;
for(inde=0;inde<100;inde++)
INPUT_BUF[inde]=0;
}
}
//-----------------------------------------------------------------------------//
// Receiver_data_Process接收数据过程 //
//-----------------------------------------------------------------------------//
void Receiver_data_Process()
{
Read_Wakeup_Data(); //读wakeup数据寄存器
if(RFLAG)
{
Make_Receive_Mode(); //进入接收模式
RFLAG=0; //清准备接收标志
RI=1; //UART接收标志
}
if (nFlag_RXSUCCESS==0x55) //表示接收数据正确
{
nFlag_RXSUCCESS=0; //清接收正确标志,为下一次接收数据做好准备
if (Receive_Data_CheckProcess()) //接收数据校验和正确,这回执正确接收数据
Transmit_Data_Dispose(Ok_Message,10);
else //否则,返回接收数据出错的消息
Transmit_Data_Dispose(Fail_Message,12);
Make_Transmit_Mode(); //进入传输模式
TI=1; //UART进入数据传输
while(SendEndflag==0)
{
SendEndflag=0;
}; //等待发送数据完毕
Make_Receive_Mode(); //进入接收模式
Make_Wakeup_Mode(); //进入唤醒模式
}
}
//-----------------------------------------------------------------------------//
// Transmit_data_Process()传输数据过程 //
//-----------------------------------------------------------------------------//
void Transmit_data_Process()
{
unsigned char inde=0;
for (inde=0;inde<3;inde++)
{
Make_Transmit_Mode(); //进入传输模式
//Transmit_Data_Dispose(Tx_Data,65); //装载指定数据
TI=1;
SBUF =Tx_Data[0]; //UART进入数据传输
while(SendEndflag==0){SendEndflag=0;}; //等待发送数据完毕
//Make_Receive_Mode(); //进入接收模式
//if (Wait_Answer_Message()) break; //应答信息为ok,退出,否者重发,连续发送3遍
}
Make_Wakeup_Mode(); //进入唤醒模式
}
bit Wait_Answer_Message()
{
if(RFLAG)
{
Make_Receive_Mode(); //进入接收模式
RFLAG=0; //清准备接收标志
RI=1; //UART接收标志
}
if (nFlag_RXSUCCESS==0x55) //表示接收数据正确
{
nFlag_RXSUCCESS=0; //清接收正确标志,为下一次接收数据做好准备
if (Receive_Data_CheckProcess()) //接收数据校验和正确,这回执正确接收数据
Transmit_Data_Dispose(Ok_Message,10);
else //否则,返回接收数据出错的消息
Transmit_Data_Dispose(Fail_Message,12);
Make_Transmit_Mode(); //进入传输模式
TI=1; //UART进入数据传输
while(SendEndflag==0){SendEndflag=0;}; //等待发送数据完毕
}
if (nLen_Rx_Data>0)
{
if ((INPUT_BUF[0]='m')&&(INPUT_BUF[6]='e')&&(INPUT_BUF[9]='k')) return(1); //接收到message ok消息,表示从端接收信息正确
else if ((INPUT_BUF[0]='m')&&(INPUT_BUF[6]='e')&&(INPUT_BUF[9]='a')) return(0);//接收到message fail消息,表示从端接收信息错误
}
else return(0);
}
//------------------------------------------------------------------------------//
// 时钟初始化例程 //
//------------------------------------------------------------------------------//
void SYSCLK_INIT()
{
int i=255;
OSCXCN = 0x67; // 开始外部震荡器,20MHz
while(i--);
while (!(OSCXCN & 0x80)); // 等待
OSCICN = 0x88; // 选择外部震荡器作为 SYSCLK 源,并使能时钟遗失检测功能
}
//-----------------------------------------------------------------------------//
// 定时器2初始化 //
//-----------------------------------------------------------------------------//
void timer2_init()
{
//选用16位定时器/计数器。RCLK=0,TCLK=0,CP/RL2=0,TR2=1
// T2CON |= 0x04; //定时器2允许,定时器
// CKCON |= 0X20; //定时器2使用系统时钟
// TL2 = 0X00;
// TH2 = 0X00;
// RCAP2L = 0X00;
// RCAP2H = 0X00;
}
//----------------------------------------------------------------------------//
// 定时器0初始化 //
//----------------------------------------------------------------------------//
void timer0_init()
{
TCON |= 0x10; //定时器0允许
TMOD |= 0X01; //定时器0使用方式1,即16位定时器
CKCON |= 0X08; //定时器0使用系统时钟
TH0 = 0XF8; //定时100us
TL0 = 0X43;
}
void Uart_init()
{
TMOD |= 0X20; //设置定时器1方式2,8位重载方式
CKCON |= 0X10; //定时器使用系统时钟作为时基
PCON |= 0x80; //电源控制寄存器,SMOD波特率加倍,为1时加倍
SCON = 0x50; //SCON工作于方式1,8位UART,使能RX
TH1 = -UART_TIME_COUNT;
TL1 = -UART_TIME_COUNT;
TR1 = 1; //启动定时器1
}
void systems_init()
{
unsigned char inde=0;
unsigned char i=0;
EA=1; //允许所有中断
ES=1; //串口中断允许
EX0=1; //外部中断0允许
ET2=1; //定时器2中断允许
ET0=1; //定时器0中断允许
IT0=1; //外部中断配置位边沿触发
timer0_count=0;
i = 0;
for(inde=0;inde<10;inde++)
{
Tx_Data[i++]=0xAA;
Tx_Data[i++]=0x00;
}
nLen_Tx_Data=10;
for(inde=0;inde<100;inde++)
INPUT_BUF[inde]=0;
}
//------------------------------------------------------------------------------//
// 端口初始化例程 //
//------------------------------------------------------------------------------//
void port_init()
{
XBR0 = 0x04; //P0.0分配为TX,P0.1分配为RX.
XBR1 = 0x04; //P0.2分配为INT0
XBR2 = 0x40; //交叉译码功能使能
//PRT0CF =0xFF; //SPI(SCK,MOSI,NSS) set to push-pull output mode
PRT1CF =0XFF; //将P1口配置成为推挽输出方式
PRT2CF =0XFF;
}
//-----------------------------------------------------------------------------//
// 初始化rf211各控制寄存器 //
//-----------------------------------------------------------------------------//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -