当前位置:文档之家› 基于315M无线通信与温度显示装置

基于315M无线通信与温度显示装置

基于315M无线通信与温度显示装置
基于315M无线通信与温度显示装置

基于PTR2000的无线通信与温度显示系统

实验前期准备:

学习315M无线通信,PT2262/PT2272无线编码与解码,DS18B20数字温度传感器,蜂鸣器的使用,1602液晶显示系统的学习。遇到不懂的问题时向单片机老师进行了请教。

实验组员:

卢少林胡月香张望平

试验所用材料:

万用板,315M无线收发模块,1602液晶,PT2262/PT2272编码与解码芯片,at89s52芯片,四位数码管,电阻,电容,二极管,开关,11.0592Mhz晶振,三极管。

试验原理

使用DS18B20对温度进行测量,通过at89s52单片机进行数据处理,在1602液晶中进行显示,并设置警报温度(当温度高于警报温度,蜂鸣器发出响声),单片机处理后的数据通过PT2262进行编码,送给315M无线发射模块进行无线发射,315M无线接收模块对无线信号进行接收,通过PT2272解码芯片进行解码,在送给另外一块

at89s52单片机,单片机对数据进行处理,然后在数码管上现实出来。

试验原理图:

图一温度检测、显示、报警与无线温度发射电路

图二无线温度接收与显示电路

作品实物图:

温度检测、显示、报警与无线温度发射电路

无线温度接收与显示电路

模块分析:

DS18B20对温度进行检测,将数据发送给AT89S52单片机处理

AT89S52单片机对数据进行处理,将数据在1602液晶上显示出来,并设置警戒温度,将当前温度值交给PT2262编码芯片进行处理。

1602对当前温度进行显示

当达到警戒温度,蜂鸣器发出警报声

PT2262接收单片机传输过来的温度值进行编码处理,处理后的数据发送给315M无线发射模块。

315M无线发射模块将编码后的数据通过天线发射给接收模块

315M无线接收模块接收数据,将接收到的数据发送给无线解码芯片PT2272

PT2272解码芯片接收数

据,将数据解码后发送给另一块AT89S52芯片

另一块AT89S52接收到数据,进行处理,并将处理后的数据发送4位数码管

数码管将接收的温度值显示出来

试验程序:

无线发送,温度检测,温度显示程序如下#include

#include

unsigned char code table[]="Now temp is"; unsigned char code table3[]="wendu:"; unsigned char code cent[]={"Cent"}; unsigned char flag,min,time,tltemp;

sbit rs=P2^0;

sbit rw=P2^1;

sbit e=P2^2;

sbit s=P3^6;

sbit bf=P0^7;

sbit DB_B20=P3^7;

sbit fa0=P3^0;

sbit fa1=P3^1;

sbit fa2=P3^2;

sbit fa3=P3^3;

sbit te=P1^5;

void fasong(unsigned char temp)

{

unsigned char i;

for(i=0;i<12;i++)

{

if(temp%2==0)

{

fa0=1;

fa1=0;

}

else

{

fa0=0;

fa1=1;

}

temp=temp>>1;

}

}

void delay_us(unsigned int time) //延时10us {

int i,j;

for(i=0;i

for(j=0;j<10;j++);

}

void jingbao()

{

int i;

if(min>=30)

{

for(i=0;i<50;i++)

{

s=!s;

delay_us(5);

};

}

}

void delay1ms()//延时1ms {

unsigned char i,j;

for(i=0;i<4;i++)

for(j=0;j<33;j++)

;

}

