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

Mr.zero

Học sinh phổ thông
#71
Chào mấy bác .Em là thành viên mới đang học năm nhất kiến thức còn hạn hẹp mà thầy cho bài tập nhờ mấy bác giúp hộ em với ạ . Em cảm ơn mấy bác trước .
 

nguyenthao

Học sinh phổ thông
#72
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:
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

a chị trong diễn đàn cho e hỏi là cái lệnh MOV sp,#60h nghĩa là gì ạ?
 

huunho

Thạc sỹ
#73
lệnh này gán cho con trỏ ngăn xếp SP giá tri 0x60
 

quocchanhqc

Học sinh phổ thông
#74
em dang có học về môn vi điều khiển và thầy có giao cho bài tập là thiết kế mach đèn xi nhan o tô sử dụng IC8051. Bac nào có thể giúp em được với không.......
emai em là: thanhtung53cnot@gmail.com
 

hatrunghieu

Học sinh phổ thông
#75
  1. có anh nào có code mạch dùng 2 led 7 đoạn đếm số từ 0-20 rồi đếm ngược lại không cho em xin với
 

nampic

Học sinh phổ thông
#77
ae giúp e chuyển code này sang C vs được ko ak




Code ASM
dataport equ p2 // xuat du lieu ra p2
ctrl equ p1 // p1 la port dieu khien de quet led
led1 equ 0 // led 1 la p1.0
led2 equ 1 // led 2 la p1.1
led3 equ 2 // led 3 la p1.2
a_ equ 11111110b
b_ equ 11111101b
c_ equ 11111011b
d equ 11110111b
e equ 11101111b
f equ 11011111b
g equ 10111111b
dp equ 01111111b
dseg at 30h
dv : ds 1
ch : ds 1
tr : ds 1
delay0: ds 1
delay1: ds 1
cseg at 00h
ljmp begin
//-----------------------------
// Khai bao ngat ngoai 1
cseg at 13h
ljmp ext1_isr
begin:
// cau hinh ngat ngoai 1
clr IE1
setb IT1
setb EX1
setb EA
mov ctrl,#0FFh //lenh dieu khien p1
mov dptr,#bitmap
mov dv,#0
mov ch,#0
mov tr,#0
l:
lcall hienthi
ljmp l
// khai bao ngat ngoai 1
ext1_isr:
//moi khi co ngat say ra thi se goi chuong trinh dem tang(count_up)
lcall count_up
reti
// dem tang tu 000-999
count_up:
inc dv
mov r0,dv
cjne r0,#10,count_exit
mov dv,#0
inc ch
mov r0,ch
cjne r0,#10,count_exit
mov ch,#0
inc tr
mov r0,tr
cjne r0,#10,count_exit
mov tr,#0
count_exit:
ret
// quet led 7 doan
hienthi:
mov dptr,#bitmap
mov a,dv
movc a,@a+dptr
mov dataport,a
setb ctrl.led3
lcall delay_2ms
clr ctrl.led3


mov dptr,#bitmap
mov a,ch
movc a,@a+dptr
mov dataport,a
setb ctrl.led2
lcall delay_2ms
clr ctrl.led2


mov dptr,#bitmap
mov a,tr
movc a,@a+dptr
mov dataport,a
setb ctrl.led1
lcall delay_2ms
clr ctrl.led1

ret
// thoi gian delay 2mms
delay_2ms:
mov delay0,#2
loop_0:
mov delay1,#250
loop_1:
nop
nop
djnz delay1,loop_1
djnz delay0,loop_0
ret
// Bang ma led 7 doan
bitmap:
db ~(g&dp)
db b_&c_
db ~(c_&f&dp)
db ~(e&f&dp)
db ~(a_&d&e&dp)
db ~(b_&e&dp)
db ~(b_&dp)
db a_&b_&c_
db ~dp
db ~(e&dp)
 

uppicsthao

Học sinh phổ thông
#78
xin chào, mình có một bài toán muốn áp dụng tại nơi làm việc mong các bác chỉ cho hướng đi.
Mình có 9 máy cần cấp liệu tại các vị trí khác nhau. Cách nhau khoảng 500m (Máy đầu và máy cuối).

Trạm điều khiển cách điểm(máy cần cấp liệu) gần nhất là 300m.

Mình muốn khi 1 máy cần cấp liệu thì nhấn 1 nút và đèn led tại vị trí đó sáng lên (báo rằng nó đã được nhận bởi nơi điều khiển và đưa vào hang đợi. Tương tự các máy khác cũng như vậy, Cái nào nhấn trước thì ưu tiên trước.

Và khi nơi điều khiển cấp cho nó rồi thì nhấn 1 nút để báo là đã cấp và lúc đó đèn trên máy đó tắt, muốn cần nhiên liệu tiếp thì lại phải nhấn để LED sáng để vào hang đợi theo cơ chế FIFO.
MOng chỉ giúp. Mình biết sơ sơ về 8051 nên xin chỉ cho hướng đó.
Tại trạm điều khiển có LED 7 để biết cấp cho máy nào.
Cám ơn nhiều.
 
Sửa lần cuối:

tran1804

Học sinh phổ thông
#79
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.
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);
      }
  }
}
 

tran1804

Học sinh phổ thông
#80
Bạn ơi cho mình hỏi cái này!
Mình đang làm đồ án 1 tay đo kiểu robot 2 bậc tự do (2 khớp quay nằm trong 1 mặt phẳng), trên mỗi trục khớp có gắn encoder 5000 xung để phát hiện sự thay đổi góc quay của tay đo .
Bài toán đặt ra là: khi dịch chuyển tay đo, nhờ 2 encoder sẽ xác định được 2 góc quay và từ đó xác định được tọa độ dịch chuyển của đầu đo cuối (bài toán động học ngược cánh tay robot). Các tọa độ này sẽ được lưu lại và hiển thị trên máy tính thông qua RS232 và phần mền Visual Basic. Giờ mình ko biết viết code ntn, mình cũng biết tàm tạm về C thôi. Mạch điều khiển mình dùng P89V51RD2FN
Bạn có thể bớt chút thời gian, nghiên cứu vấn đề này giúp mình đc ko? Cảm ơn các bạn nhiều!
 

Quảng cáo Google