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ô
Trang 1TRƯỜNG ĐẠI HỌC VINH
VIỆN KĨ THUẬT VÀ CÔNG NGHỆ
BÁO CÁO THỰC HÀNH MÔN HỌC THIẾT KẾ
HỆ THỐNG NHÚNG
Giảng viên hướng dẫn: Ts Mai Thế Anh
Sinh viên thực hiện: Nguyễn Huy Phong 205752021610009
Nghệ An, 2023
Trang 2MỤC LỤC
LỜI MỞ ĐẦU 3
BÀI 1: LẬP TRÌNH C VỚI VI ĐIỀU KHIỂN 8051 4
BÀI 2: GIAO TIẾP VỚI MA TRẬN BÀN PHÍM VÀ MÀN HÌNH LCD 16x2 17
BÀI 3: GIAO TIẾP VỚI CÁC ĐÈN LED 7 THANH 31
BÀI 4: GIAO TIẾP VỚI CẢM BIẾN NHIỆT ĐỘ 43
BÀI 5: LẬP TRÌNH SỬ DỤNG NGẮT NGOÀI 46
BÀI 6: HỆ ĐIỀU HÀNH THỜI GIAN THỰC 54
Trang 3LỜI MỞ ĐẦU
Hiện nay, ngành kỹ thuật điều khiển và tự động hóa tiến bộ không ngừng.Chúng đang ngày càng phát triển và được ứng dụng trong tất cả các mặt của đờisống Các máy điện và khí cụ điện sử dụng rộng khắp trong các ứng dụng tự động
Nó giúp chúng ta trong mọi công việc cũng như giải trí Học phần lí thuyết điềukhiển hiện đại đã cung cấp cho em những kiến thức nền tảng và các thiết bị điện sửdụng rõng rãi trong cuộc sống, giúp em hiểu rõ tính năng và công dụng để áp dụngvào công việc sau này
Và đặc biệt, chúng em xin gửi lời cảm ơn và tri ân sâu sắc tới Mai Thế Anh Giảng viên giảng dạy học phần “Thiết kế hệ thống nhúng” đã quan tâm, giúp đỡ vàhướng dẫn, chỉ bảo chúng em tận tình trong suốt thời gian học tập Với tâm huyếtcủa mình, thầy đã truyền dạy cho bọn em những kinh nghiệm và kiến thức quý giátrong quãng thời gian học tập và rèn luyện vừa qua Đó không chỉ là những kiếnthức, kinh nghiệm để chúng em áp dụng riêng cho bài tập lần này mà còn là nhữngbài học bổ ích để chúng em vững vàng hơn khi bước vào nghề, vào đời
-Với điều kiện và vốn kiến thức còn hạn chế, bài báo cáo không thể tránh khỏi đượcnhững thiếu sót nhất định Vì vậy, rất mong sẽ nhận được sự chỉ bảo, sửa chữa củagiảng viên để chúng em có thể nhận ra những lỗi sai và thiếu sót, giúp bản thânnâng cao kiến thức kinh nghiệm, tạo tiền đề cho chúng em phát triển sau này
Trang 4BÀI 1: LẬP TRÌNH C VỚI VI ĐIỀU KHIỂN 8051 1.1 MỤC ĐÍCH
- 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 CƠ SỞ LÝ THUYẾT
1.2.1 Giới thiệu Board thí nghiệm Easy 8051 v6
Board mạch Easy 8051 v6 là board thí nghiệm đầy đủ các phần cứng của hãng Mikroe, giúp cho người học có thể tiếp cận một cách nhanh chóng với dòng vi điều khiển 8051
Trang 6Ưu điểm của gói công cụ MikroC 8051 là:
- Giao diện trực quan
- 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ó
1.2.3 Điều khiển Led đơ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”
Trang 71.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
Trang 8Hì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: Bật công tắc nguồn và quan sát trạng thái 2 led: led Power và Led USB link sáng nghĩa là ta đã kết nối thành công Bật SW7.1SW7.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
Trang 9Hì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:
//design by : Template code
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
Delay_ms(100); // 1 second delay
P0 = 0xFF; // Turn OFF diodes on PORT0
Trang 10P1 = 0xFF; // Turn OFF diodes on PORT1
P2 = 0xFF; // Turn OFF diodes on PORT2
P3 = 0xFF; // Turn OFF diodes on PORT3
Delay_ms(100); // 1 second delay
} while(1); // Endless loop
}
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 đilặp lại liên tục
1.4.2 Bài tập thực hành
1 Viết lại chương trình điều khiển Led đơn nói trên với các hiệu ứng led đuổi nhau từ P0.0 P0.7 P1.0 P1.7 P2.0 P2.7 P3.0 P3.7 sử dụng các lệnh dịch bit Thời gian chuyển trạng thái của mỗi đèn LED là 1 giây Mô phỏng trên proteus và kiểm tra trên mạch phần cứng
Mô phỏng trên proteus:
Kiểm tra trên mạch phần cứng:
Chương trình Keil C:
Trang 11delay(100000);
P1 = P1<<1|0x01; //11111101}
P2 = 0xFE; // 11111110for(i=0;i<8;i++)
{
delay(100000);
P2 = P2<<1|0x01; //11111101}
P3 = 0xFE; // 11111110for(i=0;i<8;i++)
Trang 12delay(100000);
P3= P3<<1|0x01; // 11111110}
}
}
2 Sử dụng ma trận đèn LED 4 × 8 tạo bởi các port P0, P1, P2, P3 để hiện tên của bản thân, thời gian chuyển trạng thái của mỗi ký tự là 500ms Mô phỏng trên proteus và kiểm tra trên mạch phần cứng
Mô phỏng trên proteus:
Code chương trình:
#include<REGX52.H>
unsigned char code chuP[]={0x00,0xEE,0xEE,0xEE,0xEE,0xF1,0xFF,0xFF};
unsigned char code chuH[]={0XFF,0X00,0X00,0XE7,0XE7,0X00,0X00,0XFF };
unsigned char code chuO[]={0xC3,0xBD,0x7E,0x7E,0x7E,0x7E,0xBD,0xC3};
unsigned char code chuN[]={0XFF,0X01,0X00,0XFC,0XFC,0X00,0X01,0XFF };
unsigned char code chuG[]={0xC3,0xBD,0x7E,0x6E,0x6E,0x6E,0x8F,0xFF};
/* Ham Delay */
Trang 13void Fn_DELAY (unsigned int _vrui_Time) { while(_vrui_Time );}
Trang 14Kế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
Trang 151.5 CÂU HỎI KIỂM TRA
- 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 for:
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?
Vi điều khiển AT89S8253 là một trong những vi điều khiển phổ biến của hãng Atmel 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 Dưới đây là một số thông tin cơ bản về vi điều khiển AT89S8253:
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
Giao tiếp: Vi điều khiển AT89S8253 hỗ trợ các giao tiếp chuẩn như UART, SPI, và I2C, cho phép kết nối với các thiết bị ngoại vi như cảm biến, màn hình LCD, và các 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
Các tính năng khác: AT89S8253 còn có nhiều tính năng khác như bộ chuyển đổi ADC 10-bit, bộ đếm thời gian, bộ ngắt, bộ xung đồng hồ, và chế độ tiêu thụ điện năng thấp
Trang 16Ngô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ưu đồ thuật toán (flowchart) là một công cụ đồ họa được sử dụng để biểu diễn thuật toán bằng cách sử dụng các hình khối và các mũi tên để chỉ ra các bước thực hiện và các điều kiện Lưu đồ thuật toán giúp cho người lập trình
dễ dàng hiểu và kiểm tra thuật toán, cũng như giúp cho quá trình phân tích và thiết kế thuật toán trở nên dễ dàng 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): đại diện cho các thao tác đầu vào và đầu ra của thuật toán, ví dụ như đọc dữ liệu từ bàn phím, in kết quả ra màn hình,v.v
Trang 17BÀI 2: GIAO TIẾP VỚI MA TRẬN BÀN PHÍM VÀ
MÀN HÌNH LCD 16x2
2.1 MỤC ĐÍCH
- 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 mikroC cung cấp các thư viện hàm giao tiếp với keypad 4x4 Thamkhả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)
Trang 182.2.2 Làm việc với LCD 16x2
Hình 2.2 Màn hình LCD 16x2.
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:
Trang 19Các thanh ghi của LCD
- Thanh ghi IR: Mỗi lệnh được nhà sản xuất LCD đánh địa chỉ rõ ràng Người dùng chỉ việc cung cấp địa chỉ lệnh bằng cách nạp vào thanh ghi IR
Ví dụ:
Lệnh “hiển thị màn hình và con trỏ” có mã lệnh là 00001110
- Thanh ghi DR : Thanh ghi DR dùng để chứa dữ liệu 8 bit để ghi vào vùng RAM DDRAM hoặc CGRAM ( ở chế độ ghi) hoặc dùng để chứa dữ liệu
từ 2 vùng RAM này gửi ra cho MPU (ở chế độ đọc)
- Cờ báo bận BF: (Busy Flag)
Khi đang thực thi các hoạt động bên trong, LCD bỏ qua mọi giao tiếp vớibên ngoài và bật cờ BF( thông qua chân DB7 khi có thiết lập RS=0, R/W=1) lên
để cho biết nó đang “bận”
- Bộ đếm địa chỉ AC : (Address Counter)
Khi một địa chỉ lệnh được nạp vào thanh ghi IR, thông tin được nối trực tiếp cho 2 vùng RAM (việc chọn lựa vùng RAM tương tác đã được bao hàm 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 nhớ của LCD
Vùng RAM hiển thị DDRAM : (Display Data RAM)
Đây là vùng RAM dùng để hiển thị, nghĩa là ứng với một địa chỉ của RAM là 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:
Trang 20Hình 2.4 Giao tiếp giữa vi điều khiển và LCD 16x2.
Bảng mã lệnh của LCD:
Trang 21- Một số cấu hình và hàm LCD trong mikroC
void Lcd_Init(); // khởi tạo LCD
void Lcd_Out(row , column , *text); // in ra ở hàng và cột tương ứng
void Lcd_Cmd(char out_char);
Các lệnh trong mikroC:
2.3 CÁC BƯỚC TIẾN HÀNH THÍ NGHIỆM
2.3.1 Giao tiếp với ma trận phím và màn hình LCD 16x2
unsigned short kp, cnt, oldstate = 0;
char txt[6];
char keypadPort at P0;
Trang 22sbit LCD_RS at P2_0_bit; sbit LCD_EN at P2_1_bit; sbit LCD_D4 at P2_2_bit; sbit LCD_D5 at P2_3_bit; sbit LCD_D6 at P2_4_bit; sbit LCD_D7 at P2_5_bit; void main() {
cnt = 0;
Keypad_Init();
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Out(1, 1, "Key :"); Lcd_Out(2, 1, "Times:");
do {
kp = 0;
do
kp = Keypad_Key_Click(); while (!kp);
switch (kp) {
case 1: kp = 49; break; // 1 case 2: kp = 50; break; // 2 case 3: kp = 51; break; // 3 case 4: kp = 65; break; // A case 5: kp = 52; break; // 4 case 6: kp = 53; break; // 5 case 7: kp = 54; break; // 6 case 8: kp = 66; break; // B case 9: kp = 55; break; // 7 case 10: kp = 56; break; // 8 case 11: kp = 57; break; // 9 case 12: kp = 67; break; // C case 13: kp = 42; break; // * case 14: kp = 48; break; // 0
Trang 23Kết quả sau khi nap code:
Trên màn hình LCD hiện chữ Key: ở dòng đầu tiên và dòng thứ 2 hiện chữ time Khi một phím được nhấn, mã sẽ chuyển đổi mã phím thành giá trị ASCII tương ứng và hiển thị nó trên LCD
Vẽ lưu đồ thuật toán cho chương trình trên
2.4.2 Bài tập thực hành
1 Viết chương trình nhập vào một số nhị phân 4 bit và chuyển đổi số nhị phân đó sang số hexa hiển thị lên màn hình LCD Mô phỏng trên proteus và kiểm tra trên mạch phần cứng
Trang 24Lcd_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) {
Trang 26case 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);
}
Trang 272 Viết chương trình nhập vào hai số hexa và tính tổng, tích của hai số hiển thị hai số đó lên màn hình LCD Mô phỏng trên proteus và kiểm tra trên mạch phần cứng.
unsigned short hexToDec(char hex) {
if (hex >= '0' && hex <= '9') {
return hex - '0';
} else if (hex >= 'A' && hex <= 'F') {
return hex - 'A' + 10;
}
return 0;
}
char decToHex(unsigned short dec) {
if (dec >= 0 && dec <= 9) {
return dec + '0';
} else if (dec >= 10 && dec <= 15) {
return dec - 10 + 'A';
}
return '0';
}
void main() {
unsigned short firstNumber = 0, secondNumber = 0, sum, product;
unsigned short inputCount = 0;
Trang 28sum = firstNumber + secondNumber;
product = firstNumber * secondNumber;
2.5 CÂU HỎI KIỂM TRA
- Giải thích cấu trúc switch ?
Cấu trúc switch cũng được sử dụng để kiểm tra giá trị của một biến và thực hiện các hành động tương ứng với các trường hợp khác nhau
Cú pháp của cấu trúc switch trong C tương tự như ví dụ ở trên:
Trang 29và ngăn không thực hiện các hành động trong các trường hợp tiếp theo.
Một điểm khác biệt của cấu trúc switch trong C so với các ngôn ngữ lập trình khác là nó cho phép sử dụng một biểu thức case mặc định (default) ở bất
kỳ vị trí nào trong khối switch, không nhất thiết phải đặt ở cuối như các ngôn ngữ khác.ấu trúc switch cũng được sử dụng để kiểm tra giá trị của một biến và thực hiện các hành động tương ứng với các trường hợp khác nhau
- Phương pháp quét ma trận phím
Phương pháp quét ma trận phím (hay còn gọi là phương pháp quét ma trận phím ma trận) là một kỹ thuật được sử dụng trong các ứng dụng đòi hỏi nhập liệu từ bàn phím Kỹ thuật này sử dụng một ma trận để biểu diễn các nút phím và thực hiện việc đọc dữ liệu từ bàn phím bằng cách quét ma trận này
Các bước thực hiện của phương pháp quét ma trận phím như sau:
Trang 30Thiết lập ma trận phím: Tạo một ma trận có số hàng và số cột tương ứng với số lượng nút phím trên bàn phím Mỗi phần tử trong ma trận đại diện cho một nút phím và có giá trị tương ứng với mã ASCII của ký tự tương ứng với nút phím đó.
Quét ma trận: Lặp lại việc quét ma trận liên tục để kiểm tra xem có nút phím nào được nhấn không Việc quét có thể được thực hiện bằng cách duyệt từng hàng hoặc từng cột của ma trận, hoặc sử dụng một phương pháp quét khác phù hợp với ứng dụng cụ thể
Xử lý dữ liệu: Nếu có nút phím được nhấn, lấy giá trị của phần tử tương ứng trong ma trận và xử lý dữ liệu tương ứng với nút phím đó
Lặp lại quét ma trận: Sau khi xử lý dữ liệu, quay trở lại bước 2 để tiếp tục quét ma trận
Phương pháp quét ma trận phím thường được sử dụng trong các ứng dụngnhư bàn phím số, bàn phím điều khiển từ xa, các thiết bị nhập liệu đơn giản Tuynhiên, phương pháp này có một số hạn chế, chẳng hạn như việc chỉ đọc được một phím tại một thời điểm, không thể xử lý được các phím đồng thời được nhấn, và không thể phát hiện được các thao tác nhấn giữ phím
Trang 31BÀI 3: GIAO TIẾP VỚI CÁC ĐÈN LED 7 THANH 3.1 MỤC ĐÍCH
- Tìm hiểu về Led 7 thanh và phương pháp điều khiển;
- Lập trình ứng dụng hiển thị Led 7 thanh
3.2 CƠ SỞ LÝ THUYẾT
3.2.1 Giới thiệu về đèn LED 7 thanh
Led 7 thanh là thiết bị chuyên dùng để hiển thị số 0 đến9 Hình dạng của led 7 thanh trong hình 3.1
Hình 3.1 Đèn LED 7 thanh.
Có 2 loại Led 7 thanh:
- Led 7 thanh Anot chung
- Led 7 thanh Katot chung
Trang 32Hình 3.2 Cấu tạo đèn LED 7 thanh.
Nguyên lý ghép nối vi điều khiển và led 7 thanh: