Đang tải...

Cơ bản Kỹ thuật ứng dụng vi điều khiển

Thảo luận trong 'Điện - Điện tử' bắt đầu bởi haui, 4/1/11.

Thành viên đang xem bài viết (Users: 0, Guests: 0)

  1. haui
    Offline

    Tài xế O-H
    Expand Collapse

    Tham gia ngày:
    5/8/09
    Số km:
    3,304
    Được đổ xăng:
    128
    Mã lực:
    381
    Xăng dự trữ:
    -120 lít xăng
    Vi điều khiển Tui đang nghiên cứu ở mức abc đó là điều khiển LED. theo yêu câu của mấy Pác tôi entry vài bài mẫu tham khảo(lập trình không chuyên nên không áp dụng các giải thuật C++, lập trình nhúng):
    I. Điều khiển LED
    1. BẢNG CHUYỂN ĐỔI HỆ NHỊ PHÂN SANG THẬP LỤC PHÂN

    0000 === 0
    0001 === 1
    0010 === 2
    0011 === 3
    0100 === 4
    0101 === 5
    0110 === 6
    0111 === 7
    1000 === 8
    1001 === 9
    1010 === A
    1011 === B
    1100 === C
    1101 === D
    1110 === E
    1111 === F

    2. TẠM QUY ƯỚC “TẮT” ”SÁNG”
    0: SÁNG
    1: TẮT
    3.
    PORT DDR
    INPUT 0xFF 0x00
    OUTPUT 0xFF/0x00 0xFF

    4. BÀI TẬP VÍ DỤ (LẬP TRÌNH THEO KHÔNG THEO GIẢI THUẬT)
    /*===================================================================*/
    //KHAI BÁO Ở THƯ VIỆN
    #include <mega32>
    #include <delay>
    //OUT PUT
    #define LED PORTA
    #define LED1 PORTA.0
    #define LED2 PORTA.1
    #define LED3 PORTA.2
    #define LED4 PORTA.3
    #define LED5 PORTA.4
    #define LED6 PORTA.5
    #define LED7 PORTA.6
    #define LED8 PORTA.7
    // INPUT
    #define pb PIND
    #define pb1 PIND.0
    #define pb2 PIND.1
    #define pb3 PIND.2
    #define pb4 PIND.3
    #define pb5 PIND.4
    #define pb6 PIND.5
    #define pb7 PIND.6
    #define pb8 PIND.7
    // DELAY
    #define time_out 500
    #define time 100
    #define time_1 200
    /*=============================================================*/
    void khoi_tao(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTA=0xFF;
    DDRA=0xFF;

    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTB=0x00;
    DDRB=0x00;

    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0xFF;
    DDRD=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    }
    /*==========================================================*/
    // CHƯƠNG TRÌNH LED NHẤP “NHÁY” 3 LẦN
    void Ctr_1(void)
    {
    char i;
    for(i=0;i<3;i++)
    {
    LED=0x00;
    delay_ms(time_out);
    LED=0xFF;
    delay_ms(time_out);
    }
    }
    /*==========================================================*/
    // CHƯƠNG TRÌNH LED SÁNG NGOÀI VÀO VÀ SÁNG TRONG RA 3 LẦN
    void Ctr_2(void)
    {
    char i;
    for(i=0;i<3;i++)
    {
    LED=0x7E; //LED 1,8 SÁNG
    delay_ms(time);

    LED=0x3C; //LED 1,2,7,8 SÁNG
    delay_ms(time);

    LED=0x18; //LED 1,2,3,6,7,8 SÁNG
    delay_ms(time);


    LED=0x00; //LED 1,2,3,4,5,6,7,8 SÁNG
    delay_ms(time);

    LED=0xE7; //LED 4,5 SÁNG
    delay_ms(time);

    LED=0xC3; //LED 3,4,5,6 SÁNG
    delay_ms(time);

    LED=0x81;
    delay_ms(time);

    LED=0x00;
    delay_ms(time);
    }
    }
    /*==========================================================*/
    // CHƯƠNG TRÌNH LED SÁNG TỪ LED.1 ĐẾN LED.8 (3 LẦN)
    void Ctr_3(void)
    {
    char i;
    for(i=0;i<3;i++)
    {
    LED=0x7F; // LED 1 SÁNG
    delay_ms(time);

    LED=0x3F; // LED 1,2 SÁNG
    delay_ms(time);

    LED=0x1F; // LED 1,2,3 SÁNG
    delay_ms(time);

    LED=0x0F; // LED 1,2,3,4 SÁNG
    delay_ms(time);

    LED=0x0F; // LED 1,2,3,4,5 SÁNG
    delay_ms(time);

    LED=0x03; // LED 1,2,3,4,5,6 SÁNG
    delay_ms(time);

    LED=0x01; // LED 1,2,3,4,5,6,7 SÁNG
    delay_ms(time);

    LED=0x00; // LED 1,2,3,4,5,6,7,8 SÁNG
    delay_ms(time);
    }
    }
    /*==========================================================*/
    // CHƯƠNG TRÌNH LED TẮT TỪ LED.1 ĐẾN LED.8 VÀ NGƯỢC LẠI (3 LẦN)
    void Ctr_4(void)
    {
    char i;
    for(i=0;i<3;i++)
    {
    LED=0x00; //TẤT CẢ LED ĐỀU SÁNG
    delay_ms(time_1);

    LED=0x80; // LED 1 TẮT
    delay_ms(time_1);

    LED=0x40; // LED 2 TẮT
    delay_ms(time_1);

    LED=0x20; // LED 3 TẮT
    delay_ms(time_1);

    LED=0x10; // LED 4 TẮT
    delay_ms(time_1);

    LED=0x08;
    delay_ms(time_1);

    LED=0x04;
    delay_ms(time_1);

    LED=0x02;
    delay_ms(time_1);

    LED=0x01;
    delay_ms(time_1);


    /*==================================================*/
    LED=0x00; //TẤT CẢ LED ĐỀU SÁNG
    delay_ms(time_1);

    LED=0x01; // LED 8 TẮT
    delay_ms(time_1);

    LED=0x02; // LED 7 TẮT
    delay_ms(time_1);

    LED=0x04;
    delay_ms(time_1);

    LED=0x08;
    delay_ms(time_1);

    LED=0x10;
    delay_ms(time_1);

    LED=0x20;
    delay_ms(time_1);

    LED=0x40;
    delay_ms(time_1);

    LED=0x80;
    delay_ms(time_1);
    }
    }
    /*==========================================================*/
    // CHƯƠNG TRÌNH LED SÁNG TỪ LED.1 ĐẾN LED.8 (3 LẦN)
    void Ctr_5(void)
    {
    char i;
    for(i=0;i<3;i++)
    {
    LED=0xFF; // TẤT CẢ LED ĐỀU TẮT
    delay_ms(time_1);

    LED=0x7F; // LED 1 SÁNG
    delay_ms(time_1);

    LED=0xBF; // LED 2 SÁNG
    delay_ms(time_1);

    LED=0xDF; // LED 3 SÁNG
    delay_ms(time_1);

    LED=0xEF;
    delay_ms(time_1);

    LED=0xF7;
    delay_ms(time_1);

    LED=0xFB;
    delay_ms(time_1);

    LED=0xFD;
    delay_ms(time_1);

    LED=0xFE;
    delay_ms(time_1);
    }
    }
    /*==========================================================*/
    void main(void)
    {
    char i;
    khoi_tao();
    while (1)
    {
    if (pb1==0) // Nếu phím 1 nhấn thì chương trình 1 chạy,(giữa pb1 và 0 là hai dấu”=”)
    Ctr_1();

    if(pb2==0) // nếu nhấn phím 2 thì Ctr_2,Ctr_3,Ctr_4 chạy
    {
    Ctr_2();
    Ctr_3();
    Ctr_4();
    Ctr_5();
    }
    if(pb3==0) // Nhấn phím 3 thì thực hiện doạn lệnh dưới.
    {
    for(i=0;i<5;i++)
    {
    LED=~LED; // TẤT CẢ LED NHẤP NHÁY
    delay_ms(time_1);
    }
    }
    };
    }


    II. ĐIỀU CHỈNH TẦN SỐ.(LED sáng dần hoặc tối dần)

    B1. điều chỉnh timers trước khi lưu file như bảng:
    khai báo ở timers:
    B2. VIẾT CHƯƠNG TRÌNH
    Program type : Application
    Clock frequency : 11,059200 MHz
    Memory model : Small
    External SRAM size : 0
    Data Stack size : 512
    *****************************************************/
    // Bài 1 TRƯỜNG HỢP LED 6 SÁNG DẦN
    #include <mega32> ( viết ở chổ khai báo)
    #include <delay>
    #define pwm OCR1AL
    char n=0,time_out=0;

    interrupt [TIM2_OVF] void timer2_ovf_isr(void) (cái này có do bước 1 )
    {
    time_out++;
    pwm=time_out;
    if(time_out>254)
    {
    time_out=0 ;
    }

    }
    // Declare your global variables here
    /*=========================================================================*/
    void khoi_tao(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTA=0x00;
    DDRA=0x00;

    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTB=0x00;
    DDRB=0x00;

    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=Out Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=0 State6=T State5=0 State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0xA0;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 10,800 kHz
    // Mode: Ph. correct PWM top=00FFh
    // OC1A output: Inverted
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0xC1;
    TCCR1B=0x05;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: 10,800 kHz
    // Mode: Phase correct PWM top=FFh
    // OC2 output: Inverted PWM
    ASSR=0x00;
    TCCR2=0x77;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x40;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // Global enable interrupts
    #asm("sei")
    }

    /*==================================================================*/
    void main(void)
    {
    khoi_tao();
    while (1)
    {

    };
    }
    ===========================================================================
    //Bài 2. TRƯỜNG HỢP LED 6 TỐI DẦN
    #include <mega32>
    #include <delay>
    #define pwm OCR1AL
    char n=0,time_out=254;

    interrupt [TIM2_OVF] void timer2_ovf_isr(void)
    {
    time_out--;
    pwm=time_out;
    if(time_out<0)
    {
    time_out=254 ;
    }

    }
    /*==================================================*/
    void khoi_tao(void)
    PHẦN NÀY LÀ CHƯƠNG TRÌNH CON GIÔNG TRÊN (ĐOẠN MÀU XANH) KO VIET LẠI NỮA NHA.
    /*==================================================*/
    void main(void)
    {
    khoi_tao();
    while (1)
    {

    };
    }
    ===========================================================================
    // Bài 3 ĐIỀU CHỈNH SÁNG DẦN CHO 8 LED
    #include <mega32>
    #include <delay>
    #define LED PORTD
    void delay(int time_out)
    {
    int i;
    for(i=0;i<time_out;i++)
    delay_us(50);
    }
    /*==================================================*/
    void khoi_tao(void)
    PHẦN NÀY LÀ CHƯƠNG TRÌNH CON GIÔNG TRÊN (ĐOẠN MÀU XANH) KO VIET LẠI NỮA NHA. Lưu ý ở
    PORTD=0x00;
    DDRD=0xFF;
    /*==================================================*/
    void main(void)
    {
    khoi_tao();
    while (1)
    {
    char i,n;
    for(n=0;n<30>254)
    i=0;
    };
    }
    =============================================
    // Bài 4 ĐIỀU CHỈNH TỐI DẦN CHO 8 LED

    GIỐNG BÀI 3 HOÀN TOÀN CHỈ SỦA Ở MỤC TRONG while (1) HAI CHỔ MÀU XANH

    while (1)
    {
    char i,n;
    for(n=0;n<30;n++)
    LED=0x00;
    delay(i);
    LED=0xFF;
    delay(254-i);
    i--;
    if(i<0)
    i=254;

    };
    }
    (Viết cho 8 LED hoàn toàn có thể làm cho 1 LED. bàng cách cho từng PORT. ví dụ: PORTD.0 =.........)
     

    Bài viết khác:

Chia sẻ trang này