void delaynms(unsigned char n) {

unsigned char i;

for(i=0;i

delay1ms();

}

bit busy(void)

{

bit result;

rs=0; //根据规定,RS为低电平,RW为高电平时,可以读状态

rw=1;

e=1; //E=1,才允许读写

_nop_(); //空操作

_nop_();

_nop_();

_nop_(); //空操作四个机器周期,给硬件反应时间

result=bf; //将忙碌标志电平赋给result

e=0; //将E恢复低电平

return result;

}

void write_com(unsigned char datee)

{

while(busy()==1);

rs=1;

_nop_();

_nop_();

rs=0;

rw=0;

e=0;

_nop_();

_nop_();

_nop_();

_nop_();

e=1;

P0=datee;

_nop_();

_nop_();

_nop_();

_nop_();

e=0;

}

void write_dater(unsigned char datere) {

while(busy()==1);

rs=1;

e=0;

P0=datere;

_nop_();

_nop_();

_nop_();

_nop_();

e=1;

_nop_();

_nop_();

_nop_();

_nop_();

e=0;

}

void init_1604() {

delaynms(15);

write_com(0x38);

delaynms(2);

write_com(0x38);

delaynms(2);

write_com(0x38);

delaynms(2);

write_com(0x0c);

delaynms(2);

write_com(0x06);

delaynms(2);

write_com(0x01);

delaynms(2);

}

bit init()

{ bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在

DB_B20= 1; //先将数据线拉高

for(time=0;time<2;time++) //略微延时约6微秒

;

DB_B20 = 0; //再将数据线从高拉低,要求保持

480~960us

for(time=0;time<200;time++) //略微延时约600微秒

; //以向DS18B20发出一持续480~960us的低电平复位脉冲

DB_B20 = 1; //释放数据线(将数据线拉高)

for(time=0;time<10;time++)

; //延时约30us(释放总线后需等待15~60us让DS18B20输出

存在脉冲)

flag=DB_B20; //让单片机检测是否输出了存在脉冲(DQ=0表示存在)

for(time=0;time<200;time++) //延时足够长时间,等待存在脉冲输出完毕

;

return (flag);

}

unsigned char read_onebyte()//读一个字节的数据

{

unsigned char i=0;

unsigned char dat; //储存读出的一个字节数据

for (i=0;i<8;i++)

{

DB_B20=1; // 先将数据线拉高

_nop_(); //等待一个机器周期

DB_B20= 0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序

_nop_(); //等待一个机器周期

DB_B20= 1; //将数据线"人为"拉高,为单片机检测

DS18B20的输出电平作准备

for(time=0;time<2;time++)

; //延时约6us,使主机在15us内采样

dat>>=1;

if(DB_B20==1)

dat|=0x80; //如果读到的数据是1,则将1存入dat else

dat|=0x00;//如果读到的数据是0,则将0存入dat

//将单片机检测到的电平信号DQ存入r[i]

for(time=0;time<8;time++)

; //延时3us,两个读时序之间必须有大于1us的恢复期

}

return(dat); //返回读出的十六进制数据

}

void write_onebyte(unsigned int dat)//写一个字节的数据

{

unsigned char i;

for (i=0; i<8; i++)

{

DB_B20=1; // 先将数据线拉高

_nop_(); //等待一个机器周期

DB_B20=0; //将数据线从高拉低时即启动写时序

DB_B20=dat&0x01; //利用与运算取出要写的某位二进制数据,

//并将其送到数据线上等待DS18B20采样

for(time=0;time<10;time++)

;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样

DB_B20=1; //释放数据线

for(time=0;time<1;time++)

;//延时3us,两个写时序间至少需要1us的恢复期dat>>=1; //将dat中的各二进制位数据右移1位

}

for(time=0;time<4;time++)

; //稍作延时,给硬

}

void ready()

{

init();

write_onebyte(0xcc);

write_onebyte(0x44);

delay_us(20);

init();

write_onebyte(0xcc);

write_onebyte(0xbe);

}

void display_now()

{

unsigned char i;

write_com(0x80);

for(i=0;i<11;i++)

{

write_dater(table[i]);

}

}

void display_wen()

{

unsigned char j;

write_com(0x80+0x40);

for(j=0;j<7;j++)

{

write_dater(table3[j]);

}

}

void display_dian()

{

write_com(0x80+0x4a);

write_dater('.');

}

void display_cent()

{

unsigned char k;

write_com(0x80+0x4c);

for(k=0;k<4;k++)

{

write_dater(cent[k]);

}

}

void display_zhengshu(unsigned char x) {

unsigned char j,k,l;

j=x/100;

k=(x%100)/10;

l=x%10;

write_com(0x80+0x46);

if(flag==1)

{

write_dater('-');

}

else{

write_dater('+');

}

write_dater(0x30+j);

write_dater(0x30+k);

write_dater(0x30+l);

delay_us(100);

}

void display_xiaoshu(unsigned char y) {

write_com(0x80+0x4b);

write_dater(0x30+y);

delay_us(100);

}

void main()

{

unsigned char di=0,gao=0,tn,td,z,zong;

init_1604();

delay_us(1);

相关主题
文本预览
相关文档 最新文档