Thứ Ba, 5 tháng 4, 2016

Bài 7: Giao tiếp UART với 8051.

Chào các bạn!

     Giao tiếp UART là chuẩn giao tiếp nối tiếp được sử dụng phổ biến trong các dòng VĐK. Mặc dù có tốc độ truyền không cao, nhưng ngược lại giao tiếp UART có phần cứng gọn nhẹ, dễ thiết kế và giá thành thấp. Giao tiếp UART được sử dụng nhiều trong các ứng dụng như giao tiếp máy tinh, giao tiếp module SIM, module GPS...
     Hôm nay mình xin hướng dẫn các cấu hình sử dụng UART trong VĐK 8051.


I. Các thanh ghi cấu hình giao tiếp UART trong VĐK 8051.

1. Thanh ghi cấu hình cổng nối tiếp SCON.

     Đây là thanh ghi 8 bit, chứa các bit sử dụng để cài đặt chế độ của giao tiếp UART và các bit cờ báo trạng thái truyền và nhận.
     Các bit của thanh ghi được mô tả như sau.
Hình 1.1: Thanh ghi SCON.

     SM0, SM1: Đây là 2 bit sử dụng để xác định các chế độ làm việc. Có 4 chế độ truyền UART trong 8051, được miêu tả trong bảng sau.
Hình 1.2: Các chế độ hoạt động của UART.
     SM2: Đây là bit sử dụng cho truyền thông giữa các bộ vi điều khiển.
     REN: Bit cho phép nhận dữ liệu, khi sử dụng chức năng nhận dữ liệu qua cổng UART, phải bật bit này lên 1.
     TB8, RB8: Bit thứ 9 của truyền/nhận trong chế độ truyền 9 bit.
      TI, RI: Cờ báo ngắt truyền, ngắt nhận.

2. Thanh ghi sử dụng cài đặt tốc độ Baudrate: TMOD, TH1.

      Như các bạn thấy trong hình 1.2, tùy vào chế độ hoạt động mà tốc độ baudrate có cách tính khác nhau. Với chế độ được sử dụng thông dụng nhất, chế độ 1, 8 bit dữ liệu, 1 bit start, 1 bit stop. Tốc độ baudrate được xác định qua timer 1.
     Trước hết để sử dụng timer 1 để xác định tốc độ baudrate chúng ta cần cài đặt timer 1 ở chế độ 8 bit tự nạp lại. Do đó, cần gán giá trị 0x20 cho thanh ghi TMOD (TMOD = 0x20).
     Giá trị gán vào thanh ghi TH1 để xác định tốc độ baudrate được tính như sau.
     TH1 =256 - (F(crystal)/12/32/baudrate).    (Với F(crystal) tính bằng đơn vị Hz).
     Ví dụ: Muốn truyền UART với tốc độ baudrate là 9600 ta cần gán cho TH1 giá trị sau.
     TH1 =256 - (F(crystal)/12/32/9600).
     Nếu mạch sử dụng thạch anh 11.0592 MHz = 11059200 Hz, ta sẽ có:
     TH1 = 256 - (11059200/12/32/9600) = 253.
     Như vậy gán cho thanh ghi TH1 giá trị 253 (TH1 = 253), là ta đã cài đặt giao tiếp UART với tốc độ baudrate 9600.

3. Bit nhân đôi tốc độ baudrate.

     Trong 8051 có một bit được sử dụng để nhân đôi tốc độ truyền của giao tiếp UART. Đó là bit SMOD (bit thứ 7) trong thanh ghi PCON. Khi set bit SMOD lên 1, tốc độ truyền của giao tiếp UART sẽ được nhân đôi. 
     Trở lại với ví dụ ở mục 2 phía trên, nếu như chúng ta muốn sử dụng tốc độ baudrate 19200 thì giá trị gán cho TH1 phải là bao nhiêu? Mạch vẫn sử dụng thạch anh 11.0592 MHz.
     Theo công thức tính đã cho ở trên ta sẽ có:
     TH1 = 256 - (11059200/12/32/19200) = 254.5
     Nhưng số cần gán cho TH1 phải là một số nguyên, nếu chúng ta gán 254 hoặc 255 thì vẫn không đúng tốc độ baudrate 19200.
     Vậy để có được tốc độ baudrate 19200, chúng ta cần sử dụng bit nhân đôi tốc độ SMOD. Gán giá trị 253 cho thanh ghi TH1 (để có baudrate 9600), và set bit SMOD lên 1 để nhân đôi tốc độ lên 19200.


4. Thanh ghi truyền/nhận dữ liệu: SBUF.

     SBUF là thanh ghi 8 bit, được sử dụng chung cho cả truyền và nhận dữ liệu trong UART.
     Để truyền dữ liệu, chúng ta chỉ cần ghi dữ liệu vào thanh ghi SBUF.
     Để nhận dữ liệu chúng ta đọc giá trị từ thanh ghi SBUF.

II. Các bước thiết lập để truyền/nhận dữ liệu qua UART với 8051.

1. Thiết lập chế độ truyền, tốc độ baudrate.

     1. Ghi giá trị 0x20 vào thanh ghi TMOD để cài đặt sử dụng timer 1 ở chế độ 8 bit, tự nạp lại (TMOD = 0x20).
     2. Ghi vào thanh ghi TH1 giá trị thích hợp để chọn tốc độ baudrate. Giá trị này được tính dựa vào công thức đã cho ở mục 2 trong phần I.
     3. Ghi vào thanh ghi SCON giá trị 0x50 để thiết lập chế độ truyền 8 bit, 1 bit start, 1 bit stop (SCON = 0x50 (SM0 = 0, SM1 = 1, REN = 1)).
     4. Bật bit TR1 để khởi động timer 1.
 

    TMOD = 0x20;    //Timer 1, 8bit tu nap lai
    TH1 = 253;     //Buadrate: 9600
    SCON = 0x50;   //SM0 = 0, SM1 = 1; REN = 1;
    TR1 = 1;   // khoi dong timer 1
 

2. Truyền 1 ký tự.

     1. Ghi ký tự vào thanh ghi SBUF để truyền đi.
     2. Chờ cho cờ TI được bật.
     3. Xóa cờ TI để sử dụng cho lần truyền ký tự tiếp theo.

Hàm truyền 1 ký tự được viết như sau.
 

/*Ham truyen 1 ky tu*/
void UART_PutChar(unsigned char chr)
{
 SBUF = chr;           //ghi ky tu vao SBUF de truyen
 while(TI == 0);       //Cho cho co TI bat len 1
 TI = 0;
}    
 


3. Nhận 1 ký tự.

     1. Chờ cờ RI được bật báo có dữ liệu đến.     2.  Đọc dữ liệu từ thanh ghi SBUF.
     3. Xóa cờ RI cho lần nhận dữ liệu tiếp theo.
Hàm nhận dữ liệu không dùng ngắt được viết như sau.
 

/*Ham nhan 1 ky tu*/
unsigned char UART_GetChar(void)
{
 unsigned char temp;
 while(RI == 0);    //Cho co RI duoc bat len 1 bao co du lieu den
 temp = SBUF;          // doc du lieu 
 RI = 0;               // xoa co RI de lan nhan tiep theo
 return temp;
}
 


4. Nhận dữ liệu sử dụng ngắt.

     Thông thường, với một công việc thụ động như nhận dữ liệu qua UART thì việc sử dụng ngắt sẽ tiện lợi hơn rất nhiều. VĐK 8051 cho phép thiết lập ngắt UART bằng cách bật 2 bit ES và EA trong thanh ghi IE lên 1.
     Sau đó chúng ta có thể sử dụng hàm ngắt nhận dữ liệu như sau để nhận dữ liệu.

 

/*ISR UART*/
void ISR_UART(void) interrupt 4
{
 if(RI == 1)           //Kiem tra xem la ngat nhan hay truyen
 {
    chr_isr = SBUF;   //nhan du lieu
    RI = 0;
 }
}
 
     
Các bạn có thể tham khảo source code và mô phỏng Tại Đây.   
Pass giải nén: dientu79.blogspot.com
Hãy Like Fanpage để cập nhật thông tin bài viết mới nhất.

Chủ Nhật, 3 tháng 4, 2016

Sử dụng Timer tạo PWM điều khiển động cơ.

Chào các bạn!


Tiếp theo bài học Timer/Counter với 8051, mình xin chia sẻ với các bạn một project nhỏ sử dụng bộ Timer/Counter của 8051 để tạo tín hiệu PWM để điều khiển động cơ.
Sơ đồ mạch mô phỏng như sau.
Chương trình thực hiện 3 chức năng đơn giản là:
     Điều khiển Start/Stop Động cơ.
     Tăng tốc độ động cơ.
     Giảm tốc độ động cơ.

Các bạn có thể tham khảo code và mô phỏng Tại Đây.
Chương trình khá đơn giản nên mình cũng không giải thích nhiều. Bạn nào thắc mắc có thể để lại comment.
Pass giải nén: dientu79.blogspot.com
Hãy Like Fanpage để cập nhật thông tin bài viết mới nhất.


Website được thực hiện bởi: cửa hàng linh kiện điện tử Đức Long https://muabanlinhkien.net/

Thứ Năm, 31 tháng 3, 2016

Đồ án 5: Đèn giao thông ngã tư sử dụng 8051

Chào các bạn!

Hôm nay, mình xin gửi đến các bạn mạch mô phỏng đèn tín hiệu giao thông tại ngã tư, sử dụng vi điều khiển 8051.
Các bạn có thể download file mô phỏng và source code Tại Đây.
Mô phỏng trên proteus 7.0
Pass giải nén: dientu79.blogspot.com
Chúc các bạn thành công.

Website được thực hiện bởi: cửa hàng linh kiện điện tử Đức Long https://muabanlinhkien.net/

Thứ Hai, 28 tháng 3, 2016

Bài 6: Timer/Counter với 8051

Chào các bạn!

     Hôm nay, mình xin giới thiệu với các bạn cách cấu hình và sử dụng bộ Timer/Counter với 8051.
     Bộ Timer/Counter trong 8051 có thể được sử dụng trong rất nhiều ứng dụng như đếm sự kiện (Counter)  trên chân T0(P3.4), T1(P3.5), sử dụng tạo hàm delay với độ chính xác cao, sử dụng tạo tín hiệu PWM, sử dụng ngắt timer để quét led 7 thanh...
     Trong bài viết này mình sẽ hướng dẫn các bạn sử dụng timer trong 8051 ở chế độ counter và sử dụng timer để tạo hàm delay. Ứng dụng tạo PWM sử dụng timer mình sẽ đề cập trong một bài viết khác.

I. Các thanh ghi điều khiển bộ Timer/Counter trong 8051.

1. Thanh ghi TMOD.

     Cả hai bộ Timer/Counter(bộ T/C) 0 và 1 của 8051 đều sử dụng chung thanh ghi TMOD để thiết lập các chế độ hoạt động của bộ T/C. Thanh ghi TMOD là thanh ghi 8 bit, có 4 bit thấp dành cho bộ T/C0 và 4 bit cao dành cho bộ T/C1
Hình 1.1: Thanh ghi TMOD.
     Ý nghĩa các bit trong thanh ghi TMOD như sau.
GATE: GATE = 1: Bộ T/C được cho phép hoạt động khi chân INTx ở mức cao và bit TRx trong thanh ghi TCON được set lên 1. (x: 0 hoặc 1).
             GATE = 0: Bộ T/C được cho phép hoạt động khi bit TRx trong thanh ghi TCON được set lên 1.
CT: CT = 1: Chức năng counter được chọn.
       CT = 0: Chức năng timer được chọn.
M1, M0: 2 bit chọn các chế độ hoạt động của T/C.

M1                 M0                    Mode                                           Mô tả

0                      0                         0             Chế độ định thời 13 bit, 8 bit THx, 5 bit TLx

0                      1                         1             Chế độ định thời 16 bit.

1                      0                         2             Chế độ 8 bit tự nạp lại.

1                      1                         3             Chế độ bộ định thời chia tách.

2. Thanh ghi TCON.

Hình 1.1: Thanh ghi TCON.
     Thanh ghi TCON có 4 bit cao chứa các bit điều khiển và các bit cờ báo trạng thái của các bộ T/Cx.
     Ý nghĩa 4 bit cao của thanh ghi TCON như sau.

TF1: Cờ báo tràn bộ T/C1.
TR1: Bit điều khiển khởi động hoặc dừng bộ T/C1.
TF0: Cờ báo tràn bộ T/C0.
TR0: Bit điều khiển khởi động hoặc dừng bộ T/C0.

3. Thanh ghi chứa giá trị THx, TLx.

     Cả hai bộ T/C (T/C0 và T/C1) đều có các thanh ghi chứa giá trị bao gồm 16 bit, nhưng được truy cập theo 2 byte, byte cao THx và byte thấp TLx.
     Đối với bộ T/C0 thì 2 byte của thanh ghi chứa giá trị là TH0 và TL0, tương tự đối với T/C1 là TH1 và TL1.

II. Cấu hình Timer/Counter hoạt động ở chế độ counter.

     Sau đây mình sẽ hướng dẫn các bạn cấu hình bộ timer/counter 0 trong 8051 để thực hiện bài toán đếm xung cạnh xuống (falling edge) trên chân T0 và hiển thị số đếm lên LCD1602.
     Sơ đồ mạch mô phỏng như sau.
Hình 2.1: Sơ đồ mạch mô phỏng.
     Các bước cấu hình cho timer/counter 0 như sau.
1. Ghi vào thanh ghi TMOD để chọn chế độ Counter, chọn mode (8bit hoặc 16bit hoặc 13bit). Ở đây mình sẽ chọn chế độ counter nên sẽ set bit C/T=1, Mode 16 bit: M1 = 0, M0 = 1. ==>Giá trị ghi vào TMOD là 0x05. (Chỉ sử dụng Timer 0).
2. Set bit TR0 (TR0 = 1) để cho phép timer 0 hoạt động.
3. Lấy giá trị trong thanh ghi TL0, TH0 và lưu và trong một biến 16 bit và sau đó hiển thị lên LCD.

     Đoạn code trong chương trình main được viết như sau.

 

 /*Cau hinh Timer0 che do counter*/
 TMOD = 0x05; //CT=1, M1=0, M0=1. Couter, Mode 16bit
 /*Enbale Timer0*/
 TR0 = 1;
 /*Init LCD*/
 lcd1602_init();
 lcd1602_clear();
 lcd1602_gotoxy(0,0);
 lcd1602_puts("COUNTER USE 8051");
 lcd1602_gotoxy(0,1);
 lcd1602_puts("COUNTER=");
 while(1)
 {
  /*Doc gia tri tu TH0 va TL0*/
  low_byte = TL0;
  high_byte = TH0;
  bt_num=(high_byte*256)+low_byte;
  sprintf(lcd_buff,"%d",bt_num);
  lcd1602_gotoxy(9,1);
  lcd1602_puts(lcd_buff);
  
 }
 

     Trong đoạn code trên, các bạn thấy chỉ có 2 dòng lệnh sử dụng cho việc cấu hình Timer 0.
TMOD = 0x05;
TR0 = 1;
     Trong vòng lặp while(1), giá trị của thanh ghi TL0, TH0 liên tục được cập nhật và đưa vào biến bt_num, sau đó được hiển thị lên LCD.
     Các bạn có thể download source code và mô phỏng Tại Đây để tham khảo.
     Pass giải nén: dientu79.blogspot.com
     Hãy Like Fanpage để cập nhật thông tin bài viết mới nhất.

III. Cấu hình Timer/Counter hoạt động ở chế độ counter.

     Tiếp theo, mình sẽ hướng dẫn các bạn sử dụng T/C 0 của 8051 để sử dụng chức năng định thời. Mình sẽ dùng bộ T/C0 để viết một chương trình con delay.
     Nguyên tắc hoạt độn của bộ timer/counter ở chế độ timer như sau. 
     Khi bit TR của bộ T/C được set, bộ T/C sẽ được cho phép hoạt động, và cứ mỗi xung nhịp clock thì giá trị của thanh ghi chứa giá trị TH0, TL0 tăng lên 1(bắt đầu từ giá trị được cài đặt, mặc định là 0). Phụ thuộc vào mode hoạt động (8bit, 13bit, hay 16bit) mà giới hạn tràn của thanh ghi chứa giá trị là khác nhau. 
     Với mode 8bit, chỉ có thanh ghi TL được sử dụng để định thời, thanh ghi TH được sử dụng để ghi giá trị khởi tạo, và mỗi khi thanh ghi TL bị tràn (vượt quá 255) thì giá trị trong thanh ghi TH được tự động load vào thanh ghi TL. Vậy nên chế đọ này được gọi là 8 bit tự nạp lại.
     Với mode 16 bit, thì cả 2 thanh ghi TL và TH đều sử dụng chứa giá trị của T/C. Và khi T/C tràn (giá trị TH,TL vượt quá 65535) thì sẽ được reset về 0 và đồng thời cờ báo tràn TF được bật. Vậy nên sau khi tràn, phải khởi tạo lại giá trị cho TH,TL để có được thời gian định thì mong muốn.
     Mode 13 bit tương tự mode 16 bit.
     Các bước cấu hình cho bộ T/C0 hoạt động cở chế độ timer (định thời) như sau.
1. Ghi vào thanh ghi TMOD để chọn chế độ timer, chọn mode: Ví dụ ở đây mình chọn chế độ timer (C/T = 0) và mode 16 bit (M1=0, M0=1), mình sẽ ghi giá trị 0x01 vào TMOD (TMOD = 0x01).
2. Ghi vào thanh ghi TL0, TH0 các giá trị để tạo ra giá trị định thời mong muốn. Ví dụ mình muốn định thời 1ms (với thạch anh 12MHz), mình sẽ ghi vào thanh ghi giá TH, TL giá trị (65536 - 1000 =64536). Vì với thạch anh 12MHz, xung nhịp của 8051 là 1/12 của tần số thạch anh là 1MHz. Tương ứng với một xung nhịp là 1us, do vậy để có thời gian 1ms = 1000us, mình cần cho bộ T/C đếm 1000 lần. Mình gán giá trị 64536 bởi vì sau 1000 lần tăng giá trị thì T/C sẽ tràn và khi đó cờ TF sẽ bật lên 1. Chỉ cần kiểm tra cờ TF là mình biết đã đủ 1ms hay chưa. 

3. Set thanh ghi TR để cho phép bộ T/C hoạt động.
4. Kiểm tra cờ TF để biết bộ T/C đã tràn hay chưa.
5. Khởi tạo lại giá trị cho các thanh ghi TH,TL để chuẩn bị cho lần chạy tiếp theo.

Chương trình con delay_1ms được viết như sau.
 

 /*Ham delay su dung timer*/
 void delay_1ms(void)
 {
  TMOD = 0x01;   //Timer 0, mode 16 bit
  /*Gan gia tri 64536 cho thanh ghi TH0, TL0*/
  TL0 = 0x18;    //byte thap cua gia tri 64536
  TH0 = 0xFC;    //byte cao cua gia tri 64536
  TF0 = 0;       //xóa co bao tran TF0
  TR0 = 1;       //Cho phep timer 0 hoat dong
  while(TF0 == 0); //Cho cho bo timer tran
  TR0 = 0;   //Ngung timer 0
 }
 

     Đoạn chương trình trên khá đơn giản, Sau khi khởi tạo chọn chế độ cho thanh ghi TMOD. Giá trị 64536 được gán vào TL0 và TH0. 64536 là một số 16bit nên chúng ta cần tách ra 2 byte thấp và cao để đưa vào các thanh ghi TL0, TH0 tương ứng. Sau đó xóa cờ báo tràn và cho phép timer chạy bằng lệnh TR0 = 1; Câu lệnh while(TF0 == 0); sẽ chờ cho đến khi timer tràn (65536). Như vậy từ 65534 đến 65536 bộ timer đã tăng 1000 giá trị, mỗi lần tăng một giá trị là 1 xung nhịp clock (chu kỳ 1us). Như vậy khi gọi chương trình trên, mất 1ms=1000us thì mới thoát khỏi được chương trình.
     Trong các bài tiếp theo mình sẽ trình bày ngắt timer để quét led 7 thanh và sử dụng timer để tạo PWM điều khiển động cơ.
     Hãy Like Fanpage để cập nhật thông tin bài viết mới nhất.
