?? point1_fs.c
字號:
/*****************************************
*Copyright (c) 2007 江蘇大學電氣學院
*All right reserved
*文件名稱:fs.c
*摘要
無線發射
*當前版本1.1
*作者:電氣學院-季峰
*完成日期:2007年10月12日
******************************************/
#include <c8051f310.h>
xdata unsigned int stBuf[32]={0};
sbit D1=P3^1;
sbit D2=P3^2;
sbit PWR_UP=P1^0;
sbit CE=P1^1;
sbit CS=P1^2;
void PORT_Init(void)
{
P0MDOUT |=0x10; //txd輸出
P0MDOUT &=~0x20; //rxd輸入
P0MDIN &=0xf3; //P0.2 P0.3為模擬輸入,晶振
P0SKIP|=0x0C; //跳過晶體引腳
P1MDOUT|=0x07; //P1.0 P1.1 P1.3 推挽輸出
P3MDOUT|=0x06; //P3.1 P3.2推挽輸出
P2MDIN=0x00; //P2口都配置為模擬輸入,用于A/D轉換
P2SKIP=0xff; //P2口都被交叉開關跳過,用于A/D轉換
XBR0=0x03; //UART的TX0 RX0連到端口引腳P0.4、P0.5,SPI連到端口引腳
XBR1=0x41; //使能弱上拉,交叉開關啟用,外部中斷CEX0連到端口引腳
}
void External_Crystal(void)
{
unsigned int i;
OSCXCN=0x67; //外部晶振,11.0592MHz
for(i=0;i<256;i++);
while (!(OSCXCN&0x80)); //等待外部晶振穩定
CLKSEL=0x01; //系統時鐘取自外部振蕩器
}
void SPI0_Init(void)
{
SPIF=0; //清中斷標志
SPI0CFG=0x47; //配置SPI0為主方式;空閑時為低電平;在SCK周期的第1個邊沿采樣
SPI0CN=0x01; //采用三線主從方式,使能SPI
SPI0CKR=0x1a; //設定SCK輸出頻率為200K
ESPI0=0; //禁止SPI0中斷
}
unsigned char spi_read_write(unsigned char byte)
{
SPI0DAT=byte; //SPI0發送一字節數據
while(!SPIF); //等待發送完
SPIF=0;
return SPI0DAT;
}
void delay(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++);
}
void Init_ADC(void)
{
AMX0P=0x0f; //AD輸入選擇P2.7,鹽度A/D轉換通道
AMX0N=0x1f; //單端輸入
ADC0CF=0x40; //右對齊
ADC0CN=0x80; //ADC0允許,正常方式,向ADC0BUSY寫1時啟動ADC
REF0CN=0x0a; //VDD為參考電壓,溫度傳感器關閉,內部偏壓工作
EIE1&=0xf7; //EADC0置0,禁止ADC0轉換結果中斷
}
unsigned int GetADC(void)
{
unsigned int result;
AD0EN=1; //使能ADC0
AD0INT=0; //清ADC0中斷標志
AD0WINT=0; //清ADC0窗口比較標志
delay(20000);
AD0BUSY=1; //啟動A/D轉換
while(!AD0INT);
AD0INT=0;
AD0EN=0;
result=((unsigned int)ADC0H<<8)+ADC0L;
return result;
}
void nRF2401_powerup_config(void)
{
unsigned char i=0;
unsigned char config_data[15]={0};
config_data[0]=0x50;
config_data[1]=0x08; //發送8位數據
config_data[2]=0x00;
config_data[3]=0xd0;
config_data[4]=0xdd;
config_data[5]=0xdd;
config_data[6]=0xdd; //接收通道2地址
config_data[7]=0x00;
config_data[8]=0xaa;
config_data[9]=0xbb;
config_data[10]=0x11;
config_data[11]=0x22; //接收通道1地址
config_data[12]=0x83;
config_data[13]=0x6f;
config_data[14]=0x04; //配置狀態字,發送狀態,發送頻段2400MHZ+2*1.0MHZ=2.402GHZ
PWR_UP=1;
CE=0;
CS=1; //配置方式
delay(10); //延時5us以上
for(i=0;i<15;i++)
{
spi_read_write(config_data[i]);
}
CE=1; //進入激活狀態
CS=0;
D2=0; //配置完成,進入激活狀態D2亮
}
void Transmit_address_data(unsigned char number)
{
unsigned char i=0;
unsigned char transmit_data[5]={0};
transmit_data[0]=0xaa;
transmit_data[1]=0xbb;
transmit_data[2]=0x11;
transmit_data[3]=0x22;
transmit_data[4]=number;
CE=1; //準備發送數據,CE置高
delay(10);
for(i=0;i<5;i++)
{
spi_read_write(transmit_data[i]);
}
CE=0; //CE置低,數據發射出去
D1=0; //數據發射,D1燈亮
}
void main(void)
{
unsigned char i,b=0,c=0;
unsigned int saltcode=0,temperaturecode=0,a=0;
unsigned long sum=0;
PCA0MD&=~0x40; //關閉看門狗
PORT_Init();
External_Crystal();
SPI0_Init();
Init_ADC(); //初始化ADC轉換
nRF2401_powerup_config();
while(1)
{
for(i=0;i<32;i++)
{
stBuf[i]=GetADC();
sum=sum+stBuf[i];
}
saltcode=sum>>5;
a=saltcode;
b=a; //低8位
c=a>>8; //高2位
Transmit_address_data(c);
delay(500);
Transmit_address_data(b);
sum=0;
AMX0P=0x0e; //AD輸入選擇P2.6,溫度A/D轉換通道
for(i=0;i<32;i++)
{
stBuf[i]=GetADC();
sum=sum+stBuf[i];
}
temperaturecode=sum>>5;
a=temperaturecode;
b=a; //低8位
c=a>>8; //高2位
Transmit_address_data(c);
delay(500);
Transmit_address_data(b);
sum=0;
AMX0P=0x0f; //AD輸入選擇P2.7,鹽度A/D轉換通道
for(i=0;i<100;i++)
{
delay(50000);
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -