热敏电阻测温度程序及PCB
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机+ADC0832源程序如下:
- #include <AT89X52.h>
- #include <intrins.h>
- #define uint unsigned int
- #define uchar unsigned char
- typedef unsigned char unint8;
- typedef unsigned char unint16;
- sbit RS=P2^5;
- sbit RW=P2^6;
- sbit EN=P2^7;
- sbit LED1 = P2^0;
- sbit LED = P1^1;
- sbit ADCS = P1^4;
- sbit ADCLK = P1^0;
- sbit ADDI = P1^2;
- sbit ADDO = P1^ 2;
- sbit SET= P3^3;
- sbit ADD= P3^4;
- sbit DEC= P3^5;
- sbit BEEP=P3^6;
- sbit TRH = P1^3;
- uchar set_st;
- uchar tab[4];
- uint DUST_SET=35;
- bit shanshuo_st;
- bit beep_st;
- uchar x=4;
- //定义标识
- uchar FlagStart = 0;
- float DUST_Value;
- uint DUST;
- uchar num=0;
- uchar mm;
- uchar ADC_Get[10]={0};
- uchar str[5]={0};
- uchar abc;
- unsigned char str1[]={" "};
- unsigned char str2[]={" "};
- unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
- unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
- unint8 com_data,untemp,temp;
- unint8 respond;
- /*****初始化定时器0*****/
- void InitTimer(void)
- {
- TMOD = 0x01;
- TL0 = (65536-10000)/256; //定时10ms
- TH0 = (65536-10000)%256;
- TR0 = 1;
- ET0 = 1;
- EA = 1;
- }
- /*************************lcd1602程序**************************/
- void delay1ms(uint ms)
- { uint i,j;
- for(i=0;i<ms;i++)
- for(j=0;j<100;j++);
- }
- unsigned char rolmove(unsigned char m)
- {
-
- unsigned char a,b,c,d,e,f,g,h;
- a=(m&0x01)<<7;
- b=(m&0x02)<<5;
- c=(m&0x04)<<3;
- d=(m&0x08)<<1;
- e=(m&0x10)>>1;
- f=(m&0x20)>>3;
- g=(m&0x40)>>5;
- h=(m&0x80)>>7;
- m=a|b|c|d|e|f|g|h;
- return m;
- }
- void wr_com(uchar com)
- { delay1ms(1);
- RS=0;
- RW=0;
- EN=0;
- P0=rolmove(com);
- delay1ms(1);
- EN=1;
- delay1ms(1);
- EN=0;
- }
- void wr_dat(uchar dat)
- { delay1ms(1);;
- RS=1;
- RW=0;
- EN=0;
- P0=rolmove(dat);
- delay1ms(1);
- EN=1;
- delay1ms(1);
- EN=0;
- }
- /*****************************液晶初始化*********************************************/
- void lcd_init()
- { delay1ms(15);
- wr_com(0x38);delay1ms(5);
- wr_com(0x08);delay1ms(5);
- wr_com(0x01);delay1ms(5);
- wr_com(0x06);delay1ms(5);
- wr_com(0x0c);delay1ms(5);
- wr_com(0x80);
- wr_dat('P');//
- wr_com(0x81);
- wr_dat('M');//:
- wr_com(0x82);
- wr_dat(':');
- wr_com(0x87);
- wr_dat('m');
- wr_com(0x88);
- wr_dat('g');
- wr_com(0x89);
- wr_dat('/');
- wr_com(0x8a);
- wr_dat('m');
- wr_com(0x8b);
- wr_dat('3');
- wr_com(0xc0);
- wr_dat('A');
- wr_com(0xc1);
- wr_dat('L');
- wr_com(0xc2);
- wr_dat(':');
- wr_com(0xc7);
- wr_dat('m');
- wr_com(0xc8);
- wr_dat('g');
- wr_com(0xc9);
- wr_dat('/');
- wr_com(0xca);
- wr_dat('m');
- wr_com(0xcb);
- wr_dat('3');
-
- }
- /*****************显示函数******************************/
- void disp(unsigned int Data)
- {
- uint Temp;
- Temp=Data%10000;
- str[0]=Temp/1000+0x30;
- Temp%=1000;
- str[1]='.';
- str[2]=Temp/100+0x30;
- Temp%=100;
- str[3]=Temp/10+0x30;
- str[4]=Temp%10+0x30;
- wr_com(0x83);
- wr_dat(str[0]);
- wr_com(0x84);
- wr_dat(str[1]);
- wr_com(0x85);
- wr_dat(str[2]);
- wr_com(0x86);
- wr_dat(str[3]);
- }
- /************************显示************************************/
- void baojing()
- {
- wr_com(0xc3);
- wr_dat(tab[0]+0x30);
- wr_com(0xc4);
- wr_dat(tab[1]);
- wr_com(0xc5);
- wr_dat(tab[2]+0x30);
- wr_com(0xc6);
- wr_dat(tab[3]+0x30);
- wr_com(0x8d);
- wr_dat(str1[0]);
- wr_com(0x8e);
- wr_dat(str1[1]);
- wr_com(0x8f);
- wr_dat('%');
- wr_com(0xcd);
- wr_dat(str2[0]);
- wr_com(0xce);
- wr_dat(str2[1]);
- wr_com(0xcf);
- wr_dat('C');
- }
- /*****延时子程序*****/
- void Delay(uint num)
- {
- while( --num );
- }
- /**************************按键检测*******************************************/
- void checkkey()
- {
- if(SET==0)
- {
- Delay(2000);
- do{}while(SET==0);
- set_st++;
- if(set_st>1)set_st=0;
- }
- if(set_st==0)
- {
-
- }
- else if(set_st==1)
- {
- if(DEC==0)
- {
- Delay(2000);
- do{}while(DEC==0);
-
- if(DUST_SET>0)DUST_SET--;
- if(DUST_SET==0)DUST_SET=0;
- }
- if(ADD==0)
- {
- Delay(2000);
- do{}while(ADD==0);
- DUST_SET++;
- if(DUST_SET>80)DUST_SET=80;
- }
- }
- tab[0]=DUST_SET/100;
- tab[1]='.';
- tab[2]=DUST_SET%100/10;
- tab[3]=DUST_SET%100%10;
- }
- /*****报警子程序*****/
- void Alarm()
- {
- if(x>=5){beep_st=~beep_st;x=0;}
- if(DUST/10>DUST_SET&&beep_st==1)BEEP=1;
- else BEEP=0;
- }
- /**************************AD0832转换程序***********************************************/
- uchar ADC0832(bit mode,bit channel)
- {
- uchar i,dat,ndat;
-
- ADCS = 0;
- _nop_();
- _nop_();
-
- ADDI = 1;
- ADCLK = 1;
- _nop_();
- _nop_();
- ADCLK = 0;
- _nop_();
- _nop_();
-
- ADDI = mode;
- ADCLK = 1;
- _nop_();
- _nop_();
- ADCLK = 0;
- _nop_();
- _nop_();
-
- ADDI = channel;
- ADCLK = 1;
- _nop_();
- _nop_();
- ADCLK = 0;
-
- ADDI = 1;
- dat = 0;
-
- for(i = 0;i < 8;i++)
- {
- dat <<= 1;
- ADCLK=1;
- _nop_();
- _nop_();
- ADCLK=0;
- _nop_();
- _nop_();
- dat |= ADDO;
- }
- ndat = 0; //记录D0
- if(ADDO == 1)
- ndat |= 0x80;
-
- for(i = 0;i < 7;i++)
- {
- ndat >>= 1;
- ADCLK = 1;
- _nop_();
- _nop_();
- ADCLK=0;
- _nop_();
- _nop_();
- if(ADDO==1)
- ndat |= 0x80;
- }
- ADCS=1;
- ADCLK=0;
- ADDI=1;
- if(dat==ndat)
- return(dat);
- else
- return 0;
- }
- /*****定时器0中断服务程序*****/
- void timer0(void) interrupt 1
- {
- uint j;
- TL0 = (65536-10000)/256;
- TH0 = (65536-10000)%256;
- LED=1;
- x++;
- for (j=0;j<30;j++);
- abc=ADC0832(1,0);
- //num++;
- //if(num>0)
- //{
- FlagStart=1;
- //num=0;
- TR0 = 0;
- EA = 0;
- LED1=~LED1;
- //}
- LED=0;
- }
- //中值滤波
- //算法:先进行排序,然后将数组的中间值作为当前值返回。
- uchar Error_Correct(uchar *str,uchar num)
- {
- unsigned char i=0;
- unsigned char j=0;
- uchar Temp=0;
-
- //排序
- for(i=0;i<num-1;i++)
- {
- for(j=i+1;j<num;j++)
- {
- if(str[i]<str[j])
- {
- Temp=str[i];
- str[i]=str[j];
- str[j]=Temp;
-
- }
-
- }
- }
- //去除误差,取中间值
- return str[num/2];
- }
- void DelayUs(unsigned char us)//delay us
- {
- unsigned char uscnt;
- uscnt=us>>1;
- while(--uscnt);
- }
- /******************************************************************/
- void DelayMs(unsigned char ms)//delay Ms
- {
- while(--ms)
- {
- DelayUs(250);
- DelayUs(250);
- DelayUs(250);
- DelayUs(250);
- }
- }
- /****************************************************************************/
- //收发信号检测,数据读取
- /****************************************************************************/
- char receive()
- {
- unint8 i;
- com_data=0;
- for(i=0;i<=7;i++)
- {
- respond=2;
- while((!TRH)&&respond++);
- DelayUs(5);
- DelayUs(5);
- DelayUs(5);
- if(TRH)
- {
- temp=1;
- respond=2;
- while((TRH)&&respond++);
- }
- else
- temp=0;
- com_data<<=1;
- com_data|=temp;
- }
- return(com_data);
- }
- /****************************************************************************/
- //湿度读取子程序
- //温度高8位== TL_data
- //温度低8位== TH_data
- //湿度高8位== RH_data
- //湿度低8位== RH_data
- //校验 8位 == CK_data
- //调用的程序有 delay();, Delay_5us();,RECEIVE();
- /***************************************************************************/
- void read_TRH()
- {
-
- TRH=0;
- DelayMs(18);
- TRH=1;
-
- DelayUs(5);
- DelayUs(5);
- DelayUs(5);
- DelayUs(5);
-
- TRH=1;
-
- if(!TRH)
- {
- respond=2;
-
- while((!TRH)&& respond++);
- respond=2;
-
- while(TRH && respond++);
-
- RH_temp = receive();
- RL_temp = receive();
- TH_temp = receive();
- TL_temp = receive();
- CK_temp = receive();
- TRH=1;
-
- untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
- if(untemp==CK_temp)
- {
- RH_data = RH_temp;
- RL_data = RL_temp;
- TH_data = TH_temp;
- TL_data = TL_temp;
- CK_data = CK_temp;
- }
- }
-
- str1[0] = (char)(0X30+RH_data/10);
- str1[1] = (char)(0X30+RH_data%10);
-
- str2[0] = (char)(0X30+TH_data/10);
- str2[1] = (char)(0X30+TH_data%10);
-
- }
- /*****主函数*****/
- void main(void)
- {
- InitTimer();
- LED=1;
- BEEP=0;
- lcd_init();
- delay1ms(100);
- lcd_init();
- delay1ms(100);
- while(1)
- {
- checkkey();
- if(set_st==0)
- {
- wr_com(0x0c);
- if(FlagStart==1)
- {
- num++;
- ADC_Get[num]=abc;
- if(num>9)
- {
- num=0;
- read_TRH();
- DUST=Error_Correct(ADC_Get,10);
- DUST_Value=(DUST/256.0)*5000;
- DUST_Value=DUST_Value*0.17-0.1;
- if(DUST_Value<0) DUST_Value=0;
- if(DUST_Value>760) DUST_Value=760;
- DUST=(uint)DUST_Value;
- }
- TL0 = (65536-10000)/256;
- TH0 = (65536-10000)%256;
- TR0 = 1;
- EA = 1;
- FlagStart=0;
- }
- Alarm();
- }
- disp(DUST);
- baojing();
- if(set_st==1)
- {
- wr_com(0xc6);
- wr_com(0x0d);
- delay1ms(150);
- }
- }
- }/*****END*****/
复制代码
所有资料51hei提供下载:
温室度程序及PCB.rar
(607.11 KB, 下载次数: 116)
|