Tải bản đầy đủ (.pdf) (30 trang)

HƯỚNG dẫn sử DỤNG PHẦN mềm lập TRÌNH KEIL CHO ARM CORTEX – m3 STM32F103VET

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (784.64 KB, 30 trang )

Chương 2

HƯỚNG DẪN SỬ DỤNG
PHẦN MỀM LẬP TRÌNH
KEIL CHO ARM CORTEX –
M3 STM32F103VET
CÁC BÀI THỰC HÀNH
LED ĐƠN


GIỚI THIỆU








CÀI ĐẶT CHƯƠNG TRÌNH
CÁCH VIẾT CHƯƠNG TRÌNH

GIAO TIẾP VI ĐIỀU KHIỂN VỚI LED ĐƠN
SỬ DỤNG PHẦN MỀM LẬP TRÌNH C CHO VI ĐIỀU KHIỂN
CÁC CHƯƠNG TRÌNH ĐIỀU KHIỂN LED ĐƠN
CÁC CHƯƠNG TRÌNH GIAO TIẾP NÚT NHẤN


Chương 2.Module led đơn

I.



Đại Học Sư Phạm Kỹ Thuật

GIỚI THIỆU

Chương này trình bày cách sử dụng phần mềm KEIL – ARM để tạo project lập trình cho ARM
cortex – M3 STM32F.
Sau khi biết cách tạo project thì có thể thực hiện các bài điều khiển khác.

II.

CÁCH TẠO PROJECT

Cách tạo project lập trình cho ARM cũng giống như lập trình cho vi điều khiển AT89Sxx, chỉ có
1 vài khác biệt, chi tiết tiến hành như sau.
u cầu: tạo một project điều khiển 1 led đơn chớp tắt.
Thực hiện: ARM là dòng 32 bit với tài ngun và cấu trúc lớn hơn nhiều so với vi điều khiển 8
bit và được hổ trợ thư viện nhiều nên khi lập trình ta phải khai báo các thư viện cho sẵn.
Mỗi một project chứa nhiều file nên phải tạo nhiều thư mục để lưu các loại file khác nhau ví dụ
thư mục lưu thư viện, thư mục lưu file phát sinh sau biên dịch, thư mục lưu file biên dịch trung gian,

Bước 1: Tạo thư mục cha để lưu tất cả các project, tiến hành tạo thư mục con để lưu project của
bài 1 led chớp tắt. Kết quả sau khi tạo thư mục như hình sau

Hình 2-2. Thư mục cha và thư mục con.
Bước 2: Tiến hành copy thư mục chứa các file thư viện từ 1 project nào đó có sẵn đã chạy vào
thư mục của project mà bạn đang xây dựng, tên thư mục có thể khác nhau và khơng quan trọng, kết
quả sau khi copy như sau:

Hình 2-3. Sau khi copy thư mục có tên Source.

Các thành phần có trong thư mục như hình sau:

24
STM32

Nguyễn Đình Phú

Thực hành vi điều khiển ARM


Đại Học Sư Phạm Kỹ Thuật

Chương 2.Module led đơn

Hình 2-4. Các thư mục con của thư mục Source.
Bên trong các thư mục con có các thư mục con nữa và lưu các file thư viện và các file để xây
dựng project.
Bước 3: Khởi động phần mềm KEIL như sau:

Hình 2-5. Giao diện phần mềm Keil.
Bước 4: Tạo project mới theo 2 trình tự 1 và 2 như hình sau:

Hình 2-6. Tiến hành tạo project mới.
Một giao diện mới xuất hiện, bạn tiến hành chọn thư mục lưu project rồi đánh tên cho project tùy
ý nhưng ở đây đặt tên là LED_CHOPTAT, kết quả như hình sau:

Thực hành vi điều khiển ARM STM32Nguyễn Đình Phú

25



Chương 2.Module led đơn

Đại Học Sư Phạm Kỹ Thuật

Hình 2-7. Đặt tên, chọn đường dẫn lưu project mới.
Một giao diện mới xuất hiện u cầu bạn chọn loại ARM, bạn tiến hành chọn mục ARM
“STMicroelectronis” rồi chọn chip cho đúng với kit đang sử dụng, kết quả như hình sau:

Hình 2-8. Chọn đúng thơng số cho chip.

26
STM32

Nguyễn Đình Phú

Thực hành vi điều khiển ARM


Đại Học Sư Phạm Kỹ Thuật

Chương 2.Module led đơn

Tiến hành nhấn Ok, một giao diện thơng báo xuất hiện u cầu tạo file Startup mới, bạn nên
chọn No vì file này đã có sẵn trong thư viện mà đa đã copy.
Màn hình như sau:

Hình 2-9. Màn hình chưa có gì.
Bước 5: Tiến hành gán tên project, thiết lập các nhóm, gán thư viện:
Chọn biểu tượng như trong hình sau:


Hình 2-10. Chọn biểu tượng gán.
Khi đó một giao diện mới xuất hiện như hình sau:

Thực hành vi điều khiển ARM STM32Nguyễn Đình Phú

27


Chương 2.Module led đơn

Đại Học Sư Phạm Kỹ Thuật

Hình 2-11. Giao diện thay đổi tên và đường dẫn.
Trong giao diện này bạn thấy có 3 cột, cột thứ nhất tên của project là target1 và cột thứ 2 có tên
là Source Group1, các tên này là mặc nhiên phần mềm tạo ra, ta cần phải thay thế các tên này. Kết quả
thay đổi tên project và thành lập các group mới như hình sau:

Hình 2-12. Sau khi thay đổi tên.
Tên trong group có thể đặt tùy ý.
Cách thực hiện: bạn để dấu nháy ngay cột thứ nhất và tiến hành đánh đúng tên là xong.
Chuyển sang cột thứ 2 rồi đánh hàng thứ nhất xong thì nhấn enter và bấm vào ơ vng gần ơ xóa
để tạo hàng mới và đánh tên cho group thứ 2, tương tự cho group thứ 3.
Tiếp theo là gán file cho từng group:
Gán các file cho group CMSIS: chọn group CMSIS rồi chọn Add Files nằm ở cột thứ 3 thì một
giao diện mới xuất hiện như hình sau:

28
STM32


Nguyễn Đình Phú

Thực hành vi điều khiển ARM


Đại Học Sư Phạm Kỹ Thuật

Chương 2.Module led đơn

Hình 2-13. Giao diện chọn file để Add.
Tiến hành vào thư mục Source cho đến khi tìm được 2 file rồi bấm Add để đưa vào group như
hình sau:

Hình 2-14. Chọn file để add.
Group CMSIS chỉ cần lưu 2 file này, sau đó bấm close để trở lại, màn hình sau khi add cho
group CMSIS như hình sau:

Hình 2-15. Kết quả sau khi add cho group CMSIS.
Tương tự bạn chọn group APP và tìm file rồi add, kết quả của group App như hình sau:

Thực hành vi điều khiển ARM STM32Nguyễn Đình Phú

29


Chương 2.Module led đơn

Đại Học Sư Phạm Kỹ Thuật

Hình 2-16. Kết quả sau khi add cho group APP.

Tương tự bạn chọn group LIB và tìm file rồi add, kết quả của group LIB như hình sau:

Hình 2-17. Kết quả sau khi add cho group LIB.
Sau đó nhấn OK để đóng phần này, giao diện màn như sau:

Hình 2-18. Giao diện màn hình mới sau khi gán cho các group.
30
STM32

Nguyễn Đình Phú

Thực hành vi điều khiển ARM


Đại Học Sư Phạm Kỹ Thuật

Chương 2.Module led đơn

Bước 6: Tiến hành thiết lập các lựa chọn cho project bằng cách bấm vào biểu tượng có tên
“Target Option”. Một giao diện mới xuất hiện tiến hành chọn tab có tên là “Output” rồi tick vào mục
tạo file hex như hình sau:

Hình 2-19. Tick ơ xây dựng file hex.
Sau đó bấm vào ơ tương ứng với số 2 để tạo thư mục lưu các file phát sinh khi biên dịch.
Giao diện sau xuất hiện:

Hình 2-20. Giao diện tạo thư mục.
Bạn tiến hành tạo thêm thư mục có tên là obj và mở thư mục đó ra để thiết lập đường dẫn cho
phần mềm biết các file đối tượng sau khi tạo ra do trình biên dịch sẽ lưu vào thư mục này cho dễ quản
lý.

Kết quả như hình sau:

Thực hành vi điều khiển ARM STM32Nguyễn Đình Phú

31


Chương 2.Module led đơn

Đại Học Sư Phạm Kỹ Thuật

Hình 2-21. Sau khi thiết lập thư mục obj.
Sau khi tạo thư mục obj và vào ln thư mục đó (số 1) thì đường dẫn tạo ra trỏ đến thư mục đó
(số 2), tiếp theo nhấn Ok (số 3) để kết thúc tab này.
Tiến hành chọn tab Listing rồi bấm vào ơ để thiết lập thư mục lưu các file lst do trình biên dịch
tạo ra giống như mới vừa làm cho obj.
Kết quả sau khi thực hiện như hình sau:

Hình 2-22. Sau khi thiết lập thư mục lst.
Tiến hành chọn tab C/C++ rồi bấm vào ơ dấu 3 chấm của hàng “Include Paths” để thiết lập các
đường dẫn cho các file cho trình biên dịch biết để biên dịch.
Một giao diện mới xuất hiện chưa có đường dẫn, bạn tiến hành thiết lập các đường dẫn và kết
quả như sau:

32
STM32

Nguyễn Đình Phú

Thực hành vi điều khiển ARM



Đại Học Sư Phạm Kỹ Thuật

Chương 2.Module led đơn

Hình 2-23. Thiết lập đường dẫn cho các file để biên dịch.
Tiến hành chọn tab Linker rồi tick vào ơ chọn “Use Memory layout …”.
Tiến hành chọn tab Utilities rồi chọn loại bộ nạp mà bạn đang có, ở đây tác giả sử dụng bộ nạp
có tên là Cortex-M3 J-LINK (số 1).

Hình 2-24. Chọn bộ nạp.
Tiếp theo bấm vào ơ Setting (số 2), một giao diện mới xuất hiện, tiến hành tick vào ơ “Reset and
Run” (số 1), bấm vào nút “Add” (số 2) thì một danh sách xuất hiện, bạn hãy chọn thơng số giống như
ở mục số 3 rồi nhấn ok là xong.

Hình 2-24. Chọn bộ nạp.
Thực hành vi điều khiển ARM STM32Nguyễn Đình Phú

33


Chương 2.Module led đơn

Đại Học Sư Phạm Kỹ Thuật

Bước 7: Mở file main.c và hiệu chỉnh lại nội dung để điều khiển 1 led sáng tắt:
/**************************************************************
CHUONG TRINH DIEU KHIEN 1 LED CHOP TAT
***************************************************************/

#include "stm32f10x.h"
#include "GLCD.h"
#include "USART.h"
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure IO connected to LD1, LD2, LD3 and LD4 leds *********************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);

/* Configure IO connected to BeeP */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void RCC_Configuration(void)
{
SystemInit();

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA
|RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
|RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
|RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO
|RCC_APB2Periph_SPI1, ENABLE );
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL ,ENABLE );
34
STM32

Nguyễn Đình Phú

Thực hành vi điều khiển ARM


Đại Học Sư Phạm Kỹ Thuật

Chương 2.Module led đơn

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4
|RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2
, ENABLE );
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}
void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
int main(void)
{
RCC_Configuration();

GPIO_Configuration();
while(1)
{
GPIO_SetBits(GPIOD, GPIO_Pin_8); /* Turn on LD2 and LD3 */
Delay(0xEFFFF);
GPIO_ResetBits(GPIOD, GPIO_Pin_8 ); /* Turn off LD1 */
Delay(0xEFFFF);
}
}
Bước 8: Tiến hành biên dịch và kết quả sau khi biên dịch như sau:

Hình 2-25. Kết quả sau khi biên dịch.
Bước 9: Tiến hành nạp và quan sát kết quả sau khi nạp.

III. CÁC CHƯƠNG TRÌNH ĐIỀU KHIỂN LED ĐƠN
Sau khi thực hiện xong bài 2-1 thì tiến hành làm bài 2-2, vào “Project”, chọn mục “Close projet”
để đóng project. Thực hiện tương tự cho các bài tiếp theo.

Bài mẫu 2-2. Chương trình điều khiển 4 LED đơn sáng tắt dần.
Tạo thư mục “BAI_998_4LED_STD” để lưu project.
a. Mạch điện:
b. Lưu đồ:
c. Chương trình:
/**************************************************************
Thực hành vi điều khiển ARM STM32Nguyễn Đình Phú

35


Chương 2.Module led đơn


Đại Học Sư Phạm Kỹ Thuật

CHUONG TRINH SANG DAN TAT DAN
***************************************************************/
#include "stm32f10x.h"
#include "GLCD.h"
#include "USART.h"
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Configure IO connected to LD1, LD2, LD3 and LD4 leds *********************/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);

/* Configure IO connected to BeeP */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Configure USART1 Tx (PA.09) as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure USART1 Rx (PA.10) as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void NVIC_Configuration(void)
{
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
36
STM32

Nguyễn Đình Phú

Thực hành vi điều khiển ARM


Đại Học Sư Phạm Kỹ Thuật

Chương 2.Module led đơn

}
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA

|RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
|RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
|RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO
|RCC_APB2Periph_SPI1, ENABLE );
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL ,ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4
|RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2
, ENABLE );
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}
void InitDis(void)
{
/* LCD Module init */
GLCD_init();
GLCD_clear(White);
GLCD_setTextColor(Blue);
GLCD_displayStringLn(Line1, " FireBull");
GLCD_displayStringLn(Line2, " GPIO example");
GLCD_setTextColor(Red);
}
void Init_All_Periph(void)
{
RCC_Configuration();
InitDis();
GPIO_Configuration();
NVIC_Configuration();
USART1_Configuration();
USART1Write((u8*)" FireBull GPIO_example",sizeof("
}


FireBull GPIO_example"));

void Delay(vu32 nCount)
{
for(; nCount != 0; nCount--);
}
int main(void)
{
Init_All_Periph();
while(1)
{
Thực hành vi điều khiển ARM STM32Nguyễn Đình Phú

37


Chương 2.Module led đơn

Đại Học Sư Phạm Kỹ Thuật

GPIO_SetBits(GPIOD, GPIO_Pin_8);
/* Turn off LD1 */
Delay(0xEFFFF);
GPIO_SetBits(GPIOD, GPIO_Pin_9);
Delay(0xEFFFF);
GPIO_SetBits(GPIOD, GPIO_Pin_10);
Delay(0xEFFFF);
GPIO_SetBits(GPIOD, GPIO_Pin_11);
Delay(0xEFFFF);
GPIO_ResetBits(GPIOD, GPIO_Pin_8);

Delay(0xEFFFF);
GPIO_ResetBits(GPIOD, GPIO_Pin_9);
Delay(0xEFFFF);
GPIO_ResetBits(GPIOD, GPIO_Pin_10);
Delay(0xEFFFF);
GPIO_ResetBits(GPIOD, GPIO_Pin_11);
Delay(0xEFFFF);

/* Turn off LD1 */

}
}
d.
e.

Tiến hành biên dịch và nạp.
Quan sát kết quả: nếu kết quả khơng đúng u cầu thì kiểm tra lại chương trình.

Bài tập 2-3. Chương trình điều khiển 32 LED đơn nhấp nháy.
Tạo thư mục “BAI_997_32_LED_CHOPTAT” để lưu project.
Bài mẫu 2-4. Chương trình điều khiển 32 LED đơn nhấp nháy 5 lần rồi sáng ln.
Tạo thư mục “BAI_996_32_LED_CHOPTAT_5” để lưu project.
a. Mạch điện :
b. Lưu đồ:
c. Chương trình:
#include <AT89X52.h>
signed char i;
void delay(unsigned int x)
{ unsigned int y;
for(y=0;y

}
void MAIN ()
{
for(i = 0; i<5;i++)
{
P0 = 0x00;
P1 = 0x00;
P0 = 0xFF; P1 = 0xFF;
}
while(1)
{}
}
f.
Tiến hành biên dịch và nạp.
38
STM32

P2 = 0x00;
P2 = 0xFF;

Nguyễn Đình Phú

P3 = 0x00;
P3 = 0xFF;

delay(5000);
delay(5000);

Thực hành vi điều khiển ARM



Đại Học Sư Phạm Kỹ Thuật

Chương 2.Module led đơn

g. Quan sát kết quả: nếu kết quả khơng đúng u cầu thì kiểm tra lại chương trình.
h. Giải thích chương trình:
Cho vòng lặp for thực hiện chóp tắt 5 lần, sau đó thực hiện vòng lặp while (1): khơng làm gì cả,
nhảy tại chỗ.
Cách 2:

Tạo thư mục “BAI_995_32_LED_CHOPTAT_5C2” để lưu project.
#include <AT89X52.h>
signed char i;
void delay(unsigned int x)
{
unsigned int y;
for(y=0;y{}
}
void MAIN ()
{
i = 0;
while (i < 5)
{
P0 = 0x00;
P0 = 0xFF;
i++;
}
lb:

goto lb;
}

P1 = 0x00;
P1 = 0xFF;

P2 = 0x00;
P2 = 0xFF;

P3 = 0x00;
P3 = 0xFF;

delay(5000);
delay(5000);

• Giải thích chương trình:
Cho biến “i = 0”, thực hiện vòng lặp while chóp tắt 32 led với điều kiện là biến “i” nhỏ hơn, khi
bằng 5 thì làm lệnh “lb: goto lb” là nhảy tạo chỗ.

Bài mẫu 2-5. Chương trình điều khiển 8 LED sáng dần tắt dần từ phải sang trái.
Tạo thư mục “BAI_994_8_LED_STD_PST” để lưu project.
a. Mạch điện :
b. Lưu đồ:
c. Chương trình:
#include <AT89X52.h>
signed char i;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void delay(unsigned int x)
{
unsigned int y;

for(y=0;y{}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void MAIN ()
{
P0 = 0x00;
delay(5000);
while (1)
{
for(i = 0; i < 8; i++)
{
P0 = (P0 << 1) + 1;
for(i = 0; i < 8; i++)
{
P0 = (P0 << 1);

delay(5000); }
delay(5000); }

}
Thực hành vi điều khiển ARM STM32Nguyễn Đình Phú

39


Chương 2.Module led đơn

Đại Học Sư Phạm Kỹ Thuật


}
d.
Tiến hành biên dịch và nạp.
e.
Quan sát kết quả: nếu kết quả khơng đúng u cầu thì kiểm tra lại chương trình.
f.
Giải thích chương trình:
Lệnh “P0 = 0x00;” làm cho port0 bằng 00 để tắt 8 led, delay để nhìn thấy.
Vòng lặp for thực hiện 8 lần: mỗi lần thực hiện lệnh: “P0 = (P0 << 1) + 1” sẽ dịch dữ liệu 8 bit
trong port 0 sang trái 1 bit và cộng với 1:
Dữ liệu lần lượt của 8 lần dịch trái:
i Trước khi dịch Sau khi dịch Sau khi cộng 1
0 0000 0000
0000 0000
0000 0001
1 0000 0001
0000 0010
0000 0011
2 0000 0011
0000 0110
0000 0111
3 0000 0111
0000 1110
0000 1111
4 0000 1111
0001 1110
0001 1111
5 0001 1111
0011 1110
0011 1111

6 0011 1111
0111 1110
0111 1111
7 0111 1111
1111 1110
1111 1111
Sau mỗi lần dịch thì thực hiện delay để nhìn thấy.
Tương tự làm cho tắt dần thì chỉ cần dịch là được.

Bài mẫu 2-6. Chương trình điều khiển 8 LED sáng dần tắt dần từ phải sang trái, trái
sang phải.
Tạo thư mục “BAI_993_8_LED_STD_PST_TSP” để lưu project.
a. Mạch điện
b. Lưu đồ:
c. Chương trình:
#include <AT89X52.h>
signed char i;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void delay(unsigned int x)
{
unsigned int y;
for(y=0;y{}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void MAIN ()
{
P0 = 0x00;
delay(5000);
while (1)

{
for(i = 0; i < 8; i++)
{
P0 = (P0 << 1) + 1;
delay(5000);
}
for(i = 0; i < 8; i++)
{
P0 = (P0 << 1);
delay(5000);
}
for(i = 0; i < 8; i++)
{
P0 = (P0 >> 1) + 0x80;
delay(5000);
}
for(i = 0; i < 8; i++)
{
P0 = (P0 >> 1);
delay(5000);
}
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: nếu kết quả khơng đúng u cầu thì kiểm tra lại chương trình.
40
STM32

Nguyễn Đình Phú


Thực hành vi điều khiển ARM


Đại Học Sư Phạm Kỹ Thuật

Chương 2.Module led đơn

f. Giải thích chương trình:
Chỉ cần giải thích phần từ trái sang phải: lệnh xoay từ trái sang phải là “P0 = (P0 >> 1) + 0x80”
có chức năng xoay port 0 từ phải sang trái đồng thời cộng với 0x80 để đẩy số 1 vào từ bên trái.
Dữ liệu lần lượt của 8 lần dịch phải:
i Trước khi dịch Sau khi dịch Sau khi cộng 1000_0000 = 0x80
0 0000 0000
0000 0000
1000 0000
1 1000 0000
0100 0000
1100 0000
2 1100 0000

3

Sau mỗi lần dịch thì thực hiện delay để nhìn thấy.

Bài mẫu 2-7. Chương trình điều khiển 16 LED sáng dần tắt dần từ phải sang trái, trái
sang phải.
Tạo thư mục “BAI_992_16_LED_STD_PST_TSP” để lưu project.
a. Mạch điện:
b. Giải thuật:
c. Chương trình:

#include <AT89X52.h>
signed char i;
void delay (unsigned int x)
{
unsigned int y;
for (y=0; y}

{;}

void MAIN ()
{
P0 = 0x00;
P1=0X00;
while (1)
{
for(i = 0; i < 8; i++)
{
P0 = (P0 << 1) + 1;

delay(5000);

//po sang dan
delay(5000); }

for(i = 0; i < 8; i++)
{
P1 = (P1 << 1) + 1;
for(i = 0; i < 8; i++)
{

P0 = (P0 << 1);
for(i = 0; i < 8; i++)
{
P1 = (P1 << 1);
for(i = 0; i < 8; i++)
{
P1 = (P1 >> 1) + 0x80;
for(i = 0; i < 8; i++)
{
P0 = (P0 >> 1) + 0x80;
for(i = 0; i < 8; i++)
{
P1 = (P1 >> 1);

//p1 sang dan
delay(5000); }
//p0 tat dan
delay(5000); }
//p1 tat dan
delay(5000); }
// p1 sang dan tsp
delay(5000);}
// p0 sang dan tsp
delay(5000);}
// p1 tat dan tsp
delay(5000); }

Thực hành vi điều khiển ARM STM32Nguyễn Đình Phú

41



Chương 2.Module led đơn

Đại Học Sư Phạm Kỹ Thuật

for(i = 0; i < 8; i++)
{
P0 = (P0 >> 1);

// p0 tat dan tsp
delay(5000); }

}
}
d.
e.
f.

Tiến hành biên dịch và nạp.
Quan sát kết quả: nếu kết quả khơng đúng u cầu thì kiểm tra lại chương trình.
Giải thích chương trình: Cách này thực hiện từng port, hơi dài, cách sau xử lý 16 bit sẽ gọn
hơn.

Bài mẫu 2-8. Chương trình điều khiển 16 LED sáng dần tắt dần từ phải sang trái, trái
sang phải dùng biến 16 bit.
Tạo thư mục “BAI_991_16_LED_STD_PST_TSP_C2” để lưu project.
a.
Mạch điện:
b.

Lưu đồ:
c.
Chương trình:
#include <AT89X52.h>
signed char i=0;
unsigned int Z;
void delay (unsigned int x)
{
unsigned int y;
for (y=0; y}
void XUAT2PORT ()
{
P0 =
Z;

P1 =

(Z >>8);

}

void MAIN ()
{
Z = 0x0000; XUAT2PORT(); delay (5000);
while (1)
{
for(i = 0; i < 16; i++)
{
Z = (Z << 1) + 1;

XUAT2PORT ();
delay (5000);
}
for(i = 0; i < 16; i++)
{
Z = (Z << 1);
XUAT2PORT ();
delay (5000);
}
for(i = 0; i < 16; i++)
{
Z = (Z >>1) + 0x8000; XUAT2PORT ();
delay (5000);
}
for(i = 0; i < 16; i++)
{
Z = (Z >> 1);
XUAT2PORT ();
delay (5000);
}
}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: nếu kết quả khơng đúng u cầu thì kiểm tra lại chương trình.
f. Giải thích chương trình: Cách này thực hiện từng port, hơi dài, cách sau xử lý 16 bit sẽ gọn
hơn.

42
STM32


Nguyễn Đình Phú

Thực hành vi điều khiển ARM


Đại Học Sư Phạm Kỹ Thuật

DEM Trước khi dịch
0
1
2

0000 0000
0000
1000 0000
1100 0000

Chương 2.Module led đơn

Sau khi dịch
0000 0000 0000
0000
0100 0000


Sau khi cộng 1000_0000
0x8000
0000 1000 0000 0000 0000

=


1100 0000

Bài mẫu 2-9. Chương trình điều khiển 32 LED sáng dần tắt dần từ phải sang trái, trái
sang phải. Tạo thư mục “BAI_990_32_LED_STD_PST_TSP” để lưu project.
a.
Mạch điện:
b.
Lưu đồ:
c.
Chương trình:
#include<AT89X52.H>
unsigned int Z,V;
signed char i;
unsigned long W;
void delay( unsigned int x)
{
unsigned int y;
for( y =0;y}
void xuat4port()
{
P0 = Z;
P1 = (Z>>8);

P2 = V;

P3 = (V>>8); }

void tach_16bit_xuat4port()

{
Z = W; V = W>>16; xuat4port() ; }
void stdan_pstrai()
{
for(i=0;i<32;i++)
{
W = (W<<1)+1;
tach_16bit_xuat4port();
delay(5000);}
for(i=0;i<32;i++)
{
W = (W<<1);
tach_16bit_xuat4port();
delay(5000);}
}
void stdan_tsphai()
{
for(i=0;i<32;i++)
{
W = (W>>1) +0x80000000;
tach_16bit_xuat4port(); delay(5000);}
for(i=0;i<32;i++)
{
W = (W<<1);
tach_16bit_xuat4port(); delay(5000);}
}
void main()
{
W = 0;
tach_16bit_xuat4port();

delay(5000);
while(1)
{
stdan_pstrai(); stdan_tsphai(); }
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: nếu kết quả khơng đúng u cầu thì kiểm tra lại chương trình.

Thực hành vi điều khiển ARM STM32Nguyễn Đình Phú

43


Chương 2.Module led đơn

Đại Học Sư Phạm Kỹ Thuật

Bài mẫu 2-10. Chương trình điều khiển 32 LED sáng tắt dần từ ngồi vào, từ trong
ra. Tạo thư mục “BAI_989_32_LED_STD_TNV_TTR” để lưu project.
a. Mạch điện:
b. Lưu đồ:
c. Chương trình:
#include<AT89X52.H>
unsigned int Z,V;
signed char i;
void delay( unsigned int x)
{
unsigned int y;
for( y =0;y}

void xuat4port()
{
P0 = Z;

P1 = (Z>>8); P2 = V;

P3 = (V>>8);}

void main()
{
V=0; Z=0;
xuat4port (); delay(10000);
while(1)
{for(i=0;i<16;i++)
{
Z = (Z<<1)+1;V= (V>>1)+0x8000;
xuat4port(); delay(5000);}
for(i=0;i<16;i++)
{
Z = (Z<<1);V= (V>>1);
xuat4port(); delay(5000);}
for(i=0;i<16;i++)
{
Z = (Z>>1)+0x8000; V= (V<<1)+1;
xuat4port();
delay(5000);}
for(i=0;i<16;i++)
{
Z = (Z>>1);V= (V<<1);
xuat4port(); delay(5000);}

}
}
d. Tiến hành biên dịch và nạp.
e. Quan sát kết quả: nếu kết quả khơng đúng u cầu thì kiểm tra lại chương trình.

Bài mẫu 2-11. Chương trình điều khiển 32 LED theo u cầu:
1.
2.
3.
4.

Chớp tắt 5 lần
Sáng dần từ phải sang trái, tắt dần từ phải sang trái 2 lần.
Chớp tắt 5 lần
Sáng dần từ trái sang phải, tắt dần từ trái sang phải 2 lần.

Tạo thư mục “BAI_988_32_LED_TONGHOP_1” để lưu project.
a.
Mạch điện:
b.
Lưu đồ:
c.
Chương trình:
#include<AT89X52.H>
unsigned int Z,V; signed char i, j;
44
STM32

Nguyễn Đình Phú


Thực hành vi điều khiển ARM


Đại Học Sư Phạm Kỹ Thuật

unsigned long W;
void delay( unsigned int x)
{
unsigned int y;
for( y =0;y}
void xuat4port()
{
P0 = Z;
P1 = (Z>>8);

Chương 2.Module led đơn

P2 = V;

P3 = (V>>8); }

void tach_16bit_xuat4port()
{
Z = W; V = W>>16; xuat4port() ; }
void choptat()
{
for (i=0;i<5;i++)
{
P0 = 0xFF; P1 = 0xFF;

P2 = 0xFF; P3 = 0xFF; delay(10000);
P0 = 0x00; P1 = 0x00;
P2 = 0x00;
P3 = 0x00;
delay(10000); }
}
void stdan_pstrai()
{
for (j=0;j<2;j++)
{
for(i=0;i<32;i++)
{
W = (W<<1)+1;
tach_16bit_xuat4port();
delay(5000);}
for(i=0;i<32;i++)
{
W = (W<<1);
tach_16bit_xuat4port();
delay(5000);}
}
}
void stdan_tsphai()
{
for (j=0;j<2;j++)
{
for(i=0;i<32;i++)
{
W = (W>>1) + 0x80000000; tach_16bit_xuat4port();
delay(5000);}

for(i=0;i<32;i++)
{
W = (W>>1);
tach_16bit_xuat4port();
delay(5000);}
}
}
void main()
{
W = 0;
tach_16bit_xuat4port(); delay(5000);
while(1)
{
choptat();
stdan_pstrai();
choptat();
stdan_tsphai();
}
}
d.
Tiến hành biên dịch và nạp.
e.
Quan sát kết quả: nếu kết quả khơng đúng u cầu thì kiểm tra lại chương trình.

Bài tập 2-12. Chương trình điều khiển 32 LED theo u cầu:
1.
2.
3.
4.
5.


Chớp tắt 5 lần
Sáng dần từ phải sang trái, tắt dần từ phải sang trái 2 lần.
Chớp tắt 5 lần
Sáng dần từ trái sang phải, tắt dần từ trái sang phải 2 lần.
Chớp tắt 5 lần

Thực hành vi điều khiển ARM STM32Nguyễn Đình Phú

45


Chương 2.Module led đơn

Đại Học Sư Phạm Kỹ Thuật

6.
Sáng dần tắt dần từ ngồi vào và từ trong ra – 2 lần.
7.
Chớp tắt 5 lần.
8.
Sáng dần phải sang trái, tắt dần từ trái sang phải – 2 lần.
9.
Chớp tắt 5 lần.
10. Sáng dần trái sang phải, tắt dần từ phải sang trái – 2 lần.
Chú ý: ghép thêm các chương trình con.
Tạo thư mục “BAI_987_32_LED_TONGHOP_2” để lưu project.
Bài mẫu 2-13. Chương trình con điều khiển 32 LED sáng dồn từ phải sang trái.
Thêm chương trình con sáng dồn 32 led từ phải sang trái vào chương trình tổng hợp.
a.

Mạch điện:
b.
Lưu đồ:
c.
Chương trình:
void sangdon_pst()
{
unsigned long U,T; unsigned char k;
for(j=0;j<2;j++)
{
W = 0; tach_16bit_xuat4port();
delay(5000);
{for(i = 32;i>-1;i--)
{U = W;
T = 0x00000001;
for(k = 0;k{
W = U|T;
tach_16bit_xuat4port();
delay(5000); T = T <<1;}
}
}
}
}
d.
Tiến hành biên dịch và nạp
e.
Quan sát kết quả: nếu kết quả khơng đúng u cầu thì kiểm tra lại chương trình.

Bài tập 2-14. Hãy viết chương trình con điều khiển 32 LED sáng dồn từ trái sang

phải.
Thêm chương trình con sáng dồn 32 led từ trái sang phải vào chương trình tổng hợp.
Bài mẫu 2-15. Chương trình điều khiển 32 LED sáng dồn từ ngồi vào.
Thêm chương trình con sáng dồn 32 led từ trái sang phải vào chương trình tổng hợp.
a.
Mạch điện:
b.
Lưu đồ:
c.
Chương trình:
void sangdon_tnv()
{
unsigned int UT,UP,TT,TP; unsigned char k;
for(i=0;i<2;i++)
{
V = Z = 0;
xuat4port(); delay(5000);
{for(j = 16;j>-1;j--)
46
STM32

Nguyễn Đình Phú

Thực hành vi điều khiển ARM


Đại Học Sư Phạm Kỹ Thuật

Chương 2.Module led đơn


{UT = V;
TT = 0x0001; UP = Z;
TP = 0x8000;
for(k = 0;k{
V = UT|TT; Z = UP|TP; xuat4port();
delay(5000); TT = TT <<1;TP = TP >>1;}
}
}
}
}
d.
e.

Tiến hành biên dịch và nạp.
Quan sát kết quả: nếu kết quả khơng đúng u cầu thì kiểm tra lại chương trình.

Bài tập 2-16. Chương trình điều khiển 32 LED sáng dồn từ trong ra.
Viết thêm chương trình con sáng dồn 32 led từ trong ra vào chương trình tổng hợp
Bài tập 2-17. Chương trình điều khiển 32 LED chạy theo u cầu:
Lần 1: 1 điểm sáng chạy từ phải sang trái.
Lần 2: 2 điểm sáng chạy từ phải sang trái.
Lần 3: 3 điểm sáng chạy từ phải sang trái.
Lần 4: 4 điểm sáng chạy từ phải sang trái.

Lần 8: 8 điểm sáng chạy từ phải sang trái.
Sau khi viết xong thì thêm vào chương trình tổng hợp.
Bài tập 2-18. Chương trình điều khiển 32 LED chạy theo u cầu:
Lần 1: 1 điểm sáng bên phải chớp tắt 2 lần.
Lần 2: 2 điểm sáng bên phải chớp tắt 2 lần.

Lần 3: 3 điểm sáng bên phải chớp tắt 2 lần.
Lần 4: 4 điểm sáng bên phải chớp tắt 2 lần.

Lần 32: 32 điểm sáng bên phải chớp tắt 2 lần.
Sau khi viết xong thì thêm vào chương trình tổng hợp.
IV. CÁC CHƯƠNG TRÌNH GIAO TIẾP NÚT NHẤN
Nút nhấn, bàn phím dùng để giao tiếp giữa con người và mạch điện tử để điều khiển, ví dụ: bàn
phím máy tính, bàn phím điện thoại, bàn phím máy bán xăng dầu dùng nhập số tiền cần bán, số lít cần
bán … máy giặt tự động có bàn phím để chỉnh chế độ giặt, chọn mực nước …
Có 2 dạng giao tiếp vi điều khiển với bàn phím, nút nhấn:


Hệ thống ít phím: ví dụ đk động cơ bằng 3 phím: start, stop, inv, đồng hồ có 3 đến 4 phím
để chỉnh thời gian.
• Hệ thống nhiều phím: bàn phím máy tính, bàn phím điện thoại, …
Hệ thống ít phím
Thực hành vi điều khiển ARM STM32Nguyễn Đình Phú

47


×