Website được thực hiện bởi: cửa hàng linh kiện điện tử Đức Long https://muabanlinhkien.net/

Chủ Nhật, 27 tháng 3, 2016

Đồ án 4: Máy tính bỏ túi sử dụng 8051.

Chào các bạn!


Tiếp tục với serial các đồ án cho các bạn đã và đang theo học 8051 tham khảo. Hôm nay mình xin giới thiệu đến các bạn đồ án máy tính bỏ túi sử dụng 8051 hiển thị lcd1602.
Các bạn có thể download source code và mô phỏng Tại Đây.
Chúc các bạn thành công.

Website được thực hiện bởi: cửa hàng linh kiện điện tử Đức Long https://muabanlinhkien.net/

Bài 5: Ngắt ngoài với 8051

Chào các bạn!

Hôm nay, mình xin giới thiệu đến các bạn cách cấu hình và sử dụng ngắt ngoài với VĐK 8051.

I. Các nguồn ngắt của VĐK 8051.

     Vi điều khiển 8051 gồm có sáu nguồn ngắt như sau (Reset cũng là một nguồn ngắt).

II. Các thanh ghi điều khiển ngắt của 8051.

1. Thanh ghi cho phép ngắt/cấm ngắt IE (Interrupt enable).
Hình 2.1: Thanh ghi cho phép ngắt/cấm ngắt.
Ý nghĩa của các bit trong thanh ghi IE như sau.

EX0: Cho phép (EX0 = 1) hoặc cấm (EX0 = 0) ngắt ngoài 0.
ET0: Cho phép (ET0 = 1) hoặc cấm (ET0 = 0) ngắt timer 0.
EX1: Cho phép (EX1 = 1) hoặc cấm (EX1 = 0) ngắt ngoài 1.
ET1: Cho phép (ET1 = 1) hoặc cấm (ET1 = 0) ngắt timer 1.
ES: Cho phép (ES = 1) hoặc cấm (ES = 0) ngắt cổng nối tiếp.
ET2: Cho phép (ET2 = 1) hoặc cấm (ET2 = 0) ngắt timer 2.
EA: Cho phép (EA = 1) hoặc cấm (EA = 0) ngắt toàn cục. 

2. Thanh ghi TCON.
     Thanh ghi TCON là thanh ghi có chứa các bit điều khiển hoạt động timer, các bit cờ báo tràn timer, các bit cấu hình ngắt kích phát mưc/kich phát sườn sử dụng cho ngắt ngoài. 
Hình 2.2: Thanh ghi TCON.

Ý nghĩa của các bit trong thanh ghi TCON như sau.

