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

📄 uncode._c

📁 用Mega32改装的4VF遥控设备 我也是从网上下的
💻 _C
字号:
//ICC-AVR application builder : 2006-2-7 20:37:19
// Target : 2313
// Crystal: 8.0000Mhz

#include <io2313v.h>
#include <macros.h>
#include <stdio.h>
#define Uchar unsigned char
#define Uint unsigned int
#define PB PORTB
#define PD PORTD
#define nop() asm("nop")
#define _nop_() asm("nop")
#define INPUT  (PIND&0x40)
#define TimerStart();  TCCR1B = 0x82;
                           //信号下降沿触发
						   

#define WaitHigh();  while(!INPUT){nop();};
                               //只要高电平一出现就向下继续运行
#define WaitLow();  while(INPUT){nop();};
                               //只要高电平一出现就向下继续运行	
#define RESET_TIME  2900
#define MID_TIME  1200						   
#define TOV1F TIFR&0x80
#define TOV1L TIFR|=0x80
					   

Uint HowLong (void)
{Uint a=0;
TCCR1B = 0x00; //stop timer
TCNT1=0;
return(ICR1);
}

void WaitReset (void)
{
while(1)
 {
  WaitLow ();
  WaitHigh ();
  TimerStart();
  WaitLow ();
  if(HowLong()>RESET_TIME)break;
 };
}

void watchdog_init(void)
{
 WDR(); //this prevents a timout on enabling
 WDTCR = 0x0A; //WATCHDOG ENABLED - dont forget to issue WDRs
}

void timer1_init(void)
{
 TCCR1B = 0x00; //stop timer
 TCNT1H = 0x00 /*INVALID SETTING*/; //set count value
 TCNT1L = 0x00 /*INVALID SETTING*/;
 OCR1H  = 0x00; //set compare value
 OCR1L  = 0x00;
 TCCR1A = 0x00;
}


void port_init(void)
{
 PORTB = 0x00;
 DDRB  = 0xFF; 
 PORTD = 0x00;
 DDRD  = 0x3F; 
}

//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;
 GIMSK = 0x00;
 TIMSK = 0x00;
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

main()
{
Uchar sw_counter=10;//数据在开关通道的位号码//10的作用:刚开机开关信号不稳定,这时的数据是未知的,等待一个复位信号后方可使用
Uchar sw_estate;//开关通道数据的位状态
Uchar error=0;//是否存在错误帧
  //说明:如果是错误帧造成的break,那么接下来的开关数据也是未知的,必须等待一个复位信号
Uint temp;//定时器缓寸
Uchar sw_reset=0;
watchdog_init();//打开狗
WaitReset ();
WDR();//喂狗
while(1)//1
{
if(error)sw_counter=10;//错误处理,防止产生一连串错误开关信号输出
while(1)//2
{ //通道1
  WaitHigh ();
  TimerStart();
  PD|=0x01; 
  WaitLow ();
  PD&=(~0x01);
  if(HowLong()>RESET_TIME){error=1;break;}
  
  //通道2
  WaitHigh ();
  TimerStart();
  PD|=0x02;
  WaitLow ();
  PD&=(~0x02);
  if(HowLong()>RESET_TIME){error=1;break;}

  //通道3
  WaitHigh ();
  TimerStart();
  PD|=0x04;
  WaitLow ();
  PD&=(~0x04);
  if(HowLong()>RESET_TIME){error=1;break;}
 
  //通道4
  WaitHigh ();
  TimerStart();
  PD|=0x08;
  WaitLow ();
  PD&=(~0x08);
  if(HowLong()>RESET_TIME){error=1;break;}

  //通道5
  WaitHigh ();
  TimerStart();
  PD|=0x10;
  WaitLow ();
  PD&=(~0x10);
  if(HowLong()>RESET_TIME){error=1;break;}

  //通道6
  WaitHigh ();
  TimerStart();
  PD|=0x10;
  WaitLow ();
  PD&=(~0x10);
  if(HowLong()>RESET_TIME){error=1;break;}
  
  //开关数据通道
  WaitHigh ();
  TimerStart();
  WaitLow ();
  temp=HowLong();
  if(temp>RESET_TIME){error=1;break;}
  if(temp>MID_TIME)sw_estate=1;else sw_estate=0;
  
  //开关复位信号通道
  WaitHigh ();
  TimerStart();
  WaitLow ();
  temp=HowLong();
  if(temp>RESET_TIME){error=1;break;}
  if(temp>MID_TIME)sw_reset=1;else sw_reset=0;
  sw_counter++;
  
  
  WaitHigh ();
  TimerStart();//利用复位时间长,输出开关信号
  if(sw_counter<8)
  if(sw_estate)PB|=(1<<sw_counter);else PB&=(~(1<<sw_counter));
  if(sw_reset)
  sw_counter=255;
  WDR();
  WaitLow ();
  if(HowLong()>RESET_TIME)break;
  
}//while(1)2
}//while(1)1









}//main()

⌨️ 快捷键说明

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