|
#include"ad.h"//A/D转换部分 u8 e; void read()//读取TLC1549转换过来的温度值 { clock=1; ctrl=1; t=0; ctrl=0; for(e=0;e<10;e++) { clock=0; t*=2; if(here) t++; //delayms(1); clock=1; } ctrl=1; } #ifndef _AD_H_ #define _AD_H_ #include<reg52.h> #include<stdio.h> #include"led.h" //extern u16 t; sbit ctrl=P2^2;//TLC1549的三个控制位 sbit here=P2^1; sbit clock=P2^0; void read(); #endif #ifndef _LED_H_ #define _LED_H_ #include<reg52.h> #define u8 unsignedchar #define u16 unsignedint extern u16 t; extern u8 s; extern u8 ss; void display(u8h[]); void display_s(u8s); void display_w(u8h[]); void delayms(u8 ms); #endif #include"led.h" #include<reg52.h> sbit point=P0^7; u8 ms=3; u8 mms=3; u8 code num[]={ //数码管真值表 ~0x3f,~0x06,~0x5b,~0x4f, ~0x66,~0x6d,~0x7d,~0x07, ~0x7f,~0x6f,~0x77,~0x7c, ~0x39,~0x5e,~0x79,~0x71}; u8 codeerr[]={0xff,0x86,0x88,0x88}; void delayms(u8 s){//延时函数 u8 i,j; for(i=s;i>0;i--){ for(j=80;j>0;j--); } } void display(u8 h[])//未超过阈值时,LED显示函数,数码管共4位,从左往右滚动显示,4位均为温度值 { switch(s){ case 0: P1=0xFE; P0=err[0]; delayms(mms); P1=0xFD; P0=num[h[0]]; delayms(mms); P1=0xFB; P0=num[h[1]]; point=0; delayms(mms); P1=0xF7; P0=num[h[2]]; delayms(mms); break; case 1: P1=0xFE; P0=num[h[2]]; delayms(mms); P1=0xFD; P0=err[0]; delayms(mms); P1=0xFB; P0=num[h[0]]; delayms(mms); P1=0xF7; P0=num[h[1]]; point=0; delayms(mms); break; case 2: P1=0xFE; P0=num[h[1]]; point=0; delayms(mms); P1=0xFD; P0=num[h[2]]; delayms(mms); P1=0xFB; P0=err[0]; delayms(mms); P1=0xF7; P0=num[h[0]]; delayms(mms); break; case 3: P1=0xFE; P0=num[h[0]]; delayms(mms); P1=0xFD; P0=num[h[1]]; point=0; delayms(mms); P1=0xFB; P0=num[h[2]]; delayms(mms); P1=0xF7; P0=err[0]; delayms(mms); break; default:break; } } void display_w(u8h[]){//超过阈值时,LED显示函数,数码管共4位,从左往右滚动显示,前4位为温度值,后4位为ERR. switch(ss){ case 0: P1=0xFE; P0=err[0]; delayms(ms); P1=0xFD; P0=num[h[0]];; delayms(ms); P1=0xFB; P0=num[h[1]]; point=0; delayms(ms); P1=0xF7; P0=num[h[2]]; delayms(ms); break; case 1: P1=0xFE; P0=err[3]; delayms(ms); P1=0xFD; P0=err[0]; delayms(ms); P1=0xFB; P0=num[h[0]]; delayms(ms); P1=0xF7; P0=num[h[1]]; point=0; delayms(ms); break; case 2: P1=0xFE; P0=err[2]; delayms(ms); P1=0xFD; P0=err[3]; delayms(ms); P1=0xFB; P0=err[0]; delayms(ms); P1=0xF7; P0=num[h[0]]; delayms(ms); break; case 3: P1=0xFE; P0=err[1]; delayms(ms); P1=0xFD; P0=err[2]; delayms(ms); P1=0xFB; P0=err[3]; delayms(ms); P1=0xF7; P0=err[0]; delayms(ms); break; case 4: P1=0xFE; P0=err[0]; delayms(ms); P1=0xFD; P0=err[1]; delayms(ms); P1=0xFB; P0=err[2]; delayms(ms); P1=0xF7; P0=err[3]; delayms(ms); break; case 5: P1=0xFE; P0=num[h[2]]; delayms(ms); P1=0xFD; P0=err[0]; delayms(ms); P1=0xFB; P0=err[1]; delayms(ms); P1=0xF7; P0=err[2]; delayms(ms); break; case 6: P1=0xFE; P0=num[h[1]]; point=0; delayms(ms); P1=0xFD; P0=num[h[2]]; delayms(ms); P1=0xFB; P0=err[0]; delayms(ms); P1=0xF7; P0=err[1]; delayms(ms); break; case 7: P1=0xFE; P0=num[h[0]]; delayms(ms); P1=0xFD; P0=num[h[1]]; point=0; delayms(ms); P1=0xFB; P0=num[h[2]]; delayms(ms); P1=0xF7; P0=err[0]; delayms(ms); break; default:break; } } void display_s(u8s){ P1=0xF7; P0=s; delayms(20); } #include<reg52.h> #include"led.h" #include"uart.h" #include"timer.h" #include"ad.h" u16 YZ; u16 x; u16 y; u8 z; u8 i; u8 f; u8 f_f; u16 t; u8 s; u8 ss; u16 t_now; u16 t_now_g; u8 t_cnt; u8 ff; double t_s; sbit beep=P1^5; u8 dat[2]; u8 ber[4]; u8 ber_s[4]; u8 ber_w[4]; u8 codestr[]="shan"; void fengming()//控制蜂鸣器蜂鸣函数 { int i,j; for(i=0;i<5;i++) { beep=~beep; for(j=0;j<10;j++) ; } } void main(){ ff=0;//初始化 f_f=0; t=0; s=0; ss=0; t_cnt=0; YZ=3500; uartInit(); timerInit(); EA=1; while(1){//程序主体,不断采集数据并显示出来 //beep=0; //display(ber); if(f_f==1){//上位机设置阈值 ES=0; YZ=x*100+y*10+z; YZ*=10; f_f=0; ES=1; } if(t_now>YZ){//如果超过阈值,就发出警报 fengming(); display_w(ber_w); }else{ display(ber_s); } } return; } void T0_time()interrupt 1//定时器中断,读取温度值 { TH0=(65536-45872)/256; TL0=(65536-45872)%256; t_cnt++; if(t_cnt%5==0){ ss++; if(ss==8) ss=0; } switch(ss){ case 4: ber_w[0]=ber[0]; ber_w[1]=ber[1]; ber_w[2]=ber[2]; break; case 5: ber_w[2]=ber[2]; break; case 6: ber_w[2]=ber[2]; ber_w[1]=ber[1]; break; case 7: ber_w[0]=ber[0]; ber_w[1]=ber[1]; ber_w[2]=ber[2]; break; default:break; } if(t_cnt%10==0){ s++; if(s==4) s=0; switch(s){ case 0: ber_s[0]=ber[0]; ber_s[1]=ber[1]; ber_s[2]=ber[2]; break; case 1: ber_s[2]=ber[2]; break; case 2: ber_s[2]=ber[2]; ber_s[1]=ber[1]; break; case 3: ber_s[0]=ber[0]; ber_s[1]=ber[1]; ber_s[2]=ber[2]; break; default:break; } } if(t_cnt==40){ t_cnt=0; read(); dat[0]=(u8)((t&0xff00)>>8); dat[1]=(u8)(t&0x00ff); uartSend(dat); t_s=(double)t; t_s=10.0*t_s*0.004453125/(4.56-t_s*0.004453125); t_s=-0.0001*t_s*t_s*t_s*t_s*t_s+0.0051*t_s*t_s*t_s*t_s-0.1314*t_s*t_s*t_s+1.9054*t_s*t_s-16.6801*t_s+90.7365; t_s=t_s*100; t_now=(u16)t_s; t_now_g=t_now%100; t_now-=t_now_g; if(t_now_g>=50){ t_now+=50; } //t_now-=500; //t_now=3456; ber[0]=t_now/1000%10; ber[1]=t_now/100%10; ber[2]=t_now/10%10; ber[3]=t_now%10; //uartSend(ber); //ES=1; } } void T1_time()interrupt 4//串口中断,上位机发送阈值给下位机 { if(RI==1){ ff++; RI=0; if(ff==1){ x=SBUF-'0';//x、y、z用来设置阈值 } if(ff==2) { y=SBUF-'0'; } if(ff==3) { z=SBUF-'0'; ff=0; f_f=1; } } } #ifndef _UART_H_ #define _UART_H_ #include<reg52.h> #include"led.h" void uartInit(); void uartSend(u8s[]); #endif #include"timer.h"//定时器初始化 void timerInit(){ TMOD=0x21; TH0=(65536-N)/256; TL0=(65536-N)%256; ET0=1; TR0=1; } #include"uart.h" void uartInit(){//串口初始化 TMOD=0x20; TH1=0xFD;//设置波特率 TL1=0xFD; TR1=1; SM0=0; SM1=1; REN=1; ES=1; } void uartSend(u8s[]){//给上位机传送数据 u8 i; for(i=0;i<2;i++){ SBUF=s[ i]; while(!TI); TI=0; } } |