基于MODBUS协议的通讯系统 - 图文(7)

2019-03-29 15:18

}

lcden=0;

void write_data(uchar date) { } void init() {

//液晶初始化函数 lcdrs=1; P0=date; delayms(1); lcden=1; delayms(1); lcden=0;

//向液晶写数据函数

lcdrw=0; }

/**************************************************************************************************** /*函数:uint SPI_RW(uint uchar) /*功能:NRF24L01的SPI读写时序

/****************************************************************************************************/ uchar SPI_RW(uchar date) {

uint bit_ctr;

for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit { }

// return read date

MOSI = (date & 0x80); // output 'date', MSB to MOSI date = (date << 1); // shift next bit into MSB..

SCK = 1; // Set SCK high..上升沿给出数据 date |= MISO;

// capture current MISO bit // ..then set SCK low again

下降沿读回数据

lcden=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01);

SCK = 0;

return(date); }

/**************************************************************************************************** /*函数:uchar SPI_Read(uchar reg)

/*功能:NRF24L01的SPI读时序 reg为寄存器地址

/****************************************************************************************************/ uchar SPI_Read(uchar reg) {

29

}

uchar reg_val;

CSN = 0; // CSN low, initialize SPI communication... SPI_RW(reg); // Select register to read from.. reg_val = SPI_RW(0); // ..then read registervalue

CSN = 1; // CSN high, terminate SPI communication return(reg_val); // return register value

/****************************************************************************************************/ /*功能:NRF24L01写寄存器函数

/****************************************************************************************************/ void SPI_RW_Reg(uchar reg, uchar value) { }

/****************************************************************************************************/ /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)

/*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数

/****************************************************************************************************/ uchar SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars) { }

/********************************************************************************************************* /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)

/*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数

/*********************************************************************************************************/ void SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars) { }

uint uchar_ctr;

CSN = 0; //SPI使能 SPI_RW(reg);

for(uchar_ctr=0; uchar_ctr

SPI_RW(*pBuf++); uchar status,uchar_ctr; CSN = 0; status = SPI_RW(reg);

// Set CSN low, init SPI tranaction

// Select register to write to and read status uchar

CSN = 0; // CSN low, init SPI transaction SPI_RW(reg); // select register

SPI_RW(value); // ..and write value to it.. CSN = 1; // CSN high again

for(uchar_ctr=0;uchar_ctr

pBuf[uchar_ctr] = SPI_RW(0); //

CSN = 1;

return(status); // return nRF24L01 status uchar

CSN = 1; //关闭SPI

30

//**************************************************************************************** /*NRF24L01初始化

//***************************************************************************************/ void init_NRF24L01(void) { }

/*********************************************************************************************************** /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf) /*功能:发送 tx_buf中数据

/**********************************************************************************************************/ void nRF24L01_TxPacket(unsigned char * tx_buf) { }

/****************************************************************************************************/ /*函数:void SetRX_Mode(void) /*功能:数据接收配置

/****************************************************************************************************/ void SetRX_Mode(void) {

CE=0;

SPI_RW_Reg(WRITE_REG + CONFIG, 0x3f);

// IRQ收发完成中断响应,16位CRC ,主接收

CE=0;

//StandBy I模式

CE=0; // chip enable CSN=1; // Spi disable SCK=0; //

SPI_Write_Buf(WRITE_REG + TX_ADDR, A_ADR, TX_ADR_WIDTH); // 写本地地址 SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, B_ADR, RX_ADR_WIDTH); // 写接收端地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 频道0自动

ACK应答允许

SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 允许接收地址只有频道0,如果需要多频道可以参考Page21 SPI_RW_Reg(WRITE_REG + RF_CH, 0); // 设置信道工作为2.4GHZ,收发必须一致

SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07);

//设置发射速率为1MHZ,发射功率为最大值0dB

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, A_ADR, TX_ADR_WIDTH); // 装载接收端地址 此时是接受应答信号 SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH); SPI_RW_Reg(WRITE_REG + CONFIG, 0x3e); CE=1;

//置高CE,激发数据发送

// 装载数据

// IRQ收发完成中断响应,16位CRC,主发送

delayms(1); // 大于10US

SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, B_ADR, RX_ADR_WIDTH); // 写接收端地址 }

//*******************中断与定时器0初始化*********************************************************************** void Init_timer0()

CE = 1;

delayms(1);//大于130us

31

{

TMOD=0x01;

TH0=(65536-50000)>>8; TL0=65536-50000; EA=1; ET0=1; TR0 = 1;

IT0=1; //触发方式为负跳变触发 }

uchar hour=23,min=59,sec=50,month=10,day=28; uint year=2011;

//************************************主函数************************************************************ uchar TxBuf[4]={0}; uchar RxBuf[4]={0}; uchar rcv = 0; uchar bai,shi,ge,run; uchar weizhi=0,sendflag=0;

/***************************************中断处理**********************************************************/ void nRF24L01_int(void) interrupt 0 //中断说明有数据接收到或其他中断源 { EX0=0;

sta=SPI_Read(STATUS); // 读取状态寄存其来判断数据接收状况 if(RX_DR) //接收到数据

{

CE = 0;

// 进入待机模式读数据

//

EX0 = 1;

SPI_Read_Buf(RD_RX_PLOAD,RxBuf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer

SPI_RW_Reg(WRITE_REG+STATUS,sta);//清除中断标志 bai = RxBuf[1]; shi = RxBuf[2]; ge = RxBuf[3]; write_com(0x80+0x0a); write_data(table[bai]); write_data(table[shi]); write_data(table[10]); write_data(table[ge]); write_data(0xdf);

write_data(table[12]);

}

CE = 1; EX0=1; }

uchar num=0;

void Timer0() interrupt 1 {

32

TH0=(65536-50000)>>8; TL0=65536-50000; num++; if(num>=20) { num=0; sec++; if(sec>=60) { sec=0; min++; if(min>=60) { min=0; hour++; if(hour>=24) {

hour=0; day++; switch(month) {

case 1: case 3: case 5: case 7: case 8: case 10:

case 12:if(day>=32) {

day=1; month++; } break; case 4: case 6: case 9:

case 11: if(day==31) {

day=1; month++; }

break; case 2:if(run) {

33


基于MODBUS协议的通讯系统 - 图文(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:神东煤炭集团公司外委工程安全管理办法

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: