📄 atmega8.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 + -