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

📄 tdw-as1110-4-590.c

📁 用MG8通过AS1110采集温度数据,然后进行数字滤波,并通过液晶显示出来.
💻 C
字号:
//ICC-AVR application builder : 2005-02-16 12:18:59
// Target : M8
// Crystal: 6.0000Mhz
//三孔水浴控制程序
//Mg8(pb0,pb1,pb2,pb3)==> LCD (DB4,DB5,DB6,DB7)
//Mg (pb4,pb5 ) ==> LCD (R/S,E)
//用比较器和time1的输入捕获噪声抑制中断处理过零点,接PD7。
//Mg8(pd0,pd1,pd2) ==> 控制第1,2,3路加热。
//Mg8(pd5,pd6) ==>   选择第1,2,3路温度。
//ads1110,ED4,地址位为4
#include <iom8v.h>
#include <macros.h>
#include "Twi.h"

// 定义全局变量
//unsigned int temp [2];
unsigned char ib, ibb = 0;
unsigned char ibc = 0,ibcd=0;  //温度采集段变量
unsigned char warmk;//第1,2,3路加热控制量
unsigned int warm_old1,warm_old2,warm_old3,warm_old4;//温度采集数据
unsigned int warmold;//温度采集数据
unsigned int warmset;//第1,2,3路温度设定值
unsigned char warm1,warm2,warm3,warm4;             //温度显示
unsigned char setwarm1,setwarm2,setwarm3,setwarm4; //设定第二路值百位,十位,个位
unsigned char key_sign = 0x20; //位7延时标志,位6为是否置延时,位0键盘处理标志,
                   //位5为F2键按下标志 位3为调用显示标志(为1时调用)
unsigned char time_sign;//
unsigned char light = 0x83;  //光标闪烁地址值
unsigned char lcd_sign=0x00;
void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0x3f;
 DDRC  = 0x00;//pc口输入
 PORTC = 0x3f;//PC 0-5上拉有效即twi和按键上拉有效
 PORTD = 0X00;
 DDRD  = 0x67;//
}
void twi_init(void)
{
 TWCR= 0X00; //disable twi
 TWBR= 0x0c; //set bit rate TWBR=10,TWSR=0,在6M晶振下TWI为150KHz
 TWSR= 0x00; //set prescale
 TWAR= 0x02; //set slave address
 TWCR= 0x44; //enable twi
}

void timer1_init(void)
{
 TCCR1B = 0x80; //start Timer
}

void comparator_init(void)
{
 ACSR = ACSR & 0xF7; //ensure interrupt is off before changing
 ACSR = 0x44;
}

#pragma interrupt_handler timer1_capt_isr:6
void timer1_capt_isr(void)
 {
   ibb++;
  ib++;//加热周期
  
   if(warmk < 10)
    if(ib == warmk )
       PORTD &= ~0x04;//pd5=0关第3路加热
  
   if (ib >= 10)
    {
	  ib=0;
	  if(warmk > 0)//如果warm_k>0,条件判断为真,执行后面语句,开加热
	     PORTD |= 0x04;//开加热3
	  else PORTD &= ~0x04;//关加热3	 
		    
	}
  
   if (key_sign & 0x40 )//如果(是否置延时标志位)置位,
     {
	  key_sign |= 0x80;//置延时标志位
	  key_sign &=~ 0x40;// 清(是否置延时标志位)
	 }
  
  if (ibb >= 30 )//如果有0.4秒,
    {
	  ibb=0;
	  lcd_sign = 1;
	  
	} 
   ibcd++;
   if (ibcd>4)
      {ibcd = 0;
	   time_sign |= 0x10;
	   } 
      
	 
 }
//写指令
void pr1 (unsigned char ab )
    {  unsigned char bb;
	   bb=ab;
	   bb>>=4;
	   PORTB &=~0x10;//PB第4位清0,即R/S=0;
	   //PORTB &=~0x10;//PB第4位清0,即RW =0;
	   PORTB &= 0XF0;//PB低4位清0
	   PORTB |= bb;  //
	  // DDRB |= 0X0F;//PB低4位设为输出
	   PORTB |= 0X20;//PB第5位置1,即E=1
	   ;
	   PORTB &=~0X20;//PB第5位清0,即E=0
	   //bb=ab;
	   ab &= 0x0f; //ab高4位清0
	   PORTB &= 0xf0;//PB低4位清0
	   PORTB |= ab;//
	   //DDRB |= 0X0F;//
	   PORTB |= 0X20;//E=1
	   ;
	   PORTB &=~ 0X20;//E=0
	}
//写指令	

//写数据
void pr2 (unsigned char ab )
    {  unsigned char bb;
	   bb=ab;
	   bb>>=4;
	   PORTB |= 0x10;//PB第4位置1,即R/S=1;
	   //PORTB &=~0x10;//PB第4位清0,即RW =0;
	   PORTB &= 0XF0;//PB低4位清0
	   PORTB |= bb;  //
	   //DDRB |= 0X0F;//PC低4位设为输出
	   PORTB |= 0X20;//PB第5位置1,即E=1
	   ;
	   PORTB &=~0X20;//PB第5位清0,即E=0
	  // bb=ab;
	   ab &= 0x0f; //ab高4位清0
	   PORTB &= 0XF0;//PB低4位清0
	   PORTB |= ab;//
	   //DDRB |= 0X0F;//
	   PORTB |= 0X20;//E=1
	   ;
	   PORTB &=~ 0X20;//E=0
	}
//写数据	
void delay1 ( )
   {  unsigned int i;
       for (i=0;i<1800;i++)
	     ;
   }
void delay ( )
  {  unsigned int i;
     for (i=0; i<40;i++)
	 ;
  }
//lcd初始化  
void   lcdon ( )
  {  unsigned char i;
     PORTB &=~ 0X10;//pb4=0 R/S=0
	 //PORTB &=~ 0X10;//RW=0
	 PORTB &= 0XF0;
	 PORTB |= 0X03;//设置8位数据总线
	 for (i=0;i<3;i++)
	   {  PORTB |= 0X20;//E=1
	      ;
	      PORTB &=~ 0X20;//E=0
		  delay ( );
	   }
	  PORTB &= 0XF0;
	  PORTB |= 0X02;//设置4位数据总线
	  PORTB |= 0X20;//E=1;
	  ;
	  PORTB &=~ 0X20;//E=0;
	  delay ( );
	  pr1 (0x28);
	  delay1 ( );
	  pr1 ( 0x01);
	  delay1 ( );
	  pr1 (0x06);
	  delay ( );
	  pr1 ( 0x0f);
	  delay ( );
  }
//lcd初始化 
 
 //LCD显示程序
void lcd_work ( )
  {
      if ( key_sign & 0x20 )
	      {
		     pr1 ( 0x82);
			 delay ();
			 pr2 ( setwarm1+0x30);
			 delay ( );
			 pr2 ( setwarm2+0x30);
			 delay ( );
			 pr2 ( setwarm3+0x30);
			 delay ( );
			 pr2 ( 0x2e );
			 delay ( );
			 pr2 (setwarm4 + 0x30);
			 delay ( );
			 pr1(0xc1);
			 delay ();
			 pr2 (warm1 + 0x30);
			 delay ( );
			 pr2 (warm2 + 0x30);
			 delay ( );
			 pr2 (warm3 + 0x30);
			 delay ();
			 pr2 (0x2e );
			 delay ( );
			 pr2 (warm4 + 0x30);
			 delay ();
			 pr1 (light);  //光标闪烁地址
			 delay ( );
			 pr1 (0x0f);
			 delay ( ); //开光标显示及闪烁
		  }
	   else {
	         pr1 ( 0x82);
			 delay ();
			 if (setwarm1 == 0 )
			    pr2 (0x20);
			 else pr2 ( setwarm1+0x30);
			 delay ( );
			 pr2 ( setwarm2+0x30);
			 delay ( );
			 pr2 (setwarm3 + 0x30);
			 delay ( );
			 pr2 ( 0x2e );
			 delay ( );
			 pr2 (setwarm4 + 0x30);
			 delay ( );
			 pr1(0xc1);
			 delay ();
			 if (warm1 == 0)
			    pr2 (0x20);
			 else pr2 (warm1 + 0x30);
			 delay ( );
			 pr2 (warm2 + 0x30);
			 delay ( );
			 pr2 (warm3 + 0x30);
			 delay ();
			 pr2 (0x2e );
			 delay ( );
			 pr2 (warm4 + 0x30);
			 delay ();
		     pr1 (0x0c);//关光标显示及闪烁
			 delay ( ); //
	        }	  
  }

