Bài 1: Lập trình cho 4 Led đơn nháy 3 trạng thái Code mô phỏng (chương trình chi tiết ở phụ lục):
while (1) // Vòng lặp vô hạn //Trạng thái 1
{ for(i=12;i<16;i++)
{DrvGPIO_ClrBit(E_GPC, i); // Đầu ra mức thâp LED sáng DrvSYS_Delay(300000); // Trễ
DrvGPIO_SetBit(E_GPC, i); // Đầu ra mức cao LED tắt DrvSYS_Delay(300000); } //Trạng thái 2 for(i=16;i>12;i--) { DrvGPIO_ClrBit(E_GPC, i); DrvSYS_Delay(300000);
DrvGPIO_SetBit(E_GPC, i); DrvSYS_Delay(300000); } //Trạng thái 3 for(i=12;i<16;i++) {DrvGPIO_ClrBit(E_GPC, i); DrvSYS_Delay(300000); } for(i=16;i>12;i--) {DrvGPIO_SetBit(E_GPC, i); DrvSYS_Delay(300000); } DrvGPIO_ClrBit(E_GPC, 12); DrvSYS_Delay(300000); DrvGPIO_ClrBit(E_GPC, 14); DrvSYS_Delay(300000); DrvGPIO_ClrBit(E_GPC, 13); DrvSYS_Delay(300000); DrvGPIO_ClrBit(E_GPC, 15); DrvSYS_Delay(300000); DrvGPIO_SetBit(E_GPC, 15); DrvSYS_Delay(300000); DrvGPIO_SetBit(E_GPC, 13); DrvSYS_Delay(300000); DrvGPIO_SetBit(E_GPC, 14); DrvSYS_Delay(300000); DrvGPIO_SetBit(E_GPC, 12); DrvSYS_Delay(300000); }} Hình 3.28: Mô phỏng bài 1
Bài 2: Lập trình mạch đếm sản phẩm sử dụng nút nhấn Code mô phỏng (chương trình chi tiết ở phụ lục):
// Hiện thị giá trị lên LED 7 thanh void seg_display(int32_t value) { int32_t digit; digit = value / 1000; close_seven_segment(); show_seven_segment(3,digit); DrvSYS_Delay(5000);
value = value - digit * 1000; digit = value / 100;
close_seven_segment();
show_seven_segment(2,digit); DrvSYS_Delay(5000);
value = value - digit * 100; digit = value / 10;
close_seven_segment();
show_seven_segment(1,digit); DrvSYS_Delay(5000);
value = value - digit * 10; digit = value;
close_seven_segment();
show_seven_segment(0,digit); DrvSYS_Delay(5000);
}
void Init_LED() // Thiết lập chân GPIO {
DrvGPIO_Open(E_GPC, 12, E_IO_OUTPUT); // Đặt GPC12 ở chế độ đầu ra DrvGPIO_SetBit(E_GPC, 12); // Mức cao tắt LED
}
uint32_t i=0;
void EINT1Callback(void) { //Hàm ngắt i++;
if(i==10) {DrvGPIO_ClrBit(E_GPC, 12); // Mức thấp bật LED }
else if(i==11) {i=0;
DrvGPIO_SetBit(E_GPC, 12); }
}
int32_t main (void) {
UNLOCKREG(); // Mở khóa thanh ghi
DrvSYS_Open(48000000); // Đặt nguồn xung từ 25~50MHz LOCKREG(); // Khóa thanh ghi
DrvGPIO_SetDebounceTime(5 ,1);
DrvGPIO_EnableDebounce(E_GPB , 15); //Cho phép giữ trễ ở chân GPC15 DrvSYS_Delay(1000);
DrvGPIO_Open(E_GPB, 15, E_IO_INPUT); // Cấu hình chân GPB15 ngắt ngoài DrvGPIO_EnableEINT1( E_IO_RISING, E_MODE_EDGE, EINT1Callback); while(1)
{
seg_display(i); // Hàm hiện thị LED 7 thanh }
}
Hình 3.29: Mô phỏng bài 2
Bài 3: Lập trình bật đèn bằng password hiện thị thông báo lên LCD Code mô phỏng (chương trình chi tiết ở phụ lục):
while(1) {
if(key !=0) {
number[i]=key;
sprintf(TEXT+9+i,"%d",number[i]); // Hiện thị password lên LCD print_Line(0, TEXT); i++; while(ScanKey()); } if(i==4) { i = 0; if((number[0]==2)&(number[1]==1)&(number[2]==9)&(number[3]==3)) //Nhập vào password { GPC_13=0; // Led bật DrvSYS_Delay(5000); print_Line(0, TEXT); print_Line(1,"SUCCEED!"); DrvSYS_Delay(5000);
print_Line(2,"WELCOME TO HOME"); //In dòng thông báo lên dòng thứ 3 } else
clear_LCD(); // Xóa LCD nhập lại password print_Line(0, "Tryagain");
Hình 3.30: Mô phỏng bài 3
Bài 4: Lập trình đèn giao thông tại ngã tƣ
Code mô phỏng(chương trình chi tiết ở phụ lục): while(1) //Vòng lặp vô hạn { j++; if(j==100) //Hàm giữ trễ { i--; j=0; } seg_display(i); if (i==50) { GPA_14=GPC_12=0; //Đỏ 1 và xanh 2 sáng GPA_12=GPA_13=GPC_13=GPC_14=1; } else if (i==30) { GPA_14=GPC_13=0; //Đỏ 1 và vàng 2 sáng GPA_12=GPA_13=GPC_12=GPC_14=1; } else if (i==25) { GPA_13=GPC_14=0;//Đỏ 2 và xanh 1 sáng GPA_14=GPA_12=GPC_13=GPC_12=1; } else if (i==5) { GPA_14=GPA_13=GPC_14=0;//Đỏ 2 và vàng 1 sáng GPA_12=GPC_13=GPC_12=1; }
else if (i==0) i=50; }
Hình 3.31: Mô phỏng bài 4
Bài 5: Lập trình mạch chống trộm sử dụng nút nhấn thay cho cảm biến hiển thị thông báo lên LCD
Code mô phỏng (chương trình chi tiết ở phụ lục):
while(1) {
if (DrvGPIO_GetBit(E_GPB,15)==0) {
print_Line(1, "NGUY HIEM!");
DrvGPIO_ClrBit(E_GPB, 11); //Loa kêu DrvGPIO_ClrBit(E_GPC, 12); //Đèn sáng DrvSYS_Delay(5000000);
} else {
print_Line(1, "AN TOAN! ");
DrvGPIO_SetBit(E_GPB, 11); //Loa tắt DrvGPIO_SetBit(E_GPC, 12); //Đèn tắt }
} }
Hình 3.32: Mô phỏng bài 5
3.4 Kết luận chƣơng 3
Chương 3 là chương quan trọng nhất trong quá trình làm đồ án. Trong chương này bao gồm các nội dung chính đó là vận dụng các kiến thức đã tìm hiểu về dòng chíp ARM để thiết kế kit thực hành vi điều khiển ARM Cortex M0 sử dụng chíp NUC140 của hãng Nuvoton, chức năng các khối mạch. Hướng dẫn sử dụng kit và lập trình một số bài cơ bản trên kit thực hành.
KẾT LUẬN CHUNG
Vi điều khiển ARM Cortex nói chung và ARM Cortex – M0 nói riêng là loại vi điều khiển có hiệu suất cao, công suất thấp, tốc độ xử lý nhanh chóng, nhỏ gon, chi phí thấp. Hỗ trợ nhiều thiết bị ngoại vi đồng thời được hỗ trợ nhiều công cụ lập trình, Kit phát triển và thư viện giúp cho việc phát triển ứng dụng trên nền tảng ARM Cortex – M0 trở nên dễ dàng. Ngày nay dòng chip ARM đang dần phát triển và trở nên phổ biến có thể thay thế các dòng chip khác trên tất cả các ứng dụng như điện thoại, máy tính, điều khiển công nghiệp, bảo mật…
Với tầm quan trọng của mình, ARM đã và đang khẳng định vị thế của mình trong ngành công nghiệp sản xuất thiết bị di động. Các kiến trúc của họ sẽ không chỉ là nền tảng cho các đối tác sản xuất tạo ra các sản phẩm mới, chúng còn là cơ sở để tăng cường sức mạnh của các thiết bị di động trong tương lai. Với sự tăng trưởng nhanh như hiện nay của những smartphone, tablet hay các thiết bị cầm tay, ARM là cơ hội để phát triển của các nhà sản xuất là rất lớn và ARM sẽ luôn là cái tên xuất hiện trong sự phát triển đó.
Vi xử lý ARM được đánh giá là một trong những dòng vi xử lý mạnh, đáp ứng được những yêu cầu trong hệ thống nhúng ngày nay, được sử dụng rộng rãi ở trên thế giới và đang được nghiên cứu phát triển ở Việt Nam.
Về bản thân, qua quá trình tìm hiểu và thực hiện đồ án này, em đã học được kỹ năng tự nghiên cứu trong lĩnh vực còn hết sức mới mẻ với sinh viên Điện Tử - Viễn Thông hiện nay, khả năng tìm hiểu và thiết kế kit thực hành vi điều khiển ARM sử dụng chíp NUC140 của hãng Nuvoton trên nền tảng các kiến thức cơ sở đã được học ở nhà trường, hiểu thêm về những xu hướng phát triển mới của các vi điều khiển hiện nay ở Việt Nam cũng như trên thế giới đặc biệt là dòng vi điều khiển ARM Cortex M0 của hãng Nuvoton.
Do dòng chíp ARM này còn khá mới mẻ ở việt nam cùng với lượng kiến thức rộng lớn nên không thể tránh khỏi những sai sót trong quá trình làm đồ án cộng với kiến thức của em còn nhiều hạn chế nên em rất mong các thầy, các cô và các bạn sinh viên đóng góp ý kiến giúp em bổ xung xây dựng đồ án hoàn thiện hơn.
TÀI LIỆU THAM KHẢO
[1]. James A. Langbridge, “Professional Embedded ARM Development”, NXB John Wiley & Sons, xuất bản năm 2014.
[2]. “Lý thuyết NuMicro”, Công ty TULA
[3]. Ngô Diên Tập, “Vi Điều Khiển Với Lập Trình C”, NXB Khoa học và kỹ thuật, xuất bản năm 2006.
[4]. www.nuvoton-m0.com - truy cập lúc 9h30p ngày 7/4/2015 [5]. http://tulaso.com/ truy cập lúc 14h ngày 21/4/2015
[6]. http://ARM.com – truy cập lúc 15h ngày 2/5/2015 [7]. http://www.alldatasheet.com – truy cập lúc 9/5/2015
PHỤ LỤC Bài 1: Lập trình cho 4 Led đơn nháy 3 trạng thái Code mô phỏng:
#include "NUC1xx.h" //Khai báo thư viện chíp
#include "SYS.h" //Khai báo thu viện hàm tạo trễ #include "GPIO.h" //Khai báo thư viện GPIO
int i;
void Init_LED() // Thiết lập chân GPIO { for(i=12;i<16;i++)
{
DrvGPIO_Open(E_GPC, i, E_IO_OUTPUT); // Đặt GPC12-GPC16 ở chế độ đầu ra DrvGPIO_SetBit(E_GPC, i); }} // Mức cao tắt LED
int main (void)
{UNLOCKREG(); // Mở thanh ghi chương trình
DrvSYS_Open(48000000); // Đặt tần số hoạt động của CPU ở 48Mhz LOCKREG(); // Khóa thanh ghi chương trình
Init_LED(); // Gọi hàm LED while (1) // Vòng lặp vô hạn //Trạng thái 1
{ for(i=12;i<16;i++)
{DrvGPIO_ClrBit(E_GPC, i); // Đầu ra mức thâp LED sáng DrvSYS_Delay(300000); // Trễ
DrvGPIO_SetBit(E_GPC, i); // Đầu ra mức cao LED tắt DrvSYS_Delay(300000); } //Trạng Thái 2 for(i=16;i>12;i--) { DrvGPIO_ClrBit(E_GPC, i); DrvSYS_Delay(300000); DrvGPIO_SetBit(E_GPC, i); DrvSYS_Delay(300000); } //Trạng Thái 3 for(i=12;i<16;i++) {DrvGPIO_ClrBit(E_GPC, i); DrvSYS_Delay(300000); } for(i=16;i>12;i--) {DrvGPIO_SetBit(E_GPC, i);
DrvSYS_Delay(300000); } DrvGPIO_ClrBit(E_GPC, 12); DrvSYS_Delay(300000); DrvGPIO_ClrBit(E_GPC, 14); DrvSYS_Delay(300000); DrvGPIO_ClrBit(E_GPC, 13); DrvSYS_Delay(300000); DrvGPIO_ClrBit(E_GPC, 15); DrvSYS_Delay(300000); DrvGPIO_SetBit(E_GPC, 15); DrvSYS_Delay(300000); DrvGPIO_SetBit(E_GPC, 13); DrvSYS_Delay(300000); DrvGPIO_SetBit(E_GPC, 14); DrvSYS_Delay(300000); DrvGPIO_SetBit(E_GPC, 12); DrvSYS_Delay(300000); }} Bài 2: Thiết kế mạch đếm sản phẩm sử dụng nút nhấn Code mô phỏng:
#include "NUC1xx.h" //Khai báo thư viện chíp
#include "SYS.h" //Khai báo thư viện hàm tạo trễ
#include "Seven_Segment.h" //khai báo thư viện LED 7 thanh #include "GPIO.h" //Khai báo thư viện GPIO
// Hiện thị giá trị lên LED 7 thanh void seg_display(int32_t value) { int32_t digit; digit = value / 1000; close_seven_segment(); show_seven_segment(3,digit); DrvSYS_Delay(5000);
value = value - digit * 1000; digit = value / 100;
close_seven_segment();
show_seven_segment(2,digit); DrvSYS_Delay(5000);
digit = value / 10; close_seven_segment();
show_seven_segment(1,digit); DrvSYS_Delay(5000);
value = value - digit * 10; digit = value;
close_seven_segment();
show_seven_segment(0,digit); DrvSYS_Delay(5000);
}
void Init_LED() // Thiết lập chân GPIO {
DrvGPIO_Open(E_GPC, 12, E_IO_OUTPUT); // Đặt GPC12 ở chế độ đầu ra DrvGPIO_SetBit(E_GPC, 12); // Mức cao tắt LED
}
uint32_t i=0;
void EINT1Callback(void) { //Hàm ngắt i++;
if(i==10) {DrvGPIO_ClrBit(E_GPC, 12); // Mức thấp bật LED }
else if(i==11) {i=0;
DrvGPIO_SetBit(E_GPC, 12); }
}
int32_t main (void) {
UNLOCKREG(); // Mở khóa thanh ghi
DrvSYS_Open(48000000); // // Đặt tần số hoạt động của CPU ở 48Mhz LOCKREG(); // Khóa thanh ghi
DrvGPIO_SetDebounceTime(5 ,1);
DrvGPIO_EnableDebounce(E_GPB , 15); //Cho phép giữ trễ ở chân GPC15 DrvSYS_Delay(1000);
DrvGPIO_Open(E_GPB, 15, E_IO_INPUT); // Cấu hình chân GPB15 ngắt ngoài DrvGPIO_EnableEINT1( E_IO_RISING, E_MODE_EDGE, EINT1Callback); while(1) {
seg_display(i); // Hàm hiện thị LED 7 thanh }
Bài 3: Lập trình bật đèn bằng password hiện thị lên LCD Code mô phỏng:
#include "NUC1xx.h" #include "SYS.h" #include "GPIO.h"
#include "Scankey.h" //Khai báo thư viện quét bàn phím #include "LCD.h" //Khai báo thư viện LCD
int32_t main (void) //Hàm chính {
int8_t number[4],key,i;
char TEXT[13]="Password: ";
UNLOCKREG(); // Mở khóa thanh ghi
DrvSYS_Open(48000000); // Đặt tần số hoạt động của CPU ở 48Mhz LOCKREG();
DrvGPIO_Open(E_GPC, 12, E_IO_OUTPUT); //Cấu hình chân GPC12 ở chế độ đầu ra
init_LCD(); //Gọi hàm LCD clear_LCD(); //Xóa màn hình LCD OpenKeyPad(); //Gọi hàm KeyPad
print_Line(0,TEXT); //In ra dòng thứ nhất TEXT i = 0; while(1) { key = ScanKey(); if(key !=0) { number[i]=key;
sprintf(TEXT+9+i,"%d",number[i]); // Hiện thị password len LCD print_Line(0, TEXT); i++; while(ScanKey()); } if(i==4) { i = 0; if((number[0]==2)&(number[1]==1)&(number[2]==9)&(number[3]==3)) //Nhập vào password
{ GPC_13=0; // Led bật DrvSYS_Delay(5000); print_Line(0, TEXT); print_Line(1,"SUCCEED!"); DrvSYS_Delay(5000);
print_Line(2,"WELCOME TO HOME"); //In dòng thông báo lên dòng thứ 3 }
else {
clear_LCD(); // Xóa LCD nhập lại password print_Line(0, "Tryagain");
} } } }
Bài 4: Lập trình đèn giao thông tại ngã tƣ Code mô phỏng: #include "NUC1xx.h" #include "SYS.h" #include "Seven_Segment.h" #include "GPIO.h" // Hàn hiển thị
void seg_display(int so) { int stt[2],j; stt[1] = so/10; stt[0] = so%10; for(j=0;j<2;j++) { close_seven_segment(); show_seven_segment(j,stt[j]); DrvSYS_Delay(5000); } } //Hàm chính
{
uint32_t i=50, j=0;
UNLOCKREG(); // Mở khóa thanh ghi
DrvSYS_Open(48000000); // Đặt tần số hoạt động của CPU ở 48Mhz LOCKREG(); // Khóa thanh ghi
DrvGPIO_Open(E_GPA, 12, E_IO_OUTPUT); // Đặt GPA12 ở chế độ đầu ra DrvGPIO_Open(E_GPA, 13, E_IO_OUTPUT);
DrvGPIO_Open(E_GPA, 14, E_IO_OUTPUT);
DrvGPIO_Open(E_GPC, 12, E_IO_OUTPUT); // Đặt GPC12 ở chế độ đầu ra DrvGPIO_Open(E_GPC, 13, E_IO_OUTPUT); DrvGPIO_Open(E_GPC, 14, E_IO_OUTPUT); while(1) //Vòng lặp vô hạn { j++; if(j==100) //Hàm giữ trễ { i--; j=0; } seg_display(i); if (i==50) { GPA_14=GPC_12=0; //Đỏ 1 và xanh 2 sáng GPA_12=GPA_13=GPC_13=GPC_14=1; } else if (i==30) { GPA_14=GPC_13=0; //Đỏ 1 và vàng 2 sáng GPA_12=GPA_13=GPC_12=GPC_14=1; } else if (i==25) { GPA_13=GPC_14=0;//Đỏ 2 và xanh 1 sáng GPA_14=GPA_12=GPC_13=GPC_12=1; } else if (i==5) { GPA_14=GPA_13=GPC_14=0;//Đỏ 2 và vàng 1 sáng GPA_12=GPC_13=GPC_12=1; }
else if (i==0) i=50; }
Bài 5: Lập trình mạch chống trộm sử dụng nút nhấn thay cho cảm biến hiển thị thông báo lên LCD
Code mô phỏng: #include "NUC1xx.h" #include "SYS.h" #include "GPIO.h" #include "LCD.h" int main(void) {
UNLOCKREG(); //Mở khóa thanh ghi
DrvSYS_Open(50000000); // Đặt tần số hoạt động của CPU ở 48Mhz LOCKREG();
DrvGPIO_Open(E_GPB, 15, E_IO_INPUT); //Đặt chân GPB15 ở chế độ đầu vào DrvGPIO_Open(E_GPB, 11, E_IO_OUTPUT); //Đặt chân GPB11 ở chế độ đầu ra DrvGPIO_Open(E_GPC, 12, E_IO_OUTPUT); //Đặt chân GPC12 ở chế độ đầu ra init_LCD(); //Khởi tạo LCD
clear_LCD(); //Xóa LCD
print_Line(0, "Body Infrared "); while(1)
{
if (DrvGPIO_GetBit(E_GPB,15)==0) {
print_Line(1, "NGUY HIEM!");
DrvGPIO_ClrBit(E_GPB, 11); //Loa kêu DrvGPIO_ClrBit(E_GPC, 12); //Đèn sáng DrvSYS_Delay(5000000);
} else {
print_Line(1, "AN TOAN! ");
DrvGPIO_SetBit(E_GPB, 11); //Loa tắt DrvGPIO_SetBit(E_GPC, 12); //Đèn tắt }
} }