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

📄 main._c

📁 EPPROM应用,测试程序,AVR内核,供初学者参考
💻 _C
字号:
//**************************************************
//project              :SPEED TO POWER SWITCH
//chiptype             :ATMEGA48
//Clock frequency      :8.00000MHZ
//Author               :XIEHELI
//From                 :HORN
//**************************************************
#include<iom48v.h>
#include<macros.h>
#define u08 unsigned char
#define u16 unsigned int
#define u32 unsigned long
#pragma interrupt_handler Icp_time0:17
#pragma interrupt_handler Int0:2
void sendData(u08 cbit);
void delay(u08 tick);
void port_init(void);
void time_init(void);
void delayms(u08 time);
void delays(u08 time1);
u16 speed_test(void);
void eeprom_write(u16 adrw,u08 add);
u08 eeprom_read(u16 adrr);
//u16 data;
u16 data_temp1;
u16 data_temp2;
//u08 number;
void main(void)
{
    u08 temp;
	//u08 temp1;
	u16 ep_temp;
	u08 speed1;
	u08 speed2;
	u08 ep_temp1;
	u08 ep_temp2;
	u16 speed_temp;
	u16 speed_temp1;
	u08 flag;
	u08 deciMeter;
	u16 timeBlock=111;
	//u08 num_temp1;
	//u08 num_temp2;
	//u08 temp3;
	//u08 temp2;
	flag=0x00;
    port_init();                       //I/O口初始化
	time_init();
	//temp1=0;
	speed_temp=0;
    SREG|=0x80;
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	NOP();
	while(1)
	{	 
		temp=0; 
		//delayms(10);
		//delays(50);
		delay(255);
	    delay(26);
	    while((0x10&0x10)&&(++timeBlock<896));//计算距离,将距离和数据对应
	    deciMeter=(u32)timeBlock*15*18/9300;
		while(temp<=100)
		{
		    sendData(0x37);
		}
	    while((PIND&0x20)&&(temp<=100))//判断按键是否按下1s,设定车速信号
		{
		    //temp=50;
		    delayms(10);			
			temp++;              //speed=speed_test(); //测定车速信号
			if((PIND&0x20)&&(temp==99))
			{
			    speed_temp=data_temp2;   //测定车速信号
			    speed_temp1=speed_temp;
				speed1=(u08)(speed_temp&0x00ff);
				speed2=(u08)(speed_temp1>>8);
			    SREG=0x00;
			    eeprom_write(0x0025,speed1);//将用户设定车速写进EEPROM
				//delayms(20);
				eeprom_write(0x0026,speed2);
				temp=111;
				SREG|=0x80;
			}
			else
			NOP();
		}
		SREG=0x00;		
		ep_temp1=eeprom_read(0x0025);//读取EEPROM中用户设定的车速
		//delayms(20);
		ep_temp2=eeprom_read(0x0026);
		SREG|=0x80;		
		ep_temp=(ep_temp2<<8)+ep_temp1;	
		speed_temp=data_temp2;             //调用测定车速信号
		sendData(ep_temp2);
		delays(1);
	}
}
void port_init(void)
{
    DDRB=0x10;
	DDRC=0x02;
	DDRD=0x00;
	PORTC=0x00;
	PORTB=0x00;
	PORTD=0x00;
}
void time_init(void)
{
	TCCR0A=0x00;
	TCCR0B=0x03;
	TIMSK0=0x01;
	TIFR0=0x01;
	TCNT0=0xc0;
	EICRA=0x01;
	EIMSK=0x01;
	EIFR=0x01;
}
void eeprom_write(u16 adrw,u08 add)
{
    /* 等待上一次写操作结束 */
    while(EECR & (1<<EEPE));
    /* 设置地址和数据寄存器 */
    EEAR=adrw;
    EEDR=add;
    /* 置位EEMWE */
    EECR|=(1<<EEMPE);
    /* 置位EEWE 以启动写操作E */
    EECR|=(1<<EEPE);
}
u08 eeprom_read(u16 adrr)
{
    /* 等待上一次写操作结束 */
    while(EECR & (1<<EEPE));
    /* 设置地址寄存器 */
    EEAR=adrr;
    /* 设置EERE 以启动读操作 */
    EECR|=(1<<EERE);
    /* 自数据寄存器返回数据 */
    return EEDR;
}
void delay(u08 tick)
{
    while(--tick);
}
void delayms(u08 time)
{
    u08 tim1,i;
	tim1=time;
	for(i=0;i<tim1;i++)
	{
	    delay(50);
	}
}
void delays(u08 time1)
{
    u08 tim2,j;
	tim2=time1;
	for(j=0;j<tim2;j++)
	{
	    delayms(250);
	}
}
void Icp_time0(void)
{
    SREG=0x00;
    TIFR0=0x01;
	data_temp2=data_temp1;
	data_temp1=0x0000;
	TCNT0=0xc0;
	SREG|=0x80;
}
void Int0(void)
{
    //SREG=0x00;
    data_temp1++;	
	//SREG|=0x80;
}
void sendData(u08 cbit)
{
    u08 k;
	u08 hbit;
	//hbit=0x01;
	PORTC=0x02;
	delay(180);
	PORTC=0x00;
	delay(15);
	//delay(26);
	//PORTB=0x08;
	//buz(cbit);
	for(k=0;k<8;k++)
	{
	   hbit=(cbit&0x80);
	   if(hbit)
	   {  
	      PORTC=0x02;
	      delay(16);
		  PORTC=0x00;
		  delay(50);
		  //PORTB=0x00;
	   }
	   else
	   {
	      PORTC=0x02;
	      delay(50);
		  PORTC=0x00;
		  delay(16);
		  //PORTB=0x00;
	   }
	   cbit<<=1;
	}
	//buz(cbit);
}

⌨️ 快捷键说明

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