#include stdlib.h>
#include string.h>
#include unistd.h>
#include fcntl.h>
#include errno.h>
#include termios.h>
int open_port(void)
{
int fd
fd = open("/dev/s3c2410_serial1", O_RDWR|O_NOCTTY|O_NDELAY)
if(fd == -1)
printf("Unable to open uart1\n")
else
fcntl(fd, F_SETFL, 0)
return fd
}
int setup_uart(int fd)
{
struct termios oldtio, newtio
if((tcgetattr(fd, &oldtio)) != 0)
{
printf("Save old error!\n")
return -1
}
bzero(&newtio, sizeof(newtio))
newtio.c_cflag |= (CLOCAL | CREAD)
newtio.c_cflag &= ~CSIZE
newtio.c_cflag &= ~CSTOPB// 1 stop bit
newtio.c_cflag &= ~PARENB// No parity
newtio.c_cflag |= CS8// 8 bits data
cfsetispeed(&newtio, B9600)
cfsetospeed(&newtio, B9600)
//newtio.c_lflag |= (ICANON | ECHO)
//newtio.c_lflag &= ~ECHOE
//newtio.c_iflag &= ~(IXON | IXOFF | IXANY)
newtio.c_cc[VTIME] = 0
newtio.c_cc[VMIN] = 0
tcflush(fd, TCIFLUSH)
if((tcsetattr(fd, TCSANOW, &newtio)) != 0)
{
printf("Set new error!\n")
return -1
}
}
int main(void)
{
int i
int fd
char c,str[200]
fd = open_port()
if(fd == -1)
return 0
i = setup_uart(fd)
if(i == -1)
return 0
while(1)
{
for(i=0i200i++)
str = '\0'
i = 0
printf("GPRS-CMD #")
while((c=getchar()) != 10)
{
str = c
i++
}
str = 13
str[i+1] = '\0'
i = write(fd, str, strlen(str))
if(i 0)
printf("write error!")
for(i=0i100i++)
usleep(100)
i = read(fd, str, 200)
printf("%s\n", str)
}
}
另一篇和主题相似的已发送往您的邮箱,请查收.
可以控制在控制面板里禁用无线网卡bool CNetCardStateSet::NetCardStateChange(void * NetCardPoint, bool Enabled)
{
//---------------------------------------------------------------------------
//功能:NetCardStateChange 网卡的启用与禁用
//参数:NetCardPoint 是 PNetCardStruct 的指针.
//参数:Enabled true = 启用 false = 禁用
//---------------------------------------------------------------------------
PNetCardStruct NetCard = (PNetCardStruct)NetCardPoint
DWORD DeviceId = NetCard->Id
HDEVINFO hDevInfo = 0
if (INVALID_HANDLE_VALUE == (hDevInfo =
SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT|DIGCF_ALLCLASSES)))
{
return false
}
/*
SetupDiGetClassDevs(
(LPGUID) &GUID_DEVCLASS_NET,// GUID_DEVCLASS_NET表示仅列出网络设备
NULL,
this->m_hWnd,
DIGCF_PRESENT)
*/
SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)}
DWORD Status, Problem
if (!SetupDiEnumDeviceInfo(hDevInfo,DeviceId,&DeviceInfoData)) //
return false
if (CM_Get_DevNode_Status(&Status, &Problem,
DeviceInfoData.DevInst,0) != CR_SUCCESS) //读取网卡状态
return false
SP_PROPCHANGE_PARAMS PropChangeParams = {sizeof(SP_CLASSINSTALL_HEADER)}
PropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE
PropChangeParams.Scope = DICS_FLAG_GLOBAL
if (Enabled)
{
if (!((Status &DN_HAS_PROBLEM) &&(CM_PROB_DISABLED == Problem))) //如果网卡是启用中的,则不处理
{
NetCard->Disabled = false
return false
}
PropChangeParams.StateChange = DICS_ENABLE
}
else
{
if ((Status &DN_HAS_PROBLEM) &&(CM_PROB_DISABLED == Problem))
{
NetCard->Disabled = true
return false
}
if (!((Status &DN_DISABLEABLE) &&(CM_PROB_HARDWARE_DISABLED != Problem)))
return false
PropChangeParams.StateChange = DICS_DISABLE
}
if (!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData,(SP_CLASSINSTALL_HEADER *)&PropChangeParams, sizeof(PropChangeParams)))
{//功能:设置网卡有效或无效
return false
}
if (!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, &DeviceInfoData))
{
return false
}
if (CM_Get_DevNode_Status(&Status, &Problem,DeviceInfoData.DevInst,0) == CR_SUCCESS)
{
NetCard->Disabled = (Status &DN_HAS_PROBLEM) &&(CM_PROB_DISABLED == Problem)
}
return true
}
2
3
4
5
6
7
8
9
上面那函数参数的那个结构体
typedef struct NetCardStruct
{
DWORD Id // 网卡设备号
CString Name // 网卡名
bool Disabled // 当前是否禁用
bool Changed // 是否更改过
} TNetCardStruct
typedef TNetCardStruct* PNetCardStruct
[code=C/C++]这是启用、停用网卡的一段代码,可以参考
PIP_ADAPTER_INFO pAdapterInfo=NULL
ULONG len
if(ERROR_SUCCESS!=GetAdaptersInfo(pAdapterInfo,&len))
{
free(pAdapterInfo)
pAdapterInfo=(IP_ADAPTER_INFO *)malloc(len)
}
if(ERROR_SUCCESS==GetAdaptersInfo(pAdapterInfo,&len))
{
}
DWORD dwSize=0
MIB_IFTABLE *mit=NULL
GetIfTable(NULL, &dwSize, true)
mit=(MIB_IFTABLE*)new BYTE[dwSize]
if(NO_ERROR==GetIfTable(mit, &dwSize, true))
{
for(int i=0i<(int)mit->dwNumEntriesi++)
{
mit->table[i].dwAdminStatus=MIB_IF_ADMIN_STATUS_DOWN
CString str(pAdapterInfo->Description)
CString temp(mit->table[i].bDescr)
if (str==temp)
{
if(NO_ERROR==SetIfEntry(&mit->table[i]))
{
/* ShowMessage("Stop Adapter("+IntToStr(mit->table[i].dwIndex)+") "
+(AnsiString)(char*)mit->table[i].bDescr+" succeed.")*/
printf("Stop adapter succed!\n")
}
}
// if(NO_ERROR==SetIfEntry(&mit->table[i]))
// {
///* ShowMessage("Stop Adapter("+IntToStr(mit->table[i].dwIndex)+") "
// +(AnsiString)(char*)mit->table[i].bDescr+" succeed.")*/
// printf("Stop adapter succed!\n")
// }
}
for(int i=0i<(int)mit->dwNumEntriesi++)
{
mit->table[i].dwAdminStatus=MIB_IF_ADMIN_STATUS_UP
CString str(pAdapterInfo->Description)
CString temp(mit->table[i].bDescr)
if (str==temp)
{
if(NO_ERROR==SetIfEntry(&mit->table[i]))
{
printf("Start adapter succed!\n")
}
}
}
[code]
上面这个函数你可以置放放你程序里面
其实上面贴的代码比较好 是以前整理的一个网卡设置类中的部分代码
/******************************无线温度发送***********************/#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节
#define RX_ADDR_WITDH 5
#define TX_DATA_WITDH 5
#define RX_DATA_WITDH 5
/******************************************************************
// nRF24L01指令格式:
*******************************************************************/
#define R_REGISTER0x00 // 读寄存器
#define W_REGISTER0x20 // 写寄存器
#define R_RX_PLOAD0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式
#define W_TX_PLOAD0xA0 // 写TX FIFO有效数据,1-32字节,写 *** 作从字节0开始,应用于发射模式
#define FLUSH_TX0xE1 // 清除TX FIFO寄存器,应用于发射模式
#define FLUSH_RX0xE2 // 清除RX FIFO寄存器,应用于接收模式
#define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射
#define NOP 0xFF // 空 *** 作,可以用来读状态寄存器
/******************************************************************
// nRF24L01寄存器地址
*******************************************************************/
#define CONFIG 0x00 // 配置寄存器
#define EN_AA 0x01 // “自动应答”功能寄存
#define EN_RX_ADDR 0x02 // 接收通道使能寄存器
#define SETUP_AW0x03 // 地址宽度设置寄存器
#define SETUP_RETR 0x04 // 自动重发设置寄存器
#define RF_CH 0x05 // 射频通道频率设置寄存器
#define RF_SETUP0x06 // 射频设置寄存器
#define STATUS 0x07 // 状态寄存器
#define OBSERVE_TX 0x08 // 发送检测寄存器
#define CD 0x09 // 载波检测寄存器
#define RX_ADDR_P0 0x0A // 数据通道0接收地址寄存器
#define RX_ADDR_P1 0x0B // 数据通道1接收地址寄存器
#define RX_ADDR_P2 0x0C // 数据通道2接收地址寄存器
#define RX_ADDR_P3 0x0D // 数据通道3接收地址寄存器
#define RX_ADDR_P4 0x0E // 数据通道4接收地址寄存器
#define RX_ADDR_P5 0x0F // 数据通道5接收地址寄存器
#define TX_ADDR 0x10 // 发送地址寄存器
#define RX_PW_P00x11 // 数据通道0有效数据宽度设置寄存器
#define RX_PW_P10x12 // 数据通道1有效数据宽度设置寄存器
#define RX_PW_P20x13 // 数据通道2有效数据宽度设置寄存器
#define RX_PW_P30x14 // 数据通道3有效数据宽度设置寄存器
#define RX_PW_P40x15 // 数据通道4有效数据宽度设置寄存器
#define RX_PW_P50x16 // 数据通道5有效数据宽度设置寄存器
#define FIFO_STATUS 0x17 // FIFO状态寄存器
//*********************************************************************************
uchar sta // 状态变量
#define RX_DR (sta &0x40) // 接收成功中断标志
#define TX_DS (sta &0x20) // 发射成功中断标志
#define MAX_RT (sta &0x10) // 重发溢出中断标志
sbit CE=P1^5
sbit IRQ=P1^0
sbit CSN=P1^4
sbit MOSI=P1^2
sbit MISO=P1^1
sbit SCK=P1^3
//sbit key=P1^0
sbit LED=P0^0
sbit DQ=P1^6
uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01}
//uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00}
uchar RX_Buffer[RX_DATA_WITDH]
uchar Temp_Value[]={0x00,0x00}
uchar Temp=0
uchar Display_Digit[]={0,0,0,0}
bit DS18B20_IS_OK=1
uchar code df_tab[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9}//decimal fraction
void _delay_tus(uint x)
{
while(--x)
}
void _delay_us(uint x)
{
uint i,j
for (j=0j<xj++)
for (i=0i<12i++)
}
void _delay_ms(uint x)
{
uint i,j
for (j=0j<xj++)
for (i=0i<120i++)
}
/**************************************************/
/*函数功能:DS18B20初始化 */
/*入口参数:无 */
/*出口函数:status */
/**************************************************/
uchar DS18B20_Init(void)
{
uchar status
DQ=1
_delay_tus(10)
DQ=0
_delay_tus(90)
DQ=1
_delay_tus(8)
status=DQ
_delay_tus(100)
DQ=1
return status
}
/**************************************************/
/*函数功能:从DS18B20读取一字节*/
/*入口参数:无 */
/*出口函数:dat(返回读取到数据)*/
/**************************************************/
uchar Read_One_Byte(void)
{
uchar i,dat=0
DQ=1
_nop_()
for(i=8i>0i--)
{
DQ=0
dat>>=1
DQ=1
_nop_()_nop_()
if(DQ)
dat|=0x80
_delay_tus(30)
DQ=1
}
return dat
}
/**************************************************/
/*函数功能:向DS18B20写一字节 */
/*入口参数:dat(把dat写入DS18B20) */
/*出口函数:无 */
/**************************************************/
void Write_One_Byte(uchar dat)
{
uchar i
for(i=8i>0i--)
{
DQ=0
DQ=dat&0x01
_delay_tus(5)
DQ=1
dat>>=1
}
}
/**************************************************/
/*函数功能:从DS18B20读取数据(数据)*/
/*入口参数:无 */
/*出口函数:无 */
/**************************************************/
void Read_Temp(void)
{
uchar ng=0
if(DS18B20_Init()==1)
DS18B20_IS_OK=0
else
{
Write_One_Byte(0xcc)
Write_One_Byte(0x44)
DS18B20_Init()
Write_One_Byte(0xcc)
Write_One_Byte(0xbe)
Temp_Value[0]=Read_One_Byte()
Temp_Value[1]=Read_One_Byte()
DS18B20_IS_OK=1
}
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1]
Temp_Value[0]=~Temp_Value[0]+1
if(Temp_Value[0]==0x00)
Temp_Value[1]++
ng=1
}
Display_Digit[0]=df_tab[Temp_Value[0]&0x0f]
Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4)
Display_Digit[3]=Temp/100
Display_Digit[2]=Temp%100/10
Display_Digit[1]=Temp%10
}
/**************************************************/
/*函数功能:从DS18B20读取数据转换成ASCII码写入液晶 */
/*模块*/
/*入口参数:无 */
/*出口函数:无 */
/**************************************************/
/*void Display_Temperature(void)
{
uchar ng=0
if((Temp_Value[1]&0xf8)==0xf8)
{
Temp_Value[1]=~Temp_Value[1]
Temp_Value[0]=~Temp_Value[0]+1
if(Temp_Value[0]==0x00)
Temp_Value[1]++
ng=1
}
Display_Digit[0]=df_tab[Temp_Value[0]&0x0f]
Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4)
Display_Digit[3]=Temp/100
Display_Digit[2]=Temp%100/10
Display_Digit[1]=Temp%10
}
Display_LINE1[13]=0x43
Display_LINE1[12]=0xdf
Display_LINE1[11]=Display_Digit[0]+'0'
Display_LINE1[10]='.'
Display_LINE1[9]=Display_Digit[1]+'0'
Display_LINE1[8]=Display_Digit[2]+'0'
Display_LINE1[7]=Display_Digit[3]+'0'
if(Display_Digit[3]==0)
Display_LINE1[7]=' '
if(Display_Digit[2]==0&&Display_Digit[3]==0)
Display_LINE1[8]=' '
if(ng)
{
if(Display_LINE1[8]==' ')
Display_LINE1[8]='-'
else if(Display_LINE1[7]==' ')
Display_LINE1[7]='-'
else
Display_LINE1[6]='-'
}
LCD_POS(0)
Show_String(Display_LINE0)
LCD_POS(0x40)
Show_String(Display_LINE1)
}
void main(void)
{
Init_LCD()
Read_Temp()
_delay_ms(1000)
while(1)
{
Read_Temp()
if(DS18B20_IS_OK)
Display_Temperature()
_delay_ms(200)
}
}*/
/*nRF24L01初始化*/
void nRF24L01_Init(void)
{
_delay_us(2000)
CE=0//待机模式Ⅰ
CSN=1
SCK=0
IRQ=1
}
/*SPI时序函数*/
uchar SPI_RW(uchar byte)
{
uchar i
for(i=0i<8i++)//一字节8位循环8次写入
{
if(byte&0x80)//如果数据最高位是1//当访问多字节寄存器时首先要读/写的是最低字节的高位?
MOSI=1//向NRF24L01写1
else //否则写0
MOSI=0
byte<<=1//低一位移到最高位
SCK=1//SCK拉高,写入一位数据,同时读取一位数据
if(MISO)
byte|=0x01
SCK=0//SCK拉低
}
return byte//返回读取一字节
}
/*SPI写寄存器一字节函数*/
/*reg:寄存器地址*/
/*value:一字节(值)*/
uchar SPI_W_Reg(uchar reg,uchar value)
{
uchar status//返回状态
CSN=0//SPI片选
status=SPI_RW(reg)//写入寄存器地址,同时读取状态
SPI_RW(value)//写入一字节
CSN=1//
return status//返回状态
}
/*SPI*/
uchar SPI_R_byte(uchar reg)
{
uchar reg_value
CSN=0//SPI片选
SPI_RW(reg)//写入地址
reg_value=SPI_RW(0)//读取寄存器的值
CSN=1
return reg_value//返回读取的值
}
/*SPI读取RXFIFO寄存器数据*/
/*reg:寄存器地址*/
/**Dat_Buffer:用来存读取的数据*/
/*DLen:数据长度*/
uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
{
uchar status,i
CSN=0//SPI片选
status=SPI_RW(reg)//写入寄存器地址,同时状态
for(i=0i<Dleni++)
{
Dat_Buffer[i]=SPI_RW(0)//存储数据
}
CSN=1
return status
}
/*SPI向TXFIFO寄存器写入数据*/
/*reg:写入寄存器地址*/
/*TX_Dat_Buffer:存放需要发送的数据*/
/*Dlen:数据长度*/
uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{
uchar status,i
CSN=0//SPI片选,启动时序
status=SPI_RW(reg)
for(i=0i<Dleni++)
{
SPI_RW(TX_Dat_Buffer[i])//发送数据
}
CSN=1
return status
}
/*设置发送模式*/
void nRF24L01_Set_TX_Mode(uchar *TX_Data)
{
CE=0//待机(写寄存器之前一定要进入待机模式或掉电模式)
SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH)/*写寄存器指令+接收节点地址+地址宽度*/
SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH)/*为了接收设备应答信号,接收通道0地址与发送地址相同*/
SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH)/*写有效数据地址+有效数据+有效数据宽度*/
SPI_W_Reg(W_REGISTER+EN_AA,0x01)/*接收通道0自动应答*/
SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01)/*使能接收通道0*/
SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a)/*自动重发延时250US+86US,重发10次*/
//SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH)
SPI_W_Reg(W_REGISTER+RF_CH,0x40)/*(2400+40)MHZ选择射频通道0X40*/
SPI_W_Reg(W_REGISTER+RF_SETUP,0x07)/*1Mbps速率,发射功率:0DBM,低噪声放大器增益*/
SPI_W_Reg(W_REGISTER+CONFIG,0x0e)/*发送模式,上电,16位CRC校验,CRC使能*/
CE=1//启动发射
_delay_ms(5)/*CE高电平持续时间最少10US以上*/
}
uchar Check_Rec(void)
{
uchar status
sta=SPI_R_byte(R_REGISTER+STATUS)
if(RX_DR)
{
CE=0
SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH)
status=1
}
SPI_W_Reg(W_REGISTER+STATUS,0xff)
return status
}
/*检测应答信号*/
uchar Check_Ack(void)
{
sta=SPI_R_byte(R_REGISTER+STATUS)/*读取寄存状态*/
if(TX_DS||MAX_RT)/*如果TX_DS或MAX_RT为1,则清除中断和清除TX_FIFO寄存器的值*/
{
SPI_W_Reg(W_REGISTER+STATUS,0xff)
CSN=0
SPI_RW(FLUSH_TX)
CSN=1
return 0
}
else
return 1
}
void main(void)
{
uchar i
P0=0xff
P1=0xff
P2=0xff
P3=0xff
nRF24L01_Init()
Read_Temp()
_delay_ms(1000)
while(1)
{
Read_Temp()
if(DS18B20_IS_OK)
{
for(i=0i<TX_DATA_WITDH-4i++)//减1是因为最后一位为结束标志
{
LED=~LED
nRF24L01_Set_TX_Mode(&Display_Digit[i])
_delay_ms(100)
while(Check_Ack())
//LED=0
}
}
}
}
/******************************无线温度接收***********************/
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节
#define RX_ADDR_WITDH 5
#define TX_DATA_WITDH 5
#define RX_DATA_WITDH 5
/******************************************************************
// nRF24L01指令格式:
*******************************************************************/
#define R_REGISTER0x00 // 读寄存器
#define W_REGISTER0x20 // 写寄存器
#define R_RX_PLOAD0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式
#define W_TX_PLOAD0xA0 // 写TX FIFO有效数据,1-32字节,写 *** 作从字节0开始,应用于发射模式
#define FLUSH_TX0xE1 // 清除TX FIFO寄存器,应用于发射模式
#define FLUSH_RX0xE2 // 清除RX FIFO寄存器,应用于接收模式
#define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射
#define NOP 0xFF // 空 *** 作,可以用来读状态寄存器
/******************************************************************
// nRF24L01寄存器地址
*******************************************************************/
#define CONFIG 0x00 // 配置寄存器
#define EN_AA 0x01 // “自动应答”功能寄存器
#define EN_RX_ADDR 0x02 // 接收通道使能寄存器
#define SETUP_AW0x03 // 地址宽度设置寄存器
#define SETUP_RETR 0x04 // 自动重发设置寄存器
#define RF_CH 0x05 // 射频通道频率设置寄存器
#define RF_SETUP0x06 // 射频设置寄存器
#define STATUS 0x07 // 状态寄存器
#define OBSERVE_TX 0x08 // 发送检测寄存器
#define CD 0x09 // 载波检测寄存器
#define RX_ADDR_P0 0x0A // 数据通道0接收地址寄存器
#define RX_ADDR_P1 0x0B // 数据通道1接收地址寄存器
#define RX_ADDR_P2 0x0C // 数据通道2接收地址寄存器
#define RX_ADDR_P3 0x0D // 数据通道3接收地址寄存器
#define RX_ADDR_P4 0x0E // 数据通道4接收地址寄存器
#define RX_ADDR_P5 0x0F // 数据通道5接收地址寄存器
#define TX_ADDR 0x10 // 发送地址寄存器
#define RX_PW_P00x11 // 数据通道0有效数据宽度设置寄存器
#define RX_PW_P10x12 // 数据通道1有效数据宽度设置寄存器
#define RX_PW_P20x13 // 数据通道2有效数据宽度设置寄存器
#define RX_PW_P30x14 // 数据通道3有效数据宽度设置寄存器
#define RX_PW_P40x15 // 数据通道4有效数据宽度设置寄存器
#define RX_PW_P50x16 // 数据通道5有效数据宽度设置寄存器
#define FIFO_STATUS 0x17 // FIFO状态寄存器
//*********************************************************************************
uchar sta // 状态变量
#define RX_DR (sta &0x40) // 接收成功中断标志
#define TX_DS (sta &0x20) // 发射成功中断标志
#define MAX_RT (sta &0x10) // 重发溢出中断标志
sbit CE=P1^5 //RX/TX模式选择端
sbit IRQ=P1^0//可屏蔽中断端
sbit CSN=P1^4//SPI片选端//就是SS
sbit MOSI=P1^2//SPI主机输出从机输入端
sbit MISO=P1^1//SPI主机输出从机输出端
sbit SCK=P1^3//SPI时钟端
sbit LED=P0^0
sbit key=P2^0
sbit LCD_RS=P2^2
sbit LCD_RW=P2^1
sbit LCD_EN=P2^0
uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01}
uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}
uchar RX_Buffer[RX_DATA_WITDH]
uchar code Display_LINE0[]={" FROM NRF24L01:"}
uchar Display_LINE1[]={" TEMP: "}
void _delay_us(uint x)
{
uint i,j
for (j=0j<xj++)
for (i=0i<12i++)
}
void _delay_ms(uint x)
{
uint i,j
for (j=0j<xj++)
for (i=0i<120i++)
}
bit LCD_Busy(void)//测忙
{
bit LCD_Status//返回值变量
LCD_RS=0//读取状态
LCD_RW=1
LCD_EN=1
_nop_()_nop_()_nop_()_nop_()
LCD_Status=(bit)(P3&0x80)
LCD_EN=0
return LCD_Status
}
void LCD_Write_Command(uchar cmd)//写指令
{
//while(LCD_Busy())
LCD_RS=0//
LCD_RW=0
LCD_EN=0
_nop_()_nop_()
P3=cmd
_nop_()_nop_()_nop_()_nop_()
LCD_EN=1
_nop_()_nop_()_nop_()_nop_()
LCD_EN=0
}
void LCD_Write_Data(uchar dat)//写数据
{
//while(LCD_Busy())//每次写数据 *** 作之前均需要检测忙信号
LCD_RS=1
LCD_RW=0
LCD_EN=0
P3=dat
_nop_()_nop_()_nop_()_nop_()
LCD_EN=1
_nop_()_nop_()_nop_()_nop_()
LCD_EN=0
}
void Init_LCD(void)//液晶初始化
{
_delay_ms(15)//延时15MS
LCD_Write_Command(0x38)
_delay_ms(5)
LCD_Write_Command(0x38)
_delay_ms(5)
LCD_Write_Command(0x38)//以后每次写指令 *** 作之前均需要检测忙信号
//while(LCD_Busy())
_delay_ms(5)
LCD_Write_Command(0x01)//清屏
//while(LCD_Busy())
_delay_ms(5)
LCD_Write_Command(0x38)//设置16*2显示,5*7点阵,8位数据接口
_delay_ms(5)
//while(LCD_Busy())
LCD_Write_Command(0x0c)//开显示,不显示光标
_delay_ms(5)
//while(LCD_Busy())
LCD_Write_Command(0x06)//当读或写一个字符后地址指针加一,且光标加一
}
void LCD_POS(uchar pos)//字符显示位置
{
LCD_Write_Command(0x80|pos)
}
void Show_String(uchar *str)//显示字符串
{
while(*str!='\0')
LCD_Write_Data(*str++)
}
void nRF24L01_Init(void)
{
_delay_us(2000)
CE=0
CSN=1
SCK=0
IRQ=1
}
uchar SPI_RW(uchar byte)
{
uchar i
for(i=0i<8i++)
{
if(byte&0x80)
MOSI=1
else
MOSI=0
byte<<=1
SCK=1
if(MISO)
byte|=0x01
SCK=0
}
return byte
}
uchar SPI_W_Reg(uchar reg,uchar value)
{
uchar status
CSN=0
status=SPI_RW(reg)
SPI_RW(value)
CSN=1
return status
}
uchar SPI_R_byte(uchar reg)
{
uchar status
CSN=0
SPI_RW(reg)
status=SPI_RW(0)
CSN=1
return status
}
uchar SPI_R_DBuffer(uchar reg,uchar *Dat_Buffer,uchar Dlen)
{
uchar reg_value,i
CSN=0
reg_value=SPI_RW(reg)
for(i=0i<Dleni++)
{
Dat_Buffer[i]=SPI_RW(0)
}
CSN=1
return reg_value
}
uchar SPI_W_DBuffer(uchar reg,uchar *TX_Dat_Buffer,uchar Dlen)
{
uchar reg_value,i
CSN=0
reg_value=SPI_RW(reg)
for(i=0i<Dleni++)
{
SPI_RW(TX_Dat_Buffer[i])
}
CSN=1
return reg_value
}
void nRF24L01_Set_RX_Mode(void)
{
CE=0//待机
//SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH)
SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH)
SPI_W_Reg(W_REGISTER+EN_AA,0x01)
SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01)
//SPI_W_Reg(W_REGISTER+SETUP_RETR,0x0a)
SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH)
SPI_W_Reg(W_REGISTER+RF_CH,0x40)
SPI_W_Reg(W_REGISTER+RF_SETUP,0x07)
SPI_W_Reg(W_REGISTER+CONFIG,0x0f)
CE=1
_delay_ms(5)
}
uchar nRF24L01_RX_Data(void)
{
//uchar i,status
sta=SPI_R_byte(R_REGISTER+STATUS)
if(RX_DR)
{
CE=0
SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH)
//P3=RX_Buffer[0]
SPI_W_Reg(W_REGISTER+STATUS,0xff)
CSN=0
SPI_RW(FLUSH_RX)
CSN=1
return 1
}
else
return 0
}
void main(void)
{
uchar i,RX_Temp_Value[RX_DATA_WITDH]//ng
P0=0xff
P1=0xff
P2=0xff
P3=0xff
Init_LCD()
nRF24L01_Init()
_delay_us(1000)
LCD_POS(0)
Show_String(Display_LINE0)
while(1)
{
nRF24L01_Set_RX_Mode()
//_delay_ms(100)
if(nRF24L01_RX_Data())
{
for(i=0i<RX_DATA_WITDHi++)
{
RX_Temp_Value[i]=RX_Buffer[i]
LED=~LED
}
}
Display_LINE1[7]=RX_Temp_Value[3]+'0'
Display_LINE1[8]=RX_Temp_Value[2]+'0'
Display_LINE1[9]=RX_Temp_Value[1]+'0'
Display_LINE1[10]='.'
Display_LINE1[11]=RX_Temp_Value[0]+'0'
Display_LINE1[12]=0xdf
Display_LINE1[13]=0x43
if(RX_Temp_Value[3]==0)
Display_LINE1[7]=' '
/*if(RX_Temp_Value[2]==0&&RX_Temp_Value[3]==0)
Display_LINE1[8]=' '
if(ng)
{
if(Display_LINE1[8]==' ')
Display_LINE1[8]='-'
else if(Display_LINE1[7]==' ')
Display_LINE1[7]='-'
else
Display_LINE1[6]='-'*/
LCD_POS(0x40)
Show_String(Display_LINE1)
}
}
已通过测试的,希望能帮助到你!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)