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

📄 carxh.c

📁 汽车的里程表信号发生器,支持正弦波和方波,按键切换,遥控控制,十分方便!
💻 C
字号:
//
#include <iom8v.h>
#include <macros.h>

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long



#define   ky   (PINC & 0x1)==0x0   //pc0
//ad输入为pc2

#define   adjs (ADCSRA & 0x10)==0x10
#define   jsbzc ADCSRA|=0x10 

#pragma data:data
uchar hmjs,mjs,fjs,mbz,nmjs,nmbz;
uchar bxjs;
uint pinl;
static uchar xh[32];

 for (i=1;i<2000;i++)
        WDR(); 
}

void delay(unsigned int n)
{
 unsigned int i=0;
 while (i<n)
    {
     delay_1ms();
	 i++;
     WDR();
    }
}

//Watchdog initialize
// prescale: 2048K
void watchdog_init(void)
{
 WDR(); //this prevents a timout on enabling
 WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
}

//TIMER2 initialize - prescale:1024
// WGM: Normal
// desired value: 1Hz
// actual value: Out of range
void timer2_init(void)     //秒信号产生
{
 TCCR2 = 0x00;   //stop
 ASSR  = 0x00;   //set async mode
 TCNT2 = 0x35c;  //INVALID SETTING
 OCR2  = 0x00;   //INVALID SETTING
 TCCR2 = 0x07;   //start 1024
}


 TCCR1A = 0x00;
 TCCR1B = 0x01; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
 TCNT1 =pinl; 
 PORTD=xh[bxjs];
 bxjs++;
 if (bxjs>31) bxjs=0;
}

void init_devices(void)  //外部4mhz ckopt=空,CKSEL3-1=空
{
 CLI(); //disable all interrupts
 port_init();
 watchdog_init();
 timer1_init();
 timer2_init();
 TIMSK =(1<<TOIE1)|(1<<TOIE2); //中断控制
 SEI(); //re-enable interrupts
}

//dz=0-512 
void epwr(uint uaddr,uchar udata)
{
 while (EECR & (1<<EEWE)); //等待前一次写操作完成  
 EEAR=uaddr;               //写地址到EEAR寄存器
 EEDR=udata;               //写数据到EEDR寄存器
 EECR|=(1<<EEMWE);         //写EEMWE位,允许操作
 EECR|=(1<<EEWE);          //写EEWE位,开始写操作
}
 
uchar eprd(uint uaddr)
{
 while (EECR & (1<<EEWE)); //等待前一次写操作完成  
 EEAR=uaddr;               //写地址到EEAR寄存器
 EECR|=(1<<EERE);          //写EERE位,开始读操作
 return EEDR;
}

void main()
{ 
  uchar j,sa,sb,sc,sd,bz,pobz,dssj,dsbz;
  uint ia,ib,ic,id,ie,pinp;
  init_devices();
  jk1l;
  jk2l;
  jk3l;
  fmql;
  led1h;
  led2h;
  dsbz=0;
  sa=eprd(10);
  if (sa>1000)
    {
     sa=500;
	 epwr(10,sa);
	} 
  pinp=sa;
  pinl=0xff00;
  bz=eprd(12);
  if (bz==1)
	{
     for (j=0;j<32;j++)
       xh[j]=fang[j];
	 led2l;  
	}
  else
    {
     for (j=0;j<32;j++)
       xh[j]=zheng[j];
	 led2h;  
    }
  	
loop:
  WDR();
  if (nmbz==1 && pobz==1)
    {
	 nmbz=0;
     fmqh;  
	 delay(18);  
     fmql;  
    }

  if (ind)  //定时键 
    {
	 if (dsbz==2)
	   {
	    dsbz=3;
	    dssj=180;
	   }
	 if (dsbz==1)
	   {
	    dsbz=2;
	    dssj=120;
	   }
	 if (dsbz==0)
	   {
	    dsbz=1;
	    dssj=60;
	   }
	 for (j=0;j<dsbz;j++)
	   {
        fmqh;  
	    delay(246);  
        fmql;  
	    delay(128);  
	   }  
     pobz=1;
     jk2h;
     if (bz==1) jk3l;  
     else       jk3h;  
	 fjs=0;
	 led1l;
    }
	
  if (dsbz!=0) jk1h;
  else jk1l;	
  if (fjs>=dssj && dsbz==1) 
    {
	 led1h;
	 led2h;
     pobz=0;
     jk2l;
     dsbz=0;
	} 

  if (pvin) 
    {
	 led1h;
	 led2h;
     pobz=0;
     jk2l;
     dsbz=0;
	} 
  
  if (inb && pobz==1) //频率加
    {
     if (pinp<1000)  pinp=pinp+1;
     fmqh;  
	 delay(46);  
	 sa=pinp;
	 epwr(10,sa);
 	 fmql;
    }
  if (inc && pobz==1) //频率减
    {
     if (pinp>1)  pinp=pinp-1;
	 fmqh;  
	 delay(46);  
	 sa=pinp;
	 epwr(10,sa);
 	 fmql;
    }

  if (ina) //电源开关
    {
	 if (pobz==1)
	   {
	    pobz=0;
        jk1l;
        jk2l;
        jk3l;
		dsbz=0;
		led1h;
		led2h;
	   }
     else
	   {
	    pobz=1;
        jk2h;
        if (bz==1) jk3l;  
        else       jk3h;
		led1l;
        if (bz==1) led2l;  
        else       led2h;  
	   }
	 fmqh;  
	 delay(46);  
	 while (ina) WDR();
	 fmql;
	}

  if (ky && pobz==1)  //波形切换
    {
	 if (bz==0)
	   {
	    bz=1;
        for (j=0;j<32;j++)
        xh[j]=fang[j];
		jk3l;
		led2l;  
	   }
     else
	   {
	    bz=0;
        for (j=0;j<32;j++)
        xh[j]=zheng[j];
		jk3h; 
		led2h; 
	   }
	 epwr(12,bz);
	 fmqh;  
	 delay(246);  
	 while (ky) WDR();
	 fmql;
	} 

  ia=pinp;
  if (ia>1024) ia=1024;
  ib=ia*2;
  sa=pinlv[ib++];
  sb=pinlv[ib];
  ic=sa;
  ic=ic<<8;
  ic=ic|sb;
  pinl=ic;
goto loop;
}

⌨️ 快捷键说明

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