⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 温度计.c

📁 此为课程设计的作品 为数字温度计的测量~ 希望对初学者有帮助
💻 C
字号:
#include <AT89X51.H>
#include <absacc.h>
#define wlcdcom XBYTE[0xf8ff]
#define rlcdcom XBYTE[0xfcff]
#define wlcddata XBYTE[0xfaff]
#define rlcddata XBYTE[0xfeff]
typedef unsigned char byte;
typedef unsigned int word; 
unsigned char code tab0[]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};
unsigned char code tab1[]={'T','h','e',' ','p','r','o','g','r','a','m','m','e',' ','i','s',0x00};
unsigned char code tab2[]={'d','e','s','i','g','n','e','d',' ','b','y',' ','h','i','f','i',0x00};
unsigned char code tab3[]={'0','1','2','3','4','5','6','7','8','9'};
unsigned char code tab4[16][4]={{'0','0','0','0'},{'0','6','2','5'},{'1','2','5','0'},{'1','8','7','5'},
                                {'2','5','0','0'},{'3','1','2','5'},{'3','7','5','0'},{'4','3','7','5'},
						        {'5','0','0','0'},{'5','6','2','5'},{'6','2','5','0'},{'6','8','7','5'},
						        {'7','5','0','0'},{'8','1','2','5'},{'8','7','5','0'},{'9','3','7','5'}};

                  unsigned char temp[9],time[9],high[7]={'H','T','0','0','.','0',0x00},low[7]={'L','T','0','0','.','0',0x00};
unsigned char h[3],l[3],nonce_t[3]; 
sbit busy=ACC^7;
sbit DQ=P3^2;
sbit time_set=P1^0;
sbit temp_set=P1^1;
sbit inc=P1^2;
sbit dec=P1^3;
sbit bell=P1^6;
sbit fan=P1^4;
sbit heater=P1^5;
sbit l_led=P2^6;
sbit h_led=P2^7;

unsigned int b,c;
unsigned char t,tf,set_coun,temp_coun;
unsigned char hour,minute,second;
bit time_flag,set_flag,temp_flag;
bit t_c,bell_flag,ring_flag;
bit flag1;flag2;


//查询忙标志位//
void wait(void)
{  do
   ACC=rlcdcom;
   while(busy);           
}
//LCD初始化//
void lcd_init(void)        
{  wlcdcom=0x38;          
   wait();
   wlcdcom=0x06;          
   wait();
   wlcdcom=0x0c;          
   wait();
   wlcdcom=0x01;          
   wait();
}
//LCD驱动
void lcd_display(c_a,pos)
unsigned char pos;
unsigned char *c_a;
{  wlcdcom=pos;  
   wait();
   while(*c_a!=0x00)
   {  wlcddata=*c_a;
      wait();
	  c_a++;
   }
}
//延时
void delay(word useconds)
{
for(;useconds>0;useconds--);
}
//复位
byte ow_reset(void)
{
byte presence;
DQ = 0; 
delay(29); 
DQ = 1; 
delay(3); 
presence = DQ; 
delay(25); 
return(presence); 
} 
//从 1-wire 总线上读取一个字节
byte read_byte(void)
{
byte i;
byte v_alue = 0;
for (i=8;i>0;i--)
{
v_alue>>=1;
DQ = 0; 
DQ = 1; 
delay(1); 
if(DQ) v_alue|=0x80;
delay(6); 
}
return(v_alue);
}

//向 1-WIRE 总线上写一个字节

void write_byte(char val)
{
byte i;
for (i=8; i>0; i--) 
{
DQ = 0; 
DQ = val&0x01;
delay(5); 
DQ = 1;
val=val/2;
}
delay(5);
}

//读取温度

unsigned int Read_Temperature(void)
{
union{
byte c[2];
unsigned int x;
}temp;
ow_reset();
write_byte(0xCC); 
write_byte(0xBE); 
temp.c[1]=read_byte();
temp.c[0]=read_byte();
ow_reset();
write_byte(0xCC); 
write_byte(0x44); 
return temp.x;
}
//BCD码转换
void bcd_transform(void)
{  unsigned char b,c,n;
   unsigned int;
   unsigned int tm,a;
   tm=Read_Temperature();
   a=tm>>4;
   c=(unsigned char)a&0x00ff;    //整数部分
   n=c/100;
   b=c%100;
   temp[0]=tab3[n];
   n=b/10;
   temp[1]=tab3[n];
   nonce_t[0]=n;
   n=b%10;
   temp[2]=tab3[n];
   nonce_t[1]=n;
   temp[3]='.';
   a=(unsigned char)tm&0x000f;   //小数部分
   for(b=0;b<=4;b++)
   { temp[b+4]=tab4[a][b];
   }
   nonce_t[2]=tab0[a];
   temp[8]=0x00;
}
//定时器0中断服务程序
void time0() interrupt 1 using 1
{  TH0=0x3c; 
   TL0=0xa8;
   t++;
   tf++;
   if(tf==10)
     {  time_flag=~time_flag;
	    tf=0;
		bell=time_flag|ring_flag;
     }
   if(t==20)
   {
   t=0;
   second++;
   if(second==60)
     {  second=0;
        minute++;
        if(minute==60)
          {  minute=0;
             hour++;
             if(hour==24)
               {  hour=0;
			   }
           }
      }
	}
	time[0]=tab3[hour/10];
	time[1]=tab3[hour%10];
	time[2]='-';
	time[3]=tab3[minute/10];
	time[4]=tab3[minute%10];
	time[5]='-';
	time[6]=tab3[second/10];
	time[7]=tab3[second%10];
	time[8]=0x00;
}

//去抖动延时
void delay(void)
{  unsigned char i,j;
   for(i=20;i>0;i--)
   {  for(j=255;j>0;j--);
   }
}

//按键处理子程序
void keyboad(void)
{  unsigned char a,b;
   if(!time_set)
   delay();
   if(!time_set)
   {  set_flag=1;
      if(++set_coun>=5)
      {  set_coun=0;
         set_flag=0;
      }
	  while(!time_set);
   }
   if(!temp_set)
   delay();
   if(!temp_set)
   {  temp_flag=1;
      if(++temp_coun>=7)
  	  {  temp_flag=0;
	     temp_coun=0;
	  }
	  while(!temp_set);
   }
   if(!inc)
   delay();
   {
   if((!inc)&&set_flag)
   {  switch (set_coun)
      {  case 1:
         {  hour=hour+10;
            if(hour>=30)
            {  hour=hour-30;
            }
         } break;
         case 2:
         {  a=hour%10; 
            b=hour/10;
            if(++a>=10)
            {  a=0;
            }
            hour=b*10+a;
         } break;
         case 3:
         {  minute=minute+10;
            if(minute>=60)
            {  minute=minute-60;
            }
         } break;
         case 4:
         {  a=minute%10;
            b=minute/10;
            if(++a>=10)
            {  a=0;
            }
            minute=b*10+a;
         } break;
      }
   }
   if(!inc&&temp_flag)
   {  switch(temp_coun)
      {  case 1:
	     { if(++l[0]>9)
 		   {  l[0]=0;
		   }
		 }  break;
		 case 2:
		 {  if(++l[1]>9)
		    {  l[1]=0;
			}
		 }  break;
		 case 3:
		 {  if(++l[2]>9)
		    {  l[2]=0;
			}
		 }  break;
		 case 4:
		 {  if(++h[0]>9)
		    {  h[0]=0;
			}
		 }  break;
		 case 5:
		 {  if(++h[1]>9)
		    {  h[1]=0;
			}
		 }  break;
		 case 6:
		 {  if(++h[2]>9)
		    {  h[2]=0;
			}
		 }  break;
	  }
	  
   }
   while(!inc);
   }
   if(!dec)
   delay();
   {
   if((!dec)&&set_flag)
   {  switch (set_coun)
      {  case 1:
		 {  a=hour%10; 
            b=hour/10+1;
			if(--b<=0)
			{ b=3;
			}
			hour=(b-1)*10+a;
		 } break;
		 case 2:
		 {  a=hour%10+1; 
            b=hour/10;
            if(--a<=0)
			{ a=10;
			}
			hour=b*10+a-1;
		 } break;
		 case 3:
		 {  a=minute%10;
            b=minute/10+1;
            if(--b<=0)
            {  b=6;
            }
            minute=(b-1)*10+a;
		 } break;
		 case 4:
		 {  a=minute%10+1;
            b=minute/10;
            if(--a<=0)
            {  a=10;
            }
            minute=b*10+a-1;
		 }
	  }
	}
    if(!dec&&temp_flag)
	{  switch(temp_coun)
	   { case 1:
	     {a=l[0]+1;
	      if(--a<=0)
		  {  a=10;
		  }
		  l[0]=a-1;
	   }  break;
	   case 2:
	   {  a=l[1]+1;
	      if(--a<=0)
		  {  a=10;
		  }
		  l[1]=a-1;
	   }  break;
	   case 3:
	   {  a=l[2]+1;
	      if(--a<=0)
		  {  a=10;
		  }
		  l[2]=a-1;
	   }  break;
	   case 4:
	   {  a=h[0]+1;
	      if(--a<=0)
		  {  a=10;
		  }
		  h[0]=a-1;
	   }  break;
	   case 5:
	   {  a=h[1]+1;
	      if(--a<=0)
		  {  a=10;
		  }
		  h[1]=a-1;
	   }  break;
	   case 6:
	   {  a=h[2]+1;
	      if(--a<=0)
		  {  a=10;
		  }
		  h[2]=a-1;
	   }  break;
	}
   
	}
    while(!dec);
  }
  
}

