1. Xin chào Khách ! Ban quản trị sẽ tiến hành nâng cấp diễn đàn từ ngày 11/8/2017 Mọi truy cập có thể bị dán đoạn, mong bạn thông cảm!
    Dismiss Notice

Chia sẻ Một số code và mạch cơ bản cho 8051

Thảo luận trong 'Họ 8051'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

  1. ChipKool

    ChipKool Thạc sỹ

    Tham gia ngày:
    4/9/12
    Bài viết:
    1,054
    Đã được thích:
    1,288
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Nghề nghiệp:
    Sinh Viên UNETI
    Nơi ở:
    Điện Tử | Tin Học - echipkool.com
    Chip Chỉ được học lập trình trên ngôn ngữ ASM nên các bạn đừng chê nha ^^..Chip vẽ cả mô phỏng chạy ngon trên Protues 7.8 nhé....

    -mạch điều khiển led đơn nhiều hiệu ứng Code asm DK LED DON.rar
    -Mach điêu khiển led đơn dùng 74HC595 Code Asm 8led_74hc595.rar
    -mạch quét ma trận dùng IC 74HC595 code ASM QUET MA TRAN 595.rar
    -Mạch led 7 đoạn dùng 74HC595 có nút bấm đếm 7SEG_HC595_BUTTON.rar
    -Mạch IC số đếm 00 - 99 dùng 7447 Mach đếm 00 - 99 7447.rar
    -Mạch VĐK dùng 595 Mach Dieu Khien 595.rar
    -Mạch ma trận phím + led 7 đoạn MA TRAN PHIM_LED 7 DOAN.rar
    -mạch ma trận led + ma trận phím MA TRAN LED + MA TRAN PHIM.rar
    Chip sẽ còn update tiếp sau nhé..đói quá..đi nấu mum ^^.Hay like chip nhé..Chúc diễn đàn Codientu.org ngày càng phát triển.Nhiều bạn góp bài.
     
    cuongMU, pinklight, nhan020929 others thích bài này.
  2. dainv

    dainv http://vntech24h.com/

    Tham gia ngày:
    6/9/12
    Bài viết:
    411
    Đã được thích:
    655
    Điểm thành tích:
    93
    Giới tính:
    Nam
    Nghề nghiệp:
    Engineer Electronic
    Nơi ở:
    Vĩnh Phúc
    Tham gia diễn đàn nhiều rùi và có đọc các bài của mọi người. Mình thấy mọi người rất nhiệt tình giúp đỡ nhau vì vậy mình cũng xin đóng góp 1 chút xíu cho anh em.
    Cái này là các bài lập trình cơ bản dành cho newbie.
    Anh em cảm thấy có ích thì thank 1 cái động viên nha.
     

    Các file đính kèm:

    Văn Quả, chuot coi, xuan bao29 others thích bài này.
  3. Hattieu

    Hattieu Sinh viên cao đẳng

    Tham gia ngày:
    19/10/12
    Bài viết:
    26
    Đã được thích:
    27
    Điểm thành tích:
    13
    Giới tính:
    Nam
    Nghề nghiệp:
    Sinh Viên
    Nơi ở:
    Bắc Ninh
    Đèn giao thông sử dụng ASM :=))#-ocác bạn có thể tham khảo ở đây mình chỉ lập cho một bài toán đơn giản tù yêu cầu thực tế các bạn có thể phát triển thêm ~X(
     

    Các file đính kèm:

  4. sgesvn

    sgesvn Moderator Staff Member

    Tham gia ngày:
    24/7/12
    Bài viết:
    2,235
    Đã được thích:
    3,077
    Điểm thành tích:
    113
    Giới tính:
    Nam
    Dưới đây là một số code mẫu cho 8051, hi vọng nó sẽ giúp các bạn mới làm quen với 8051 có thêm tài liệu và code tham khảo. Tất cả những code này cũng đều do mình sưu tầm lại, chưa có thời gian fix, nhưng cơ bản là chạy ngon lành cành đào. Hi vọng các bạn sau khi sử dụng có những phản hồi và hoàn thiện bộ code này hơn.
    01.
    1. Code đo nhiệt độ hiển thị lên LCD
    2. Code quét led 7 đoạn
    3. Code nháy led tạo hiệu ứng đơn giản
    4. Code tạo xung vuông chính xác theo tỉ lệ
    5. Code đo nhiệt độ hiển thị lên LCD, giao tiếp PC bằng RS232
     
    tran1804, hoanglocmdc, tuannam_hp905 others thích bài này.
  5. sgesvn

    sgesvn Moderator Staff Member

    Tham gia ngày:
    24/7/12
    Bài viết:
    2,235
    Đã được thích:
    3,077
    Điểm thành tích:
    113
    Giới tính:
    Nam
    1.Chương trình thực hiện đo nhiện độ và hiển thị kết quả lên LCD 16x2, các bước khởi tạo LCD, khởi tạo bộ ADC trong 8051.
    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
     
    #define INTR P3_2
    #define RD P3_3
    #define WR P3_4
     
     
    //===========================
    void delay_ms(int n)
    {
      int k,j;
      for(k=0;k<n;k++)
      {
          for(j=0;j<500;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 LCDWriteCmd(unsigned char c) //CT con ghi du lieu len LCD
    {
    RS=0;//code
    RW=0;//ghi
    LCD_PORT=c;
    EN=1;
    EN=0;
    delay_5ms();
    }
    //==============================
    void LCDWriteData(unsigned char c) //CT con doc du lieu tu LCD
    {
    RS=1;//data
    RW=0;//ghi
    LCD_PORT=c;
    EN=1;
    EN=0;
    delay_5ms();
    }
    //===============================
    void LCD_init()  // Khoi tao LCD
    {
    delay_15ms(); 
    LCDWriteCmd(0x38); //che do 8bit,2 hang,kieu ky tu 5x8 diem anh.
    LCDWriteCmd(0x0C);  //hien thi man hinh.
    LCDWriteCmd(0x06);  //tu dong tang bo dem dia chi
    LCDWriteCmd(0x01); // Xoa man hinh LCD
    }
    //================================
    void LCD_clear()
    {
    LCDWriteCmd(0x01);
    }
    //===============================
    void LCD_home()
    {
    LCDWriteCmd(0x80);
    }
    //=============================
    void LCD_putstr(unsigned char *s)
    {
    while (*s)
    {
      LCDWriteData(*s);
      s++;
    }
    } 
    //============================
    void HienThi_ADC(unsigned char t)
    {
        unsigned char v;
        if(t<10)
              LCDWriteData(t+48);
        else if(t<100)
        {
              LCDWriteData(t/10+48);
            LCDWriteData(t%10+48);
        }
        else
        {
            v=t/10;
            LCDWriteData(v/10+48);
            LCDWriteData(v%10+48);
            LCDWriteData(t%10+48);
        }
    }
    //==========================================
    void main (void)
    {
    unsigned char gt=0;      //gt la bie^n' cho gia tri 8bit ADC
    LCD_init();
    while(1)
    {
      WR=0;            //      Bat dau chuyen doi gia tri tu ADC
      delay_ms(5);      // Tao tre de cap nhat du lieu tu ADC
      WR=1;            //ket thuc chuyen doi.
    //  while(!INTR);
        RD=0;            // Nhan du lieu da duoc chuyen doi
        gt=P2;          //cap nhat ADC.
        LCDWriteCmd(0x01);
        LCDWriteCmd(0x83);
        LCD_putstr("8051 & ADC");
        LCDWriteCmd(0xC0);
        LCD_putstr("Nhiet do:");
          HienThi_ADC(gt);
        delay_ms(150);
    }
    } 
     
    tran1804, colentoioi, quocvtt6 others thích bài này.
  6. sgesvn

    sgesvn Moderator Staff Member

    Tham gia ngày:
    24/7/12
    Bài viết:
    2,235
    Đã được thích:
    3,077
    Điểm thành tích:
    113
    Giới tính:
    Nam
    2. Chương trình quét LED 7 đoạn để hiển thị các số từ 00 đến 99.
    Mã:
    #include<at89x51.h>
    #define c P2_0
    #define d P2_1
    unsigned char so[10]={0xc0,0x79,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    void delay(int ms)
    {
        while(ms--)
        {}
    }
    void hienso(unsigned char x)
    {
        unsigned char chuc=x/10;
        unsigned char donvi=x%10;
        c=1;d=1;
        if(x>=10)
        {
            c=0;
            d=1;
            P0=so[chuc];
            delay(50);
              c=1;
            d=0;
            P0=so[donvi];
            delay(50);
     
        }
        if(x<10)                 
        {
              c=0;
            d=1;
            P0=so[x];
            delay(100);
        }
    }
    main()
    {
      P0=0xff;
      while(1)
      {
          unsigned char i;
          for(i=0;i<100;i++)   
          hienso(i);
      }
    } 
     
    BÁ TIẾN, tran1804, tuannam_hp905 others thích bài này.
  7. sgesvn

    sgesvn Moderator Staff Member

    Tham gia ngày:
    24/7/12
    Bài viết:
    2,235
    Đã được thích:
    3,077
    Điểm thành tích:
    113
    Giới tính:
    Nam
    3. Code nháy Led tạo hiệu ứng đơn giản
    3.

    Mã:
    #include<at89x52.h>
    unsigned char nhayled[20]={0x05,0x0e,0x1d,0x3e,0x7d,0xfe,0x01,0x82,0xc1,0xe2,0xf1,0xfa,0xfd,0x02,0xfd,0x02,0xfd,0x02,0xfd,0x02}; //cac hieu ung
    void delay(unsigned int i)
    {
        while(i--)
        {
          unsigned char j=121;
          while(j--){}
        }
    }
    main()
    {
      unsigned char k;
      while(1)
      {
          for(k=0;k<20;k++)
          {
            P0=nhayled[k];
            delay(250);
          }
      }
    } 
     
    tran1804, khongtrung, MuoiTDH3 others thích bài này.
  8. sgesvn

    sgesvn Moderator Staff Member

    Tham gia ngày:
    24/7/12
    Bài viết:
    2,235
    Đã được thích:
    3,077
    Điểm thành tích:
    113
    Giới tính:
    Nam
    4: Tạo xung vuông chính xác
    Chương trình ASM tạo xung vuông 70/30 tần số 12Khz, với Thạch anh 12Mhz.
    Sử dụng trình dịch Reads51, mô phỏng trên Proteus:
    4.
    Mã:
    #include <sfr51.inc>
    org 0h
    main:
            MOV sp,#60h 
     
    MOV TMOD,#01H ; Chon Timer0, che do 1 (16 bit)
                                 
                      ; Chu ky xung: 1/12K=83 us
                      ;chu ky may: 12/12M=1 us         
                      ; => 70/30 = 58/25
                      ; 58-8=50   
                      ; 25-10=15   
                   
    HERE: SETB P0.1        ;1 Bat P0.1
      MOV TL0, #0CEH ;2 byte thap;CE
    MOV TH0, #0FFH ;2 byte cao 
    SETB TR0 ;1 Khoi dong Timer0
     
    AGAIN1: JNB TF0, AGAIN1 ;1 Kiem tra co bo dinh thoi TF0
    CLR TR0 ;1 Dung bo dinh thoi
    CLR TF0    ;1 Xoa co bo dinh thoi cho vong sau
     
     
    CLR P0.1            ;1 Lat P0.1
      MOV TL0, #0F1H ;2 byte thap;F1
    MOV TH0, #0FFH ;2 byte cao
    SETB TR0 ;1 Khoi dong Timer0
     
    AGAIN2: JNB TF0, AGAIN2 ;1 Kiem tra co bo dinh thoi TF0
    CLR TR0 ;1 Dung bo dinh thoi
    CLR TF0    ;1 Xoa co bo dinh thoi cho vong sau
     
            SJMP    HERE        ;2
                   
    end 
     
  9. sgesvn

    sgesvn Moderator Staff Member

    Tham gia ngày:
    24/7/12
    Bài viết:
    2,235
    Đã được thích:
    3,077
    Điểm thành tích:
    113
    Giới tính:
    Nam
    5. Chương trình thực hiện kết hợp đo nhiệt độ, hiển thị lên LCD, và truyền dữ liệu lên máy tính qua giao tiếp RS232.
    5.

    Mã:
    #include<at89x51.h>
    #include<conio.h>
    #include<stdio.h>
    #include<string.h>
    //=========================  #DEFINE LCD
    #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
    //========================= #DEFINE ADC
    #define INTR P3_2
    #define RD P3_3
    #define WR P3_4
    //============================================================== DELAY
    void delay_ms(int n)
    {
      int k,j;
      for(k=0;k<n;k++)
      {
          for(j=0;j<500;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++){}
    }
    //============================================================== LCD
    //============================== GUI LENH CHO LCD
    void LCD_CODE(unsigned char c)
    {
        RS=0;//code
        RW=0;//ghi
        LCD_PORT=c;
        EN=1;
        EN=0;
        delay_5ms();
    }
    //=============================== KHOI TAO LCD
    void LCD_INIT()
    {
        delay_15ms();   
        LCD_CODE(0x38); //che do 8bit,2 hang,kieu ky tu 5x8 diem anh.
        LCD_CODE(0x0C);  //hien thi man hinh,có con tro, con tro nhâp' nháy.
        LCD_CODE(0x01); // Xoa man hinh LCD
    }
    //============================== IN KY TU
    void LCD_DATA(unsigned char c)
    {
      RS=1;//data
      RW=0;//ghi
      LCD_PORT=c;
      EN=1;
      EN=0;
      delay_5ms();
    }
    //=============================== IN CHUOI KY TU
    void LCD_STRING(unsigned char *s)
    {
        while(*s) //den NULL thi thoi
        {
            LCD_DATA(*s);
            s++;
        }
    }   
    //============================================================== KHOI TAO RS232
    void SetupSerial()
    {
      TMOD=0x20;    /* timer 1 che do 2: 8-Bit tu dong nap lai.          */
      TH1=0xFD;    /* toc do 9600 baud                */
      TL1=0xFD;
      SCON=0x52;      /* Che do 1: 8-bit UART, cho phep truyen  */
      TR1=1;          /* timer 1 run                          */
      TI=0;          /* co ngat nha^n.=0*/
      RI=0;          /* co ngat' truye^n =0*/
      ES=1;          /* cho phep ngat noi tiep */
    }
    //============================================================== HIEN THI GIA TRI ADC LEN LCD
    void HIENTHI_ADC(unsigned char t)
    {
        unsigned char v;
        if(t<10)
              LCD_DATA(t+48);
        else
        if(t<100)
        {
              LCD_DATA(t/10+48);
            LCD_DATA(t%10+48);
        }
        else
        {
            v=t/10;
            LCD_DATA(v/10+48);
            LCD_DATA(v%10+48);
            LCD_DATA(t%10+48);
        }
    }
    //============================================================== HAM GUI SO LIEU LEN VB
    void send(unsigned char a)
    {
        if(a<10)
        {
            SBUF=a+48;
            while(TI==0){}
            TI=0;       
        }
        if(a>9&&a<100)
        {
              unsigned char c=a/10;
              unsigned char d=a%10;
            SBUF=c+48;
            while(TI==0){}
            TI=0;
            SBUF=d+48;
            while(TI==0){}
            TI=0;     
        }
        if(a>99)
        {
              unsigned char t=a/100;
              unsigned char c=a/10-10*t;
              unsigned char d=a%10;
            SBUF=t+48;
            while(TI==0){}
            TI=0;
            SBUF=c+48;
            while(TI==0){}
            TI=0;
            SBUF=d+48;
            while(TI==0){}
            TI=0;     
        }
    }
    //============================================================== NGAT NOI TIEP
    void RS232(void) interrupt 4 
    {
        unsigned char *c,count=0;
        while(RI==0){}
        RI=0;
        *c=SBUF;
        if(count==1&&*c=='1') *c='3';
        if(count==1&&*c=='2') *c='4';
        switch(*c)
        {
          case '0':  //xoa man hinh LCD
          {
                LCD_CODE(0x01);
          }
          break;
              //o day co the su dung ma thap phan! (ngoai tru cac ky tu dieu khien)
     
     
          case '-':  //lui con tro hien thi LCD 1 don vi.
          {
                  LCD_CODE(0x10);
          }
          break;
     
     
          case '1':  //truyen len may tinh: gia tri do duoc.
          {
                send(P2);
          }
          break;
     
     
          case '2':  //truyen len may tinh: gia tri do duoc.
          {
                send(P2);
          }
          break;
     
     
          case '9':  //thoat khoi ham ngat, cho ADC làm viec.
          {
                TI=0;  //cho phep thoat khoi ham ngat.
                count=0;  //ket thuc viec truyen ky tu len LCD
          }
          break;
     
     
          default : //truyen ky tu xuong LCD ^^.
          {
                if(TI==0)
                  LCD_CODE(0x01);
                LCD_DATA(*c);
                TI=1;    //de cho chuong trinh ko thoat khoi ham ngat,phuc vu viec truyen ky tu len LCD.
                count=1;  //danh dau bat dau viec truyen ky tu len LCD
          }   
        }
    }
    //============================================================== MAIN
    void main()
    {
      SetupSerial();    //Khoi tao cac thong so cho truyen thong noi tiep
      LCD_INIT();
        //LCD_CODE(0x80);//hien thi 2 hang : dia chi hien thi + 80
      EA = 1;          //Cho phep ngat nhung chi? có ngat noi tiep duoc dung trong code nay
      while(1)
      {
          //if(P0_3==1)
          {
            P0_0=P0_1=P0_2=0;
            WR=0;            //Bat dau chuyen doi gia tri tu ADC
            delay_ms(10);      //Tao tre de cap nhat du lieu tu ADC
            WR=1;            //Ket thuc chuyen doi
                RD=0;            //Chot du lieu da duoc chuyen doi: P2
            LCD_CODE(0x01);
            LCD_putstr("Nhiet do:");
            HIENTHI_ADC(P2);
            LCD_STRING(" oC");
            delay_ms(300);
          }
      }
    }

     
    xyzacb, binh96vdk_kt, tran18045 others thích bài này.
  10. sgesvn

    sgesvn Moderator Staff Member

    Tham gia ngày:
    24/7/12
    Bài viết:
    2,235
    Đã được thích:
    3,077
    Điểm thành tích:
    113
    Giới tính:
    Nam
    hai gạo, bom123, tran18044 others thích bài này.

Chia sẻ trang này