//LCD显示程序
 
 
//按键F1处理函数
void keyf1()
   {
      if (key_sign & 0x20)
	    {
		   light++;
		   if (light == 0x85)
		      light = 0x86;
		   if (light == 0x87)
		      light = 0x82;
		    
		}
   }
//按键F1处理函数

//按键F2处理函数
void keyf2()
 {
    key_sign |= 0x20;//置F2键处理标志 key-sign第5位
	light = 0x83;
 }
//按键F2处理函数

//按键增加键处理函数
void keyadd()
{
    if( key_sign & 0x20 )
	    { 
           switch (light )
	       {
	         case 0x82 : setwarm1++; if (setwarm1 == 1)
			                          { setwarm2 = 0;
									    setwarm3 = 0;
										setwarm4 = 0;
									  }
			                         if ( setwarm1 > 1) //温度十位最高为1
		                             setwarm1 = 0 ; break;
		     case 0x83 : setwarm2++; if ( setwarm1 == 1)
			                              setwarm2 = 0;
									  else if (setwarm2 > 9)
								               setwarm2 = 0; break;
		     case 0x84 : setwarm3++; if (setwarm1 == 1) 
		                                 setwarm3 = 0 ; 
									  else if( setwarm3 > 9 )
									            setwarm3 = 0; break;
		     case 0x86 : setwarm4++; if ( setwarm1 == 1) 
		                                setwarm4 = 0;
									 else if (setwarm4 > 9 )
									    setwarm4 = 0; break;
			 	
		     break;						   				   						   							  	     						   
	     }//switch
	   }//if	
}
//按键增加键处理函数

//按键开始处键理函数
void keystart()
 {
     key_sign &=~0x20;  //清F2按键标志位
	  warmset = setwarm1*1000 + setwarm2*100 + setwarm3*10+ setwarm4;
	 
	  //把设定值传入控制部分
 }
//按键开始键处理函数

//按键崭停处理函数
void keystop()
  {;
  }
//按键崭停处理函数


//键盘处理函数
void key_work()
  {   unsigned char keydata ;
	   keydata = PINC ;
	   keydata &= 0x0f; //取低4位的值
	   if (keydata < 0x0f )//有键按下为真,没有键按下为假
	     {
		     if (!(key_sign & 0x01))//按键处理过为假,按键没有处理过为真
			    {
				   if (key_sign & 0x80) //位7,经过延时为真,没有经过延时为假
				     {   //键值处理部分
				       switch ( keydata )
					     {// case 120 : keystop( ); break;//调用F1键处理函数
					       case 14 : keystart( );break;//调用F2键处理函数
						   case 13 : keyf2( );   break;//调用开始处理函数 
						   case 11 : keyf1( );   break;//调用开增加理函数 
						   case 7 : keyadd( );  break;//调用崭停处理函数 
						   break; 	 
					     }
					   key_sign |= 0x01;  //置处理标志
					   key_sign &= ~0x80; //清延时标志
				     } 
				  else key_sign |= 0x40; //置延时要处理标志位6为1,在中断中置延时标志 
				}
		  }
		else if ( key_sign & 0x01) // 键处理标志为1时为真
		        key_sign &= ~0x01; //清键处理标志key-sign的位0
			 
  }
//键盘处理函数