//
void ASC(void)
{  
    high[2]=tab3[h[0]];
	high[3]=tab3[h[1]];
    high[5]=tab3[h[2]];
	low[2]=tab3[l[0]];
	low[3]=tab3[l[1]];
	low[5]=tab3[l[2]];
    b=l[0]*100+l[1]*10+l[2];
    c=h[0]*100+h[1]*10+h[2];
}

//
void time_display(void)
{ 
   if(set_flag)
   {  switch(set_coun)
      {  case 1:
	     {  if(time_flag)
		    time[0]=' ';
		 }  break;
		 case 2:
		 {  if(time_flag)
		    time[1]=' ';
		 }  break;
		 case 3:
		 {  if(time_flag)
		    time[3]=' ';
		 }  break;
		 case 4:
		 {  if(time_flag)
		    time[4]=' ';
		 }  break;
	  }
   }
   if(temp_flag)
   {  switch(temp_coun)
      {  case 1:
	     {  if(time_flag)
		    low[2]=' ';
            else
			low[2]=tab3[l[0]];
		 }  break;
		 case 2:
		 {  if(time_flag)
		    low[3]=' ';
			else
			low[3]=tab3[l[1]];
		 }  break;
		 case 3:
		 {  if(time_flag)
		    low[5]=' ';
			else
			low[5]=tab3[l[2]];
		 }  break;
         case 4:
	{  if(time_flag)
		    high[2]=' ';
			else
			high[2]=tab3[h[0]];
		 }  break;
         case 5:
		 {  if(time_flag)
		    high[3]=' ';
			else
			high[3]=tab3[h[1]];
		 }  break;
         case 6:
		 {  if(time_flag)
		    high[5]=' ';
			else
			high[5]=tab3[h[2]];
		 }  break;
	  }
   }
}

//报警子程序
void warm(void)
{  unsigned int a;
   a=nonce_t[0]*100+nonce_t[1]*10+nonce_t[2];
   if(b==c)
   {  bell_flag=1;
   }
   else
	  bell_flag=0;
   if(a<c&&a>=b)
   {  heater=0;
      l_led=1; 
      bell=1;
      fan=0;
      h_led=1;
	  ring_flag=1;
	  flag1=1;
	  flag2=1;
   }
   else if(a>=c&&flag1)
   {  fan=1;
	   h_led=0;
	   ring_flag=bell_flag;
	   flag2=0;
   }
   else if(a<b&&flag2)
   {  heater=1;
	  l_led=0;
	  bell=bell_flag;
	  flag1=0;
   }
   
}

//主程序
main(void)
{  
   TMOD=0x01;
   EA=1;
   ET0=1;
   TH0=0x3c;
   TL0=0xa8;
   TR0=1;
   fan=0;
   heater=0;
   lcd_init();
   ring_flag=1;
   while(1)
   {  keyboad();
      time_display();
	  bcd_transform();
      lcd_display(temp,0xc0);    //第二行
      lcd_display(time,0x80);   //第一行
 lcd_display(low,0xca);
lcd_display(high,0x8a);
	  ASC();
	  warm() ;
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -