关于无线温度计单片机部分代码.doc_第1页
关于无线温度计单片机部分代码.doc_第2页
关于无线温度计单片机部分代码.doc_第3页
关于无线温度计单片机部分代码.doc_第4页
关于无线温度计单片机部分代码.doc_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include #include #define uchar unsigned char#define uint unsigned intsbit RS = P23; /片选信号sbit RW = P24;/数据信号sbit EN = P25;/时钟信号sbit DQ = P26; /连接DS18B20uchar tplsb,tpmsb; / 温湿度值低位、高位字节 uint temp; uchar code num=0123456789;uchar code dis1=温湿度A :;uchar code dis2=温湿度B :;/-#define BYTE_BIT00x01#define BYTE_BIT70x80/-bdata unsigned char DATA_BUF;#define DATA7(DATA_BUF&BYTE_BIT7) != 0)#define DATA0 (DATA_BUF&BYTE_BIT0) != 0)sbitflag=DATA_BUF7;sbitflag1=DATA_BUF0;/-发送数据缓冲区-/#define TxRxBuf_Len 4/unsigned char TxRxBufTxRxBuf_Len=0x29,0x30,0x31,0x32,;code TxAddress4=0xcc,0xcc,0xcc,0xcc;char K2;uchar TxRxBuf4=0x29,0x30,0x31,0x32,;/-NRF24L01工作模式控制端口-sbitTXEN=P10;sbitTRX_CE=P35;sbitPWR=P11;/-LED显示端口-/sbit LED=P35;/-NRF24L01 数据交换端口-sbitMISO=P16;sbitMOSI=P15;sbitSCK=P17;sbitCSN=P13;/-NRF24L01状态端口-sbitAM=P14;sbitDR=P36;sbitCD=P12;/-/-按键端口-sbitKEY2=P32;sbitKEY3=P21;/-NRF24L01控制指令-#define WC0x00#define RC0x10#define WTP0x20#define RTP0x21#define WTA0x22#define RTA0x23#define RRP0x24/-NRF24L01寄存器配置-unsigned char idata RFConf11= 0x00, /配置命令/ 0x4c, /CH_NO,配置频段在430MHZ 0x0c, /输出功率为10db,不重发,节电为正常模式 0x44, /地址宽度设置,为4字节 0x04,0x04, /接收发送有效数据长度为4字节 0xCC,0xCC,0xCC,0xCC, /接收地址 0x58, /CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振;/=延时=void NRF24L01_Delay(int n)uint i;while(n-)for(i=0;i80;i+);/=SPI读函数=unsigned char SpiRead(void)unsigned char j;for (j=0;j8;j+) DATA_BUF=DATA_BUF1;SCK=1;if (MISO)/读取最高位,保存至最末尾,通过左移位完成整个字节DATA_BUF|=BYTE_BIT0;elseDATA_BUF&=BYTE_BIT0;SCK=0; return DATA_BUF;/=SPI写函数=void SpiWrite(unsigned char send)unsigned char i;DATA_BUF=send;for (i=0;i8;i+)if (DATA7)/总是发送最高位MOSI=1;elseMOSI=0;SCK=1;DATA_BUF=DATA_BUF1;SCK=0;/-初始化NRF24L01-void NRF24L01Init(void) CSN=1;/ Spi disableSCK=0;/ Spi clock line init lowDR=1;/ Init DR for inputAM=1;/ Init AM for inputCD=1;/ Init CD for inputPWR=1;/ NRF24L01 power onTRX_CE=0;/ Set NRF24L01 in standby modeTXEN=0;/ set radio in Rx mode/-初始化寄存器-void Config905(void)uchar i;CSN=0;/ Spi enable for write a spi command/SpiWrite(WC);/ Write config command写放配置命令for (i=0;i11;i+)/ Write configration words 写放配置字 SpiWrite(RFConfi);CSN=1;/ Disable Spi/-发送数据打包-void TxPacket(uchar *TxRxBuf)uchar i;/Config905();CSN=0;SpiWrite(WTP);/ Write payload commandfor (i=0;i4;i+)SpiWrite(TxRxBufi);/ Write 32 bytes Tx dataCSN=1;NRF24L01_Delay(1);/ Spi disableCSN=0;/ Spi enable for write a spi commandSpiWrite(WTA);/ Write address commandfor (i=0;i=650us)/-设置接收初始化-void SetRxMode(void)TXEN=0;TRX_CE=1;NRF24L01_Delay(1); / NRF24L01_Delay for mode change(=650us)/-判断数据接收状态-unsigned char CheckDR(void)/检查是否有新数据传入 Data ReadyDR=1; /通过对端口写1,可以使端口为输入状态,这51的 特性。不熟悉者可以参阅51相关书籍作证(将DR端口设置为输入状态。)if (DR=1)DR=0;return 1;elsereturn 0;/-读NRF24L01接收数据-void RxPacket(void)uchar i; NRF24L01_Delay(1);/TRX_CE=0;/ Set NRF24L01 in standby mode NRF24L01_Delay(100); TRX_CE=0;CSN=0;/ Spi enable for write a spi command NRF24L01_Delay(1);SpiWrite(RRP);for (i = 0 ;i 4 ;i+) TxRxBufi=SpiRead();/ Read data and save to buffer CSN=1; NRF24L01_Delay(10);TRX_CE=1;/-数据接收-void RX(void) SetRxMode(); / while (CheckDR()=0); 为了实现双向通信,就不能一直处于接收等待状态,所以注释掉 NRF24L01_Delay(10); RxPacket();/* 名称 : delay()* 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。* 输入 : t* 输出 : 无*/void delay(unsigned int t)unsigned int i,j;for(i=0; it; i+) for(j=0; j10; j+);/* 名称 : sendbyte()* 功能 : 按照液晶的串口通信协议,发送数据* 输入 : zdata* 输出 : 无*/void sendbyte(unsigned char zdata)unsigned int i;for(i=0; i8; i+)if(zdata i) & 0x80)RW = 1;else RW = 0;EN = 0;EN = 1;/* 名称 : write_com()* 功能 : 写串口指令* 输入 : cmdcode* 输出 : 无*/void write_com(unsigned char cmdcode)RS = 1;sendbyte(0xf8);sendbyte(cmdcode & 0xf0);sendbyte(cmdcode 4) & 0xf0);delay(2);/* 名称 : write_data()* 功能 : 写串口数据* 输入 : cmdcode* 输出 : 无*/void write_data(unsigned char Dispdata)RS = 1;sendbyte(0xfa);sendbyte(Dispdata & 0xf0);sendbyte(Dispdata 0) write_data(*s);s+;delay(50); /* 名称 : 显示位置*/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; write_com(pos);/* 名称 : 清屏*/void clear_show() uchar i,j;lcd_pos(0,0);for(i = 0;i 6;i+) for(j = 0; j 16; j+) write_data( ); /* 名称 : lcdinit()* 功能 : 初始化函数* 输入 : cmdcode* 输出 : 无*/void lcdinit() delay(200);write_com(0x30);delay(50);write_com(0x0c);delay(50);/*/* */* 温湿度 */* */*/*产生复位脉冲初始化DS18B20*/void reset(void)uint i;DQ=0;i=100;while(i-);DQ=1;/ 产生上升沿i=4;while(i-);/* 等待应答脉冲*/void wait(void)uint i;while(DQ);while(DQ); / 检测到应答脉冲 i=4;while(i-);bit readbit(void)uint i;bit b;DQ=0;i+;DQ=1;i+;i+;/ 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效b=DQ;i=10;while(i-);return (b);/* 读取数据的一个字节*/uchar readbyte(void)uchar i,j,b;b=0;for(i=0;i8;i+)j=readbit();b=(j1);return(b);/*写数据的一个字节,满足写1和写0的时隙要求*/void writebyte(uchar b)uint i;uchar j;bit btmp;for(j=0;j1; / 取下一位(由低位向高位)if(btmp)DQ=0;i+;i+;DQ=1;i=10;while(i-);/ 整个写1时隙不低于60uselseDQ=0;i=10;while(i-); / 保持低在60us到120us之间DQ=1;i+;i+;/* 启动温湿度转换*/void convert(void)reset();/ 产生复位脉冲,初始化DS18B20wait();/等待DS18B20给出应答脉冲writebyte(0xcc);/ skip rom 命令writebyte(0x44);/ convert T 命令/* 读取温湿度值*/uint readtemp(void)float tt;reset();wait();delay(1);writebyte(0xcc);/ skip rom 命令writebyte(0xbe);/ read scratchpad 命令tplsb=readbyte();/ 温湿度值低位字节(其中低4位为二进制的小数部分)tpmsb=readbyte();/ 高位值高位字节(其中高5位为符号位)temp=tpmsb;temp=8;temp=temp|tplsb;tt=temp*0.0625;temp=tt*10+0.5;return (temp);void display(uint temp)uchar a1,a2,a3,a4;a1=temp/100;a2=temp%100;a3=a2/10;a4=a2%10;lcd_pos(2,1); write_data(numa1);delay(1); lcd_pos(2,2);write_data(numa3);delay(1);lcd_pos(2,3);write_data(.);delay(1);lcd_pos(2,4); write_data(numa4);delay(1); /* 名称 : Main()* 功能 : 主函数* 输入 : 无* 输出 : 无*/void Main()uchar i;delay(10); lcdinit();NRF24L01Init();Config905();while(1)RX();if(KEY2=0)delay(5);if(KEY2=0)K2=0;while(!KEY2);delay(5);while(!KEY2);if(KEY3=0)delay(5);if(KEY3=0)K2=1;while(!KEY3);delay(5);while(!KEY3);if(K2=0)lcd_pos(0,0); /设置显示位置为第一行的第1个字符 i = 0; while(dis1i != 0) /显示字符 write_data(dis1i); i+; convert();display(readtemp(); if(K2=1)lcd_pos(0,0); /设置显示位置为第一行的第1个字符 i = 0; while(dis2i != 0) /显示字符 write_data(dis2i); i+; lcd_pos(2,1); write_data(numTxRxBuf0);delay(1); lcd_pos(2,2);write_data(numTxRxBuf1);delay(1);lcd_pos(2,3);write_data(.);delay(1);lcd_pos(2,4); write_data(numTxRxBuf3);delay(1); 附录D:ATC89C52接收代码#include #include #define uchar unsigned char#define uint unsigned intsbit RS = P23; /片选信号sbit RW = P24;/数据信号sbit EN = P25;/时钟信号sbit DQ = P26; /连接DS18B20uchar tplsb,tpmsb; / 温湿度值低位、高位字节 uint temp; uchar code num=0123456789;uchar code dis1=温湿度:;/-#define BYTE_BIT00x01#define BYTE_BIT70x80/-bdata unsigned char DATA_BUF;#define DATA7(DATA_BUF&BYTE_BIT7) != 0)#define DATA0 (DATA_BUF&BYTE_BIT0) != 0)sbitflag=DATA_BUF7;sbitflag1=DATA_BUF0;/-发送数据缓冲区-/#define TxRxBuf_Len 4/unsigned char TxRxBufTxRxBuf_Len=0x29,0x30,0x31,0x32,;code TxAddress4=0xcc,0xcc,0xcc,0xcc;char tf;uchar TxRxBuf4=0x29,0x30,0x31,0x32,;/-NRF24L01工作模式控制端口-sbitTXEN=P10;sbitTRX_CE=P35;sbitPWR=P11;/-LED显示端口-/sbit LED=P35;/-NRF24L01 数据交换端口-sbitMISO=P16;sbitMOSI=P15;sbitSCK=P17;sbitCSN=P13;/-NRF24L01状态端口-sbitAM=P14;sbitDR=P36;sbitCD=P12;/-/-按键端口-/sbitKEY=P32;/-NRF24L01控制指令-#define WC0x00#define RC0x10#define WTP0x20#define RTP0x21#define WTA0x22#define RTA0x23#define RRP0x24/-NRF24L01寄存器配置-unsigned char idata RFConf11= 0x00, /配置命令/ 0x4c, /CH_NO,配置频段在430MHZ 0x0c, /输出功率为10db,不重发,节电为正常模式 0x44, /地址宽度设置,为4字节 0x04,0x04, /接收发送有效数据长度为4字节 0xCC,0xCC,0xCC,0xCC, /接收地址 0x58, /CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振;/=延时=void NRF24L01_Delay(int n)uint i;while(n-)for(i=0;i80;i+);/=SPI读函数=unsigned char SpiRead(void)unsigned char j;for (j=0;j8;j+) DATA_BUF=DATA_BUF1;SCK=1;if (MISO)/读取最高位,保存至最末尾,通过左移位完成整个字节DATA_BUF|=BYTE_BIT0;elseDATA_BUF&=BYTE_BIT0;SCK=0; return DATA_BUF;/=SPI写函数=void SpiWrite(unsigned char send)unsigned char i;DATA_BUF=send;for (i=0;i8;i+)if (DATA7)/总是发送最高位MOSI=1;elseMOSI=0;SCK=1;DATA_BUF=DATA_BUF1;SCK=0;/-初始化NRF24L01-void NRF24L01Init(void) CSN=1;/ Spi disableSCK=0;/ Spi clock line init lowDR=1;/ Init DR for inputAM=1;/ Init AM for inputCD=1;/ Init CD for inputPWR=1;/ NRF24L01 power onTRX_CE=0;/ Set NRF24L01 in standby modeTXEN=0;/ set radio in Rx mode/-初始化寄存器-void Config905(void)uchar i;CSN=0;/ Spi enable for write a spi command/SpiWrite(WC);/ Write config command写放配置命令for (i=0;i11;i+)/ Write configration words 写放配置字 SpiWrite(RFConfi);CSN=1;/ Disable Spi/-发送数据打包-void TxPacket(uchar *TxRxBuf)uchar i;/Config905();CSN=0;SpiWrite(WTP);/ Write payload commandfor (i=0;i4;i+)SpiWrite(TxRxBufi);/ Write 32 bytes Tx dat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论