完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
数值显示,报警,无线传输,数据采集部分都做完了,想加一个温湿度的动态曲线显示,找了网上很多例程都没有弄出来,望给位前辈给点指导。 这是我接收端的代码。 #include #include #include #define uchar unsigned char #define uint unsigned int #define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址 #define TX_PLOAD_WIDTH 6 // 数据通道有效数据宽度 uchar code TX_ADDRESS_0[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01}; // 定义一个静态发送地址 uchar RX_BUF[TX_PLOAD_WIDTH];//0通道数据 uchar TX_BUF[TX_PLOAD_WIDTH]; uchar flage; uchar str[TX_PLOAD_WIDTH],outdata[TX_PLOAD_WIDTH]; uchar bdata sta; uchar K1num,K2num,K3num,K4num; uchar code dis1[] = {"当前温度"}; uchar code dis2[] = {" ℃"}; uchar code dis3[] = {"当前湿度"}; uchar code dis4[] = {" %"}; uchar code dis5[] = {"温度上限:"};//温湿度设置界面 uchar code dis6[] = {"温度下限:"}; uchar code dis7[] = {"湿度上限:"}; uchar code dis8[] = {"湿度下限:"}; uchar code table[]={"0123456789.CT:"}; int count,n; ***it RX_P_NO1=sta^1; ***it RX_P_NO2=sta^2; ***it RX_P_NO3=sta^3; ***it MAX_RT = sta^4; ***it TX_DS = sta^5; ***it RX_DR = sta^6; /*TS12864A-3 端口定义*/ #define LCD_data P0 //数据口 ***it LCD_RS = P2^0; //寄存器选择输入 ***it LCD_RW = P2^1; //液晶读/写控制 ***it LCD_EN = P2^2; //液晶使能控制 ***it LCD_PSB = P2^3; //串/并方式控制 ***it fmq = P1^6; //蜂鸣器 ***it led1 = P3^4; //正常灯 ***it led2 = P3^5; //报警灯 ***it K1 = P2^4; //设置温湿度报警值 ***it K2 = P2^5; //加操作 ***it K3 = P2^6; //减操作 ***it K4 = P2^7; //关报警 typedef unsigned char U8; bit flag,flag2,flag3=0,flag4=0,flag5=0,flag6=0; U8 Temp,RH1; U8 str_1[6]; U8 U8count,U8temp; //温湿度的高低位及校验位 U8 temp_H=30,temp_L=0,RH_H=50,RH_L=10; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; uchar IRDIS[2]; uchar IRCOM[4]; void delay0(uchar x); //x*0.14MS void delay1(uint z); //按键延时函数 void display1(); //主界面显示 void display2(); //温湿度上下限及报警开关设置界面 void display3(); void keyscan(); //温湿度上下限设置按键扫描 void keyscan2(); void shut(); //关报警 void Buffer(); void lcd_pos(uchar X,uchar Y); //确定显示位置 /**************************************************/ /*函数: init_io() */ /*描述: 初始化IO */ /**************************************************/ void init_io(void) { CE = 0; // 待机 CSN = 1; // SPI禁止 SCK = 0; // SPI时钟置低 IRQ = 1; // 中断复位 //LED = 0xff; // 关闭指示灯 } /**************************************************/ /*函数: init_ser() */ /*描述: 初始化串口 */ /**************************************************/ void init_ser() { TMOD = 0x20; //定时器T1使用工作方式2 TH1 = 253; // 设置初值 TL1 = 253; TR1 = 1; // 开始计时 SCON = 0x50; //工作方式1,波特率9600bps,允许接收 ES = 1; EA = 1; // 打开所以中断 ti = 0; RI = 0; } /**************************************************/ /*函数:delay_ms() */ /*描述:延迟x毫秒 */ /**************************************************/ void delay_ms(uchar x) { uchar i, j; i = 0; for(i=0; i j = 250; while(--j); j = 250; while(--j); } } /**************************************************/ /*函数:SPI_RW() */ /*描述:根据SPI协议,写一字节数据到nRF24L01, */ /* 同时从nRF24L01读出一字节 */ /**************************************************/ uchar SPI_RW(uchar byte) { uchar i; for(i=0; i<8; i++) // 循环8次 { MOSI = (byte & 0x80); // byte最高位输出到MOSI byte <<= 1; // 低一位移位到最高位 SCK = 1; // 拉高SCK,nRF24L01从MOSI读入1位数据,同时从MISO输出1位数据 byte |= MISO; // 读MISO到byte最低位 SCK = 0; // SCK置低 } return(byte); // 返回读出的一字节 } /**************************************************/ /*函数:SPI_RW_Reg() */ /*描述:写数据value到reg寄存器 */ /**************************************************/ uchar SPI_RW_Reg(uchar reg, uchar value) { uchar status; CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 SPI_RW(value); // 然后写数据到该寄存器 CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } /**************************************************/ /*函数:SPI_Read() */ /*描述:从reg寄存器读一字节 */ /**************************************************/ uchar SPI_Read(uchar reg) { uchar reg_val; CSN = 0; // CSN置低,开始传输数据 SPI_RW(reg); // 选择寄存器 reg_val = SPI_RW(0); // 然后从该寄存器读数据 CSN = 1; // CSN拉高,结束数据传输 return(reg_val); // 返回寄存器数据 } /**************************************************/ /*函数:SPI_Read_Buf() */ /*描述:从reg寄存器读出bytes个字节, */ /* 通常用来读取接收通道数据或接收/发送地址 */ /**************************************************/ uchar SPI_Read_Buf(uchar reg, uchar * pBuf, uchar bytes) { uchar status, i; CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 for(i=0; i CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } /**************************************************/ /*函数:SPI_Write_Buf() */ /*描述:把pBuf缓存中的数据写入到nRF24L01, */ /* 通常用来写入发射通道数据或接收/发送地址 */ /**************************************************/ uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes) { uchar status, i; CSN = 0; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 for(i=0; i CSN = 1; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器 } /******************************************************************/ /*函数:RX_Mode() */ /*描述:这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包 */ /******************************************************************/ void RX_Mode(void) { CE = 0; SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS_0, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址 SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答 SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0 SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 选择射频通道0x40 SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度 SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式 CE = 1; // 拉高CE启动接收设备 } /**************************************************/ /*函数:SendData(uchar *a) */ /*描述:串口发送数据 */ /**************************************************/ SendData(uchar a[TX_PLOAD_WIDTH]) { int i; for(i=0;i } count = 1; SBUF=outdata[0]; } /*******************************************************************/ /*函数:Check_ACK() */ /*描述:检查接收设备有无接收到数据包,设定没有收到应答信号是否重发 */ /*******************************************************************/ uchar Check_ACK(bit clear) { while(IRQ); sta = SPI_RW(NOP); // 返回状态寄存器 if(MAX_RT) if(clear) // 是否清除TX FIFO,没有清除在复位MAX_RT中断标志后重发 SPI_RW(FLUSH_TX); SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中断标志 IRQ = 1; if(TX_DS) return(0x00); else return(0xff); } /*******************************************************************/ /* 延时函数 */ /*******************************************************************/ void delay(int ms) { while(ms--) { uchar i; for(i=0;i<250;i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } /*********************************************************/ /* */ /* 延时x*0.14ms子程序 */ /* */ /*********************************************************/ void delay0(uchar x) //x*0.14MS { uchar i; while(x--) { for (i = 0; i<13; i++) {} } } /*******************************************************************/ /*检查LCD忙状态 */ /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */ /*******************************************************************/ bit lcd_busy() { bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP(); result = (bit)(P0&0x80); LCD_EN = 0; return(result); } /*******************************************************************/ /*读LCD数据 */ /*******************************************************************/ unsigned char readData(void) { unsigned char RData; while(lcd_busy()); P0=0xff; LCD_RS=1; LCD_RW=1; LCD_EN=0; LCD_EN=1; RData=P0;//RData=dataPort; LCD_EN=0; return RData; } /*******************************************************************/ /*写指令数据到LCD */ /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */ /*******************************************************************/ void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*******************************************************************/ /*写显示数据到LCD */ /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */ /*******************************************************************/ void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; } /*******************************************************************/ /* LCD初始化设定 */ /*******************************************************************/ void lcd_init() { LCD_PSB = 1; //并口方式 LCD_RST = 0; //液晶复位 delay(2); LCD_RST = 1; delay(2); lcd_wcmd(0x34); //扩充指令操作 delay(5); lcd_wcmd(0x30); //基本指令操作 delay(5); lcd_wcmd(0x0C); //显示开,关光标 delay(5); lcd_wcmd(0x01); //清除LCD的显示内容 delay(5); } /*********************************************************/ /* 设定显示位置 */ /*********************************************************/ void lcd_pos(uchar X,uchar Y) { uchar pos; if (X==0) {X=0x80;} else if (X==1) {X=0x90;} else if (X==2) {X=0x88;} else if (X==3) {X=0x98;} pos = X+Y ; lcd_wcmd(pos); //显示地址 } /********************************************************/ /* 图形显示 */ /********************************************************/ void photodisplay(uchar *bmp) { uchar i,j; lcd_wcmd(0x34); //写数据时,关闭图形显示 for(i=0;i<32;i++) { lcd_wcmd(0x80+i); //先写入水平坐标值 lcd_wcmd(0x80); //写入垂直坐标值 for(j=0;j<16;j++) //再写入两个8位元的数据 lcd_wdat(*bmp++); delay1(1); } for(i=0;i<32;i++) { lcd_wcmd(0x80+i); lcd_wcmd(0x88); for(j=0;j<16;j++) lcd_wdat(*bmp++); delay1(1); } lcd_wcmd(0x36); //写完数据,开图形显示 } /*********************************************************/ /* 画点程序 */ /*********************************************************/ void drawPoint(unsigned char x,unsigned char y,unsigned char color) { unsigned char row,collum,cbite; unsigned char tempH,tempL; lcd_wcmd(0x34); //设置扩充指令集,关闭绘图 lcd_wcmd(0x36); //扩充指令集,打开绘图 collum=x>>4; //列 左移四位 cbite=x&0x0f; if(y<32) row=y; else { row=y-32; collum+=8; } lcd_wcmd(0x80+row); lcd_wcmd(0x80+collum); readData(); tempH=readData(); tempL=readData(); lcd_wcmd(0x80+row); lcd_wcmd(0x80+collum); if (color) { if(cbite<8) { tempH|=(1<<(7-cbite)); //tempL=(1<<(7-cbite)); } else { //tempH=(1<<(15-cbite)); tempL|=(1<<(15-cbite)); } } else { if(cbite<8) { tempH&=~(1<<(7-cbite)); //tempL=(1<<(7-cbite)); } else { //tempH=(1<<(15-cbite)); tempL&=~(1<<(15-cbite)); } } lcd_wdat(tempH); lcd_wdat(tempL); lcd_wcmd(0x30); } /*********************************************************/ /* 清屏函数 */ /*********************************************************/ void clr_screen() { lcd_wcmd(0x34); //扩充指令操作 delay(3); lcd_wcmd(0x30); //基本指令操作 delay(3); lcd_wcmd(0x01); //清屏 delay(3); } /*********************************************************/ /* 清整个GDRAM空间 */ /*********************************************************/ void clrgdram() { unsigned char x,y ; for(y=0;y<64;y++) for(x=0;x<16;x++) { lcd_wcmd(0x34); lcd_wcmd(y+0x80); //行地址 lcd_wcmd(x+0x80); //列地址 lcd_wcmd(0x30); //基本指令操作 lcd_wdat(0x00); lcd_wdat(0x00); } } /*********************************************************/ /* 温湿度上下限设置更新 */ /*********************************************************/ void write_lim1(uchar add,uchar dat) { uchar shi,ge; shi=dat/10; ge=dat%10; lcd_wcmd(0x80+add); lcd_wdat(0x30+shi); lcd_wdat(0x30+ge); } void write_lim2(uchar add,uchar dat) { uchar shi,ge; shi=dat/10; ge=dat%10; lcd_wcmd(0x90+add); lcd_wdat(0x30+shi); lcd_wdat(0x30+ge); } void write_lim3(uchar add,uchar dat) { uchar shi,ge; shi=dat/10; ge=dat%10; lcd_wcmd(0x88+add); lcd_wdat(0x30+shi); lcd_wdat(0x30+ge); } void write_lim4(uchar add,uchar dat) { uchar shi,ge; shi=dat/10; ge=dat%10; lcd_wcmd(0x98+add); lcd_wdat(0x30+shi); lcd_wdat(0x30+ge); } /*********************************************************/ /* 温度显示子函数 */ /*********************************************************/ void write_tem(uchar add,uchar dat,uchar dat1) { uchar shi,ge,xiao; shi=dat/10; ge=dat%10; xiao=dat1/10; lcd_wcmd(0x90+add); lcd_wdat(0x30+shi); lcd_wdat(0x30+ge); lcd_wdat(0x2e); lcd_wdat(0x30+xiao); Temp=dat; } /*********************************************************/ /* 湿度显示子函数 */ /*********************************************************/ void write_hum(uchar add,uchar dat,uchar dat1) { uchar shi,ge,xiao; shi=dat/10; ge=dat%10; xiao=dat1/10; lcd_wcmd(0x98+add); lcd_wdat(0x30+shi); lcd_wdat(0x30+ge); lcd_wdat(0x2e); lcd_wdat(0x30+xiao); RH1=dat; } /*********************************************************/ /* 主界面显示 */ /*********************************************************/ void display1() { uchar i; delay(10); //延时 lcd_init(); //初始化LCD lcd_pos(0,0); //设置显示位置为第一行的第1个字符 i = 0; while(dis1[i] != ' |