KIT AT89S52 V1 - Hướng Dẫn Sử Dụng

KIT AT89S52 V1

Là phiên bản đơn giản cho người mới bắt đầu học dòng 8051.
Để bắt đầu với KIT, ta cần chuẩn bị:

  1. Mạch Nạp 89
  2. KIT AT89S52 V1
  3. Nguồn Adapter 5V1A
  4. Các Module Mở Rộng : LCD, Cảm Biến …(Trên KIT cơ bản đã có ứng dụng lập trình LED đơn)
    Các tính năng có thể học:
  • Giao Tiếp IO
  • Giao Tiếp UART qua MAX232
  • Giao Tiếp LCD: Graphic, Text
  • Giap Tiếp Key Đơn ( Bàn Phím)
  • Giao Tiếp Led Đơn
  • Giao Tiếp Nhiệt Độ DS18B20
  • Giao Tiếp Cảm Biến Siêu Âm SRF05
  • Hỗ trợ Nạp ISP
  • Hỗ Trợ Các Dòng Chip: AT89C51, AT89C52, AT89C55, AT89S51, AT89S52
    Tổng hợp tài liệu :
    - Code Test Tổng Hợp: AT89S52.rar
  • Sơ Đồ Nguyên Lý: KIT AT89S52 V1
    Video ứng dụng:
    https://youtu.be/Hj7B7GclYFI
    Xem các bài học bên dưới:

Bài 1. Dùng Nút Nhấn Điều Khiển LED Đơn

Mô tả đề bài : Nhấn nút nhấn 1 -> Led 1 sáng 1s rồi tắt
Nhấn nút nhấn 2 -> Led 2 sáng 1s rồi tắt
Nhấn nút nhấn 3 -> Led 3 sáng 1s rồi tắt
Nhấn nút nhấn 4 -> Led 4 sáng 1s rồi tắt
Sơ đồ nguyên lí khối Led đơn
[​IMG]
Sơ đồ nguyên lí khối nút nhấn
[​IMG]
Đầu tiên vào chương trình chúng ta tắt toàn bộ Led đơn bằng cách kéo các chân I/O tương ứng với Led các led đơn lên mức 1
Để điều khiển được thì trong hàm thực thi chính chúng ta sẽ luôn kiểm tra xem nút nhấn nào được nhấn bằng cách kiểm tra xem chân I/O ứng với nút nhấn nào được kéo xuống mức 0 .Nếu phát hiện nút được nhấn thì sẽ cho con led tương ứng sáng bằng cách kéo chân I/O ứng với nó xuống mức 0 sau đó chờ 1s và kéo chân đó lên mức 1

 //Code             
          LED_ONE = LED_TWO = LED_THREE = LED_FOUR = 1;
          KEY_ONE = KEY_TWO = KEY_THREE = KEY_FOUR = 1;
          while(1)
            {
                    if(KEY_ONE == 0)
                        {
                            delay_ms(10);
                            if(KEY_ONE == 0)
                                {
                                    while(KEY_ONE == 0);
                                    LED_ONE = 0;
                                    delay_ms(1000);
                                    LED_ONE = 1;
                                }
                        }
                        if(KEY_TWO == 0)
                        {
                            delay_ms(10);
                            if(KEY_TWO == 0)
                                {
                                    while(KEY_TWO == 0);
                                    LED_TWO = 0;
                                    delay_ms(1000);
                                    LED_TWO = 1;
                                }
                        }
                        if(KEY_THREE == 0)
                        {
                            delay_ms(10);
                            if(KEY_THREE == 0)
                                {
                                    while(KEY_THREE == 0);
                                    LED_THREE = 0;
                                    delay_ms(1000);
                                    LED_THREE = 1;
                                }
                        }
                        if(KEY_FOUR == 0)
                        {
                            delay_ms(10);
                            if(KEY_FOUR == 0)
                                {
                                    while(KEY_FOUR == 0);
                                    LED_FOUR = 0;
                                    delay_ms(1000);
                                    LED_FOUR = 1;
                                }
                        }
            }

Xem code dưới đây:
LED.rar (31.2 KB)
Nguồn: http://hocdientu.vn/threads/kit89s52-v1-dung-nut-nhan-dieu-khien-led-don.2812/

Bài 2. Đo ,hiển thị và cảnh báo nhiệt độ sử dụng DS18B20

-Mô tả đề bài

  • Đo nhiệt độ bằng DS18B20 hiển thị lên LCD16x2
  • Nhiệt độ vượt quá 34 độ C Cảnh báo nhiệt độ cao trên LCD16x2
    -Sơ đồ phần cứng
  • Khối DS18B20
    [​IMG]
    +Khối LCD16x2

[​IMG]
-Thực hiện chương trình
+Vào chương trình chúng ta khởi tạo cho LCD16x2
+Trong vòng lặp mình đọc nhiệt độ từ DS18b20
+Check nhiệt độ xem nhiệt độ bình thường (<= 34 độ C) hay nhiệt độ cao (> 34 độ C)
Nếu nhiệt độ bình thường : Hiển thị nhiệt độ lên LCD 16x2 và báo nhiệt độ thường
Nếu nhiệt độ cao : Hiển thị nhiệt độ lên LCD16x2 và cảnh báo nhiệt độ cao
Code

lcd1602_init();
    lcd1602_gotoxy(0,0);
    lcd1602_puts("banlinhkien.vn");
    delay_ms(1000);
    lcd1602_clear();
    LED_DON = 0xff;
    while(1)
    {
        Nhiet_Do=ds18b20_readtemp();
        if(Nhiet_Do > 34)Check_Temp();
        sprintf(str2,"Temp=%.1f",Nhiet_Do);
        lcd1602_gotoxy(0,0);
        lcd1602_puts(str2);
        sprintf(str2,"Nhiet Do Thuong      ");
        lcd1602_gotoxy(0,1);
        lcd1602_puts(str2);
    }

Tải code full bên dưới:
DS18B20.rar (69.3 KB)

Nguồn: http://hocdientu.vn/threads/kit89s52-v1-do-hien-thi-va-canh-bao-nhiet-do-su-dung-ds18b20.2818/

Bài 3: Điều khiển LED đơn thông qua PC

  • Mô tả đề bài : Dùng PC điều khiển LED .
    Gửi từ PC xuống ‘0’ : Tất cả LED đơn đều tắt
    Gửi từ PC xuống ‘1’ : Mình LED 1 sáng
    Gửi từ PC xuống ‘2’ : Mình LED 2 sáng
    Gửi từ PC xuống ‘3’ : Mình LED 3 sáng
    Gửi từ PC xuống ‘4’ : Mình LED 4 sáng
  • Sơ đồ phần cứng
    Khối RS232
    [​IMG]

Khối LED đơn
[​IMG]
-Thực hiện chương trình
+Vào chương trình chúng ta khởi tạo cho UART của AT89S52 .Khởi tạo chế độ hoạt động ,tốc độ Baurate

  • Tắt toàn bộ LED đơn

  • Gửi lên PC chuỗi kí tự “BANLINHKIEN.VN”

  • Trong vòng lặp while mình luôn kiểm tra xem có tín hiệu từ PC gửi xuống không
    Nếu có
    Kiểm tra xem tín hiệu PC gửi xuống là kí tự gì
    Nếu là ‘0’ : Tắt toàn bộ LED bằng cách kéo các chân I/O tương ứng lên 1
    Nếu là ‘1’ ,‘2’,‘3’,hoặc ‘4’ : Bật LED tương ứng và tắt các LED còn lại bằng cách kéo chân I/O của LED cần bật xuống 0 và kéo các chân I/O của các led còn lại lên 1
    Code

    uart_init();
    LED_ONE = LED_TWO = LED_THREE = LED_FOUR = 1;
    Uart_Puts(“BANLINHKIEN.VN”);
    while(1)
    {
    key=Uart_Getchar();
    if(key)
    {
    switch(key)
    {
    case ‘0’:
    {
    LED_ONE = LED_TWO = LED_THREE = LED_FOUR = 1;
    break;
    }
    case ‘1’:
    {
    LED_ONE = 0;
    LED_TWO = LED_THREE = LED_FOUR = 1;
    break;
    }
    case ‘2’:
    {
    LED_TWO = 0;
    LED_ONE = LED_THREE = LED_FOUR = 1;
    break;
    }
    case ‘3’:
    {
    LED_THREE = 0;
    LED_ONE = LED_TWO = LED_FOUR = 1;
    break;
    }
    case ‘4’:
    {
    LED_FOUR = 0;
    LED_ONE = LED_TWO = LED_THREE = 1;
    break;
    }
    }
    }
    }

Tải code full tại đây: UART.rar (76.1 KB)
Nguồn: http://hocdientu.vn/threads/kit89s52-v1-dieu-khien-led-don-thong-qua-pc.2817/

Bài 4: ĐO KHOẢNG CÁCH SỬ DỤNG CẢM BIẾN SRF05

Hiện nay, cửa hàng banslinhkien.vn đã cho ra đời sản phẩm Kit AT89S52 V1. Đây là bộ kit học tập nhỏ gọn cho dòng vi điều khiển 8051. Ngoài những tính năng cơ bản khác như ghép nối LCD1602, GLCD KS0108, giao tiếp máy tính qua cổng com, nút nhấn, led đơn, DS18B20. Thì Kit AT89S52 V1 còn có thêm chức năng ghép nối với cảm biến siêu âm SRF05.




Sơ đồ kết nối SRF05 với AT89S52 trên Kit AT89S52 V1.

Giao tiếp 8051 với SRF05.

*.Giản đồ xung hoạt động của SRF05.


Dựa vào giản đồ xung ở trên ta thấy:
Để SRF hoạt động chúng ta cần tạo 1 xung có độ rộng tối thiểu là 10us trên chân Trigger.
Sau khi có ung được kích trên chân Trigger, SRF05 sẽ phát ra chuỗi 8 xung để phát sóng siêu âm.
Sau kết thúc việc phát 8 xung, SRF05 sẽ kéo chân Echo lên mức cao. Chúng ta sẽ dựa vào thời gian tồn tại mức cao (Độ rộng xung mức cao) của chân Echo để tính khoảng cách.
Nếu độ rộng xung mức cao nằm trong khoảng 100us-25ms thì nghĩa là có vật cản nằm trong phạm vi phát hiện của SRF05. Và khoảng cách từ cảm biến tới vật cản được tính theo công thức:
Khoảng cách=(((Độ rộng mức cao(us))/58) (cm) =(((Độ rộng mức cao(us))/148 ) (inch).
Nếu độ rộng xung mức cao lớn hơn hoặc bằng 300ms nghĩa là không có vật nằm trong phạm vi của cảm biến SRF05.

*Phương pháp đo khoảng cách với 8051.
Dựa vào tính chất độ rộng xung mức cao trên chân Echo có liên quan với khoảng cách từ cảm biến SRF05 đến vật, ta sẽ dùng vi điều khiển AT89S52 để đo độ rộng xung mức cao trên chân Echo.
Ở đây mình sẽ sử dụng Timer để tính độ rộng xung mức cao trên chân Echo. Nghĩa là sau khi chân Echo được SRF05 kéo lên mức 1, mình sẽ cho Timer hoạt động, sau đó, khi chân Echo xuống mức 0, mình sẽ dừng Timer và từ giá trị đếm được trong thanh ghi TH và TL của Timer để tính ra khoảng cách.
Việc kiểm tra trạng thái của chân Echo từ mức 0 -> 1 có thể thực hiện được bằng cách sử dụng lệnh: while(!Echo);
Việc kiểm tra trạng thái của chân Echo từ 1->0 các bạn có thể dùng ngắt ngoài, hoặc dùng lệnh while(Echo);
Mình khuyên các bạn nên sử dụng ngắt ngoài.
Vậy để đo khoảng cách chúng ta sẽ sử dụng 1 Timer và một chân ngắt ngoài của Vi điều khiển 8051.
Trước hết chúng ta cần khai báo sử dụng và cài đặt cho Timer và ngắt ngoài.
Đoạn mã này mình xin gọi nó là chương trình con khởi tạo cho khởi tạo cho SRF05. Thực chất đây là đoạn chương trình khoi tao cho Timer và ngắt ngoài.

void SRF05_Init(void)
{
    TRIGGER=0;
    TMOD=0x01;  //timer 0 che do 1 (16bit) cuc GATE mo
    TR0=0;
    IT0=1;      //ngat ngoai 0 che do falling
    EX0=1;          //cho phep ngat ngoai 0
    EA=1;          // cho phep ngat toan cuc
    range_ok=0;
}

Chương trình con SRF05_Init(); sẽ được gọi 1 lần ngay từ đầu chương trình.
Sau đó chúng ta sẽ gọi 1 chương trình con cho phép SRF05 hoạt động. Nội dung của chương trình con này là tạo 1 xung có độ rộng tối thiểu 10us trên chân Trigger. Sau đó đợi chân Echo được kéo lên mức cao và cho Timer và ngắt ngoài hoạt động.

void  StartRange()
{
    TRIGGER=1;
    delay_ms(12);        // Phai tao 1 xung len co do lon it nhat 10ms
    ECHO=1;                 
    delay_us(1);
    TRIGGER=0;       
    while(!(ECHO));        // Doi cho den khi chan ECHO duoc keo len cao
    TR0=IT0=EX0=EA=1;    // cho phep timer hoạt dong, cho phep ngat ngoai
}

Việc còn lại là vào chương trình con ngắt ngoài để đọc giá trị bộ Timer và tính khoảng cách.

//ngat ngoai 0
void ngatngoai0(void)interrupt 0
{
    distance=TH0;
    distance<<=8;
    distance|=TL0;
    range=(float)distance*12;
    temp1=(58*11.0592);
    range=range/(temp1);
    TR0=IT0=EX0= 0;        // Ngung timer
    TL0=TH0=0;                  // Xoa du lieu trong thanh ghi Timer 0                   
    range_ok=1;
}  

Tần số bộ timer: Ftimer=11,0592/12.
–>Chu ki bộ Timer: Ttimer=1/Ftimer=12/11.0592.
–> Thời gian độ rộng xung mức cao chân Echo bằng giá trị trong thanh ghi TH, TL của của bộ timer nhân với chu kỳ của bộ timer: (distance12)/11.0592.
–>Khoảng cách tính theo cm: range=(distance
12)/(11.0592*58) (cm)

Tải code full tại đây:
SRF05.rar (41.3 KB)
Nguồn: http://hocdientu.vn/threads/kit-at89s52-v1-do-khoang-cach-su-dung-cam-bien-srf05.2833/