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

📄 atmega8.c

📁 这是本人调试成功的遥控程序
💻 C
字号:
#include <iom48v.h>
#include <macros.h>
#include <STDIO.H>
#include <eeprom.h>
typedef unsigned  int  unint;
typedef unsigned  char uchar;
typedef unsigned  long ulong;
union User_Data_Type
{
  uchar CharType[2];
  unint IntType;
};
#define Fosc           4        //晶振频率
#define BAUD           19200    //波特率
#define MAX_FADE_LEVEL 255      
#define Remot_pin      (PINC&0x04)
uchar led_display_count;
uchar led_display_data[3];
uchar flag;
unint remote_count_min=0xffff;
unint remote_count_max;
uchar receive_data[3],receive_data_buff[3];
uchar con_count1,con_count2,con_count3,check_con;
uchar auto_run_count[3];
uchar color_value;
uchar auto_mode;
/*===========================================================================*/
void led_scan(void)//LED显示刷新,共50个时钟周期50x0.0625=3.125us
{                                         
  led_display_count++;                    
  if(led_display_count>=MAX_FADE_LEVEL)   
    led_display_count = 0;               
  else
    {_NOP();_NOP();_NOP();_NOP();_NOP();}
  if(led_display_count<led_display_data[0])
    PORTC &= ~0x08;                        
  else
    {PORTC |= 0x08;_NOP();}
  if(led_display_count<led_display_data[1])
    PORTC &= ~0x10;                        
  else
    {PORTC |= 0x10;_NOP();}
  if(led_display_count<led_display_data[2])
    PORTC &= ~0x20;                        
  else
    {PORTC |= 0x20;_NOP();}
}                                          

//*************************************************************
void auto_run(void)
{ //主程序延时大约100us
  switch(auto_mode)
  {
    case 0x02:
      if(++auto_run_count[0] == 0x05)
      {
    case 0x01:
        auto_run_count[0] = 0;
        if(++auto_run_count[1] == 0x64)
        {
          auto_run_count[1] =0;
          if(++auto_run_count[2] == 0x64)
          {
            auto_run_count[2] = 0;
            switch(color_value)
            {
              case 0x01:
                led_display_data[0] = MAX_FADE_LEVEL;
                led_display_data[1] = 0x00;
                led_display_data[2] = 0x00;
                color_value++;
                break;
              case 0x02:
                led_display_data[0] = MAX_FADE_LEVEL;
                led_display_data[1] = MAX_FADE_LEVEL;
                led_display_data[2] = 0x00;
                color_value++;
                break;
              case 0x03:
                led_display_data[0] = 0x00;
                led_display_data[1] = MAX_FADE_LEVEL;
                led_display_data[2] = 0x00;
                color_value++;
                break;
              case 0x04:
                led_display_data[0] = 0x00;
                led_display_data[1] = MAX_FADE_LEVEL;
                led_display_data[2] = MAX_FADE_LEVEL;
                color_value++;
                break;
              case 0x05:
                led_display_data[0] = 0x00;
                led_display_data[1] = 0x00;
                led_display_data[2] = MAX_FADE_LEVEL;
                color_value++;
                break;
              case 0x06:
                led_display_data[0] = MAX_FADE_LEVEL;
                led_display_data[1] = 0x00;
                led_display_data[2] = MAX_FADE_LEVEL;
                color_value = 9;
                break;
              case 0x09:
                led_display_data[0] = MAX_FADE_LEVEL;
                led_display_data[1] = MAX_FADE_LEVEL;
                led_display_data[2] = MAX_FADE_LEVEL;
                color_value = 0;
                break;
              default:
                color_value = 1;
                break;
            } 
          }
        }
      }
      break; 

//**************************************************************
case 0x04://Smooth
      if(++auto_run_count[0] == 0x08)
      {
        auto_run_count[0] = 0;
    case 0x03
        if(++auto_run_count[1] == 0x64)
        {
          auto_run_count[1] = 0;
          flag |= 0x04;
          switch(color_value)
          {
            case 0x00:
              if(++led_display_data[0] >= MAX_FADE_LEVEL)
                color_value ++;
              break;
            case 0x01:
              if(++led_display_data[1] >= MAX_FADE_LEVEL)
                color_value ++;
              break;
            case 0x02:
              if(--led_display_data[0] == 0x00)
                color_value ++;
              break;
            case 0x03:
              if(++led_display_data[2] >= MAX_FADE_LEVEL)
                  color_value ++;
              break;
            case 0x04:
              if(--led_display_data[1] == 0x00)
                color_value ++;
              break;
            case 0x05:
              if(++led_display_data[0] >= MAX_FADE_LEVEL)
                color_value ++;
              break;
            case 0x06:
              if(--led_display_data[2] == 0x00)
                color_value ++;
              break;
            case 0x07:
              if(++led_display_data[1] >= MAX_FADE_LEVEL)
                color_value ++;
              break;
            case 0x08:
              if(++led_display_data[2] >= MAX_FADE_LEVEL)
                color_value ++;
              break;
            case 0x09:
              if(--led_display_data[1] == 0x00)
                color_value ++;
              break;
            case 0x0A:
              if(--led_display_data[2] == 0x00)
                color_value = 1;
              break;
            default:
              color_value = 0;
              break;
          }
        }
      } 
break;
    default:
   auto_mode = 3;
      break;
  }
}
/*===========================================================================*/
void init_remote(void)//初始化无线遥控,检测振荡频率
{                     
  unint temp;
  uchar i=0;
  if(!Remot_pin)      //无线接收脚是为低,有信号
  {
init_remote_flag:
    while(Remot_pin)  //等待无线接收脚是为低
   led_scan();
    for(temp = 0;temp<6400;temp++)//延时大约6400*3.125=20000us
    {
      led_scan();     
      if(Remot_pin)
      {
        if(temp<64)   //如果小于大约64*3.125=200us,为干扰,返回
          return;
        if(++i>60)    
        {
          flag |= 0x01;
          remote_count_min += remote_count_min>>1;
          remote_count_max = remote_count_max>>3;
          return;
        }
        if(temp<remote_count_min) 
          remote_count_min = temp;
        else if(temp>remote_count_max)
          remote_count_max = temp;//最大时间
        goto init_remote_flag;    //重新开始计数检测
      }   
    }     
  }   
  else
    auto_run();     
} 

