多点温度测试,超过阈值声光报警。LCD1602显示。
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit lcdrs=P2^6;
- sbit lcdrw=P2^5;
- sbit lcden=P2^7;
- sbit led0=P0^0;
- sbit led1=P0^1;
- sbit led2=P0^2;
- sbit led3=P0^3;
- sbit speak=P2^4;
- uchar code t0[]="T1: T2: ";
- uchar code t1[]="T3: T4: ";
- uchar code digital[]="0123456789";
- uint data a[10]={0xff,0,0,0,0,0,0,0,0,0xfb}; //发送的数据 ,分别以0xff和0xfb作为起始位和停止位,用于校验
- sbit DS0=P2^0;
- sbit DS1=P2^1;
- sbit DS2=P2^2;
- sbit DS3=P2^3;
- unsigned int flag;//是否报警标志
- uchar i;
- void delay(uchar z)//延时
- { uchar x,y;
- for(x=1000;x>1;x--)
- for(y=z;y>1;y--);
- }
- void delay_50us(uint t)// 延时50us
- {
- uchar j;
- for(;t>0;t--)
- for(j=19;j>0;j--);
- }
- void delay_50ms(uint t)//延时50ms
- {
- uint j;
- for(;t>0;t--)
- for(j=6245;j>0;j--);
- }
- /***LCD1602相关程序*******************************/
- void write_com(uchar com)
- {
- lcdrs=0;
- P1=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_date(uchar date)
- {
- lcdrs=1;
- P1=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init_lcd()
- {
- lcden=0;
- lcdrw=0;
- write_com(0x0f);
- write_com(0x38);
- write_com(0x01);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x06);
-
-
- write_com(0x80);
- for(i=0;i<16;i++)
- {write_date(t0[i]);
- delay(0);
- }
- write_com(0x80+0x40);
- for(i=0;i<16;i++)
- {write_date(t1[i]);
- delay(0);
- }}
- void tmpDelay(int num)
- { while(num--) ;
- }
- /**************DS18B20初始化及数据处理程序******************/
- void Init_DS018B200() //第一块DS18B20初始化
- { unsigned char x=0;
- DS0 = 1;
- tmpDelay(8);
- DS0 = 0;
- tmpDelay(80);
- DS0 = 1;
- tmpDelay(14);
- x=DS0;
- tmpDelay(20);
- }
- unsigned char ReadOneChar0()
- { unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--) { DS0 = 0;
- dat>>=1;
- DS0 = 1;
- if(DS0)
- dat|=0x80;
- tmpDelay(4);
- }
- return(dat);
- }
- void WriteOneChar0(unsigned char dat)
- { unsigned char i=0;
- for (i=8; i>0; i--) { DS0 = 0;
- DS0 = dat&0x01;
- tmpDelay(5);
- DS0 = 1;
- dat>>=1;
- } }
- unsigned int Readtemp0() //第一个温度点温度数据处理
- {unsigned char a=0;
- unsigned char b=0;
- unsigned int t=0;
- float tt=0;
- Init_DS018B200();
- WriteOneChar0(0xCC);
- WriteOneChar0(0x44);
- Init_DS018B200();
- WriteOneChar0(0xCC);
- WriteOneChar0(0xBE);
- a=ReadOneChar0();
- b=ReadOneChar0();
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625;
- t= tt*10;
- return(t);
- }
- void Init_DS118B201() //第二块DS18B20初始化
- { unsigned char x=0;
- DS1 = 1;
- tmpDelay(8);
- DS1 = 0;
- tmpDelay(80);
- DS1 = 1;
- tmpDelay(14);
- x=DS1;
- tmpDelay(20);
- }
- unsigned char ReadOneChar1()
- { unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--) { DS1 = 0;
- dat>>=1;
- DS1 = 1;
- if(DS1)
- dat|=0x80;
- tmpDelay(4);
- }
- return(dat);
- }
- void WriteOneChar1(unsigned char dat)
- { unsigned char i=0;
- for (i=8; i>0; i--) { DS1 = 0;
- DS1 = dat&0x01;
- tmpDelay(5);
- DS1 = 1;
- dat>>=1;
- } }
- unsigned int Readtemp1() //第二个温度点温度数据处理
- {unsigned char a=0;
- unsigned char b=0;
- unsigned int t=0;
- float tt=0;
- Init_DS118B201();
- WriteOneChar1(0xCC);
- WriteOneChar1(0x44);
- Init_DS118B201();
- WriteOneChar1(0xCC);
- WriteOneChar1(0xBE);
- a=ReadOneChar1();
- b=ReadOneChar1();
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625;
- t= tt*10;
- return(t);
- }
- void Init_DS218B202() //第三块DS18B20初始化
- { unsigned char x=0;
- DS2 = 1;
- tmpDelay(8);
- DS2 = 0;
- tmpDelay(80);
- DS2 = 1;
- tmpDelay(14);
- x=DS2;
- tmpDelay(20);
- }
- unsigned char ReadOneChar2()
- { unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--) { DS2 = 0;
- dat>>=1;
- DS2 = 1;
- if(DS2)
- dat|=0x80;
- tmpDelay(4);
- }
- return(dat);
- }
- void WriteOneChar2(unsigned char dat)
- { unsigned char i=0;
- for (i=8; i>0; i--) { DS2 = 0;
- DS2 = dat&0x01;
- tmpDelay(5);
- DS2 = 1;
- dat>>=1;
- } }
- unsigned int Readtemp2() //第三个温度点温度数据处理
- {unsigned char a=0;
- unsigned char b=0;
- unsigned int t=0;
- float tt=0;
- Init_DS218B202();
- WriteOneChar2(0xCC);
- WriteOneChar2(0x44);
- Init_DS218B202();
- WriteOneChar2(0xCC);
- WriteOneChar2(0xBE);
- a=ReadOneChar2();
- b=ReadOneChar2();
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625;
- t= tt*10;
- return(t);
- }
- void Init_DS318B203()//第四块DS18B20初始化
- { unsigned char x=0;
- DS3 = 1;
- tmpDelay(8);
- DS3 = 0;
- tmpDelay(80);
- DS3 = 1;
- tmpDelay(14);
- x=DS3;
- tmpDelay(20);
- }
- unsigned char ReadOneChar3()
- { unsigned char i=0;
- unsigned char dat = 0;
- for (i=8;i>0;i--) { DS3 = 0;
- dat>>=1;
- DS3 = 1;
- if(DS3)
- dat|=0x80;
- tmpDelay(4);
- }
- return(dat);
- }
- void WriteOneChar3(unsigned char dat)
- { unsigned char i=0;
- for (i=8; i>0; i--) { DS3 = 0;
- DS3 = dat&0x01;
- tmpDelay(5);
- DS3 = 1;
- dat>>=1;
- } }
- unsigned int Readtemp3()//第四个温度点温度数据处理
- {unsigned char a=0;
- unsigned char b=0;
- unsigned int t=0;
- float tt=0;
- Init_DS318B203();
- WriteOneChar3(0xCC);
- WriteOneChar3(0x44);
- Init_DS318B203();
- WriteOneChar3(0xCC);
- WriteOneChar3(0xBE);
- a=ReadOneChar3();
- b=ReadOneChar3();
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625;
- t= tt*10;
- return(t);
- }
- /*****************************************************/
- /***********************LCD1602显示程序*********************/
- void display(unsigned int pt) //LCD1602显示程序
- { unsigned int m;
- m=pt;
-
- if (m==0){
- uint num0;
- uint shi0,ge0,xiaoshu0;
- num0=Readtemp0();
-
- shi0=num0/100;
- ge0=num0/10%10;
- xiaoshu0=num0%10;
- a[1]=num0/10;//第一个温度数据整数部分保存到待发送的数组中
- a[2]=xiaoshu0;//第一个温度数据小数部分保存到待发送的数组中
-
- write_com(0x80+3);
- write_date(digital[shi0]);
- write_com(0x80+4);
- write_date(digital[ge0]);
- write_com(0x80+5);
- write_date(0x2e);
- write_com(0x80+6);
- write_date(digital[xiaoshu0]);
- if(shi0<2||shi0>8){led0=0;
- flag=1;}
- else{led0=1;}
- }
-
- else if(m==1){
- uint num1;
- uint shi1,ge1,xiaoshu1;
- num1=Readtemp1();
-
-
- shi1=num1/100;
- ge1=num1/10%10;
- xiaoshu1=num1%10;
- a[3]=num1/10;//第二个温度数据整数部分保存到待发送的数组中
- a[4]=xiaoshu1; //第二个温度数据小数部分保存到待发送的数组中
- write_com(0x80+11);
- write_date(digital[shi1]);
- write_com(0x80+12);
- write_date(digital[ge1]);
- write_com(0x80+13);
- write_date(0x2e);
- write_com(0x80+14);
- write_date(digital[xiaoshu1]);
- if(shi1<2||shi1>8){led1=0;
- flag=1;}
- else{led1=1;}
- }
-
-
- else if(m==2){
- uint num2;
- uint shi2,ge2,xiaoshu2;
- num2=Readtemp2();
-
-
- shi2=num2/100;
- ge2=num2/10%10;
- xiaoshu2=num2%10;
- a[5]=num2/10; //第三个温度数据整数部分保存到待发送的数组中
- a[6]=xiaoshu2;//第三个温度数据小数部分保存到待发送的数组中
- write_com(0x80+0x40+3);
- write_date(digital[shi2]);
- write_com(0x80+0x40+4);
- write_date(digital[ge2]);
- write_com(0x80+0x40+5);
- write_date(0x2e);
- write_com(0x80+0x40+6);
- write_date(digital[xiaoshu2]);
- if(shi2<2||shi2>8){led2=0;
- flag=1;}
- else{led2=1;}
- }
-
- else{
- uint num3;
- uint shi3,ge3,xiaoshu3;
- num3=Readtemp3();
-
-
- shi3=num3/100;
- ge3=num3/10%10;
- xiaoshu3=num3%10;
- a[7]=num3/10;//第四个温度数据整数部分保存到待发送的数组中
- a[8]=xiaoshu3;//第四个温度数据小数部分保存到待发送的数组中
- write_com(0x80+0x40+11);
- write_date(digital[shi3]);
- write_com(0x80+0x40+12);
- write_date(digital[ge3]);
- write_com(0x80+0x40+13);
- write_date(0x2e);
- write_com(0x80+0x40+14);
- write_date(digital[xiaoshu3]);
- if(shi3<2||shi3>8) //判断温度数据是否在指定范围20~90
- {led3=0;
- flag=1;}
- else{led3=1;}
-
- }
-
- }
- /***************************************************************/
- void InitScom(void) //串口初始化
- {
- TMOD=0x21;
- TH1=0xfd;
- TL1=0xfd;
- PCON=0x00;
- TR1=1;
- SCON=0x50;
- RI = 0;
- TI = 0;
- ES=1;
- EA=1;
- }
- void SendChar(uchar SendData) //发送数据
- {
- SBUF=SendData;
- while(TI==0);
- TI=0;
- }
- /**************************主程序*****************************/
- void main()
- {unsigned int h,i,j;
- h=0;
-
- init_lcd();
- InitScom();
- while(1)
- {
- flag=0; //清零报警标志
- h=0;
- display(h);
- h=1;
- display(h);
-
- h=2;
- display(h);
-
- h=3;
- display(h);
- for(i=0;i<10;i++)//依次发送数据
- SendChar(a[i]) ;
- delay_50ms(10);
-
-
- for(i=0;i<4;i++)
- if(flag==1)//flag=1则报警
- {
-
- for(j=0;j<500;j++)
- {speak=1;
- delay_50us(10); //延时500us
- speak=0;
- delay_50us(10); //延时500us
- }
- delay_50ms(10); //延时0.5s
- }
- delay_50ms(20);//再延时1s每五秒刷新一次数据
- }
- }
- /*****************************************************************/
- void Receive() interrupt 4 using 0
- { uchar rdata;
- if(RI)
- { RI=0;
- rdata=SBUF;
- P2=rdata; } }
复制代码
所有资料51hei提供下载:
多点温度测试.rar
(27.22 KB, 下载次数: 48)
|