//初始化ADS1100,Twi写数据到ADS1100
unsigned char twi_write(unsigned char reg) 
{
	  Start();//I2C启动
	  Wait();
	  if(TestAck()!=START) return 1;//ACK
	  Write8Bit(0x98);//写I2C从器件地址和写方式地址为4
	  Wait();
	
	  if(TestAck()!=MT_SLA_ACK) return 1;//ACK
	  Write8Bit(reg);//写数据到ADS1100,
	  Wait();
	  if(TestAck()!=MT_DATA_ACK) return 1;//ACK	
	  Stop();//I2C停止
 	  
	  return 0;
}
//初始化ADS1100

//Twi读ADS1100数据,
unsigned int twi_read() 
   {
	  signed int temp2;
	  unsigned char temp1;
	  Start();//I2C启动
	  Wait();
	  Write8Bit(0x99);//写I2C从器件地址(4)和读方式
	  Wait();
	  Twi();//启动主I2C读方式
	  SetAck();
	  Wait();
	  temp2=TWDR;//读取I2C接收数据
	  temp2 <<= 8;
	  Twi();//启动主I2C读方式
	  SetAck();
	  Wait();  
	  temp1=TWDR;//读取I2C接收数据
	  temp2+=temp1;
      //temp2>>=1;//采集数据除以2
	  Twi();
	  Wait ();
	  temp1 = TWDR;
	  Stop();//I2C停止
	  if (temp1 & 0x80)
	     return 0;
	  else return temp2;
      }
//Twi读ADS1100数据,

//数据采集函数
void cj1( )
  {
     if (time_sign & 0x10)
       {
	      time_sign &= ~0x10; 
  
		  warm_old1 = twi_read( );
		
		  warmold = warm_old1 + warm_old2 + warm_old3 + warm_old4;
		  warmold >>=4;//warmold除以16
		  warm_old4 = warm_old3;
		  warm_old3 = warm_old2;
		  warm_old2 = warm_old1;
	   }   
  }
//数据采集函数

//数据采集函数
void cj( )
  {
     if (time_sign & 0x10)
       {
	      time_sign &= ~0x10; 
  
		  warm_old1 = twi_read( );
		  if(warm_old2 >= warm_old1)//
		     { if((warm_old2 - warm_old1)>=0x10)//
			       warm_old1 = warm_old2;//
		     }
		   else if((warm_old1-warm_old2)>=0x10)
		            warm_old1 = warm_old2;
		  warmold = warm_old1 + warm_old2 + warm_old3 + warm_old4;
		  warmold >>=4;//warmold除以16
		  warm_old4 = warm_old3;
		  warm_old3 = warm_old2;
		  warm_old2 = warm_old1;
	   }   
  }
//数据采集函数

//控制量计算函数
  void js (void )
  {
      if ( warmset >= warmold )
           {		
		    if (( warmset - warmold) > 5 )
		        warmk = 10;
		    else warmk = warmset - warmold + 1;	 
	       }	 
	     else warmk = 0;
	 
  }
//控制量计算函数

//call this routine to initialise all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 twi_init();
 timer1_init ();
 comparator_init();
 MCUCR = 0x00;//外部中断0中断方式,0低电平1上升和下降2下降沿3上升沿
 GICR  = 0x00;//不用外部中断0使能
 //TIMSK = 0x01; //位0,T0溢出 位2,T1溢出 位3输出B 位4输出A
 TIMSK |= 0x20;//位5 T1输入捕获 位6 T2溢出 位7 T2输出比较匹配
 SEI(); //re-enable interrupts

}

void main(void)
{
 init_devices();
 PORTD |= 0X60;
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 delay1();
 twi_write (0x84 );//初始化ads1110,14b,连续转换PGA=1
 lcdon ( );
 lcd_work ( );
  for(ibc=0;ibc<12;)
   {
      while(!(time_sign & 0x10));
	  cj1();
	  ibc++;
   }
 while (1)
 {            
     key_work () ;
	 cj ();
	 js ();
     if (lcd_sign == 1)
          {  lcd_sign = 0;
		     warm1=warmold/1000;
		     warm2=(warmold-1000*warm1)/100;
		     warm3=(warmold-1000*warm1-100*warm2)/10;
		     warm4= warmold-1000*warm1-100*warm2-10*warm3;
		     lcd_work ( );
		   }
     
 }//while
}//mail

⌨️ 快捷键说明

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