Nó là một loại vi điều khiển 8-bit, được sử dụng trong nhiều ứng dụng như điều khiển thiết bị, đo lường, điều khiển động cơ, và các hệ thống nhúng.. Lưu đồ thuật toán flowchart là một cô
LẬP TRÌNH C VỚI VI ĐIỀU KHIỂN 8051
- Làm quen với Board mạch Easy 8051 v6.
- Làm quen với phần mềm MikroC cho 8051.
- Tìm hiểu và viết chương trình điều khiển cơ bản với C/C++.
1.2.1 Giới thiệu Board thí nghiệm Easy 8051 v6
Board mạch Easy 8051 v6 là sản phẩm thí nghiệm hoàn chỉnh từ hãng Mikroe, cung cấp đầy đủ phần cứng cần thiết để người học dễ dàng làm quen với vi điều khiển 8051.
Easy 8051 v6 bao gồm các thiết bị sau:
- Màn hình LCD 16x2 serial interface;
Hình 1.2 Các khối chức năng của board mạch Easy 8051 v6.
Mikro C là công cụ lập trình dành cho vi điều khiển 8051, được phát triển bởi công ty MikroElectronic Gói công cụ Mikro bao gồm các công cụ lập trình cho nhiều nền tảng như 8051, AVR, PIC, và mới nhất là ARM: STM32F của ST cùng với Stelaris, Tiva của TI Một trong những ưu điểm nổi bật của gói công cụ MikroC 8051 là tính năng mạnh mẽ và dễ sử dụng, giúp lập trình viên tối ưu hóa quy trình phát triển ứng dụng.
- Rất dễ sử dụng đặc biệt là với những người mới làm quen với việc lập trình cho vi điều khiển 8051
- Hỗ trợ thư viện hầu hết cho các ứng dụng như: Uart, Spi,i2c,onewrite, Nhược điểm:
- Người sử dụng gặp khó khăn trong việc tìm hiểu cấu trúc của hàm library và khó thay đổi được nó.
Led là 1 loại diode phát quang, để Led sáng đơn giản cấp cho nó đủ dòng điện tầm 10mA
Hình 1.3 Điều khiển ở chế độ hút dòng Hình 1.4 Điều khiển ở chế độ xả dòng.
Có 2 phương pháp điều khiển Led
- Điều khiển ở chế độ hút dòng (hình 1.3).
- Điều khiển ở chế độ xả dòng (hình 1.4)
Trong bài này ta sẽ làm ở chế độ hút dòng như hình 1.1
- Muốn Led sáng chỉ việc cho đầu Katot của Led ở mức logic “0”
- Muốn Led tắt chỉ việc cho đầu Katot của Led ở mức logic “1”.
1.3 CÁC BƯỚC TIẾN HÀNH THÍ NGHIỆM
1.4.1 Kết nối và lập trình với board mạch Easy 8051v6
Nội dung bài toán yêu cầu: sinh viên phải thực hiện bật tắt các đèn Led đơn theo các yêu cầu sau: ON/OFF led trong 1 thời gian.
- Bước 1: Cài đặt trên máy tính bộ công cụ lập trình mikroC 8051 và công cụ nạp chương trình 8051 flash programmer.
- Bước 2: Cắm jack USB vào board mạch, đầu kia cắm vào PC
Hình 1.4 Cấu hình cấp nguồn cho board mạch Easy 8051v6
Chú ý J11 như ở hình trên nghĩa là lấy nguồn từ USB cấp.
Bước 3: Kết nối thành công khi đèn LED Power và LED USB link sáng Hãy bật công tắc SW7.1 đến SW7.4 sang vị trí ON.
- Bước 4: Trên máy tính, mở phần mềm MikroC
Hình 1.5 Màn hình MikroC khi mới mở lên
Hình1.6 Thiết lập new project trong Mikro C
Sau khi thiết lập trên MikroC ta thử chạy chương trình sau:
//description: ON/OFF led void main() { do {
P0 = 0x00; // Turn ON diodes on PORT0
P1 = 0x00; // Turn ON diodes on PORT1
P2 = 0x00; // Turn ON diodes on PORT2
P3 = 0x00; // Turn ON diodes on PORT3
P0 = 0xFF; // Turn OFF diodes on PORT0
P1 = 0xFF; // Turn OFF diodes on PORT1
P2 = 0xFF; // Turn OFF diodes on PORT2
P3 = 0xFF; // Turn OFF diodes on PORT3
Nội dung sau khi code chạy:
Led trên tất cả các cột sáng 1 giây xong đó đồng thời tắt, led sáng tắt được lặp đi lặp lại liên tục.
Chương trình điều khiển LED đơn sẽ được viết lại với các hiệu ứng LED đuổi nhau từ P0.0 đến P3.7, sử dụng lệnh dịch bit Thời gian chuyển trạng thái cho mỗi đèn LED được thiết lập là 1 giây Người dùng cần mô phỏng chương trình trên phần mềm Proteus và kiểm tra kết quả trên mạch phần cứng thực tế.
Kiểm tra trên mạch phần cứng:
#include void delay(int time)
Sử dụng ma trận đèn LED 4 × 8 được tạo ra từ các port P0, P1, P2, P3 để hiển thị tên của bạn, với thời gian chuyển trạng thái của mỗi ký tự là 500ms Thực hiện mô phỏng trên phần mềm Proteus và kiểm tra kết quả trên mạch phần cứng.
The provided code snippet includes definitions for several arrays of unsigned characters, each representing different characters in a format suitable for display on a 7-segment or similar LED display The array `chuP` encodes the character 'P' with a specific pattern of hexadecimal values, while `chuH` represents the character 'H' Similarly, `chuO` is defined for the character 'O', `chuN` for 'N', and `chuG` for 'G' Each character's representation consists of a series of hexadecimal values that dictate how the character will be visually rendered on the display.
/* Ham Delay */ void Fn_DELAY (unsigned int _vrui_Time) { while(_vrui_Time );} void main()
Kết quả sau khi chạy code:
Sau khi nạp vào mạch phần cứng, các chữ P H O N G sẽ lần lượt xuất hiện sau 1s.
- Với sơ đồ mắc Led như hình 1.5: tính giá trị điện trở phù hợp
Giá trị mỗi điện trở thường là 300 ôm.
- Vòng lặp while, do while, for?
Vòng lặp while được sử dụng để lặp lại một khối mã cho đến khi một điều kiện cụ thể không còn đúng nữa.
Vòng lặp do-while cho phép thực thi một khối mã ít nhất một lần trước khi kiểm tra điều kiện Nó sẽ tiếp tục lặp lại khối mã cho đến khi điều kiện cụ thể không còn đúng nữa.
Vòng lặp for được sử dụng để lặp lại một khối mã một số lần cụ thể.
Vi điều khiển AT89S8253 của hãng Atmel là một trong những vi điều khiển 8-bit phổ biến, được ứng dụng rộng rãi trong các lĩnh vực như điều khiển thiết bị, đo lường, điều khiển động cơ và hệ thống nhúng Dưới đây là thông tin cơ bản về vi điều khiển này.
Kiến trúc: Vi điều khiển AT89S8253 được thiết kế dựa trên kiến trúc von Neumann, với bộ nhớ chung cho dữ liệu và chương trình.
Bộ nhớ: AT89S8253 có bộ nhớ trong 8KB ROM và 256 bytes RAM, cho phép lưu trữ chương trình và dữ liệu.
Vi điều khiển AT89S8253 hỗ trợ các giao tiếp chuẩn như UART, SPI và I2C, giúp kết nối dễ dàng với các thiết bị ngoại vi như cảm biến, màn hình LCD và nhiều thiết bị khác.
Tốc độ xung nhịp: Tốc độ xung nhịp của AT89S8253 có thể được cấu hình tùy ý trong khoảng từ 0 đến 24 MHz.
AT89S8253 sở hữu nhiều tính năng nổi bật như bộ chuyển đổi ADC 10-bit, bộ đếm thời gian, hệ thống ngắt, bộ xung đồng hồ và chế độ tiêu thụ điện năng thấp, mang lại hiệu suất tối ưu cho các ứng dụng điện tử.
Ngôn ngữ lập trình: Vi điều khiển AT89S8253 được lập trình bằng ngôn ngữ lập trình C hoặc ngôn ngữ lập trình hợp ngữ.
Môi trường phát triển: Các công cụ phát triển phổ biến cho vi điều khiển AT89S8253 là Keil C51 và SDCC.
Lưu đồ thuật toán là một công cụ đồ họa hữu ích để biểu diễn thuật toán thông qua các hình khối và mũi tên, cho phép người lập trình dễ dàng theo dõi các bước thực hiện và điều kiện Việc sử dụng lưu đồ thuật toán không chỉ giúp người lập trình hiểu và kiểm tra thuật toán một cách hiệu quả, mà còn làm cho quá trình phân tích và thiết kế thuật toán trở nên đơn giản hơn.
Các hình khối thường được sử dụng trong lưu đồ thuật toán bao gồm: Khối bắt đầu (Start): đại diện cho bước bắt đầu của thuật toán.
Khối kết thúc (End): đại diện cho bước kết thúc của thuật toán.
Khối xử lý (Process): đại diện cho các bước xử lý trong thuật toán, ví dụ như tính toán, gán giá trị, in kết quả, v.v.
Khối điều kiện (Decision): đại diện cho các điều kiện kiểm tra trong thuật toán, ví dụ như kiểm tra điều kiện IF/ELSE, WHILE, FOR, v.v.
Khối đầu vào/đầu ra (Input/Output) thể hiện các thao tác liên quan đến việc nhập và xuất dữ liệu trong thuật toán, chẳng hạn như việc đọc dữ liệu từ bàn phím và in kết quả ra màn hình.
GIAO TIẾP VỚI MA TRẬN BÀN PHÍM VÀ MÀN HÌNH LCD 16x2
- Tìm hiểu và viết chương trình giao tiếp với keypad 4x4;
- Hiển thị trạng thái phím bấm lên LCD 16x2
Trong các hệ thống sử dụng vi điều khiển , bàn phím ,LCD là công cụ giúp cho việc giao tiếp giữa người và vi xử lý.
Xét ma trận bàn phím 4x4 như hình 2.1.
Hình 2.1 Ma trận bàn phím 4x4.
Ma trận bàn phím kết nối với vi điều khiển qua PORT0, hoạt động bằng cách kích hoạt lần lượt các chân P0.0, P0.1, P0.2, P0.3 và đọc trạng thái của các phím bấm thông qua P0.4, P0.5, P0.6, P0.7.
Trong mikroC cung cấp các thư viện hàm giao tiếp với keypad 4x4 Tham khảo trong phần help của MikroC.
Ta xét các thông số và hàm cơ bản sau: char keypadPort at P0 ; // khai báo ma trận phím ở port0
Keypad_Init(); // khởi tạo ma trận bàn phím char Keypad_Key_Click(void);// trả về trạng thái của phím bấm từ (1den16)
Hình 2.3 Các chân chức năng trên màn hình LCD 16x2.
Màn hình LCD16x2 có 2 dòng và 16 cột, chức năng các chân của nó như sau:
Các thanh ghi của LCD
Thanh ghi IR là nơi mà mỗi lệnh được nhà sản xuất LCD đánh địa chỉ một cách rõ ràng Người dùng chỉ cần cung cấp địa chỉ lệnh bằng cách nạp vào thanh ghi IR để thực hiện các thao tác cần thiết.
Lệnh “hiển thị màn hình và con trỏ” có mã lệnh là 00001110
Thanh ghi DR là thành phần quan trọng trong việc lưu trữ dữ liệu 8 bit, phục vụ cho việc ghi vào vùng RAM DDRAM hoặc CGRAM khi ở chế độ ghi Ngoài ra, thanh ghi này cũng có chức năng chứa dữ liệu từ hai vùng RAM để gửi ra cho MPU trong chế độ đọc.
- Cờ báo bận BF: (Busy Flag)
Khi thực hiện các hoạt động nội bộ, LCD ngừng mọi giao tiếp bên ngoài và kích hoạt cờ BF thông qua chân DB7 với thiết lập RS=0 và R/W=1 để thông báo rằng nó đang "bận".
- Bộ đếm địa chỉ AC : (Address Counter)
Khi địa chỉ lệnh được nạp vào thanh ghi IR, thông tin sẽ được kết nối trực tiếp với hai vùng RAM, và việc lựa chọn vùng RAM tương tác đã được xác định trong mã lệnh.
Sau khi ghi vào (đọc từ) RAM, bộ đếm AC tự động tăng lên (giảm đi)1 đơn vị.
Vùng RAM hiển thị DDRAM (Display Data RAM) là khu vực RAM chuyên dụng để hiển thị thông tin, trong đó mỗi địa chỉ RAM tương ứng với một ô ký tự trên màn hình.
Vùng CGROM: Character Generator ROM
Chứa các mẫu kí tự loại 5x7 hoặc 5x10 điểm ảnh/kí tự, và định địa chỉ bằng 8 bit.
Vùng CGRAM : (Character Generator RAM)
Người dùng có thể tạo các mẫu kí tự đồ họa riêng
- Phần cứng giao tiếp với LCD:
Hình 2.4 Giao tiếp giữa vi điều khiển và LCD 16x2.
Bảng mã lệnh của LCD:
Trong lập trình với mikroC, một số cấu hình và hàm quan trọng để làm việc với LCD bao gồm: `void Lcd_Init();` để khởi tạo LCD, `void Lcd_Out(row, column, *text);` dùng để in ra văn bản tại hàng và cột tương ứng, và `void Lcd_Cmd(char out_char);` để gửi lệnh đến LCD.
2.3 CÁC BƯỚC TIẾN HÀNH THÍ NGHIỆM
This article discusses the communication between a keypad matrix and a 16x2 LCD screen, initializing variables such as 'kp', 'cnt', and 'oldstate' to zero It defines a character array 'txt' with a size of six and specifies the keypad port as P0 Additionally, it configures the control pins for the LCD, including RS, EN, and data pins D4 to D7, all set to specific bit positions on port P2 The main function initializes the 'cnt' variable to zero, setting the stage for further operations.
The LCD is initialized by clearing the display and turning off the cursor, followed by displaying the prompts "Key :" and "Times:" The program enters a loop where it waits for a key press from the keypad Upon detecting a key press, it assigns corresponding values to the variable `kp` based on the key pressed, with specific cases for each key from 1 to 9, A to D, as well as special keys like * and # This structured approach allows for efficient key detection and processing in the application.
} if (kp != oldstate) { cnt = 1; oldstate = kp;
Lcd_Chr(1, 10, kp); if (cnt == 255) { cnt = 0;
Kết quả sau khi nap code:
Màn hình LCD hiển thị chữ "Key" ở dòng đầu tiên và "time" ở dòng thứ hai Khi người dùng nhấn một phím, mã phím sẽ được chuyển đổi thành giá trị ASCII tương ứng và hiển thị trên màn hình LCD.
Vẽ lưu đồ thuật toán cho chương trình trên
Chương trình này cho phép người dùng nhập vào một số nhị phân 4 bit và thực hiện chuyển đổi sang số hexa, sau đó hiển thị kết quả trên màn hình LCD Quá trình này được mô phỏng trên phần mềm Proteus và được kiểm tra thực tế trên mạch phần cứng.
The code initializes several variables, including an unsigned short for keypad input and a character array for binary and hexadecimal representations It defines the keypad port at P0 and sets up specific bits for controlling an LCD display, including register selection and enable signals, along with data lines D4 to D7 The main function serves as the entry point for the program, where these components will be utilized to process input and display results.
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_Off); // Cursor off
Lcd_Out(1, 1, "Bin : "); // Write message text on LCD Lcd_Out(2, 1, "Hex: "); do { kp = 0; // Reset key code variable
// Wait for key to be pressed and released do
// kp = Keypad_Key_Press(); // Store key code in kp variable kp = Keypad_Key_Click(); // Store key code in kp variable while (!kp);
// Prepare value for output, transform key to it's ASCII value switch (kp) { case 1: kp = 49; bin[i]=1; i++; break; // 1 case 14: kp = 48; bin[i]=0; i++;
; break; // 0 case 15: i=0; cot=8; break; // # case 16:
Dec=bin[0]*8+bin[1]*4+bin[2]*2+bin[3]*1; flag=1; break; // D
} if(flag==1){ switch (Dec) { case 0:
Hex = 55; break; // 7 case 8: Hex = 56; break; // 8 case 9: Hex = 57; break; // 9 case 10: Hex = 65; break; // A case 11: Hex = 66; break; // B case 12: Hex = 67; break; // C case 13: Hex = 68; break; // D case 14: Hex = 69; break; // E case 15: Hex = 70; break; // F }
//WordToStr(Hex, Hex1); Lcd_Chr(2, 7, Hex); cot++;
Lcd_Chr(1, cot, kp); } while (1);
Chương trình này cho phép người dùng nhập vào hai số hexa, sau đó tính toán tổng và tích của chúng Kết quả sẽ được hiển thị trên màn hình LCD Ngoài ra, người dùng cũng có thể mô phỏng quá trình này trên phần mềm Proteus và kiểm tra hoạt động trên mạch phần cứng thực tế.
The provided code snippet defines variables for handling hexadecimal to decimal conversion, including an unsigned short for storing values, a character array for binary and hexadecimal representations, and specific bit assignments for interfacing with an LCD display The function `hexToDec` converts a hexadecimal character to its decimal equivalent, checking if the character falls within the range of '0' to '9' and returning the corresponding integer value This setup is essential for projects involving microcontrollers and display outputs, ensuring accurate data representation.
} else if (hex >= 'A' && hex = 0 && dec = 10 && dec