Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 53

ĐẠI HỌC BÁCH KHOA HÀ NỘI

TRƯỜNG ĐIỆN – ĐIỆN TỬ

BÁO CÁO

Đề tài:
THIẾT KẾ HỆ THỐNG ĐO KHOẢNG CÁCH SỬ DỤNG
CẢM BIẾN HC-SR04

Giáo viên hướng dẫn : …


Mã lớp : …
Họ và tên sinh viên : Nguyễn Chí Phi
Mã số sinh viên : 20207577
Lớp : ET – LUH K65

Hà Nội, 09-2023
LỜI NÓI ĐẦU

Ngày nay, đất nước chúng ta đang trong giai đoạn công nghiệp hóa, hiện đại hóa. Do
đó, khoa học kĩ thuật đang là mối quan tâm hàng đầu. Cùng với sự phát triển của khoa
học kĩ thuât, ngành điện tử cũng có những bước phát triển mạnh mẽ với các linh kiện bán
dẫn và hệ thống nhúng được ra đời. Kèm theo đó là tạp ra nhiều ứng dụng được phục vụ
nhu cầu của con người. Nhờ có những ứng dụng này mà đời sống của chúng ta được cải
thiện hơn.
Là sinh viên ngành Điện tử - Viễn thông, chúng em có nhiệm vụ tìm tòi, nghiên cứu
và phát triển các ứng dụng dựa trên cơ sở lý thuyết được học trên trường để có thể tạo ra
những ứng dụng trong đời sống thực tiễn hỗ trợ cải thiện cuộc sống của con người.
Qua tìm hiểu, nhóm chúng em nhận thấy đề tài “Thiết kế hệ thống đo khoảng cách sử
dụng cảm biến HC-SR04” có những ứng dụng thực tiễn đối với đời sống chúng ta như
trong việc cảnh báo các vật cản gây nguy hiểm, hay có thể được ứng dụng trong các hệ
thống ô tô tự lái.
Báo cáo của chúng em được chia làm 4 phần với các nội dung cơ bản như sau:
Chương 1: Tổng quan đề tài
Chương 2: Cơ sở lý thuyết của đề tài
Chương 3: Thiết kế và mô phỏng
Chương 4: Kết quả và đánh giá
Trong quá trình thực hiện đề tài, mặc dù có sự cố gắng, nhưng chúng em cũng không
thể tránh khỏi những thiếu sót. Em rất mong nhận được những ý kiến đóng góp từ thầy để
đề tài ngày càng hoàn thiện hơn.
Chúng em xin gửi lời cảm ơn chân thành tới thầy Phan Văn Phương đã tận tình hướng
dẫn và cung cấp những kiến thức cần thiết, tạo điều kiện thuận lợi giúp chúng em hoàn
thành đề tài này.
LẬP KẾ HOẠCH

Dựa trên các yêu cầu về đề tài: “Thiết kế hệ thống đo khoảng cách”, em đã đưa ra kế
hoạch các công việc cần làm trong bảng dưới:
STT Tên công việc Mô tả công việc
1 Tìm hiểu đề tài Tìm hiểu, nghiên cứu đề tài, lên kế hoạch và lựa chọn các
linh kiện thiết kế
2 Tìm hiểu lý thuyết Tìm hiểu về cấu tạo, nguyên lý hoạt động của vi điều
khiển Atmega16, LCD16x2, cảm biến HC-SR04
3 Thiết kế sơ đồ khối Thiết kế sơ đồ khối thực hiện chức năng đo và cảnh báo
khoảng cách
4 Thiết kế hệ thống Xây dựng thuật toán và viết code trên Atmel Studio, thiết
kế sơ đồ nguyên lý và mô phỏng trên Proteus, kiểm tra
lỗi
5 Thiết kế mạch in Thiết kế file nguyên lý và file mạch in trên phần mềm
Altium
6 Hoàn thiện mạch thực tế Đặt mạch, hàn mạch, chạy và kiểm tra mạch in
7 Hoàn thiện báo cáo Viết báo cáo bản word, trình bày slide và video thuyết
trình
MỤC LỤC

DANH MỤC KÝ HIỆU VÀ CHỮ VIẾT TẮT.............................................................................i


DANH MỤC HÌNH ẢNH..............................................................................................................ii
DANH MỤC BẢNG BIỂU...........................................................................................................iii
CHƯƠNG 1. TỔNG QUAN ĐỀ TÀI............................................................................................1
1.1 Lý do chọn đề tài....................................................................................................................1
1.2 Mục tiêu và phạm vi nghiên cứu...........................................................................................1
1.3 Phương pháp nghiên cứu......................................................................................................1
1.4 Chỉ tiêu kỹ thuật.....................................................................................................................2
1.4.1 Yêu cầu chức năng............................................................................................................2
1.4.2 Yêu cầu phi chức năng......................................................................................................2
1.5 Kết luận..................................................................................................................................2
CHƯƠNG 2. CƠ SỞ LÝ THUYẾT CỦA ĐỀ TÀI......................................................................3
2.1 Tổng quan về AVR.................................................................................................................3
2.1.1 Giới thiệu..........................................................................................................................3
2.1.2 Phân loại...........................................................................................................................3
2.1.3 Ứng dụng..........................................................................................................................4
2.1.4 Nhận xét............................................................................................................................4
2.2 Vi điều khiển Atmega16........................................................................................................4
2.2.1 Thông số kỹ thuật.............................................................................................................4
2.2.2 Sơ đồ chân của Atmega16................................................................................................5
2.2.3 Kiến trúc bus.....................................................................................................................6
2.2.4 Bộ nhớ chương trình.........................................................................................................6
2.2.5 Vùng nhớ dữ liệu I/O........................................................................................................7
2.2.6 Interrupts...........................................................................................................................8
2.2.7 Timer...............................................................................................................................11
2.2.8 Nhận xét..........................................................................................................................14
2.3 Màn hình LCD16x2.............................................................................................................14
2.3.1 Giớ i thiệu LCD16x2.......................................................................................................14
2.3.2 Mô tả chân củ a LCD16x2..............................................................................................14
2.3.3 Các lệnh trong LCD 16x2...............................................................................................16
2.4 Modul cảm biến siêu âm HC-SR04.....................................................................................16
2.4.1 Giớ i thiệu HC-SR04.......................................................................................................16
2.4.2 Các thông số kỹ thuật......................................................................................................17
2.4.3 Mô tả chân củ a HC-SR04...............................................................................................18
2.4.4 Nguyên lý làm việc của HC-SR04..................................................................................18
2.5 Kết luận................................................................................................................................19
CHƯƠNG 3. THIẾT KẾ VÀ MÔ PHỎNG...............................................................................20
3.1 Sơ đồ khối hệ thống.............................................................................................................20
3.2 Linh kiện sử dụng................................................................................................................21
3.3 Các phần mềm sử dụng.......................................................................................................21
3.3.1 Phần mềm mô phỏng mạch Proteus 8.6..........................................................................21
3.3.2 Phần mềm thiết kế mạch Altium Designer 20.0.13........................................................22
3.3.3 Phần mềm lập trình Microchip Studio............................................................................24
3.3.4 Phần mềm nạp code Progisp...........................................................................................24
3.4 Thiết kế phần cứng..............................................................................................................25
3.4.1 Sơ đồ nguyên lý của mạch..............................................................................................25
3.4.2 Phân tích chức năng và nhiệm vụ các khối.....................................................................26
3.4.3 Nguyên lý hoạt động.......................................................................................................29
3.5 Thiết kế phần mềm..............................................................................................................32
3.5.1 Các công cụ cần thiết......................................................................................................32
3.5.2 Các bước cơ bản ban đầu................................................................................................32
3.5.3 Lập trình cho LCD16x2 với Atmega16..........................................................................32
3.5.4 Lập trình cho khối cảnh báo sử dụng còi chíp 5V..........................................................34
3.5.5 Source code.....................................................................................................................35
3.6 Mô phỏng trên Proteus........................................................................................................35
3.7 Sơ đồ mạch in.......................................................................................................................36
3.8 Kết luận................................................................................................................................37
CHƯƠNG 4. KẾT QUẢ VÀ ĐÁNH GIÁ...................................................................................38
4.1 Kết quả mô phỏng trên Proteus...........................................................................................38
4.1.1 Trường hợp 1..................................................................................................................38
4.1.2 Trường hợp 2..................................................................................................................38
4.1.3 Trường hợp 3..................................................................................................................39
4.2 Kết quả thực tế.....................................................................................................................39
4.3 Ứng dụng cảm biến đo khoảng cách trong việc cảnh báo va chạm của ô tô....................40
4.4 Đánh giá...............................................................................................................................40
KẾT LUẬN...................................................................................................................................41
TÀI LIỆU THAM KHẢO............................................................................................................42
PHỤ LỤC......................................................................................................................................43
DANH MỤC KÝ HIỆU VÀ CHỮ VIẾT TẮT

DMA: Direct memory access


ADC: Analog-to-Digital Converter
LCD: Liquid Crystal Display
IC: Integrated circuit
FPSLIC: Field-Programmable System-Level IC
SRAM: Static random-access memory
RISC: Reduced Instructions Set Computer
CPU: Central Processing Unit
MCU: Multipoint control unit
EEPROM: Electrically Ereasable Programmable ROM
DANH MỤC HÌNH ẢNH

Hình 2.1 Atmega328P.........................................................................................................3


Hình 2.2 Sơ đồ chân của Atmega16 [1]............................................................................5
Hình 2.3 Sơ đồ khối của kiến trúc AVR MCU [1]...........................................................6
Hình 2.4 Sơ đồ bộ nhớ chương trình [1]...........................................................................7
Hình 2.5 Sơ đồ bộ nhớ dữ liệu SRAM [1].........................................................................8
Hình 2.6 Cấu tạo thanh ghi TCNT1H/L [1]...................................................................12
Hình 2.7 Cấu tạo thanh ghi TCCT1A và TCCR1B [1].................................................13
Hình 2.8 Cấu tạo thanh ghi OCR1A và OCR1B [1]......................................................13
Hình 2.9 Màn hình LCD 16x2.........................................................................................14
Hình 2.10 Mô tả chân LCD 16x2 [2]...............................................................................15
Hình 2.11 Nguyên lý làm việc siêu âm [3]......................................................................17
Hình 2.12 Modul cảm biến siêu âm HC-SR04...............................................................17
Hình 2.13 Sơ đồ chân của HC-SR04 [3].........................................................................18
Hình 2.14 Sơ đồ thời gian siêu âm HC-SR04.................................................................18
Hình 3.1 Sơ đồ khối hệ thống..........................................................................................20
Hình 3.2 Giao diện phần mềm Proteurs 8.6...................................................................22
Hình 3.3 Giao diện phần mềm Altium Designer 20.0.13...............................................23
Hình 3.4 Giao diện phần mềm Microchip Studio..........................................................24
Hình 3.5 Giao diện phần mềm Progisp...........................................................................24
Hình 3.6 Sơ đồ nguyên lý của mạch................................................................................25
Hình 3.7 Sơ đồ nguyên lý của khối nguồn......................................................................26
Hình 3.8 Sơ đồ nguyên lý của khối vi điều khiển...........................................................26
Hình 3.9 Sơ đồ nguyên lý của khối cảm biến.................................................................27
Hình 3.10 Sơ đồ nguyên lý của khối hiển thị..................................................................28
Hình 3.11 Sơ đồ nguyên lý khối cảnh báo......................................................................28
Hình 3.12 Sơ đồ nguyên lý của khối nút nhấn...............................................................29
Hình 3.13 Thanh ghi MCUCR........................................................................................31
Hình 3.14 Thanh ghi GICR.............................................................................................31
Hình 3.15 Thanh gi TCCR1B..........................................................................................31
Hình 3.16 Sơ đồ mạch mô phỏng trên Proteus..............................................................35
Hình 3.17 Mạch in sau khi được phủ đồng....................................................................36
Hình 3.18 Sơ đồ mạch in dạng 3D...................................................................................36
Hình 4.1 Vật thể nằm trong khoảng cách 60cm đến 100cm.........................................38
Hình 4.2 Vật thể nằm trong khoảng các từ 10cm đến 60cm.........................................38
Hình 4.3 Mạch đo và cảm biến khoảng cách.................................................................39

ii
DANH MỤC BẢNG BIỂU

Bảng 2.1 Thông số kỹ thuật của Atmega16......................................................................4


Bảng 2.2 Các vector Reset và Interrupt [1]......................................................................9
Bảng 2.3 Reset and Interrupt vectors placement............................................................9
Bảng 2.4 Các lệnh LCD 16x2 thường sử dụng [2].........................................................16
Bảng 3.1 Bảng điều khiển ngắt INT0..............................................................................31

iii
CHƯƠNG 1. TỔNG QUAN ĐỀ TÀI

Chương này trình bày tổng quan về lý do chọn đề tài, mục tiêu và phạm vi nghiên cứu
xuất phát từ các phương pháp đã có trước đó để thực hiện đề tài.

1.1 Lý do chọn đề tài


Trong cuộc cách mạng 4.0, khoa học máy tính và xử lý thông tin có những bước tiến
vượt bậc, ngày càng phát triển mạnh mẽ. Sự phát triển nhanh chóng đó góp phần đưa các
kỹ thuật hiện đại áp dụng vào các sản phẩm trong mọi lĩnh vực đời sống của con người.
Các thiết bị cảm biến, tự động cũng đóng vai trò quan trọng khi nhu cầu chất lượng cuộc
sống ngày càng tăng.
Xuất phát từ các nhu cầu của cuộc sống hiện nay khi dịch bệnh diễ biến phức tạp và
các yêu cầu về khả năng tự tìm tòi, nghiên cứu và giải quyết các vấn đề của học phần Đồ
án thiết kế 2, em xin tìm hiểu đề tài “Thiết kế hệ thống đo và cảm biến khoảng cách”.

1.2 Mục tiêu và phạm vi nghiên cứu


Mục tiêu của đề tài là nghiên cứu và Thiết kế hệ thống đo khoảng cách vi điều khiển
Atmega16 một cách chính xác, có thể phát triển, mở rộng thêm các chức năng khác của
hệ thống. Bên cạnh đó, em đặt mục tiêu tự học hỏi, nghiên cứu, thành thạo các công cụ
lập trình vi điều khiển, mô phỏng và thiết kế mạch. Đó là các kỹ năng cần thiết của một
sinh viên để sau này có thể phát triển các sản phẩm lớn hơn.
Phạm vi nghiên cứu của đề tài là trong các lĩnh vực đời sống và khoa học, giúp tăng
tính tự động và tiện lợi. Bên cạnh đó còn để cảnh báo khoảng cách khi mục tiêu ở quá gần
hoặc quá xa so với yêu cầu của thực tiễn.

1.3 Phương pháp nghiên cứu


Đề tài được thiết kế dựa trên kiến thức cơ bản về phần cứng và phần mềm trong lập
trình vi điều khiển. Dựa trên các đề tài đã có, được tìm hiểu ở nhiều nguồn tin khác nhau.
Em sử dụng phương pháp thiết kế theo từng khối chức năng, dựa trên chức năng của từng
khối để thiết kế sơ đồ nguyên lý, sơ đồ mạch in và đưa ra phương pháp kiểm thử, mô
phỏng. Kết quả của quá trình này là sự kết hợp thiết kế của từng khối để tạo thành một hệ
thống lớn.

1
1.4 Chỉ tiêu kỹ thuật

1.4.1 Yêu cầu chức năng


Hệ thống đo và cảnh báo khoảng cách thực hiện các chức năng sau:
- Cảm biến HC-SR04 sẽ tạo ra các xung nhịp để tính xử lý và tính toán khoảng cách.
- Khoảng cách đo được sẽ được hiển thị trên LCD16x2.
- Cảnh báo khoảng cách thông qua còi chíp nếu không nằm trong phạm vi cho phép.

1.4.2 Yêu cầu phi chức năng


Bên cạnh các yêu cầu về chức năng thì cũng có những yêu cầu phi chức năng để đảm
bảo cho hệ thống hoạt động tối ưu nhất:
- Mạch phải đảm bảo có tính thẩm mỹ cao.
- Mạch thiết kế phải nhỏ gọn và dễ sử dụng.
- Thiết kế sao cho có khả năng nâng cấp và bảo trì.

1.5 Kết luận


Qua các vấn đề trên, em đã trình bày tổng quan về đề tài: “Thiết kế hệ thống đo
khoảng cách sử dụng cảm biến HC-SR04”. Từ đó xây dựng, lựa chọn các phương pháp
nghiên cứu phù hợp.

2
CHƯƠNG 2. CƠ SỞ LÝ THUYẾT CỦA ĐỀ TÀI

Chương này sẽ trình bày lý thuyết về các linh kiện quan trọng được trình bày trong
mạch. Gồm có giới thiệu về AVR nói chung và Atmega16 nói riêng, giới thiệu hoạt động
của màn hình LCD16x2 và hoạt động của cảm biến siêu âm HC-SR04.

2.1 Tổng quan về AVR

2.1.1 Giới thiệu


AVR là một loạt vi điều khiển (microcontroller) được sản xuất bởi công ty Atmel (nay
là một phần của Microchip Technology). AVR là viết tắt của "Advanced Virtual RISC"
hoặc "Alf-Egil Bogen Vegard Wollan's RISC," được lấy từ tên của hai kỹ sư tại Atmel,
những người đã phát triển kiến thức ban đầu về nền tảng này.
AVR mang đến hiệu suất vượt trội, hiệu quả sử dụng điện năng và tính linh hoạt cao.
AVR cung cấp các công cụ phát triển do chính hãng sản xuất, giúp hoàn thiện thiết kế
nhanh chóng và chính xác. Dòng vi điều khiển này cũng hỗ trợ nhiều chuẩn giao tiếp và
kết nối, cho phép điều khiển nhiều thiết bị ngoại vi một cách dễ dàng. Hình dưới là chip
ATmega328P thuộc họ vi điều khiển AVR.

Hình 2.1 Atmega328P

2.1.2 Phân loại


Họ vi điều khiển AVR có thể chia thành 7 nhóm lớn: tinyAVR, megaAVR, AVR Dx,
XMEGA, Application-specific AVR, FPSLIC, 32-bit AVRs.

2.1.3 Ứng dụng


Các ứng dụng của AVR rất đa dạng, từ điều khiển thiết bị nhúng đơn giản như đèn
LED và cảm biến đến các ứng dụng phức tạp như hệ thống điều khiển ô tô, thiết bị y tế,

3
và nhiều sản phẩm điện tử tiêu dùng khác. AVR đã trở thành một trong những lựa chọn
phổ biến cho vi điều khiển nhúng và thiết kế hệ thống nhúng trên toàn thế giới.

2.1.4 Nhận xét


Thông qua phần này, em đã giới thiệu một số thông tin cơ bản về họ vi điều khiển
AVR và cách phân loại, qua đó đưa ra được lựa chọn phù hợp cho bài tập lớn là sử dụng
vi điều khiển ATmega16.

2.2 Vi điều khiển Atmega16


Trong quá trình thiết kế, thực hiện đề tài, em sử dụng vi điều khiển 4 bit kiến trúc
RISC thuộc họ AVR - Atmega16 là linh kiện chính trong khối vi điều khiển. Trong phần
này, chúng em sẽ trình bày về cấu tạo, các chức năng cơ bản của Atmega16 được sử dụng
trong phạm vi bài tập lớn và cách lập trình cho các chức năng đó.

2.2.1 Thông số kỹ thuật


ATmega16 là vi điều khiển 4 bit dựa trên kiến trúc tập lệnh đơn giản RISC (Reduced
Instructions Set Computer) thuộc dòng megaAVR với một số thông số kỹ thuật được mô
tả trong bảng dưới đây:
Bảng 2.1 Thông số kỹ thuật của Atmega16

Thông số Giá trị


Tốc độ CPU 1 – 16MHz
Điện áp hoạt động 2.7V – 5.5V
Bộ dao động nội 8MHz
Bộ nhớ chương trình (Flash) 16KB
EEPROM 512 bytes
Số chân Digital I/O 32
Số chân Analog 8
Capture/Compare/PWM 4
Độ phân giải ADC 10 bits
Bộ nhớ RAM 1KB
Timer 3
Ngắt ngoài 3
Kết nối UART, I2C, SPI

2.2.2 Sơ đồ chân của Atmega16


Atmega16A-PU có 40 chân, mỗi chân được sử dụng để thực hiện một nhiệm vụ cụ
thể, có tổng cộng 32 chân I/O và bốn cổng, mỗi cổng bao gồm 8 chân I/O.

4
Hình 2.2 Sơ đồ chân của Atmega16 [1]

2.3 Màn hình LCD16x2

2.3.1 Giới thiệu LCD16x2


Màn hình tinh thể lỏng (LCD) được sử dụng rộng rãi trong các ứng dụng điện tử khác
nhau. Nó thường được sử dụng trong các hệ thống khác nhau để hiển thị các trạng thái và
thông số khác nhau. Màn hình LCD16x2 có 2 dòng với 16 kí tự trên mỗi dòng. Mỗi kí tự
được tạo thành từ ma trận pixel 5x8 (cột x hàng) [2].

Hình 2.3 Màn hình LCD 16x2

2.3.2 Mô tả chân của LCD16x2


LCD16x2 là thiết bị 16 chân, có 8 chân dữ liệu (D0-D7) và 3 chân điều khiển (RS,
RW, EN). 5 chân còn lại dùng để cấp nguồn và đèn nèn cho LCD. Hình dưới đây là mô tả
chân của LCD16x2.

5
Hình 2.4 Mô tả chân LCD 16x2 [2]

Chức năng chi tiết của từng chân:


- Chân 1 : nối đất.
- Chân 2: nối với nguồn 5V.
- Chân 3: chân VEE. Được sử dụng để điều chỉnh độ tương phản của màn hình. Điện
áp trên chân này xác định độ tương phản trên màn hình, điện áp thấp hơn, độ tương
phản cao hơn. Có thể kết nối với biến trở để điều chỉnh độ tương phản hoặc chỉ cần
nối chân này với đất để có được độ tương phản tối đa.
- Chân 4: chân RS – chọn thanh ghi
 RS=0: Dữ liệu trên các chân D0 đến D7 được coi như một lệnh.
 RS=1: Dữ liệu trên các chân D0 đến D7 được coi là dữ liệu hiển thị trên
LCD16x2.
- Chân 5: chân R/W – Đọc/Ghi dữ liệu
 RW = 0: Ghi dữ liệu vào màn hình LCD.
 RW = 1: Đọc dữ liệu từ màn hình LCD.
- Chân 6: chân E. Được sử dụng để chốt dữ liệu hiện trên các chân từ D0 đến D7.
Xung từ cao đến thấp với độ rộng tối thiểu là 450 ns được yêu cầu để chốt dữ liệu
vào màn hình.
- Chân 7-14: các chân dữ liệu từ D0 – D7. Các chân dữ liệu được sử dụng để gửi dữ
liệu/lệnh đến LCD16x2 dưới dạng 8 bit dữ liệu song song.
- Chân 15,16: LED+ và LED-. Màn hình tinh thể lỏng không có ánh sáng riêng như
màn hình bảy phân khúc. Do đó, modul có đèn LED nền. Nguồn cung cấp cho đèn
LED được cung cấp thông qua các chân này.

6
2.4 Modul cảm biến siêu âm HC-SR04

2.4.1 Giới thiệu HC-SR04


Cảm biến siêu âm hoạt động dựa trên nguyên lý của hệ thống SONAR và RADAR
được sử dụng để xác định khoảng cách đến một vật thể.
Cảm biến siêu âm tạo ra sóng âm tần số cao (siêu âm). Khi sóng siêu âm này chạm
vào vật thể, nó phản xạ dưới dạng tiếng vang được máy thu cảm nhận như trong hình dưới
đây.

Hình 2.5 Nguyên lý làm việc siêu âm [3]

Bằng cách đo thời gian cần thiết để tiếng vang đến máy thu, chúng ta có thể tính được
khoảng cách. Đây là nguyên lý hoạt động cơ bản của module siêu âm để đo khoảng cách
[3].
Cảm biến có thời gian phản hồi nhanh, độ chính xác cao, phù hợp với việc đo khoảng
cách và cảnh báo trong phạm vi của đề tài.

Hình 2.6 Modul cảm biến siêu âm HC-SR04

7
2.4.2 Các thông số kỹ thuật
 Điện áp hoạt động: 5VDC
 Dòng tiêu thụ: 10~40mA
 Tín hiệu giao tiếp: TTL
 Chân tín hiệu: Echo, Trigger.
 Góc quét:<15 độ
 Tần số phát sóng: 40Khz
 Khoảng cách đo được: 2~400cm (khoảng cách xa nhất đạt được ở điều khiện lý
tưởng với không gian trống và bề mặt vật thể bằng phẳng, trong điều kiện bình
thường cảm biến cho kết quả chính xác nhất ở khoảng cách <100cm).
 Sai số: 0.3cm (khoảng cách càng gần, bề mặt vật thể càng phẳng sai số càng nhỏ).
 Kích thước: 43mm x 20mm x 17mm

2.4.3 Mô tả chân của HC-SR04

Hình 2.7 Sơ đồ chân của HC-SR04 [3]

- Nguồn cung cấp VCC - +5 V


- TRIG (Trigger) - Đầu vào kích hoạt của cảm biến. Bộ vi điều khiển áp dụng xung
kích hoạt 10 us cho mô-đun siêu âm HC-SR04. Chân này được sử dụng để khởi
động quá trình đo khoảng cách bằng cách gửi một xung điện trở cao ngắn từ vi
điều khiển.
- ECHO - Echo đầu ra của cảm biến. Bộ vi điều khiển đọc/giám sát chân này để
phát hiện chướng ngại vật hoặc để tìm khoảng cách. Chân này phát ra xung điện
trở cao khi sóng siêu âm phản xạ từ vật thể và được thu lại bởi mô-đul.
- GND – Kết nối đất.

8
2.5 Kết luận
Như vậy chương 2 đã trình bày một cách tổng quan về AVR, những đặc điểm cơ bản
của Atmega16, LCD 16x2. Bên cạnh đó cũng trình bày module cảm biến được sử dụng
trong đề tài này.

CHƯƠNG 3. THIẾT KẾ VÀ MÔ PHỎNG

Trong chương này, chúng em sẽ trình bày về quá trình thiết kế sơ đồ khối, sơ đồ
nguyên lý, sơ đồ mạch in và mô phỏng hệ thống trên các phần mềm.

3.1 Sơ đồ khối hệ thống


Với đề tài là “Thiết kế hệ thống đo khoảng cách sử dụng cảm biến HC-SR04” nên các
chức năng của hệ thống bao gồm đo khoảng cách thông qua cảm biến siêu âm HC-SR04,
sau đó dựa vào kết quả trả về vi điều khiển Atmega16 để phân tích và đưa ra mức độ an
toàn đối với từng mức khoảng cách nhất định, nếu như vượt quá mức khoảng cách tối
thiểu cho phép, hệ thống cảnh báo là còi chip hoặc đèn tín hiệu sẽ được kích hoạt.
Dựa vào các chức năng đã nêu trên em thiết kế được sơ đồ khối như sau:

Hình 3.8 Sơ đồ khối hệ thống


Với khối vi điều khiển là trung tâm, tất cả các dữ liệu được trả về từ các khối chức
năng khác sẽ được đưa qua đây để xử lý và tính toán trước, sau đó dữ liệu phản hồi sẽ
được gửi tới các khối chức năng khác.
Về chức năng và nhiệm vụ của từng khối sẽ được trình bày cụ thể ở phần sau.

9
3.2 Linh kiện sử dụng
Để đáp ứng được các yêu cầu hoạt động của mạch, em và lựa chọn bổ sung các linh
kiện sau:
- 1 vi điều khiển Atmega16.
- 1 modul cảm biến siêu âm HC-SR04.
- 1 màn hình LCD16x2.
- 1 thạch anh 16MHz.

3.3 Các phần mềm sử dụng


3.3.1 Phần mềm mô phỏng mạch Proteus 8.13
Proteus là phần mềm mô phỏng mạch điện tử của Labcenter Electronics, gồm 2
chương trình: ISIS cho phép mô phỏng mạch và ARES dùng để vẽ mạch in. Proteus là
công cụ mô phỏng cho các loại vi điều khiển khá tốt, nó hỗ trợ các dòng vi điều khiển
MS-51, PIC, AVR, MSP430,…, các giao tiếp I2C, SPI, CAN, USB, Ethenet,… ngoài ra
còn mô phỏng các mạch số. Hình dưới đây là giao diện của Proteus.

Hình 3.9 Giao diện phần mềm Proteurs 8.6

10
3.3.2 Phần mềm thiết kế mạch Altium Designer 20.0.13
Altium Designer là một trong những phần mềm tự động hóa thiết kế PCB và điện tử
cho các bo mạch in tốt và phổ biến nhất hiện nay. Nó được phát triển bởi công ty phần
mềm Altium Limited có trụ sở tại Úc.
Altium Designer 20 ngày nay đang là một trong những phần mề vẽ mạch điện tử mạnh
và ưa chuộng ở Việt Nam. Ngoài việc hỗ trợ tốt cho hoạt động vẽ mạch, Altium còn hỗ
trợ tốt trong việc quản lý mạch, trích xuất file thống kê linh kiện.
Các tính năng của Altium Designer:
- Phân tích các mạch tương tự sử dụng Spice.
- Mô phỏng, gỡ lỗi mã và thiết kế FPGA VHDL.
- Khả năng hình thành 3 chiều mạch.
- Đo 3D như Solid Work.
- Tạo outputs, drawing như những bản vẽ kỹ thuật chuyên nghiệp.
- Hỗ trợ mạnh mẽ việc thiết kế tự động hóa.
Hình dưới đây là giao diện của Altium Designer 20.0.13.

Hình 3.10 Giao diện phần mềm Altium Designer 20.0.13

11
3.3.3 Phần mềm lập trình Microchip Studio
Microchip Studio là một bộ phần mềm do hãng Atmel phát triển, sử dụng cho việc
soạn thảo và biên dịch chương trình cho các vi điều khiển thuộc họ AVR bằng ngôn ngữ
C và Assembly. Giao diện phần mềm Atmel Studio được mô tả trong hình sau:

Hình 3.11 Giao diện phần mềm Microchip Studio

3.3.4 Phần mềm nạp code Progisp


Progisp là phần mềm dùng để fuse bits và nạp code cho vi điều khiển. Hình dưới là
giao diện của phần mềm.

12
Hình 3.12 Giao diện phần mềm Progisp

13
3.4 Thiết kế phần cứng

3.4.1 Sơ đồ nguyên lý của mạch


Để thực hiện được một cách chính xác và hiệu quả các yêu cầu của hệ thống, em đã
nghiên cứu và thiết kế sơ đồ nguyên lý như sau:

Hình 3.13 Sơ đồ nguyên lý của mạch

Hình trên là sơ đồ nguyên lý được thiết kế theo yêu cầu của hệ thống. Mỗi khối sẽ
đảm nhận các chức năng khác nhau, giúp cho mạch đáp ứng được các yêu cầu chức năng
và phi chức năng.

3.5 Thiết kế phần mềm

3.5.1 Các công cụ cần thiết


- Ngôn ngữ lập trình: C
- Phần mềm lập trình: Microchip Studio (Atmel Studio)

14
3.5.2 Các bước cơ bản ban đầu
- Khởi tạo các thanh ghi GICR, MCUCR.
khoảng thời gian∗343 m/s
- Tính khoảng cách theo công thức: khoảng cách=
2

3.5.3 Lập trình cho LCD16x2 với Atmega16

3.5.3.1 Khởi tạo LCD16x2


Các bước để khởi tạo cho LCD16x2 là:
 Bật nguồn màn hình LCD.
 Chờ 15 ms (thời gian khởi tạo bật nguồn cho LCD16x2).
 Gửi lệnh 0x38 để khỏi tạo 2 dòng, ma trận 5x8, chế độ 8 bit LCD16x2.
 Gửi bất kỳ lệnh ‘Display ON’ nào (0x0E, 0x0C) tới LCD16x2.
 Gửi lệnh 0x06 (con trỏ tăng dần) tới LCD16x2 [2].
Sau khi khởi tạo LCD, nó đã sẵn sàng chấp nhận dữ liệu để hiển thị.

void LCD_Init(void)
{
LCD_DATA_DIR=0xFF; //Make LCD data port direction as o/p
LCD_COMMAND_DIR=0b11111011;//Make LCD command port direction as
o/p
_delay_ms(20); //LCD power ON delay always > 15ms

LCD_Command(0x38); //initialization of 16x2 LCD in 8 bit


LCD_Command(0x0C); //display ON Cursor OFF
LCD_Command(0x06); //auto increment cursor
LCD_Command(0x01); //clear display
_delay_ms(2); //clear display command delay > 1.63
LCD_Command(0x80); //cursor at home position
}

3.5.3.2 Ghi lệnh vào LCD


Để ghi một lệnh bất kỳ vào LCD, cần thực hiện các bước sau:
 Gửi giá trị lệnh đến cổng dữ liệu LCD16x2.
 Đặt chân RS ở mức thấp, RS = 0.
 Đặt chân RW ở mức thấp, RW = 0 (hoạt động ghi).
 Cung cấp xung từ cao xuống thấp tại chân Enable (E) với độ trễ tối thiểu là 450 ns.
Khi đưa ra một xung kích hoạt, màn hình LCD sẽ chốt dữ liệu tại D0 đến D7 và thực
thi dưới dạng lệnh vì RS là lệnh reg.
void LCD_Command(unsigned char cmnd)

15
{
LCD_DATA_PORT=cmnd; //data lines are set to send command
LCD_COMMAND_PORT &= ~(1<<RS); //RS=0 command reg.
LCD_COMMAND_PORT &= ~(1<<RW); //RW=0 Write operation
LCD_COMMAND_PORT |= (1<<EN); //Enable pulse
_delay_us(1);
LCD_COMMAND_PORT &= ~(1<<EN);
_delay_ms(2);
}

3.5.3.3 Ghi dữ liệu vào LCD


Các bước để ghi dữ liệu vào LCD16x2:
 Gửi lệnh đến cổng dữ liệu.
 Đặt chân RS ở mức cao, RS = 1 (thanh ghi dữ liệu).
 Đặt chân RW ở mức thấp, RW = 0 (hoạt động ghi).
 Cho xung từ cao xuống thấp ở chân Enable (E).
Khi đưa một xung kích hoạt, màn hình LCD sẽ chốt dữ liệu hiện tại (trên các chân từ
D0 đến D7) và hiển thị nó trên ma trận 5x8, vì RS là một thanh ghi dữ liệu.
void LCD_Char(unsigned char character)
{
LCD_DATA_PORT=character; //data lines are set to send command
LCD_COMMAND_PORT |= (1<<RS); //RS=1 Data reg.
LCD_COMMAND_PORT &= ~(1<<RW); //RW=0 write operation
LCD_COMMAND_PORT |= (1<<EN); //Enable Pulse
_delay_us(1);
LCD_COMMAND_PORT &= ~(1<<EN);
_delay_ms(2);
}

3.5.3.4 Hiển thị chuỗi trên LCD


Hàm này nhận một chuỗi (một mảng các ký tự) và gửi một ký tự tại một thời điểm đến
hàm dữ liệu LCD cho đến khi kết thúc chuỗi. Một vòng lặp for được sử dụng để gửi một
ký tự trong mỗi lần lặp. Một ký tự NULL cho biết kết thúc của chuỗi.
void LCD_Char(unsigned char character)
{
LCD_DATA_PORT=character; //data lines are set to send command
LCD_COMMAND_PORT |= (1<<RS); //RS=1 Data reg.
LCD_COMMAND_PORT &= ~(1<<RW); //RW=0 write operation
LCD_COMMAND_PORT |= (1<<EN); //Enable Pulse
_delay_us(1);
LCD_COMMAND_PORT &= ~(1<<EN);
_delay_ms(2);
}

3.5.3.5 Một số lưu ý


Khi lập trình cho LCD, cần chú ý một vài điều sau đây:

16
- Sau khi LCD16x2 bật nguồn, không thể gửi lệnh ngay lập tức đến nó vì nó cần thời
gian khởi tạo là 15ms. Do đó, cần chú ý cung cấp đủ độ trễ khi bật nguồn, sau đó
gửi lệnh đến màn hình LCD.
- Sau khi gửi lệnh 0x01 cần phải cũng cấp đủ độ trễ (>1.63ms).

3.5.4 Lập trình cho khối cảnh báo sử dụng còi chíp 5V
Khi dữ liệu được hiển thị trên LCD cũng là lúc khối cảnh báo đưa ra các cảnh bảo về
khoảng cách. Để cảnh báo, chúng em đưa ra 3 trường hợp sau:
- Trường hợp 1: Khi vật cản cách cảm biến < 20 cm . Trong khoảng cách trên, còi
chíp sẽ hoạt động để cảnh báo vật thể sắp vượt khỏi phạm vi cho phép. LCD sẽ
hiển thị cảnh báo và khoảng cách.

if((distance >= 2 && distance < 10) || (distance > 60 && distance <=100))
{
PORTA |= (1<<PINA0); //pin A0 5V
LCD_String_xy(0,3,"WARNING^_^"); //displaying name
LCD_String_xy(1,0,"DIST = ");
dtostrf(distance, 2, 2, show); //distance to string
strcat(show, "cm");
LCD_String_xy(2, 7, show);

_delay_ms(250);
LCD_Clear();
}

- Trường hợp 2: Với khoảng cách đo được không nằm ở 2 trường hợp trên, LCD sẽ
thông báo lỗi và khối cảnh báo hoạt động.

else
{
PORTA |= (1<<PINA0); //pin A0 5V
LCD_String_xy(0,4,"ERROR^_^"); //displaying name

_delay_ms(250);
LCD_Clear();
}

3.5.5 Source code


Source code sẽ được trình bày trong phần Phụ lục.

17
3.6 Mô phỏng trên Proteus

Hình 3.14 Sơ đồ mạch mô phỏng trên Proteus

Các thành phần chủ yếu để mô phỏng mạch trên Proteus gồm: Atmega16, cảm biến
siêu âm HC-SR04 và LCD16x2.
Khi mô phỏng trên Proteus, do không thể có khoảng cách thực tế được nên chúng em
dùng biến trở để điều chỉnh khoảng cách. Bên cạnh đó thì còi chíp cũng không hoạt động
vì thế cũng không mô phỏng để cảnh báo thành tiếng được nên chúng em dùng Led đơn.
Hình trên là sơ đồ mạch mô phỏng trên Proteus.

3.7 Sơ đồ mạch in
Mạch in được thiết kế bằng phần mềm Altium Designer dựa trên sơ đồ nguyên lý đã
xây dựng. Bảng mạch in cần đảm bảo chính xác, có kích thước nhỏ gọn, sắp xếp linh kiện
hợp lý, dây nối không bị chồng lấn nhau và đi dây đầy đủ đảm bảo hoạt động của mạch.

18
Hình 3.15 Mạch in sau khi được phủ đồng

Hình trên là sơ đồ mạch in sau khi phủ đồng. Sau quá trình tối ưu, mạch gồm 2 lớp,
mà đi dây phù hợp không chồng chéo. Mạch được phủ đồng 2 lớp trên đường dây GND
để tránh nhiễu từ bên ngoài gây ảnh hưởng cho mạch

19
Hình 3.16 Sơ đồ mạch in dạng 3D

Hình trên là mạch in PCB 3D. Mạch đảm bảo tính thẩm mỹ cao. Trong khi thiết kế
mạch in cần điều chỉnh khoảng cách giữa các linh kiện và chú ý điều chỉnh cả độ cao của
linh kiện. Có thể kiểm tra tính chính xác của mạch bằng cách dùng các phần mềm để đảm
bảo mạch chạy đúng chức năng trong thực tế.

3.8 Kết luận


Như vậy, ở chương này đã trình bày chi tiết được nguyên lý hoạt động của mạch, các
bước thiết kế về phần cứng cũng như phần mềm và mô phỏng được mạch đo và cảnh báo
khoảng cách.

20
CHƯƠNG 4. KẾT QUẢ VÀ ĐÁNH GIÁ

4.1 Kết quả thực nghiệm mạch thật

4.1.1 Trường hợp 1


Hình dưới là kết quả mô phỏng khi vật thể nằm trong khoảng cách trên 20cm. Khi đó,
LCD16x2 hiện khoảng cách.

Hình 4.17 Vật thể nằm trong khoảng cách trên 20cm

4.1.2 Trường hợp 2


Đây là trường hợp vật thể nằm trong khoảng cách an toàn từ dưới 20cm. Khi đó,
LCD16x2 hiện khoảng cách đồng thời khối cảnh báo cũng được kích hoạt.

21
Hình 4.18 Vật thể nằm trong khoảng các từ 10cm đến 60cm

4.2 Kết quả thực tế


Dưới đây là hình mạch đo và cảm biến khoảng cách thực tế mà nhóm em thiết kế:

Hình 4.19 Mạch đo và cảm biến khoảng cách

22
4.3 Đánh giá
Mạch đáp ứng được các yêu cầu chức năng và phi chức năng. Đảm bảo chức năng đo
và cảnh báo khoảng cách, đảm bảo tính thẩm mỹ. Như vậy, mạch đã đảm bảo được cơ
bản các yêu cầu của bài toán.

23
CHƯƠNG 5. THỰC HÀNH LẬP TRÌNH CHO VĐK

5.1. Tạo Project mới với Atmel Studio 6 và nạp thử mã máy cho VĐK
Khi bắt đầu lập trình với VĐK họ AVR có rất nhiều phần mềm hỗ trợ tốt cho dòng
VĐK này, tuy nhiên, lí do mà Atmel Studio được sử dụng là mang lại sự hiểu biết về
VĐK đang lập trình – vì với Atmel Studio ta phải khai báo cụ thể các chân, v.v. còn
một số IDE khác hỗ trợ điều này khi tạo một project mới.

Cụ thể, để tạo một Project mới và nạp thử mã máy cho VĐK ta cần thông qua các
bước sau:

Bước 1: Trong Atmel Studio 6, vào File > New > Project . Sau khi thay đổi tên và đường
dẫn lưu project thì ta bấm OK .

Hình 5.1 : Giao diện tạo Project mới trong Atmel Studio 6

Bước 2: Sau khi tạo Project, giao diện chọn loại vi điều khiển sẽ hiện ra, ở đây ta sẽ
chọn loại vi điều khiển là Atmega 16.

24
Hình 5.2 : Giao diện chọn loại vi điều khiển

Bước 3: Cuối cùng thì chương trình sẽ hiện ra file chứa hàm main của project từ đó ta
có thể code chương trình theo ý muốn.

25
Hình 5.3 : Hàm main của chương trình
Bước 4 : Copy đoạ n mã nguồ n vào file main.c trong project vừ a tạ o:

#include <avr/io.h>

int main(){

DDRD |= 0xFF;

PORTD |= 0xAA;

DDRC |= 0xFF;

PORTC |= 0x00;

return 0;

Đoạn code trên có nghĩa đang xét chế độ cho Port D và C với DDRx là mode Input
hay Output của mỗi chân vi điều khiển. 1 tức là chân đó là chân xuất tín hiệu ra và ngược
lại.

26
Bước 5: Dịch đoạn mã nguồn trên sang mã máy bằng cách chọn Project > Build .
Nếu không có lỗi gì, file mã máy “tên project”.hex sẽ được tạo trong thư mục Exe của
Project.

Bước 6: Sử dụng phần mềm PROGISP để chỉnh cấu hình Fuse bit cho VĐK như
hình rồi chọn file hex vừa được tạo để nạp xuống VĐK. Nếu không có lỗi gì, dãy 8
LED đơn trên Kit sẽ sáng tắt xen kẽ nhau và LED 7 thanh sẽ sáng toàn bộ.

Hình 5.4 : Thiết lập Fuse bit trong PROGISP

Để có thể nạp file hex vào cho vi điều khiển ta cần cắm chân nạp của usbisp vào đê có ghi
isp trên bản mạch của mình.

5.2. Ví dụ lập trình điều khiển cổng ra số

Mục tiêu

• Với LED đơn: khi bật nguồn, toàn bộ LED tắt. Sau mỗi 0.5 s, có thêm một
LED sáng (từ trái sang phải) để tạo thành dải sáng có độ dài tăng dần. Sau
khi dải sáng đạt độ dài cực đại, toàn bộ LED tắt và quy trình được lặp lại từ
đầu.

27
• Với LED 7 thanh: khi bật nguồn, LED 7 thanh hiện số 0. Sau mỗi 0.5 s, số
đếm trên LED 7 thanh tăng hêm 1 đơn vị và dấu chấm trên LED đảo trạng
thái (nhấp nháy). Sau khi tăng đến 9, số đếm quay lại giá trị 0 và quy trình
được lặp lại từ đầu.
Thực hiện

Bước 1: Tạo mới Project AVR_Kit_Test như đã hướng dẫn ở trên. Trong project
này ta tạo tiếp 2 file là AVR_Kit_Test.c (chưa hàm main()) và thu_vien_rieng.h

Bước 2: Trong file thu_vien_rieng.h ta tạo 4 chương trình con:

• INIT(): là chương trình con dùng để khởi tạo trạng thái cho các chân I/O của
VĐK.
• PORT(): là chương trình còn dùng để bật/tắt các LED thong qua việc điều
khiển các PORT của VĐK.
• LED7_OUT(num): là chương trình con dùng để điều khiển LED 7 thanh
hiển thị số theo biến num (0 ≤ num ≤ 9).
• DELAY_MS(mili_count): là chương trình con dùng để tạo ra các khoảng
thời gian trễ, tính bằng mili giây, giữa các lần bật/tắt LED để dễ dàng qua sát
hiệu ứng (Lưu ý: project phải chọn Optimization là -O0 thì hàm này mới
hoạt động đúng!).
Trong file AVR_Kit_Test.c ta cần khai báo các thư viện sẽ sử dụng ( file *.h) – gồm
thư viện chuẩn của AVR (avr/io.h) và thu_vien_rieng.h, định nghĩa các hằng số, khai
báo biến toàn cục và gọi hàm main(). Trong hàm main() ta sẽ gọi hai chương trình con
INIT() và PORT() từ file thu_vien_rieng.h.

Bước 3: Tiến hành biên dịch sang mã mãy (Build - F7) và nạp mã máy xuống IC
VĐK như đã hướng dẫn ở trên.

Chi tiết các hàm

Hàm INIT(), để sử dụng các chân I/O của VĐK ta cần khai báo trạng thái output của
các chân (1 tương ứng với trạng thái output, 0 tương ứng với trạng thái input). Sau khi
đã khai báo trạng thái ta cần khai báo mức logic của các chân đó.

void INIT()

28
{

//Khoi tao trang thai output cho cac chan noi toi cac LED don

DDRD |= 0xFF;

//Khoi tao trang thai logic 1 cho cac chan noi toi cac LED don

PORTD |= 0xFF;

//Khoi tao trang thai output cho cac chan noi toi cac LED 7 thanh

DDRC |= 0xFF;

//Khoi tao trang thai logic 1 cho cac chan noi toi cac LED 7 thanh

PORTC |= 0xFF;

Hàm PORT() đây là hàm không có tham số và không trả về giá trị, hàm điều khiển
trạng thái logic của các chân trong các Port của VĐK với mục đích cho các LED sáng
tắt theo yêu cầu ở trên.

void PORT()

/* Khai bao cac bien dung trong ham */

//Bien led_shift dung de dieu khien cac LED don

//Gia tri dau la 255 = 0xFF 0b11111111 -> cac LED deu tat

unsigned char led_shift = 255;

//Bien dem cho LED 7 thanh, gia tri dau la 0

unsigned char led_7_count = 0;

//Vong for giup cac LED sang/tat theo quy luat lap di lap lai

for(;;)

/* Doan ma dieu khien cac LED don */

//Cac LED tat/sang theo 8bit cua bien led_shift

PORTD = led_shift;

//Thay doi bien led_shift

if(led_shift != 0) //Neuu led_shift khac 0

29
led_shift = led_shift << 1; // Dich trai 1bit

else

led_shift = 255; // Tro lai gia tri255

/* Doan ma dieu khien LED 7 thanh */

// Xuat gia tri dem ra LED 7 thanh

LED7_OUT((led_7_count));

//Dao trang thai PC3 de nhap nhay dau cham tren LED 7 thanh

PORTC ^= (1<<PC3);

//Tang dan gia tri dem

led_7_count = led_7_count + 1;

//Khi vuot qua 9, gia tri dem duoc reset ve 0

if(led_7_count > 9)

led_7_count = 0;

//Ham tre khoang 0.5s = 500 ms

DELAY_MS(500);

Hàm LED7_OUT() có tham số là num và không trả về giá trị, hàm điều khiển LED
7 thanh hiển thị num bằng cách sáng tắt các thanh LED một cách phù hợp.

void LED7_OUT(unsigned char num)

//Khai bao bien temp luu trang thai cua PORTC

unsigned char temp = PORTC;

//Cac chan vi dieu khien ung voi cac thanh LED

// a – PC5

// b – PC4

// c – PC2

// d – PC1

// e – PC0

// f – PC6

30
// g – PC7

//dot - PC3

//Tat cac doan LED hien dang sang truoc khi sang cac doan LED moi

temp &= 0B00001000;

//Gan muc logic cho 8 bit cua bien temp ung voi gia tri cua bien num

switch(num)

case 0: temp |= 0B10000000; break;

case 1: temp |= 0B11100011; break;

case 2: temp |= 0B01000100; break;

case 3: temp |= 0B01000001; break;

case 4: temp |= 0B00100011; break;

case 5: temp |= 0B00010001; break;

case 6: temp |= 0B00010000; break;

case 7: temp |= 0B11000011; break;

case 8: temp |= 0B00000000; break;

case 9: temp |= 0B00000001; break;

//Xuat gia tri logic moi ra PORTC de lam sang LED 7 thanh

PORTC = temp;

Hàm DELAY_MS(), hàm này nhận mili_count làm tham số và không trả về giá trị,
được sử dụng để tạo ra khoảng thời gian trễ tính bằng mili giây. Việc trễ được thực hiện
bằng các vòng lặp rỗng, tuy không thực hiện gì nhưng vẫn làm CPU tiêu tốn một
khoảng thời gian nhất định cho việc khởi tạo và kết thúc.

void DELAY_MS(unsigned int mili_count)

//Khai bao hai bien chay cho 2 vong for

unsigned int i, j;

31
//Xung nhip cua he thong cang cao, so vong lap cang tang

mili_count = mili_count * FRE;

//Cac vong for gay tre

for(i = 0; i < mili_count; ++i)

for(j = 0; j < 53; ++j);

5.3. Ví dụ lập trình đọc trạng thái logic đầu vào số


Mục tiêu

• Với LED đơn: khi bật nguồn, toàn bộ LED tắt. Nếu phím PB1 được ấn, chỉ
hai LED ngoài cùng bên trái sáng. Nếu phim PB2 được ấn, chỉ hai LED tiếp
theo sáng,… Nếu phim PB4 được ấn, chỉ hai LED ngoài cùng bên phải sáng.
• Với LED 7 thanh: khi bật nguồn, LED 7 thanh hiện số 0. Nếu phim PBx
được ấn, LED 7 thanh hiện giá trị của x.
Thực hiện

Bước 1: Tạo một bản sao lưu của toàn bộ Project AVR_Kit_Test sau đó chỉnh sửa
lại project này.

Bước 2: Trong file thu_vien_rieng.h thêm hai chương trình con:

• PB_2_LED(): chương trình con dùng để điều khiển LED theo phím ấn.
• PB_CHECK(): chương trình con dùng để nhận diện phím đang được ấn.
Trong file AVR_Kit_Test.c ta khởi tạo một biến toàn cục unsigned char push_button

= 0, xóa hoặc comment hàm PORT() và gọi hàm PB_2_LED() sau INIT().

Bước 3: Tiến hành biên dịch sang mã mãy và nạp mã máy xuống IC VĐK.

Chi tiết các hàm

Hàm PB_2_LED() là hàm không có tham số và không trả về giá trị, được sử dụng
để điều khiển LED theo phím ấn theo quy tắc nhất định đã được mô tả ở trên.

void PB_2_LED()

//Vong for giup viec quet phim an duoc lap di lap lai

32
for(;;)

//Goi ham quet phim, luu ket qua phim an vao bien push_button

push_button = PB_CHECK();

//Hien so thu tu phim an ra LED 7 thanh

LED7_OUT(push_button);

//Dieu khien hang LED don

switch (push_button){

//Neu push_button = 1, sang 2 LED ngoai cung ben trai

case 1: PORTD = 0b11111100; break;

//Tuong tu voi, cac gia tri con lai...

case 2: PORTD = 0b11110011; break;

case 3: PORTD = 0b11001111; break;

case 4: PORTD = 0b00111111; break;

//push_button = 0, tat tat ca cac LED default:

PORTD = 0xFF; }}}

Hàm PB_CHECK() là hàm không có tham số và có trả về giá trị, được sử dụng để nhận
diễn các phím ấn. Giá trị trả về của hàm là thứ tự các phím ấn. Khi được ấn, phím sẽ kết
nối chân tương ứng của VĐK với GND (mức logic 0). Khi nhả phím, chân tương ứng của
VĐK sẽ được treo lên mức 1 nhờ các điện trở kéo có sẵn. Hàm trả về 0 khi không có
phím nào được ấn (khi không có phím nào được ấn thì trạng thái LED sẽ reset), trong
trường hợp hàm trả về push_button thì trạng thái của các LED sẽ được giữ cho đến khi
phím khác được ấn. (push_button là biến toàn cục lưu giá trị trả về của hàm
PB_CHECK()).
unsigned char PB_CHECK()

//Kiem tra trang thai logic cua 4 chan PB0-3. Neu khac 1111

if((PINB & 0x0F) != 0x0F)

//Kiem tra PB0, neu la muc logic 0, ham ket thuc va tra ve 1

if(!(PINB & (1<<PB0)))

return 1;

33
//Kiem tra PB1, neu la muc logic 0, ham ket thuc va tra ve 2

if(!(PINB & (1<<PB1)))

return 2;

//Kiem tra PB2, neu la muc logic 0, ham ket thuc va tra ve 3

if(!(PINB & (1<<PB2)))

return 3;

//Kiem tra PB3, neu la muc logic 0, ham ket thuc va tra ve 4

if(!(PINB & (1<<PB3)))

return 4;

//Neu khong co phim nao duoc an, ham ket thuc va tra ve 0

return 0;

u giá tr tr v ca hàm PB_CHECK()).

5.4. Ví dụ lập trình đo điện áp tương tự và hiển thị kết quả lên LCD
Mục tiêu

• Bộ ADC: liên tục số hóa mức điện áp tại đầu vào ADC0, 10 bit kết quả được
lưu trong thanh ghi ADC.
• Màn hình LCD: hiển thị dòng text và liên tục cập nhật giá trị ADC theo mẫu:

Hình 5.5 : Mẫu hiển thị trên LCD trong ví dụ 3

Thực hiện

Bước 1: Tạo một bản sao lưu của toàn bộ Project AVR_Kit_Test sau đó chỉnh sửa
lại project này.

34
Bước 2: Thêm 2 file chứa thư viện ADC và LCD từ thư mục Library đã được cung
cấp sắn vào project bằng cách vào File > New > Source… (hoặc ấn tổ hợp phím Ctrl +
N) tạo ra 2 file mới sau đó copy lại nội dung 2 file này vào 2 file mới được tạo trên.

Bước 3: Chỉnh sửa và bổ sung các lệnh cần thiết vào thư viện thu_vien_rieng.h để
khởi tạo ADC, LCD, điều khiển hoạt động. Chỉnh sửa, cập nhật file AVR_Kit_Test.c.

Bước 4: Tiến hành biên dịch sang mã máy và nạp mã máy xuống IC VĐK.

Chi tiết các hàm

Hàm ADC_2_LCD(), hàm này là hàm không có giá trị trả về và không có tham số,
có tác dụng thiết lập các bit khởi tạo cho LCD1602 và sau đó thực hiện việc hiển
thị, cập nhập liên tiếp giá trị ADC đọc được từ chân ADC0 (nối tới biến trở).
void ADC_2_LCD()

//Khoi tao man hinh LCD

DDRD |= (1<<PD5);

PORTD &= ~(1<<PD5);

PORTC |= 0x0F;

LCD4_INIT(0,0);

//Hien thi cac dong text tinh

LCD4_CUR_GOTO(1,0);

LCD4_OUT_STR("Test ADC & LCD");

LCD4_CUR_GOTO(2,0);

LCD4_OUT_STR("ADC0: 0000/1024");

//Vong lap do va cap nhat gia tri ADC

for(;;)

ADC_STA_CONVERT();

LCD4_CUR_GOTO(2, 6);

LCD4_OUT_DEC(ADC, 4);

DELAY_MS(200);

35
}

Ngoài ra, ta cũng cần phải thêm vào hàm INIT() những câu lệnh khởi tạo cho ADC.
Trong đó ADC_AVCC() là câu lệnh để thiết lập điện áp tham chiếu cho ADC là 5 V,
ADC_IN(0) là câu lệnh để đọc giá trị ADC từ chân ADC0. Ngoài ADC_AVCC() ta
còn có thể dùng ADC_2V56() chuyển điện áp tham chiều từ 5 V xuống 2.56 V.

//Khoi tao tran thai input tha noi cho 8 dau vao ADC DDRA = 0x00;

PORTA = 0x00;

//Goi cac ham khoi tao tham so cho bo ADC

ADC_PRES(128);

ADC_AVCC();

ADC_IN(0);

5.5. Ví dụ lập trình giao tiếp với máy tính qua chuẩn UART-
USB
Mục tiêu

• Bộ UART: hoạt động ở chế độ truyền 8 bit, tốc độ 9600 bps, liên tục gửi
đoạn text sau lên máy tính:
[Họ và tên],

[MSSV],

• Màn hình LCD: hiển thị và dịch dần (sau mỗi 1s) hai dòng chữ trên sang trái
để có thể quan sát được oàn bộ đoạn text.
Thực hiện

Bước 1: Tạo một bản sao lưu của toàn bộ Project AVR_Kit_Test sau đó chỉnh sửa
lại project này.

Bước 2: Thêm 2 file chứa thư viện UART và LCD từ thư Library đã được cung cấp
sắn vào project bằng cách vào File > New > Source… (hoặc ấn tổ hợp phím Ctrl + N)
tạo ra 2 file mới sau đó copy lại nội dung 2 file này vào 2 file mới được tạo trên.

36
Bước 3: Chỉnh sửa và bổ sung các lệnh cần thiết vào thư viện thu_vien_rieng.h để
khởi tạo UART rồi điều khiển hoạt động. Chỉnh sửa, cập nhật file AVR_Kit_Test.c.

Bước 4: Tiến hành biên dịch sang mã máy và nạp mã máy xuống IC VĐK.

Chi tiết các hàm

Hàm UART() là hàm không có tham số, không có giá trị trả về. Hàm này sẽ thiết
lập, khởi tạo UART và LCD, sau đó truyền dữ liệu liên tục thông qua UART.

void UART()

//Khoi tao UART voi cac thong so ve braud rate, uart size, parity bit,
stop bit

UART_INIT(51,8,0,1);

//Khoi tao LCD

DDRD |= (1<<PD5);

PORTD &= ~(1<<PD5);

PORTC |= 0x0F;

LCD4_INIT(0,0);

//Hien thi dong text tinh len LCD

LCD4_CUR_GOTO(1,0);

LCD4_OUT_STR("Nguyen Tran Dung, 20207552, ET LUH - K65");

LCD4_CUR_GOTO(2,0);

LCD4_OUT_STR("Truong Dien Dien tu,DHBK HN");

//Ham tao tre

DELAY_MS(1000);

//Vong for vo han, gui du lieu cho may tinh thong qua UART

for(;;)

UART_TRAN_STR("Nguyen Tran Dung, 20207552, ET LUH - K65");

UART_TRAN_BYTE(13);

UART_TRAN_BYTE(10);

UART_TRAN_STR("Truong Dien Dien tu,DHBK HN");

37
UART_TRAN_BYTE(13);

UART_TRAN_BYTE(10);

UART_TRAN_BYTE(13);

UART_TRAN_BYTE(10);

DELAY_MS(1000);

//Ham dich toan bo du lieu cua LCD sang trai 1 don vi

LCD4_DIS_SHIFT(1,1); }}

Hàm LCD4_DIS_SHIFT() là hàm có 2 tham số và không có giá trị trả về, được sử
dụng để mở tính năng dịch dữ liệu của LCD thông qua lệnh LCD4_OUT_CMD.

void LCD4_DIS_SHIFT(unsigned char lcd4_direct, unsigned char lcd4_step) {

unsigned char i;

if(lcd4_direct == 0)

// Kiem tra lcd4_direct, bang 0 thi dich phai, 1 thi dich trai

//Vong for de dich du lieu theo step

for(i=0;i<lcd4_step;i++)

LCD4_OUT_CMD(0x1C);

else

//Vong for de dich du lieu theo step

for(i=0;i<lcd4_step;i++)

LCD4_OUT_CMD(0x18);

38
KẾT LUẬN

Kết luận chung

Sau một thời gian tìm hiểu, em đã hoàn thành đề tài Đồ án 2: “Thiết kế hệ thống đo
khoảng cách sử dụng cảm biến HC-SR04”. Qua đề tài này, chúng em đã thu được
những thành quả sau:
 Biết cách lập trình và thiết kế mạch sử dụng vi điều khiển họ AVR.
 Biết được các đặc điểm, chức năng cơ bản của vi điều khiển họ AVR nói chung
và ATmega16 nói riêng.
 Biết được các phương pháp thiết kế mạch cơ bản.
 Biết sử dụng các công cụ trong lập trình và thiết kế mạch như: Microchip
Studio, CodevisionAVR, Proteus, Altium Designer.
 Biết được cách sửa lỗi trong thực tế.
Quá trình thực hiện đề tài thực sự là khoảng thời gian vô cùng quý báu và hữu ích để
có thể bổ sung kiến thức vào lĩnh vực lập trình nhúng, giúp em tích lũy nhiều kinh nghiệm
có ích cho công việc sau này. Em xin chân thành cảm ơn thầy Phan Văn Phương đã
hướng dẫn và giúp đỡ chúng em.
Hướng phát triển

Hệ thống có thể được áp dụng vào sản xuất các công nghệ tiên tiến hiện nay như ô tô
tự lái để cảnh báo vật cản hay các thiết bị thông minh cảnh báo nguy hiểm. Đề tài cũng
cần được phát triển nghiên cứu sâu hơn để có thể được ứng dụng được trong nhiều lĩnh
vực khác nhau, phục vụ trong đời sống và trong các nghiên cứu.

39
TÀI LIỆU THAM KHẢO

[1] Atmel, "8-bit AVR Microcontroller with 16K Bytes In-System Programmable Flash," ATmega16/ATmega16L
datasheet.

[2] "ElectronicWings," 2021. [Online]. Available: https://www.electronicwings.com/sensors-modules/lcd-16x2-


display-module.

[3] "ElectronicWings," 2021. [Online]. Available: https://www.electronicwings.com/sensors-modules/ultrasonic-


module-hc-sr04.

[4] D. Raja, "CircuitDigest," 05 July 2015. [Online]. Available:


https://circuitdigest.com/microcontroller-projects/distance-measurement-using-hc-sr04-avr.

[5] [Trực tuyến]. Available: https://en.wikipedia.org/wiki/AVR_microcontrollers, truy cậ p cuố i cùng ngày


13/8/2021.

40
PHỤ LỤC

Source code:

#define F_CPU 8000000UL //clock speed is 8 MHz


#include <avr/io.h> //include AVR std. library file
#include <util/delay.h> //include inbuilt defined delay header file
#include <avr/interrupt.h> //interrupt header
#include <string.h>
#include <stdlib.h>

/*******************PROGRAM START*******************/

//LCD define
#define LCD_DATA_DIR DDRB //Define LCD data port direction
#define LCD_COMMAND_DIR DDRD //Define LCD command port direction register
#define LCD_DATA_PORT PORTB //Define LCD data port
#define LCD_COMMAND_PORT PORTD//Define LCD data port
#define EN PD7 //Define Register Select signal pin
#define RW PD6 //Define Read/Write signal pin
#define RS PD5 //Define Enable signal pin

//variable static
volatile float duration = 0; //integer to access all though the program
volatile int i = 0; //integer to access all though the program

//function
void LCD_Command(unsigned char cmd);
void LCD_Init(void);
void LCD_Char(unsigned char character);
void LCD_Clear();
void LCD_String (char *str);
void LCD_String_xy (char row, char pos, char *str);

/********************MAIN PROGRAM*******************/

int main(void)
{
double distance = 0; //storing digital output
char show [16]; //displaying digital output in 16x2 LCD

DDRA=0xFF;
LCD_Init(); //initialize LCD
_delay_ms(50);

GICR |= (1<<INT0); //enabling interrupt 0


MCUCR |= (1<<ISC00); //setting interrupt triggering logic change

TCCR1A = 0;

sei(); //enabling global interrupts

41
while (1)
{
LCD_COMMAND_PORT |= (1<<PIND0);
_delay_us(10); //triggering the sensor 10 us
LCD_COMMAND_PORT &= ~(1<<PIND0);

distance = duration /58; //getting the distance

if((distance >= 2 && distance < 10) || (distance > 60 &&


distance <= 100))
{
PORTA |= (1<<PINA0); //pin A0 5V
LCD_String_xy(0,3,"WARNING^_^"); //displaying name
LCD_String_xy(1,0,"DIST = ");
dtostrf(distance, 2, 2, show); //distance to string
strcat(show, "cm");
LCD_String_xy(2, 7, show);

_delay_ms(250);
LCD_Clear();
}
else if (distance >= 10 && distance <=60)
{
PORTA = 0x00;
LCD_String_xy(0,4,"DISTANCE"); //displaying name
LCD_Command(0xC0);
dtostrf(distance, 2, 2, show); //distance to string
strcat(show, "cm");
LCD_String_xy(1, 4, show);

_delay_ms(250);
LCD_Clear();
}
else
{
PORTA |= (1<<PINA0); //pin A0 5V
LCD_String_xy(0,4,"ERROR^_^"); //displaying name

_delay_ms(250);
LCD_Clear();
}
}
return 0;
}

//interrupt service routine when there is a change in logic level

ISR(INT0_vect)
{
if(i==1) //when logic from low to high
{
TCCR1B = 0; //disabling counter
duration = TCNT1; //count memory is updated to integer
TCNT1 = 0; //resetting the counter memory

42
i = 0;
}

if(i==0) //when logic change from high to low


{
TCCR1B |= (1<<CS10); //enabling counter
i = 1;
}
}

void LCD_Init(void)
{
LCD_DATA_DIR=0xFF; //Make LCD data port direction as o/p
LCD_COMMAND_DIR=0b11111011; //Make LCD command port direction as o/p
_delay_ms(20); //LCD power ON delay always > 15ms

LCD_Command(0x38); //initialization of 16x2 LCD in 8 bit


LCD_Command(0x0C); //display ON Cursor OFF
LCD_Command(0x06); //auto increment cursor
LCD_Command(0x01); //clear display
_delay_ms(2); //clear display command delay > 1.63
LCD_Command(0x80); //cursor at home position
}

/***************sending command on LCD***************/

void LCD_Command(unsigned char cmnd)


{
LCD_DATA_PORT=cmnd; //data lines are set to send command
LCD_COMMAND_PORT &= ~(1<<RS); //RS=0 command reg.
LCD_COMMAND_PORT &= ~(1<<RW); //RW=0 Write operation
LCD_COMMAND_PORT |= (1<<EN); //Enable pulse
_delay_us(1);
LCD_COMMAND_PORT &= ~(1<<EN);
_delay_ms(2);
}

/***************LCD data write function***************/

void LCD_Char(unsigned char character)


{
LCD_DATA_PORT=character; //data lines are set to send command
LCD_COMMAND_PORT |= (1<<RS); //RS=1 Data reg.
LCD_COMMAND_PORT &= ~(1<<RW); //RW=0 write operation
LCD_COMMAND_PORT |= (1<<EN); //Enable Pulse
_delay_us(1);
LCD_COMMAND_PORT &= ~(1<<EN);
_delay_ms(2);
}

void LCD_Clear()
{
LCD_Command(0x01); //clear display
LCD_Command(0x80); //cursor at home position
}

43
//*************Send string to LCD function**************

void LCD_String (char *str)


{
for(int i=0;str[i]!=0;i++) //Send each char of string till the NULL
{
LCD_Char(str[i]);
}
}

/*********Send string to LCD with x, y position*********/

void LCD_String_xy (char row, char pos, char *str)


{
if (row == 0 && pos<16)
{
LCD_Command((pos & 0x0F)|0x80); //Command of first row and
required position < 16
}
else if (row == 1 && pos<16)
{
LCD_Command((pos & 0x0F)|0xC0); //Command of second row and
required position<16 */
}
LCD_String(str); //Call LCD string function
}

44

You might also like