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

ChipKool

Thạc sỹ
#1
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.
 

dainv

http://vntech24h.com/
#2
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.
 

Đính kèm

sgesvn

Moderator
Thành viên BQT
#4
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.gif
  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
 

sgesvn

Moderator
Thành viên BQT
#5
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);
}
}
 

sgesvn

Moderator
Thành viên BQT
#6
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);
  }
}
 

sgesvn

Moderator
Thành viên BQT
#7
3. Code nháy Led tạo hiệu ứng đơn giản
3.png

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);
      }
  }
}
 

sgesvn

Moderator
Thành viên BQT
#8
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.png
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
 

sgesvn

Moderator
Thành viên BQT
#9
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.png
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);
      }
  }
}

 

sgesvn

Moderator
Thành viên BQT

Quảng cáo Google