哪位大哥能给一段GPRS模块通信的程序示例,我用的是sim900A模块。

哪位大哥能给一段GPRS模块通信的程序示例,我用的是sim900A模块。,第1张

#include stdio.h>

#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)

}

}

已通过测试的,希望能帮助到你!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12158195.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存