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

📄 mainkey.c

📁 2005年吉林省电子大赛一等奖的全部代码
💻 C
字号:
//ICC-AVR application builder : 2005-4-11 12:45:38
// Target : M16
// Crystal: 8.0000Mhz

#include <iom16v.h>
#include <macros.h>
#include "DS18B20.h"
#include "7279.h"



//*****变量声明*******
const unsigned char table[]="0123456789ABCDEF";
unsigned char DS18B20[9]={0,0,0,0,0,0,0,0,0};
unsigned char sec_count[4]={0,0,0,0x0f};
unsigned char DisplayTable[4]={0,0,0,0};
unsigned char RateDisplay[2]={0,0};
unsigned char key_dis[5]={0,0,0,0x0f,0x0f};
unsigned int RateBuff[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned int RateBuff_to80[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned char RateDisplay_to80[2]={0,0};

unsigned char *asc2p,*RateDis;

unsigned int value_temp;

unsigned int init_temper;
unsigned int Occupy_delay,Sum_value;
unsigned int Open,Close;
unsigned int FirstValue=0;
unsigned int Begin_value,ave_hot=0;
unsigned int Begin_valueTo80=800;

unsigned char flag_cal=1;
unsigned char flag_beginValue=1;
unsigned char RateCount=0;
unsigned char count=0;
unsigned char flag_sec=0;
unsigned char testcount=0;
unsigned char BuffCount=0;
unsigned char key_number=0;
unsigned char key_temp=0;
unsigned char flag_key=0;
unsigned char normal_hot=0;
unsigned char average_hot=0;
unsigned char flag_dis=1;
unsigned char flag_disTo80=1;
unsigned char rate_min=0;
unsigned char RateCountTo80=0;
unsigned char BeforeCountTo80=0;
unsigned char BuffCountTo80=0;
unsigned char flag_secDis=1;
unsigned char flag_hot=0;
unsigned char flag_warn=0;



void port_init(void)
{
 PORTA = 0x01;
 DDRA  = 0x07;
 PORTB = 0x00;
 DDRB  = 0x07;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
}

//TIMER1 initialize - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 1Sec
// actual value:  1.000Sec (0.0%)
void timer1_init(void)
{
 TCCR1B = 0x00; //stop
 TCNT1H = 0xE3; //setup
 TCNT1L = 0xE1;
 OCR1AH = 0x1C;
 OCR1AL = 0x1F;
 OCR1BH = 0x1C;
 OCR1BL = 0x1F;
 //OCR1CH = $OCR1CH$;
 //OCR1CL = $OCR1CL$;
 ICR1H  = 0x1C;
 ICR1L  = 0x1F;
 TCCR1A = 0x00;
 TCCR1B = 0x05; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
 CLI();               //关中断
if(normal_hot)
{
 if(RateCount==60)     //判断是否60秒
  {
    if(value_temp<=800)//判断是否到50度
	 {
	  //if(flag_cal)
      //{
       RateBuff[BuffCount]=value_temp-Begin_value;
	   Begin_value=value_temp;
	   BuffCount++;
       RateCount=0;
     // }
	 }
    else
     {
	   //flag_cal=0;
       //TCCR1B = 0x00; //Stop Timer
	   flag_dis=0;       //显示设定值标志
	   flag_sec=1;       //读秒显示标志
	   flag_secDis=0;
	 }  
  }
 if(value_temp>800)//判断是否到50度
  {
    flag_sec=1;       //读秒显示标志
    flag_dis=0;       //显示设定值标志
    flag_secDis=0;
  }
 RateCount++;
 if(flag_sec)
  sec_display();
}

if(average_hot)
{
  //flag_sec=0;
  if(RateCountTo80==60)     //判断是否60秒
  {
    if(value_temp<=1280)//判断是否到80度
	 {
	  if(value_temp>Begin_valueTo80)
	  //if(flag_cal)
      {
	   BeforeCountTo80=BuffCountTo80;
       RateBuff_to80[BuffCountTo80]=value_temp-Begin_valueTo80;
	   /*if((RateBuff_to80[BeforeCountTo80]>56)&&(RateBuff_to80[BeforeCountTo80]<40))
	     {
		   PORTA|=(1<<1);  //声报警
		   PORTA|=(1<<2);  //光报警
		   //PORTA&=~(1<<1);  //关声报警
		   //PORTA&=~(1<<2);  //关光报警
		 }
	   if((RateBuff_to80[BeforeCountTo80]<=56)&&(RateBuff_to80[BeforeCountTo80]>=40))
	     {
		   PORTA&=~(1<<1);  //关声报警
		   PORTA&=~(1<<2);  //关光报警
		   //PORTA|=(1<<1);  //声报警
		   //PORTA|=(1<<2);  //光报警
		 }*/
	if((RateBuff_to80[BeforeCountTo80]<=56)&&(RateBuff_to80[BeforeCountTo80]>=40))
	  flag_warn=1;
	else
	  flag_warn=0;
	if(flag_warn)
	 {
	  //PORTA|=(1<<1);
	  //PORTA|=(1<<2);
	  PORTA&=~(1<<1);
	  PORTA&=~(1<<2);
	 }
	else
	 {
	  PORTA|=(1<<1);
	  PORTA|=(1<<2);
	  //PORTA&=~(1<<1);
	  //PORTA&=~(1<<2);
	 }
	   Begin_valueTo80=value_temp;
	   BuffCountTo80++;
       RateCountTo80=0;
      }
	 }
    else
     {
	   //flag_cal=0;
       TCCR1B = 0x00; //Stop Timer
	  //flag_dis=0;
	 }
  }
 RateCountTo80++;
}
 //TIMER1 has overflowed
 TCNT1H = 0xE3; //reload counter high value
 TCNT1L = 0xE1; //reload counter low value

 SEI();
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 timer1_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x04; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}



void main(void)
{

  unsigned char i,j;

  //OSCCAL=0X9F; 
    
  init_devices();      //端口初始化  
  Write_Init();        //18B20初始化 
  
  PORTA&=~(1<<1);
  PORTA&=~(1<<2);
	  
  	send_byte(CMD_RESET);				// 清除显示
	//write7279(BLINKCTL,0xff);           // 清除闪烁设置	 
   
  while(1)
   {
    
    if ((PINB&0x08)==0)					// 如果有键按
      {
		key_number=read7279(CMD_READ);			// 读出键码
		//write7279(DECODE1+1,key_number/16);		// 在第2位显示键码高8位
		//write7279(DECODE1,key_number&0x0f);		// 在第1位显示键码低8位
		switch (key_number)
		{ 
		  case 0x0F:  key_temp=5;  key_display(key_temp); break;//数字键5
		  case 0x0E:  key_temp=6;  key_display(key_temp); break;//数字键6
		  case 0x0D:  key_temp=7;  key_display(key_temp); break;//数字键7
		  case 0x0C:  key_temp=8;  key_display(key_temp); break;//数字键8
		  case 0x0B:  key_temp=9;  key_display(key_temp); break;//数字键9
		  case 0x0A:  Change_sum();                       break;//显示升率
		  case 0x09:  PORTA&=~(1<<1);                     break;//消声
		  case 0x08:  
		              normal_hot=0;average_hot=0;PORTA|=(1<<0);
					  flag_sec=0;PORTA&=~(1<<1);PORTA&=~(1<<2);
					  send_byte(CMD_RESET);TCCR1B = 0x00; break;//复位 
		  case 0x07:  key_temp=0;  key_display(key_temp); break;//数字键0
		  case 0x06:  key_temp=1;  key_display(key_temp); break;//数字键1
		  case 0x05:  key_temp=2;  key_display(key_temp); break;//数字键2
		  case 0x04:  key_temp=3;  key_display(key_temp); break;//数字键3
		  case 0x03:  key_temp=4;  key_display(key_temp); break;//数字键4
		  case 0x02:  
		   init_temper=(key_dis[2]*10+key_dis[1])*16;     break;//设定温度
		  case 0x01:  
		   normal_hot=1;average_hot=0;TCCR1B=0x05;
		   PORTA&=~(1<<1);PORTA&=~(1<<2);                 break;//正常加热
		  case 0x00:  
		   average_hot=1;flag_sec=0;
		   normal_hot=0;TCCR1B=0x05;
		   ave_hot=1280;
		   PORTA&=~(1<<1);PORTA&=~(1<<2);                 break;//匀速加热
		  default :  break;
		}
		while ((PINB&0x08)==0);			// 等待按键放开	
	  }

if(normal_hot)     //正常加热  室温到50度
{ 
	convert_T();
	
  //if((init_temper-1)>=value_temp)
  if(init_temper>=value_temp)
   { 
	Sum_value=init_temper-value_temp;
	if(Sum_value>108)
	{
	 	for(i=0;i<20;i++)
	  {
	 	  PORTA&=~(1<<0);
		  delay_nms(30);
	  }
	}
	//else if(value_temp>
	else
   {
    Occupy_delay=Sum_value/10;
	//Open=(Occupy_delay*280)/100;
	Open=(Occupy_delay*295)/100;
	//Open=Occupy_delay*3;
	Close=30-Open;
	for(i=0;i<20;i++)
	  {
	 	  PORTA&=~(1<<0);
		  delay_nms(Open);
		  PORTA|=(1<<0);
		  delay_nms(Close);
	  }
    }
  }
   else 
   {
    //if(!flag_hot)
   // {
	   for(i=0;i<20;i++)
	     {
	       PORTA|=(1<<0);
		   delay_nms(30);
		 //PORTA&=~(1<<0);
		 //delay_nms(1);
	     }
	  
	  //flag_hot=1;
	//}
	//if(flag_hot)
	//{
	 	// if((value_temp>=800)&&(value_temp<801))
     // {
      //  for(i=0;i<20;i++)
	  //    {
	  //      PORTA|=(1<<0);
		//    delay_nms(29);
		//    PORTA&=~(1<<0);
	//	    delay_nms(1);
	    //  }
	// }
	 //if(value_temp>=801)
	//  { 
	//   for(i=0;i<20;i++)
	  //   {
	  //     PORTA|=(1<<0);
		//   delay_nms(30);
		 //PORTA&=~(1<<0);
		 //delay_nms(1);
	  //   }
	  }
	//}
 // } 
    turnon();
  if(flag_secDis)
  {
   if(FirstValue)       //第一次转换值不要
    {
	 DS18B20Display();
	 if(flag_beginValue)
	  {
	   Begin_value=value_temp;
	   flag_beginValue=0;
	  }
	 }
	else
	 FirstValue=1;
   }
  }

 if(average_hot)
 {
    convert_T();
	
  if(value_temp<=ave_hot)
   { 
    if(value_temp>=800)
	{	
	  TCCR1B=0x05;
     if(value_temp<824)//小于51.5度
	 {
	   for(i=0;i<20;i++)
	    {  
	      PORTA|=(1<<0);
		  delay_nms(3);
	      PORTA&=~(1<<0);
		  delay_nms(27);
	    }
	 }
	if((value_temp>=824)&&(value_temp<848))//大于51.5小于53
	 {
	   for(i=0;i<20;i++)
	    {  
	      PORTA|=(1<<0);
		  delay_nms(8);
	      PORTA&=~(1<<0);
		  delay_nms(22);
	    }
	 }
	if((value_temp>=848)&&(value_temp<896))//大于53小于56
	 {
	   for(i=0;i<20;i++)
	    {  
	      PORTA|=(1<<0);
		  delay_nms(20);
	      PORTA&=~(1<<0);
		  delay_nms(10);
	    }
	 }
    if((value_temp>=896)&&(value_temp<960))//大于56小于60
	 {
	   for(i=0;i<20;i++)
	    {  
	      PORTA|=(1<<0);
		  delay_nms(14);
	      PORTA&=~(1<<0);
		  delay_nms(16);
	    }
	 }
	 if((value_temp>=960)&&(value_temp<1040))//大于60小于65
	 {
	   for(i=0;i<20;i++)
	    {  
	      PORTA|=(1<<0);
		  delay_nms(15);
	      PORTA&=~(1<<0);
		  delay_nms(15);
	    }
	 }
	 if((value_temp>=1040)&&(value_temp<1120))//大于65小于70 1218
	  { 
	   for(i=0;i<20;i++)
	    {  
	      PORTA|=(1<<0);
		  delay_nms(13);
	      PORTA&=~(1<<0);
		  delay_nms(17);
	    }
	  }
	 if((value_temp>=1120)&&(value_temp<1200))//大于70小于75
	  { 
	   for(i=0;i<20;i++)
	    {  
	      PORTA|=(1<<0);
		  delay_nms(12);
	      PORTA&=~(1<<0);
		  delay_nms(18);
	    }
	  }
	 if((value_temp>=1200)&&(value_temp<1280))//大于75小于80
	  { 
	   for(i=0;i<20;i++)
	    {  
	      PORTA|=(1<<0);
		  delay_nms(11);
	      PORTA&=~(1<<0);
		  delay_nms(19);
	    }
	  }	 
	}
	else
	 {
	  	   for(i=0;i<20;i++)
	    {  
	      PORTA|=(1<<0);
		  delay_nms(2);
	      PORTA&=~(1<<0);
		  delay_nms(28);
	    }
	  }
    }
   
  else
   { 
      for(i=0;i<20;i++)
	    {  
	      PORTA|=(1<<0);
		  delay_nms(30);
	     // PORTA&=~(1<<0);
		 // delay_nms(23);
	    }
	}
    turnon(); 
    DS18B20Display();
   } 
  }
 }


/****温度转换****/

void turnon(void)
{
  unsigned long int turnoff;
  unsigned char i,crc;
  unsigned int  DS18B20_temp;
  
  
    DS18B20_reset();
    DS18B20_write(0xcc);     // 跳过多器件识别
    DS18B20_write(0xbe);     // 读暂存器
	for(i=0;i<9;i++)
	 DS18B20[i]=DS18B20_read();
	asc2p=&DS18B20[0];	
	crc=CRCcheck(asc2p,9);
	delay(3);
	if(crc==0x00)
	{
	 DS18B20_temp=DS18B20[1];
	 DS18B20_temp=DS18B20_temp<<8;
	 DS18B20_temp+=DS18B20[0];
	 value_temp=DS18B20_temp;
	 asc2p=&DS18B20[0];
	}
	turnoff=(unsigned long int)(DS18B20_temp);
	turnoff=(turnoff*10000/16);
    /*for(i=6;i>0;i--)
	{
	 DS18B20[i-1]=table[turnoff%10];
	 turnoff/=10;
	}*/
	for(i=0;i<6;i++)
	{
	 DS18B20[i]=table[turnoff%10];
	 turnoff/=10;
	}
	DS18B20[4]|=0x80;
	//return(value_temp);
	for(i=0;i<4;i++)
	DisplayTable[i]=DS18B20[i+2];
	//delay(2);
  
}
 
/****温度显示****/

void DS18B20Display(void)
{
 unsigned char i,j;
 unsigned int buff_tempTo80;//temp_warn;
 //send_byte(CMD_RESET);			// 复位HD7279A
 for(i=0;i<4;i++)
    write7279(DECODE1+i,DisplayTable[i]);
 if(normal_hot)
  {
   if(flag_dis)   //显示设定值
    for(j=0;j<4;j++)
     write7279(DECODE0+j+4,key_dis[j+1]);
  }
 if(average_hot)
  {
   //if(RateBuff_to80[BuffCountTo80]!=0)
   //{
    buff_tempTo80=(RateBuff_to80[BeforeCountTo80]*10)/16;
	//temp_warn=buff_tempTo80;
	

    for(i=0;i<2;i++)
     {
       RateDisplay_to80[i]=buff_tempTo80%10;
	   buff_tempTo80/=10;
     }
    RateDisplay_to80[1]|=0x80;
    write7279(DECODE1+7,BuffCountTo80);
    for(j=0;j<2;j++)
       write7279(DECODE1+j+4,RateDisplay_to80[j]);
   //}
   //else
   //{
   //  write7279(DECODE1+7,BuffCountTo80);
   //  for(j=0;j<2;j++)
   //    write7279(DECODE1+j,RateDisplay_to80[j]);
   //}
 }	   
}	
/****读秒计数****/
void sec_display(void)
{
 unsigned char i,j;
  {
   count++;
   j=count;
   for(i=0;i<3;i++)
   {
    sec_count[i]=j%10;
	j/=10;
   }
   for(i=4;i<8;i++)
   write7279(DECODE0+i,sec_count[i-4]);
   } 
  for(i=0;i<4;i++)
    write7279(DECODE1+i,DisplayTable[i]);  
}

/*unsigned char switch_T()
{

 //temp_mul=MUL*16;
 Occupy=10*(Sum_value/160);
 //kinds=5/N;
 //ChaZhi=ChaZhi/(N*16);
 //Occupy=kinds*ChaZhi;
 return(Occupy);
}*/
 
/* 
/*******升率运算程序******
void Cal_sum(void)
{
 unsigned char i,j;
 
 for(i=0;i<BuffCount;i++)
  RateCal[i]=RateBuff[i+1]-RateBuff[i];
  RateDis=RateCal;
}
*/

/*******转换程序******/
void Change_sum(void)
{
 unsigned char i,j;
 unsigned int buff_temp;
 if(RateBuff[rate_min]==0xff)
   {
    rate_min=0;
    buff_temp=(RateBuff[rate_min]*10)/16;
    for(i=0;i<2;i++)
     {
       RateDisplay[i]=buff_temp%10;
	   buff_temp/=10;
     }
    RateDisplay[1]|=0x80;
    send_byte(CMD_RESET);				// 清除显示 
    write7279(DECODE1+7,rate_min+1);
    for(j=0;j<2;j++)
       write7279(DECODE1+j,RateDisplay[j]);
   rate_min++;
  }
 else
   {
     buff_temp=(RateBuff[rate_min]*10)/16;
     for(i=0;i<2;i++)
      {
        RateDisplay[i]=buff_temp%10;
	    buff_temp/=10;
      }
     RateDisplay[1]|=0x80;
     send_byte(CMD_RESET);				// 清除显示 
     write7279(DECODE1+7,rate_min+1);
     for(j=0;j<2;j++)
       write7279(DECODE1+j,RateDisplay[j]);
     rate_min++;
   } 
}  

//****************
// 0-9显示程序
//****************
void key_display(unsigned char key_TempValue)
{
  unsigned char i;    
    key_dis[0]=key_TempValue;

	for(i=0;i<2;i++)
      write7279(DECODE1+i+4,key_dis[i]);
	if(flag_key)
	 {
	   key_dis[2]=key_dis[1];
	   key_dis[1]=key_dis[0];
	 }	
	flag_key=1;
}

⌨️ 快捷键说明

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