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

📄 justrun.c

📁 avr常用功能程序中包含了pwm、adc、中断、定时、i2c等各程序可供开发者直接使用
💻 C
字号:
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define a 0xf4              //a=0.95
#define b 0x0d              //b=1-a=0.05
unsigned char x0,y0=0;    //x0,ADCH的值;
signed char right=0;
int delay_time=0,time=0;
unsigned char read_adc(unsigned char ad_chanel)     //单通道AD值读取函数
{
    ADMUX=1<<ADLAR|ad_chanel|1<<REFS1|1<<REFS0; //内参2.56V
    ADCSRA=1<<ADEN|1<<ADSC|6<<ADPS0;    //16分频做AD转换时钟
    loop_until_bit_is_set(ADCSRA,ADIF);  //等待ADCSRA中的ADIF位置位
        ADCSRA=1<<ADIF;
    return ADCH;
    
}
SIGNAL(SIG_OUTPUT_COMPARE0)             //interrupt
{
    x0=read_adc(7);
    y0=(char)(((int)a*y0+(int)b*x0)>>8);
    
    if(y0<12)                 {time=50; right=1;PORTD=0X00;}
    if(12<y0<24)              {time=100; right=1;}
    if((24<y0)&(y0<36))      {time=300; right=1;}
    if((36<y0)&(y0<48))      {time=500; right=1;}
    if((48<y0)&(y0<60))      {time=800; right=1;}
    if((60<y0)&(y0<72))      {time=1000; right=1;}
    if((72<y0)&(y0<84))      {time=1300; right=1;}
    if((84<y0)&(y0<96))      {time=1600; right=1;}
    if((96<y0)&(y0<108))     {time=4000; right=1;}
    
    if((108<y0)&(y0<134))    {right=0;PORTD=0X00;}
    
    if((134<y0)&(y0<146))    {time=5000; right=2;}
    if((146<y0)&(y0<158))    {time=3000; right=2;}
    if((158<y0)&(y0<170))    {time=2000; right=2;}
    if((170<y0)&(y0<182))    {time=1500; right=2;}
    if((182<y0)&(y0<194))    {time=1200; right=2;}
    if((194<y0)&(y0<206))    {time=1000; right=2;}
    if((206<y0)&(y0<218))    {time=800; right=2;}
    if((218<y0)&(y0<240))    {time=500; right=2;}
    if(y0>240)                {time=300; right=2;PORTD=0X00;}
    
    }
void delay (unsigned int t)
{
    for(;t>1;t--);
}
void main()
{
    unsigned int delay_time=0;
    char i=0;
    DDRA=0x0f;
    DDRB=0XFF;                  //OCR0,T0比较输出;在比较中断中改变PB口
    DDRD=0X20;
    TCCR1A=0x83;       		 //OC1A(PD5) is "0",10 BITS PWM
    TCCR1B=0X02;             //CLK/8
    OCR0=0X7f;                  //设置OCR0的值(此值越大,采频越低),使采样频率约为500Hz
    TCCR0=1<<WGM01|3<<CS00;
    TIMSK=1<<OCIE0;
    TIFR=1<<OCF0;
    SREG=0X80;
    right=1;
while(1)
    {
    delay_time=time;
 /*   if(right==1) {
    PORTA=1;    PORTB=0x56;    delay(delay_time); 
    PORTA=1;    PORTB=0x95;    delay(delay_time);   
    PORTA=1;    PORTB=0x65;    delay(delay_time); 
    PORTA=1;    PORTB=0x59;    delay(delay_time);
    PORTA=2;    PORTB=0x55;    delay(delay_time);
    }
    else if(right==2){
        PORTA=2;    PORTB=0x55;    delay(delay_time);
        PORTA=1;    PORTB=0x59;    delay(delay_time);
        PORTA=1;    PORTB=0x65;    delay(delay_time);
        PORTA=1;    PORTB=0x95;    delay(delay_time);
        PORTA=1;    PORTB=0x56;    delay(delay_time);
        }       */
    if(right==1) {
    PORTA=1;    PORTB=0x56;    delay(delay_time); 
    PORTA=1;    PORTB=0x95;    delay(delay_time);   
    PORTA=1;    PORTB=0x65;    delay(delay_time); 
    PORTA=1;    PORTB=0x59;    delay(delay_time);
    PORTA=2;    PORTB=0x55;    delay(delay_time);
    }
    else if(right==2){
        PORTA=2;    PORTB=0x65;    delay(delay_time);
        PORTA=1;    PORTB=0x9;    delay(delay_time);
        PORTA=1;    PORTB=0x66;    delay(delay_time);
        PORTA=2;    PORTB=0x95;    delay(delay_time);
        PORTA=1;    PORTB=0x5A;    delay(delay_time);
        }
    else if(right==0)   PORTD=0XFF;

   }
}

⌨️ 快捷键说明

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