}
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