基于温度远程控制系统.docx
《基于温度远程控制系统.docx》由会员分享,可在线阅读,更多相关《基于温度远程控制系统.docx(29页珍藏版)》请在冰豆网上搜索。
![基于温度远程控制系统.docx](https://file1.bdocx.com/fileroot1/2022-11/20/fd40f005-d542-4bb2-a112-04a037d785a9/fd40f005-d542-4bb2-a112-04a037d785a91.gif)
基于温度远程控制系统
基于温度远程控制系统
【实验目的】
本次实验目的如下:
1、绘制原理仿真电路图;
2、调试hex文件;
3、A机在LCD1602芯片上显示DS18B20所得到的时间,以及DS1302所获取的温度值,并且发送给B机,在B机的LCD1602上显示。
4、如果A机的温度大于30°C则蜂鸣器鸣笛,步进电机正转。
若A机的温度在28°C到30°C之间,步进电机反转,蜂鸣器鸣笛。
其余温度时,无反应。
5、B机在无操作时,始终接收A机发送的时间和温度值,并且在LCD1602上显示。
6、B机按下K3按键时,可以对A机进行设置时间,并且显示所设置的时间,通过矩阵键盘设置时间,通过K3进行位操作。
如果按下B机的K2则显示接收到的日期,温度,电机状态,第几周;
7、把A机电机运动的状态发送给B机。
8、如果按下A机的K3则显示时间,温度,电机状态,第几周;按下A机的K4则显示日期,温度,电机状态,第几周。
9、“--”表示电机不转,“>>”表示电机正转,“<<”表示电机反转。
正转和反转时蜂鸣器发出的频率不同。
【实验原理】
对实验四的原理图进行如下图A和B调整。
【实验内容】
1、熟悉Protues绘制原理图的基本步骤。
2、学会可执行文件的加载以及程序仿真的方法。
3、验证数码管的动态显示效果。
4、验证DS1302写入和读取效果。
5、验证LCD1302显示效果。
6、验证DS18B20温度读取效果。
7、验证串口通信。
8、验证蜂鸣器,矩阵键盘,验证步进电机正反转。
9、验证外部中断,验证串口中断;
【实验步骤】
1、熟悉动态数码管显示的原理,LCD1602显示的原理。
2、熟悉DS1302芯片的写入和读取。
3、熟悉DS18B20芯片的读取。
4、熟悉蜂鸣器的控制;
5、熟悉步进电机的控制;
6、绘制Protues原理图。
7、在ISIS中加载可执行文件a.hex运行仿真,并调试。
【实现效果】
实验效果如图A2所示,完成实验目的所要求的内容。
【实验小结】
通过这次实验是我更加熟悉了LCD1602的显示和DS1302的写入和读取,步进电机的控制和蜂鸣器、矩阵键盘的工作原理,外部中断的使用,串口中断的使用,双机通信的原理,以及keil和Protues的应用。
【附录】
C51源程序
A机程序
#include
#definedjP0
#definelcdP1
sbitDQ=P3^7;
sbitRST=P2^2;
sbitSCLK=P2^3;
sbitIO=P2^4;
sbitfmq=P2^1;
sbitRS=P2^5;
sbitRW=P2^6;
sbitEN=P2^7;
sbitK3=P3^2;
sbitK4=P3^3;
unsignedcharsecond,minute,hour,week,day,month,year;
unsignedchart1302[7]={0x15,0x11,0x20,0x47,0x21,0x30,0x00};
unsignedcharcodeggsj[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59};
unsignedcharzf0[5]="Time:
";
unsignedcharzf1[5]="Temp:
";
unsignedcharzf2[5]="Data:
";
unsignedcharzf3[5]="Week:
";
unsignedcharzf4[3]="><-";
unsignedchardjsz[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};
unsignedcharxssj[]="0123456789:
+-.CE><";
unsignedcharjssj[8];
unsignedcharsjsj[8];
unsignedcharwdsj[8];
unsignedcharrqsj[11];
unsignedcharm,s,rq;
voidgszh();
voidinit1302();
voidlcdxs2();
voiddelay(unsignedchari)
{
intj;
for(i;i>0;i--)
for(j=10;j>0;j--);
}
voidcktx()
{
SCON=0X50;
TMOD=0X20;
PCON=0X80;
TH1=0XF3;
TL1=0XF3;
ES=1;
EA=1;
TR1=1;
}
voidwbzd()
{
IT0=1;
EX0=1;
IT1=1;
EX1=1;
IP=0x01;
EA=1;
}
voidint0()interrupt0
{
if(K3==0)
{
rq=1;
}
}
voidint1()interrupt2
{
if(K4==0)
{
rq=0;
}
}
voidsend(unsignedchardat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
unsignedcharreceive()
{
unsignedchardat;
while(RI==0);
RI=0;
dat=SBUF;
returndat;
}
voidzd()interrupt4
{
if(RI)
{
if(m>=7)
{
m=0;
gszh();
init1302();
}
jssj[m++]=receive();
RI=0;
}
}
voidwritecom(unsignedcharcom)
{
lcd=com;
RS=0;
RW=0;
EN=1;
delay(10);
EN=0;
}
voidwritedat(unsignedchardat)
{
lcd=dat;
RS=1;
RW=0;
EN=1;
delay(20);
EN=0;
}
voidinit()
{
writecom(0x01);
writecom(0x38);
writecom(0x0c);
writecom(0x06);
}
unsignedcharread1302(unsignedcharadd)
{
unsignedcharn,dat,dat1;
RST=0;
SCLK=0;
RST=1;
for(n=0;n<8;n++)
{
IO=add&0x01;
add>>=1;
SCLK=1;
SCLK=0;
}
for(n=0;n<8;n++)
{
dat1=IO;
dat=(dat>>1)|(dat1<<7);
SCLK=1;
SCLK=0;
}
RST=0;
SCLK=1;
IO=0;
IO=1;
returndat;
}
voidwrite1302(unsignedcharadd,unsignedchardat)
{
unsignedcharn;
RST=0;
SCLK=0;
RST=1;
for(n=0;n<8;n++)
{
IO=add&0x01;
add>>=1;
SCLK=1;
SCLK=0;
}
for(n=0;n<8;n++)
{
IO=dat&0x01;
dat>>=1;
SCLK=1;
SCLK=0;
}
RST=0;
}
voidread1302time()
{
second=read1302(0x81);
minute=read1302(0x83);
hour=read1302(0x85);
day=read1302(0x8b);
week=read1302(0x87);
month=read1302(0x89);
year=read1302(0x8d);
sjsj[0]=hour/16;
sjsj[1]=hour%16;
sjsj[2]=10;
sjsj[3]=minute/16;
sjsj[4]=minute%16;
sjsj[5]=10;
sjsj[6]=second/16;
sjsj[7]=second%16;
rqsj[0]=year/16;
rqsj[1]=year%16;
rqsj[2]=12;
rqsj[3]=month/16;
rqsj[4]=month%16;
rqsj[5]=12;
rqsj[6]=day/16;
rqsj[7]=day%16;
rqsj[8]=week/16;
rqsj[9]=week%16;
}
voidinit1302()
{
write1302(0x8e,0x00);
write1302(0x86,t1302[0]);
write1302(0x88,t1302[1]);
write1302(0x8c,t1302[2]);
write1302(0x89,t1302[3]);
write1302(0x84,t1302[4]);
write1302(0x82,t1302[5]);
write1302(0x80,t1302[6]);
write1302(0x8e,0x80);
}
intinit18b20()
{
inti;
DQ=0;
i=70;
while(i--);
DQ=1;
i=0;
while(DQ)
{
i++;
if(i>50000)
return0;
}
return1;
}
voidwrite18b20(unsignedchardat)
{
inti,j;
for(i=0;i<8;i++)
{
DQ=0;
j++;
DQ=dat&0x01;
j=6;
while(j--);
DQ=1;
dat>>=1;
}
DQ=1;
}
unsignedcharread18b20()
{
unsignedchardat