1. THÔNG BÁO TUYỂN ADMIN DIỄN ĐÀN 2013
    Tìm kiếm nhà trọ - Ở ghép
    THÔNG BÁO BÁN ÁO SPKT.NET CHO THÀNH VIÊN DIỄN ĐÀN


    HÃY TÌM KIẾM Ở ĐÂY TRƯỚC KHI ĐẶT CÂU HỎI
    {xen:phrase loading}

Mô phỏng 8051 trên proteus

Thảo luận trong 'Vi điều khiển - Mạch Số' bắt đầu bởi admin, 11 Tháng mười một 2010.

  1. admin Administrator

    Số bài viết: 683
    Đã được thích: 64
    Điểm thành tích: 28
    Hôm nay tớ sẽ tiếp tục phần mô phỏng với bài điều khiển động cơ 1 chiều chạy thuận ngược kết hợp hiển thị lên LCD. Tất nhiên sẽ là cơ bản, đơn giản và dễ hiểu thôi:D Dưới đây là hình ảnh của bài này trong proteus:
    [IMG]

    Trong bài này tớ dùng rơ le để đảo chiều quay động cơ, nguyên lý của rơ le rất đơn giản, khi có dòng điện chaỵ qua cuộn dây nó sẽ hút tiếp điểm, lợi dụng điều này ta điều khiển đóng ngắt, đảo chiều động cơ, dưới đây là hình ảnh cụ thể:
    [IMG]

    1 đầu của cuộn dây rơle nối đất, đầu còn lại nối tới 1 chân của 8051 để điều khiển đóng mở rơle, về phần tiếp điểm, thì có 3 vị trí, 1 vị trí được nối cố định tới 1 đầu của động cơ, 2 vị trí kia 1 nối đất, 1 nối nguồn 5V, chú ý ở đây là rơle 12V, phải chỉnh lại thành 5V mới chạy nha:D. Về phía động cơ 1 chiều,1 đầu như trên hình, còn 1 đầu được nối tới 1 chân của 8051 để kết hợp với 2 vị trí tiếp điểm nối đất và nguồn để động cơ quay thuận ngược. Ở đây để thêm mầu mè, tớ thêm 2 con led chỉ chiều quay, cộng thêm LCD hiện chiều quay, cho thêm vào công nhận là đẹp hơn thật:D

    Dưới đây là đoạn code:
    Mã:
    #include <at89x51.h>
    #include <stdio.h>
    #include<string.h>
    
    #define RS P3_5
    #define RW P3_6        //RW=0 => ghi
    #define EN P3_7        //RW=1 => doc
                        //RS=0 => code
                        //RS=1 => data
    #define LCD_PORT P1
    sbit thuan= P2^0;
    sbit nguoc= P2^1 ;
    sbit dkrole= P2^2  ;
    sbit dc= P2^3    ;
    sbit DC1=  P0^0    ;
    sbit DC2= P0^1    ;
    //=================
    void delay( unsigned int ms )
    {
    unsigned int i,j;
    for (i=0;i<ms;i++)
    for (j=0;j<120;j++)
    {} 
    }
    //=============================
    void delay_5ms(){
    int i,j;
    for(i=0;i<250;i++)
        for(j=0;j<4;j++){}
    }
    //===========================
    void delay_15ms(){
    int i,j;
    for(i=0;i<250;i++)
        for(j=0;j<100;j++){}
    }
    //==============================
    void LCDcontrol(unsigned char c)     //CT con ghi du lieu len LCD
    {
     RS=0;
     RW=0;
     LCD_PORT=c;
     EN=1;
     EN=0;
     delay_5ms();
    }
     //===================================
    void LCDwrite(unsigned char c)     //CT con doc du lieu tu LCD
    {
     RS=1;
     RW=0;
     LCD_PORT=c;
     EN=1;
     EN=0;
     delay_5ms();
    }
     //===============================
     void LCDwrites(unsigned char*s)
    {
     unsigned char data lens,count;
     lens=strlen(s)    ;
     for(count=0;count<lens;count++){
       LCDwrite(*(s+count));
       }
    }
     //================================
    void LCD_init()          // Khoi tao LCD
    {
     delay_15ms();
    
     LCDcontrol(0x38);
     LCDcontrol(0x0C);
    // LCDWriteCmd(0x06);
     LCDcontrol(0x01);      // Xoa man hinh LCD
    }
     //==================================
    void LCD_clear()
    {
     LCDcontrol(0x01);
    }
    //==================================
    void LCD_home()
    {
     LCDcontrol(0x80);
    }
    
    void LCD_putstr(unsigned char *s)
    {
     while (*s)
     {
      LCDwrite(*s);
      s++;
     }
    }
    //===============================
    void main()
    {
       LCD_init();
     LCDwrites("  Xin moi nhan nut ");
     LCDcontrol(0xc0);
     LCDwrites("  de dong co chay  "); 
    // dkrole=0; 
     while(1){
      
      
      if (DC1==0){              //an nut dong co chay thuan
       LCD_clear();
       LCDwrites("    LOADING....  ");
       dkrole=1;
       dc=0;
       delay(2500);
       LCD_clear();
       thuan=0;
       nguoc=1;
       
       LCDwrites(" DONG CO CHAY THUAN ");
       LCDcontrol(0xc0);
       LCDwrites("     ====>>>>    "); }
      if (DC2==0){             //an nut dong co quay nguoc lai
       LCD_clear();
       LCDwrites("    LOADING....  ");
       dkrole=0;
       dc=1;
       delay(2500);
       LCD_clear();
       nguoc=0;
       thuan=1;
       LCDwrites(" DONG CO CHAY NGUOC ");
       LCDcontrol(0xc0);
       LCDwrites("     <<<<====    ");  }
    }
    
    }
    Và cuối cùng là link dow mô phỏng+code C( thay vì file hex như mọi lần^^):
    http://www.mediafire.com/?sharekey=2857f12fe3e5d90be5c3dee5769931ece04e75f6e8ebb871
    Ở bài mô phỏng sau: tớ sẽ bắt đầu chuyển sang giao tiếp máy tính, và có 1 số bài nho nhỏ hướng dẫn về CVI để lập trình giao tiếp! chúc các bạn thành công!
    xuanlienbk thích bài này.
  2. xuanlienbk New Member

    Số bài viết: 3
    Đã được thích: 0
    Điểm thành tích: 1
    Giới tính: Nam

Chia sẻ trang này