Đại Học Sư Phạm Kỹ Thuật
Chương 2.Module led đơn
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
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
Nguyễn Đình Phú
Thực hành vi điều khiển ARM STM32
Đạ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
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 STM32
Nguyễ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.
Nguyễ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
Nguyễn Đình Phú
Thực hành vi điều khiển ARM STM32
Đạ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:
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
Nguyễn Đình Phú
Thực hành vi điều khiển ARM STM32
Đạ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.
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
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 );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4
|RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2
, ENABLE );
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}
void Delay(vu32 nCount)
{
34
Nguyễn Đình Phú
Thực hành vi điều khiển ARM STM32
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:
/**************************************************************
CHUONG TRINH SANG DAN TAT DAN
***************************************************************/
#include "stm32f10x.h"
#include "GLCD.h"
#include "USART.h"
void GPIO_Configuration(void)
{
Thực hành vi điều khiển ARM STM32
Nguyễn Đình Phú
35
Chương 2.Module led đơn
Đại Học Sư Phạm Kỹ Thuật
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);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA
|RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
|RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
36
Nguyễn Đình Phú
Thực hành vi điều khiển ARM STM32
Đại Học Sư Phạm Kỹ Thuật
Chương 2.Module led đơn
|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");
37
Chương 2.Module led đơn
Đại Học Sư Phạm Kỹ Thuật
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.
while(1)
{}
}
f.
Tiến hành biên dịch và nạp.
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.
38
Nguyễn Đình Phú
Thực hành vi điều khiển ARM STM32
Đại Học Sư Phạm Kỹ Thuật
#include <AT89X52.h>
signed char i;
void delay(unsigned int x)
{
unsigned int y;
for(y=0;y
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
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)
}
}
}
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:
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
40
Nguyễn Đình Phú
Thực hành vi điều khiển ARM STM32
Đại Học Sư Phạm Kỹ Thuật
Chương 2.Module led đơn
0 0000 0000
0000 0000
1000 0000
1 1000 0000
0100 0000
1100 0000
2 1100 0000
…
3
//po sang dan
delay(5000); }
for(i = 0; i < 8; i++)
{
P1 = (P1
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.
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>8);
}
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
hơn.
DEM Trước khi dịch
0
1
42
0000 0000
0000
1000 0000
Sau khi dịch
0000 0000 0000
0000
0100 0000
Sau khi cộng 1000_0000
0x8000
0000 1000 0000 0000 0000
Nguyễn Đình Phú
}
}
}
}
void delay( unsigned int x)
{
unsigned int y;
for( y =0;y>8);
P2 = V;
P3 = (V>>8);
}
void tach_16bit_xuat4port()
{
Z = W; V = W>>16; xuat4port() ; }
void stdan_pstrai()
{
for(i=0;i
c.
Mạch điện:
Lưu đồ:
Chương trình:
Thực hành vi điều khiển ARM STM32
Nguyễn Đình Phú
43
Chương 2.Module led đơn
Đại Học Sư Phạm Kỹ Thuật
#include<AT89X52.H>
unsigned int Z,V;
signed char i;
void delay( unsigned int x)
{
unsigned int y;
for( y =0;y>8); P2 = V;
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;
unsigned long W;
void delay( unsigned int x)
{
unsigned int y;
for( y =0;y
P0 = 0x00; P1 = 0x00;
P2 = 0x00;
P3 = 0x00;
delay(10000); }
}
void stdan_pstrai()
{
for (j=0;j
8.
9.
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
Sáng dần tắt dần từ ngồi vào và từ trong ra – 2 lần.
Chớp tắt 5 lần.
Sáng dần phải sang trá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 STM32
Nguyễn Đình Phú
45
Chương 2.Module led đơn
Đại Học Sư Phạm Kỹ Thuật
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.
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-1;j--)
{UT = V;
TT = 0x0001; UP = Z; TP = 0x8000;
for(k = 0;k
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
Để hiểu giao tiếp vi điều khiển với bàn phím ta khảo sát các bài ứng dụng theo sau.
Bài mẫu 2-21. Dùng vi điều khiển AT89S52 giao tiếp với 8 led đơn và 2 nút nhấn
ON, OFF. Khi cấp điện thì 8 led tắt, khi nhấn ON thì 8 led sáng, khi nhấn OFF thì 8 led
tắt.
Thực hành vi điều khiển ARM STM32
Nguyễn Đình Phú
47