TF1: Cờ báo tràn của timer 1. Được set lên 1 khi timer 1 tràn và được xóa bởi phần cứng khi chương trình nhày vào trình phục vụ ngắt (chương trình ngắt).
TR1: bit điều khiển hoạt động của timer 1. TR1 = 1: timer 1 bắt đầu hoạt động, TR1 = 0: Dừng timer 1.
TF0: Tương tự TF1, nhưng sử dụng cho timer 0.
TR0: Tương tự TR1, nhưng sử dụng cho timer 0.
IE1: Cờ ngắt ngoài 1 kích phát sườn, được set lên 1 khi phát hiện có sườn xuống ngắt ngoài, và được xóa khi ngắt được xử lý.
IT1: Bit điều khiển kiểu ngắt ngoài 1. Có 2 kiểu ngắt ngoài là ngắt kích phát mức và ngắt kích phát sườn. Bit IT1 được sử dụng để chọn 1 trong 2 kiểu ngắt ngoài này cho ngắt ngoài 1. Khi IT1 = 0, ngắt ngoài 1 là ngắt kích phát mức, ngược lại IT1 = 1, ngắt ngoài 1 là ngắt kích phát sườn.
IE0: Tương tự IE1 nhưng sử dụng cho ngắt ngoài 0.
IT0: Tương tự IT1nhưng sử dụng cho ngắt ngoài 0.

III. Cấu hình ngắt ngoài cho 8051 sử dụng Keil C.

     Sau đây, mình xin chia sẻ cách cấu hình ngắt ngoài cho 8051 trong Keil C.
     Mình sẽ cấu hình sử dụng ngắt ngoài 0, đối với ngắt ngoài 1 các bạn có thể làm tương tự, chỉ khác nhau là thay đổi các bit cấu hình cho ngắt ngoài 0 sang ngắt ngoài 1.
     Sơ đồ mô phỏng được cho như sau.

Hình 3.1: Sơ đồ mạch mô phỏng.
     Đối với mạch điện như trên hình 3.1, mình sẽ viết chương trình sử dụng ngắt ngoài để đếm số trên led 7 thanh tăng giá trị từ 0 -> 9.
     Như các bạn thấy nút nhấn được nối vào chân P3.2, do vậy mình sẽ sử dụng ngắt ngoài 0 (EX0=1).
     Kiểu ngắt ở đây mình sử dụng ngắt kích phát sườn (IT0 = 1).
     Để sử dụng ngắt, chúng ta cần thực hiện 2 công việc. 1 là cấu hình các thanh ghi cho phép sử dụng ngắt, và 2 là viết chương trình thực hiện ngắt.
     Cấu hình các thanh ghi cho phép sử dụng ngắt được thực hiện trong chương trình chính. Để cấu hình cho phép sử dụng ngắt ngoài 0, kiểu ngắt kích phát sườn ta thực hiện như sau.


 

/*Cau hinh ngat ngoai 0*/
EX0 = 1; //cho phep ngat ngoai 0
IT0 = 1; //ngat kich phat suon
EA = 1;  //cho phep ngat toan cuc.
 

     Trong chương trình ngắt, chúng ta sẽ thực hiện công việc tăng giá trị của biến đếm và kiểm tra biến đếm có bị tràn (lớn hơn 9) hay không. Chương trình ngắt được viết như sau

 

/*Chuong trinh phuc vu ngat ngoai 0*/
void ISR_EX0 (void) interrupt 0
{
 bt_num ++;
 if(bt_num > 9)
  bt_num = 0;
}
 

     Công việc còn lại trong chương trình chính là xuất giá trị tương ứng với biến đếm bt_num ra led 7 thanh.

 

while(1)
 {
  /*Xuat gia tri ra led 7 thanh*/
  LED_PORT =  code_7_seg[bt_num];
 }
 

     Các bạn có thể download source code và chương trình mô phỏng Tại Đây.
     Chúc các bạn thành công.

Thứ Bảy, 12 tháng 3, 2016

Đồ án 3: Đo nhiệt độ sử dụng LM35 hiển thị led 7 thanh.

Chào các bạn!
     Đồ án đo nhiệt độ là một trong những đồ án phổ biến trong môn học VĐK 8051.
     Vì vậy, hôm nay mình xin chia sẻ với mọi người mạch mô phỏng đo nhiệt độ bằng VĐK 8051 sử dụng cảm biến nhiệt độ LM35 và bộ chuyển đổi tương tự - số ADC0804, hiển thị giá trị nhiệt độ lên led 7 thanh.
   
       Các bạn có thể tham khảo source code và mô phỏng Tại Đây.
       Lưu ý: Mô phỏng chạy trên proteus 7.0