uchar remote_decode(void)//无线遥控解码
{
  uchar i,j;
  unint temp;
  if(!Remot_pin)      //无线接收脚是为低,有信号
  {
    for(i=0;i<64;i++)//延时64*3.125=200us看是否干扰
    {
      led_scan();
      if(Remot_pin)
        return 0;      
    }
    while(!Remot_pin)//等待高电平
      led_scan();
    while(Remot_pin) //等待低电平
      led_scan();
    for(temp=0;temp<remote_count_max;temp++)
    {                               
      led_scan();                   
      if(Remot_pin)
        return 0;        
    }
    receive_data_buff[0]=receive_data_buff[0]=receive_data_buff[0]=0;
    for(i=0;i<3;i++)                            //检测到同步头,接收24位数据
    {
      for(j=0;j<8;j++)
      {
        while(!Remot_pin)                       //等待高电平,等待同步头结束
          led_scan();
receive_flag:
        while(Remot_pin)                        
          led_scan();    
        for(temp=0;temp<remote_count_min;temp++)
        {
          led_scan();  
          if(Remot_pin)                        
          {
            receive_data_buff[i] |= 1<<j;     
            goto receive_flag;
          }
        }                                     
      }
    }
 if(receive_data[0]==receive_data_buff[0]&&receive_data[1]==receive_data_buff[1]&&receive_data[2]==receive_data_buff[2])
 {
      if(++check_con>5)//连续检测到5次数据相同认为是连按
     flag |= 0x02;  //连按标志置位
 }
 return 1;
  }
  return 0;
} 

//****************************************************************
void remote_cont(void)//连按处理程序
{  
}
void remote_run(void) //无线遥控代码执行
{
}
#pragma interrupt_handler usart_isr:12  
void usart_isr(void)                          //串口中断
{
  uchar temp;
  temp = UDR;
  UDR = temp;
}
void main(void)
{
 
  PORTB = 0x00;
  DDRB  = 0x00;
  PORTC = 0x00;
  DDRC  = 0x38;
  PORTD = 0x00;
  DDRD  = 0x00;  
  
  UCSRB = 0x00; 
  UCSRA = 0x00;
  UCSRC = (1<<UCSZ1)|(1<<UCSZ0)|(1<<USBS);  //8位数据位2位停止位
  UBRRL = (Fosc*1000000/16/BAUD)%256-1;     //波特率
  UBRRH = (Fosc*1000000/16/BAUD)/256;
  UCSRB = (1<<RXEN)|(1<<TXEN)|(1<<RXCIE);   //接收/发送中断使能
  SEI();                                    //打开全局中断允许位

  led_display_data[0] =0x32;  
  led_display_data[1] =0x96;  
  led_display_data[2] =0x128;  
  while(1)
  {
    if(flag&0x01)
      if(remote_decode())
     if(flag&0x02)    
    remote_cont(); 
  else
          remote_run();   
      else
        auto_run();
    else
      init_remote();      //初始化遥控数据
  }
}


⌨️ 快捷键说明

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