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

📄 12864h.txt

📁 用AVR芯片
💻 TXT
📖 第 1 页 / 共 2 页
字号:
           dat=t5x8[(da-0x20)*5+i];
           disp(col_x+i,dat,3);
          }
       }
   else
      {
         for(i=0;i<5;i++)
             {
             ctrl(yy,0); 				//set page address
             ctrl(yy,1); 				//set page address
             temp=t5x8[(da-0x20)*5+i];
             dat=temp<<a;
             disp(col_x+i,dat,3);
             ctrl(yy+1,0); 				//set page address
             ctrl(yy+1,1); 				//set page address
             dat=temp>>(8-a);
             disp(col_x+i,dat,3);
             }
         }
}      */
//========================================
//
//=======================================
 void scroll_up()
 {
 }

//====================================
//
//====================================
void write_text(uchar dat)
{
 uchar temp,temp1;
 temp=column*6; 
 temp1=row*8;  
// wtext8x8(temp,temp1,dat,3);
}

//===============================================
 //==== move cursor one character left ==========
 //===============================================
  void cursor_left()
  {
 if(column==0)
    {
     if(row!=0)
        { row--,column=21 ;}
    }
 else
    {column--;}
    wtext8x8(cursor,1);// write_text(cursor);
 }

 //===============================================
 //==== move cursor one character right ==========
 //===============================================
 void cursor_right()
  {
    column++;
    if(column>20)   //判列是否超出范围
        {
        row++;
        column=0;
        if(row>7)    //判行是否超出范围
            {
            if(autoscroll==1)    //超出范围,判是否卷动显示
               {
                scroll_up();                 //卷动显示
                column=0,row=7;          // display_line-1
                }
            else {row=0;}               //行返回第一行
            }
         }
    wtext8x8(cursor,1);//write_text(cursor);
  }

//=============================================
void EEPROM_write(uint addr, uchar dat)
{
 while(EECR & (1<<EEWE)); 	// 等待上一次写操作结束
 EEAR = addr;				// 设置地址和数据寄存器
 EEDR = dat;
 EECR |= (1<<EEMWE);		// 置位EEMWE //
 EECR |= (1<<EEWE);			// 置位EEWE 以启动写操作
}

//=====================================
uchar EEPROM_read(uint addr)
{
	while(EECR & (1<<EEWE)); 	// 等待上一次写操作结束 
	EEAR = addr;				// 设置地址寄存器
	EECR |= (1<<EERE);			// 设置EERE 以启动读操作
	return EEDR;				// 自数据寄存器返回数据 
}


//==============================

void mcu_init()
{
    PORTA=0xff;
	DDRA=0xff;
   pdout=0xff;
	DDRB=0xff;
	pdout=0xff;
	DDRB=0xff;
	pcont=0xff;
	DDRC=0xff;
	pcont1=0xff;
	DDRD=0xff;
}

//==================================
//SPI初始化
//===============================
/*
 DDRB=0x2C;     //PB口初始化
    SPCR=0x53;     //SPI初始化,主机模式,时钟7.8.3K,时钟相位0度,极性Low,数据方向MSB
    while (1)      //循环函数
      {
        data=170;
        spi (data);//从spi口输出数据函数
        DDRC=255;
        PORTC=255;
        PORTC=0;
      };
*/
//===================================
//采用timer2 产生波形
// PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))
//===================================
void timer2_init()
{
  TCCR2 = 0x00; //stop
  TCNT2= 0x01; //set count
  OCR2 = pwmbuf; //set compare
  TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x01; // start timer 快速pwm模式,匹配清零,溢出置位 8分频
//占空比=高:低为OCR2-0X01)/(0XFF-OCR2)   OX01++++++(OCR2)__________OXFF (+表示输出高,_表示输出低)
//即OCR2越大,输出越大
}    
//========================================
//电压检测初始化
//===========================================
void Init_ADC(void)
{
 ADMUX=0x47;  //参考电压为 AVCC,转换结果左对齐 选择第七通道ADC7;
 ADCSRA=0xe6;  //125K转换速率,自由转换模式;启动AD转换器;
}
                 
//=====================================
//A/D转换采样电压值
//===================================
//参数说明:
//Channel:0 A点电压采样;1:B点电压采样;2:A、B电压差值
//返回值:电压采样值或者A、B点采样差值
uint ADC_Convert(void)
{
 uint temp1,temp2;
 delay(4);
 temp1=(uint)ADCL;
 temp2=(uint)ADCH;
 temp2=(temp2<<8)+temp1;
 return(temp2);
}
/*
uint temp1,temp2;
delay(4);
 temp1=(uint)ADCL;
 temp2=(uint)ADCH;
 temp2=(temp2<<8)+temp1;
 return(temp2);
*/

//====================================
 //分解2位16进制数据
 //=======================================
 void read16db(uint da)
 {
 // uchar i,ii;
	//	datbuf1=strcmp_P leddat[(uchar)(da&0x000f)];
         datbuf4=pgm_read_byte(&leddat[(uchar)(da&0x000f)]);
         da=da>>4;
		 datbuf3=pgm_read_byte(&leddat[(uchar)(da&0x000f)]);
         da=da>>4;
		 datbuf2=pgm_read_byte(&leddat[(uchar)(da&0x000f)]);
         da=da>>4;
         datbuf1=pgm_read_byte(&leddat[(uchar)(da&0x000f)]);
/*  for (i=0;i<4;i++)
         {
         ii=3-i;
         datbuf[ii]=leddat[(uchar)(da&0x000f)];
         da=da>>4;
         } */
 }        
//======================================
//
//=======================================
void display_16()
{
// uchar i;
  wtext8x8(datbuf1,3);
  cursor_right();
  wtext8x8(datbuf2,3);
  cursor_right();
  wtext8x8(datbuf3,3);
  cursor_right();
  wtext8x8(datbuf4,3);
  cursor_right();
 /*
 for (i=0;i<4;i++)
         {
         wtext8x8(datbuf[i],3);//write_text(datbuf[i]);
         cursor_right();
         }*/

}

//=============================================
// 检测电压即获得ADC转换值 转换通道ADC7
//=============================================
uint work_adc7(void)
{
    uchar i;
	uint ret;
	uchar max_id,min_id,max_value,min_value;
	//ADMUX=0x47;							//内部AVCC参考电压,通道7
	ADMUX=0x43;
	ADCSRA=_BV(ADEN);					//使能ADC,单次转换模式
						
	for(i=0;i<8;i++)			//连续转换8 次
			{
			ADCSRA|=_BV(ADSC);
			_delay_loop_1(60);
			while(ADCSRA&_BV(ADSC))
			_delay_loop_1(60);
			ret=ADCL;
			ret|=(uint)(ADCH<<8);
			g_aAdValue[i]=ret;
			}
	ret=0;
	for(i=1;i<8;i++)
	ret+=g_aAdValue[i];
						//找到最大和最小值索引
	ret/=7;
	max_id=min_id=1;
	max_value=min_value=0;
	for(i=1;i<8;i++)
			{
			if(g_aAdValue[i]>ret)
					{
					 if(g_aAdValue[i]-ret>max_value)
								{
									max_value=g_aAdValue[i]-ret;
									max_id=i;
								}
					}
			else
					{
					if(ret-g_aAdValue[i]>min_value)
								{
									min_value=ret-g_aAdValue[i];
									min_id=i;
								}
					}
			}
									//去掉第一个和最大最小值后的平均值
	ret=0;
	for(i=1;i<8;i++)
			{
				if((i!=min_id)&&(i!=max_id))
				ret+=g_aAdValue[i];
			}
	if(min_id!=max_id){ret/=5;}
	else {ret/=6;}

   ADCSRA=0;//关闭ADC
   return ret;
}

//==========================
int main()
{
 uchar i;
 uchar led=0;
 uint temp,temp1;
 delay(1);
 column=0,row=0;	
 mcu_init();
 pwmbuf=0x62;
 timer2_init(); //驱动LCD对比度
 lcd_init();
 for(;;)
    {
	 for(i=0;i<8;i++)
	       {
			
  			PORTA=0xf0;  //11110000  PA4=1,PA1=0
  			DDRA=0xf0;   //
  			delay(255);
  			column=0,row=i;
  			temp=work_adc7();
  			read16db(temp);
  			display_16();
  			PORTA=0xff;  //常温
  			DDRA=0xff;
  			delay(255);

			PORTA=0xE2;  //11100010  PA4=0,PA1=1
     		DDRA=0xE2;
     		temp1=work_adc7();
     		read16db(temp1);
     		column=8,row=i;
     		display_16();	
     		PORTA=0xff;  //NTC
     		DDRA=0xff;
  			delay(255);
			column=14,row=i;
            if(temp<temp1){temp=(temp1-temp);}
			else 
				{
				wtext8x8(0x2d,3);
				cursor_right();
				temp=(temp-temp1);
				}
			read16db(temp);
       		display_16();
		   }
		   delay(255);
	delay(255);
	delay(255);
	delay(255);
	delay(255);
	delay(255);
	delay(255);
	delay(255);
     
	}
	delay(255);
	delay(255);
	delay(255);
	delay(255);
}
/*
 PORTA=0xE2;  //11100010  PA4=0,PA1=1
 DDRA=0xE2;
  
  example=work_adc7();
  read16db(example);
  column=8,row=0;
  display_16();	
  PORTA=0xff;  //11110000  PA4=1,PA1=0
  DDRA=0xff;
delay(255);
 PORTA=0xf0;  //11110000  PA4=1,PA1=0
 DDRA=0xf0;
 delay(255);
 column=0,row=0;
 example=work_adc7();
 read16db(example);
 display_16();
 PORTA=0xff;  //11110000  PA4=1,PA1=0
 DDRA=0xff;
 delay(255);
  
 // Init_ADC();                 //ADC初始化
 

 

  column=0,row=1;
  delay(255);
  for(i=0;i<35;i++)
           {
           wtext8x8(i+0x21,3);
           cursor_right();
		   delay(255);
	      }
      cursor_right();

  
 //Voltage_A=ADC_Convert(0);     //采样A点电压
// Voltage_B=ADC_Convert(1);     //采样B点电压
// Voltage_Diff=ADC_Convert(2);  //计算AB点电压采样差值

pwmbuf=0x45;
 
 for(i=0;i<8;i++)
     {
     pwmbuf=pwmbuf+4;  //加16,电压升0.31V
     timer2_init();
     delay(255);
	 delay(255);
	 }

DDRB=0xff;
while (1)
{
if(led)
{
//pcont=(1<<cs1);
PORTB|=0X01;
   }
else
PORTB&=0XFE;
led=!led;
//延时

}
}
*/

⌨️ 快捷键说明

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