#include <C8051F020.h> // SFR declarations
#define BAURDRATE 9600//485通信波特率为9600
#define SYSCLK 22118400 //系统时钟为22.1184MHz
#define SARCLK 2500000//AD转换时钟为2.5MHz
#define SPISCK 110592// Maximum SPI clock, The SPI clock is a maximum of110592Hz
//----------------------------------------------------------------------------------------------------------------
#define uint unsigned int
#define uchar unsigned char
//-------------NRF905工作模式控制端口------------------------------------------------------
sbitTRX_CE=P1^0;
sbitTXEN=P1^2;
sbitPWR=P1^3;
//-------------NRF905数据交换端口---------------------------------------------------
sbitSCK=P0^2;
sbitMISO=P0^3;
sbitMOSI=P0^4;
sbitCSN=P0^5;// Slave select pin (NSS/CSN)
//-------------nrf905状态端口---------------------------------------------------------
sbitAM=P1^4;
sbitDR=P1^1;
sbitCD=P1^5;
sbit LED = P1^6; // LED='0' means ON
//------------------AD采集变量----------------------------
unsigned char TxBuf_DATA[4]={0};//源地址+66H+DATA+len(DATA字节数)
unsigned int ad_data[8]={0};//AD采样 数据暂存位置
unsigned int ad_avg=0;
unsigned int ad_sum=0;
unsigned int ad_num=0; //ad_num≤10
unsigned int ad_strain;
unsigned int strain[8]={0};
//------------------初始化函数-------------------------
void Watchdog_Init ()
{
WDTCN = 0xDE; // Disable the Watchdog Timer
WDTCN = 0xAD;
}
void Oscillator_Init()//系统时钟初始化程序
{
int i;
OSCXCN=0x67;//P156 0110 0111 以晶体振荡器方式工作 频率大于6.74MHz
for(i=0;i<256;i++)//小延时
while(!(OSCXCN&0x80));//等待外部晶体振荡器运行 工作稳定(最高位为1时稳定运行)
OSCICN=0x88;//P1551000 1000 检测到时钟丢失降复位 选用外部时钟作为系统时钟
}
void Port_Init ()
{
P0MDOUT = 0x14; // Make SCK, MOSI, NSS为推挽输出
P1MDOUT = 0xff; // LED推挽输出 Make the LED push-pull
//P0 = 0x0D;
XBR0 = 0x06; // 交叉开关使能SPI UART0
XBR1 = 0x14; //配置INT0、INT1到端口
XBR2 = 0x44; // 交叉开关允许,全局弱上拉
// XBR3 = 0x01;//T3配置到端口
}
void SPI0_Init()
{
SPI0CFG = 0x07; // (在SCK第一个边沿采集数据,SCK空闲时处于低电平;8-bit移入移出)
SPI0CN = 0x03; // (以主方式操作,允许SPI)Master, SPI enabled
SPI0CKR = (SYSCLK/(2*SPISCK))-1; //计算得SPI0CKR=0x18;
EIE1 |= 0x01; // (允许SPIF标志位的中断请求)Enable SPI interrupts
CSN = 1; // (NSS—使能主从关系)De-select the slave
}
void ADC0_Init()//AD采样初始化程序 采样率由定时器3溢出决定
{
AMX0CF=0x00;//AIN0~AIN08通道都为独立单端输入
AMX0SL=0x00;//禁止端口引脚作为模拟输入
ADC0CF|=0x00;//AD内部放大器增益为1
ADC0CF=0x38;//P121 公式 AD转换时钟配置
ADC0CN=0x04;//P122 10000100 AD转换允许 数据格式右对齐 采用T3溢出作为采样周期
EIE2|=0x02;//允许AD转换结束的中断请求
REF0CN=0x03;
}
void T3_Init()
{
TMR3CN=0x02;
TMR3H=0x53;//TMR3H=(65536-SYSCLK/501)/256;
TMR3L=0x8c;//TMR3L=(65536-SYSCLK/501)%256;
TMR3RLH=0x53;//TMR3RLH=(65536-SYSCLK/501)/256;
TMR3RLL=0x8c;//TMR3RLL=(65536-SYSCLK/501)%256;
TMR3CN|=0x06;
}
void main() //主程序
{
Watchdog_Init (); // Disable the Watchdog Timer first
Oscillator_Init ();
Port_Init ();
SPI0_Init ();
ADC0_Init();//AD初始化
T3_Init();//T3初始化
EIE1=0x01;//SPI0中断开启
EIE2|=0x03;//开启ADC0中断、T3中断
AD0EN = 1; // Enable ADC
EA=1;//总中断允许
while(1)
{
//ET0=1;//T0中断开始
//ES0=1;//UART0中断开启
//AD0INT=1;
TxBuf_DATA[2] = ad_strain;
}
}
void ADC0_ISR() interrupt 15
{
AMX0SL=0x00;
ad_data[ad_num] = ADC0H;
ad_data[ad_num] <<= 8;
ad_data[ad_num] = ADC0L;
strain[ad_num] = ad_data[ad_num];
ad_sum = ad_sum + strain[ad_num];
ad_num++;
if( ad_num == 8 )
{
ad_num = 0;
ad_avg = ad_sum/8;
ad_strain = ad_avg;
if( ad_strain > 2.5 )
{
ad_strain = 2.5;
}
if( ad_strain < 0 )
{
ad_strain = 0;
}
TxBuf_DATA[2] = ad_strain;
}
AD0INT=0;
}
#define BAURDRATE 9600//485通信波特率为9600
#define SYSCLK 22118400 //系统时钟为22.1184MHz
#define SARCLK 2500000//AD转换时钟为2.5MHz
#define SPISCK 110592// Maximum SPI clock, The SPI clock is a maximum of110592Hz
//----------------------------------------------------------------------------------------------------------------
#define uint unsigned int
#define uchar unsigned char
//-------------NRF905工作模式控制端口------------------------------------------------------
sbitTRX_CE=P1^0;
sbitTXEN=P1^2;
sbitPWR=P1^3;
//-------------NRF905数据交换端口---------------------------------------------------
sbitSCK=P0^2;
sbitMISO=P0^3;
sbitMOSI=P0^4;
sbitCSN=P0^5;// Slave select pin (NSS/CSN)
//-------------nrf905状态端口---------------------------------------------------------
sbitAM=P1^4;
sbitDR=P1^1;
sbitCD=P1^5;
sbit LED = P1^6; // LED='0' means ON
//------------------AD采集变量----------------------------
unsigned char TxBuf_DATA[4]={0};//源地址+66H+DATA+len(DATA字节数)
unsigned int ad_data[8]={0};//AD采样 数据暂存位置
unsigned int ad_avg=0;
unsigned int ad_sum=0;
unsigned int ad_num=0; //ad_num≤10
unsigned int ad_strain;
unsigned int strain[8]={0};
//------------------初始化函数-------------------------
void Watchdog_Init ()
{
WDTCN = 0xDE; // Disable the Watchdog Timer
WDTCN = 0xAD;
}
void Oscillator_Init()//系统时钟初始化程序
{
int i;
OSCXCN=0x67;//P156 0110 0111 以晶体振荡器方式工作 频率大于6.74MHz
for(i=0;i<256;i++)//小延时
while(!(OSCXCN&0x80));//等待外部晶体振荡器运行 工作稳定(最高位为1时稳定运行)
OSCICN=0x88;//P1551000 1000 检测到时钟丢失降复位 选用外部时钟作为系统时钟
}
void Port_Init ()
{
P0MDOUT = 0x14; // Make SCK, MOSI, NSS为推挽输出
P1MDOUT = 0xff; // LED推挽输出 Make the LED push-pull
//P0 = 0x0D;
XBR0 = 0x06; // 交叉开关使能SPI UART0
XBR1 = 0x14; //配置INT0、INT1到端口
XBR2 = 0x44; // 交叉开关允许,全局弱上拉
// XBR3 = 0x01;//T3配置到端口
}
void SPI0_Init()
{
SPI0CFG = 0x07; // (在SCK第一个边沿采集数据,SCK空闲时处于低电平;8-bit移入移出)
SPI0CN = 0x03; // (以主方式操作,允许SPI)Master, SPI enabled
SPI0CKR = (SYSCLK/(2*SPISCK))-1; //计算得SPI0CKR=0x18;
EIE1 |= 0x01; // (允许SPIF标志位的中断请求)Enable SPI interrupts
CSN = 1; // (NSS—使能主从关系)De-select the slave
}
void ADC0_Init()//AD采样初始化程序 采样率由定时器3溢出决定
{
AMX0CF=0x00;//AIN0~AIN08通道都为独立单端输入
AMX0SL=0x00;//禁止端口引脚作为模拟输入
ADC0CF|=0x00;//AD内部放大器增益为1
ADC0CF=0x38;//P121 公式 AD转换时钟配置
ADC0CN=0x04;//P122 10000100 AD转换允许 数据格式右对齐 采用T3溢出作为采样周期
EIE2|=0x02;//允许AD转换结束的中断请求
REF0CN=0x03;
}
void T3_Init()
{
TMR3CN=0x02;
TMR3H=0x53;//TMR3H=(65536-SYSCLK/501)/256;
TMR3L=0x8c;//TMR3L=(65536-SYSCLK/501)%256;
TMR3RLH=0x53;//TMR3RLH=(65536-SYSCLK/501)/256;
TMR3RLL=0x8c;//TMR3RLL=(65536-SYSCLK/501)%256;
TMR3CN|=0x06;
}
void main() //主程序
{
Watchdog_Init (); // Disable the Watchdog Timer first
Oscillator_Init ();
Port_Init ();
SPI0_Init ();
ADC0_Init();//AD初始化
T3_Init();//T3初始化
EIE1=0x01;//SPI0中断开启
EIE2|=0x03;//开启ADC0中断、T3中断
AD0EN = 1; // Enable ADC
EA=1;//总中断允许
while(1)
{
//ET0=1;//T0中断开始
//ES0=1;//UART0中断开启
//AD0INT=1;
TxBuf_DATA[2] = ad_strain;
}
}
void ADC0_ISR() interrupt 15
{
AMX0SL=0x00;
ad_data[ad_num] = ADC0H;
ad_data[ad_num] <<= 8;
ad_data[ad_num] = ADC0L;
strain[ad_num] = ad_data[ad_num];
ad_sum = ad_sum + strain[ad_num];
ad_num++;
if( ad_num == 8 )
{
ad_num = 0;
ad_avg = ad_sum/8;
ad_strain = ad_avg;
if( ad_strain > 2.5 )
{
ad_strain = 2.5;
}
if( ad_strain < 0 )
{
ad_strain = 0;
}
TxBuf_DATA[2] = ad_strain;
}
AD0INT=0;
}