|
多點(diǎn)溫度測(cè)試,超過(guò)閾值聲光報(bào)警。LCD1602顯示。
O~@3PV9PP)LTTY{QH7OT.png (157.86 KB, 下載次數(shù): 92)
下載附件
2021-2-2 13:06 上傳
1.png (37.11 KB, 下載次數(shù): 65)
下載附件
2021-2-2 16:25 上傳
單片機(jī)源程序如下:
- #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}; //發(fā)送的數(shù)據(jù) ,分別以0xff和0xfb作為起始位和停止位,用于校驗(yàn)
- sbit DS0=P2^0;
- sbit DS1=P2^1;
- sbit DS2=P2^2;
- sbit DS3=P2^3;
- unsigned int flag;//是否報(bào)警標(biāo)志
- uchar i;
- void delay(uchar z)//延時(shí)
- { uchar x,y;
- for(x=1000;x>1;x--)
- for(y=z;y>1;y--);
- }
- void delay_50us(uint t)// 延時(shí)50us
- {
- uchar j;
- for(;t>0;t--)
- for(j=19;j>0;j--);
- }
- void delay_50ms(uint t)//延時(shí)50ms
- {
- uint j;
- for(;t>0;t--)
- for(j=6245;j>0;j--);
- }
- /***LCD1602相關(guān)程序*******************************/
- 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初始化及數(shù)據(jù)處理程序******************/
- 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() //第一個(gè)溫度點(diǎn)溫度數(shù)據(jù)處理
- {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() //第二個(gè)溫度點(diǎn)溫度數(shù)據(jù)處理
- {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() //第三個(gè)溫度點(diǎn)溫度數(shù)據(jù)處理
- {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()//第四個(gè)溫度點(diǎn)溫度數(shù)據(jù)處理
- {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;//第一個(gè)溫度數(shù)據(jù)整數(shù)部分保存到待發(fā)送的數(shù)組中
- a[2]=xiaoshu0;//第一個(gè)溫度數(shù)據(jù)小數(shù)部分保存到待發(fā)送的數(shù)組中
-
- 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;//第二個(gè)溫度數(shù)據(jù)整數(shù)部分保存到待發(fā)送的數(shù)組中
- a[4]=xiaoshu1; //第二個(gè)溫度數(shù)據(jù)小數(shù)部分保存到待發(fā)送的數(shù)組中
- 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; //第三個(gè)溫度數(shù)據(jù)整數(shù)部分保存到待發(fā)送的數(shù)組中
- a[6]=xiaoshu2;//第三個(gè)溫度數(shù)據(jù)小數(shù)部分保存到待發(fā)送的數(shù)組中
- 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;//第四個(gè)溫度數(shù)據(jù)整數(shù)部分保存到待發(fā)送的數(shù)組中
- a[8]=xiaoshu3;//第四個(gè)溫度數(shù)據(jù)小數(shù)部分保存到待發(fā)送的數(shù)組中
- 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) //判斷溫度數(shù)據(jù)是否在指定范圍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) //發(fā)送數(shù)據(jù)
- {
- SBUF=SendData;
- while(TI==0);
- TI=0;
- }
- /**************************主程序*****************************/
- void main()
- {unsigned int h,i,j;
- h=0;
-
- init_lcd();
- InitScom();
- while(1)
- {
- flag=0; //清零報(bào)警標(biāo)志
- h=0;
- display(h);
- h=1;
- display(h);
-
- h=2;
- display(h);
-
- h=3;
- display(h);
- for(i=0;i<10;i++)//依次發(fā)送數(shù)據(jù)
- SendChar(a[i]) ;
- delay_50ms(10);
-
-
- for(i=0;i<4;i++)
- if(flag==1)//flag=1則報(bào)警
- {
-
- for(j=0;j<500;j++)
- {speak=1;
- delay_50us(10); //延時(shí)500us
- speak=0;
- delay_50us(10); //延時(shí)500us
- }
- delay_50ms(10); //延時(shí)0.5s
- }
- delay_50ms(20);//再延時(shí)1s每五秒刷新一次數(shù)據(jù)
- }
- }
- /*****************************************************************/
- void Receive() interrupt 4 using 0
- { uchar rdata;
- if(RI)
- { RI=0;
- rdata=SBUF;
- P2=rdata; } }
復(fù)制代碼
51hei.png (5.92 KB, 下載次數(shù): 94)
下載附件
2021-2-2 16:26 上傳
所有資料51hei提供下載:
多點(diǎn)溫度測(cè)試.rar
(27.22 KB, 下載次數(shù): 48)
2021-2-2 12:58 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|