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

ĐẠI HỌC ĐÀ NẴNG

TRƯỜNG ĐẠI HỌC BÁCH KHOA


KHOA CƠ KHÍ

PBL 3: TK TB ƯD vi ĐK và cảm biến


NHÓM 20.04B

ĐỀ TÀI: CÂN SỨC KHỎE ĐO CÂN NẶNG VÀ CHIỀU CAO

Giáo viên hướng dẫn: TS. ĐẶNG PHƯỚC VINH

TS. ĐỖ THẾ CẦN

Sinh viên thực hiện: NGUYỄN THANH SANG

NGUYỄN TĂNG PHI LONG

Lớp: 20CDT1

Đà Nẵng, tháng 5/2023


LỜI NÓI ĐẦU

Trong nền kinh tế ngày nay, cùng với sự phát triển của quá trình công
nghiệp hóa hiện đại hóa. Ngành Y học nói chung và sức khỏe con người nói
riêng là vấn đề được quan tâm hàng đầu. Các thiết bị điện tử sử dụng Vi điều
khiển được sử dụng rộng rãi trong quá trình công nghiệp hiện đại hóa. Vi điều
khiển ngày càng hiện đại, tốc độ xử lý nhanh hơn, ứng dụng rộng hơn. Nhiều
máy móc hiện đại để phục vụ điều trị bệnh tật cho con người. Những ứng dụng
này vô cùng quan trọng trong Y học hiện đại. Tuy nhiên trước khi đi sâu vào
bên trong cơ thể để khám nghiệm thì chúng ta phải có thông tin cơ bản về trạng
thái cơ thể như chiều cao, cân nặng,... để đánh giá sơ bộ sức khỏe của con người
thường xuyên hàng tháng. Vì vậy, yêu cầu đặt ra là thiết bị phải tiện lợi, giá
thành rẻ và chính xác. Việc nghiên cứu, chế tạo cân điện tử đo các chỉ số sức
khỏe con người đã mở ra cho nhóm rất nhiều vấn đề cần được giải quyết.

Đề tài “nghiên cứu sức khỏe đo cân nặng và chiều cao” là cơ hội để chúng
em có thời gian để tìm hiểu, thiết kế, chế tao một hệ thống tích hợp này. Qua đó,
sẽ góp phần nâng cao được sức khỏe của người Việt.

Lần đầu làm quen với Vi điều khiển và các sensors hệ thống nên kiến thức
còn nhiều hạn chế. Trong quá trình hoàn thành đồ án môn học có hạn, kiến thức
và trình độ còn hạn chế nên không tránh khỏi những sai sót.

Trong quá trình thiết kế không tránh khỏi sai sót. Nhóm em xin chân thành
cảm ơn sự chỉ bảo, giúp đỡ của thầy cô trong khoa đặc biệt là sự giúp đỡ của
thầy Đặng Phước Vinh đã trực tiếp hướng dẫn nhóm tác giả thực hiện đồ án.
Xin chân thành cảm ơn quý thầy cô.

Đà Nẵng, ngày 22 tháng 05 năm 2023


Mục lục
CHƯƠNG 1: GIỚI THIỆU CHỦ ĐỀ.............................................................................4
1.1 Đặt ra một vấn ........................................................................................4
1.2 Giới thiệu về chủ đề..........................................................................................4
1.3 Khả năng ứng dụng và mở rộng của đề tài.......................................................4
CHƯƠNG 2: PHỤ KIỆN...............................................................................................4
2.1 PICVi điều khiển 16F877A..................................................................................4
2.2 Các loại cảm biến sử dụng................................................................................9
a) Cảm biến lực..................................................................................................9
b) Module HX711............................................................................................11
c) Cảm Biến siêu âm HC-SR04.......................................................................12
2.4 Thành phần hiển thị LCD................................................................................14
2.5 Các mạch điện quan trọng...............................................................................16
a) mạch nguồn..................................................................................................16
b) Giao tiếp UART-RS232..............................................................................17
2.6 Timer 1............................................................................................................19
CHƯƠNG 3 : NGUYÊN TẮC LÀM VIỆC.................................................................21
3.1 Nguyên lý làm việc của mạch............................................................................21
3.2 Tác dụng của từng mạch điện.............................................................................21
CHƯƠNG 4 : LƯU ĐỒ THUẬT TOÁN.....................................................................26
4.1 Lưu đồ thuật toán của chương trình chính......................................................26
4.2 Lưu đồ thuật toán giao tiếp với LCD..............................................................27
4.3 Lưu đồ thuật toán đo chiều cao của cảm biến siêu âm....................................28
CHƯƠNG 5 : CHƯƠNG TRÌNH................................................................................30
5.1 Lập trình trên CCS..............................................................................................30
5.2 Lập trình trên Visual Studio 2013......................................................................32
CHƯƠNG 6 : THIẾT KẾ MẠCH VÀ MẪU SẢN PHẨM.........................................41
6.1 Bố cục PCB........................................................................................................41
6.2 Quy trình lập dự án............................................................................................42
6.3 Mô hình thực tế..................................................................................................42
CHƯƠNG 7 : TÀI LIỆU THAM KHẢO.....................................................................43
CHƯƠNG 1: GIỚI THIỆU CHỦ ĐỀ
1.1 Đặt ra một vấn
Sức khỏe và một yếu tố hết sức quan trọng đối với mỗi chúng ta. Hai chỉ số mà
chúng ta có thể dễ dàng theo dõi mỗi ngày đó là cân nặng và chiều cao, và làm thế nào
để cúng ta biết được chỉ số cân nặng và chiều cao mỗi ngày để biết được mình cần
điều chế độ ăn uống, và thay đổi thói quen sinh hoạt như thế nào để có một cơ thể tốt?
→Cân sức khỏe
1.2 Giới thiệu về chủ đề
 Tính năng sản phẩm
 Sử dụng cảm biến lực để đo được cân nặng con người
 Sử dụng cảm biến siêu âm để đo được chiều cao con người
 yêu cầu sản phẩm
 Cân vận hành nhanh chóng, đạt độ chính xác
 Dễ dàng lắp đặt và sửa chữa khi có sự cố
 Hiển thị chính xác cân nựng và chiều cao trên màn hình LCD
 Dự án được thiết kế bằng cách sử dụng các thành phần
 Vi điều khiển PIC16F877A
 Cảm biến: Cảm biến lực, cảm biến siêu âm, module HX711
 Khối hiển thị LCD
 Giao tiếp RS232 sử dụng cổng COM
 Ngoài ra các linh kiện điện tử khác cũng được sử dụng như điện trở, tụ, led,
opto, BJT……
1.3 Khả năng ứng dụng và mở rộng của đề tài
Dự án có tính ứng dụng cao, giải bài toán gốc. Về việc mở rộng đề tài, khi dự
án được ứng dụng vào thực tế, các cảm biến có độ chính xác và hiệu suất cao hơn sẽ
được sử dụng. Ngoài ra, việc phát triển App điều khiển hệ thống trên điện thoại rất
tiện lợi cho người dùng. Mở rộng phát triển thành mô hình cân thông minh.
CHƯƠNG 2: PHỤ KIỆN
2.1 PIC Vi điều khiển 16F877A
Vi điều khiển PIC16F877A bao gồm 5 cổng I/O và được đặt tên lần lượt là A, B, C,
D, E, tổng cộng có 33 chân I/O.

Hình 2.1 Vi điều khiển PIC16F877A


PORT A
 Cổng A rộng 6 bit có thể được sử dụng làm I/O
 Thanh ghi quyết định chức năng cho mỗi chân là thanh TRISA, nếu ghi 1
vào các bit thì các bit tương ứng trong thanh ghi PORTA sẽ có chức năng
nhập, còn nếu ghi 0 thì chức năng xuất
 Dựa vào địa chỉ của thanh ghi ta có thể truy xuất từng bit trong thanh ghi
TRIS và thanh ghi PORT để cấu hình chức năng và xuất tín hiệu
 Cổng A thường được dùng để xử lý và đọc tín hiệu tương tự
 Chức năng của các chân
Hình 2.2 Chức năng PORT A

Hình 2.3 Tóm tắt các thanh ghi được liên kết với PORT A

 PORT B
 Cổng B rộng 8 bit có thể được sử dụng làm I/O
 Thanh ghi quyết định chức năng cho mỗi chân là thanh TRISB, nếu ghi 1
vào các bit thì các bit tương ứng trong thanh ghi PORTB sẽ có chức năng
nhập, còn nếu ghi 0 thì chức năng xuất
 Dựa vào địa chỉ của thanh ghi ta có thể truy xuất từng bit trong thanh ghi
TRIS và thanh ghi PORT để cấu hình chức năng thư và xuất tín hiệu
 Port B thường dùng để đọc các nút tín hiệu
 Chức năng của các chân
Hình 2.4 Chức năng PORT B

Hình 2.5 Tóm tắt các thanh ghi liên kết với PORT B
 PORT C
 Cổng C rộng 8 bit có thể dùng làm I/O
 Thanh ghi quyết định chức năng cho mỗi chân là thanh TRISC, nếu ghi 1
vào các bit thì các bit tương ứng trong thanh ghi PORTC sẽ có chức năng
nhập, còn nếu ghi 0 thì chức năng xuất
 Dựa vào địa chỉ của thanh ghi ta có thể truy xuất từng bit trong thanh ghi
TRIS và thanh ghi PORT để cấu hình chức năng thư và xuất tín hiệu
 PORTC được ghép kênh với một số chức năng ngoại vi. Các chân PORTC
có bộ đệm đầu vào kích hoạt schmitt.
Hình 2.6 Chức năng PORT C

Hình 2.7 Tóm tắt các thanh ghi liên kết với PORT C
 PORT D
 PORTD là một cổng 8 bit với bộ đệm đầu vào kích hoạt schmitt.
 Mỗi chân có thể cấu hình riêng lẻ làm đầu vào hoặc đầu ra.
 PORTD có thể được cấu hình như một cổng bộ vi xử lý rộng 8 bit (Cổng
Slave song song) bằng cách đặt bit điều khiển, PSPMODE (TRISE<4>).
Trong chế độ này, bộ đệm đầu vào là TTL.

Hình 2.8 Chức năng PORT D


Hình 2.9 Tóm tắt các thanh ghi được liên kết với PORT D
 PORT E
 Cổng E có ba chân (RE0/RD/AN5, RE1/WR/AN6 và RE2/CS/AN7) có thể cấu
hình riêng lẻ làm đầu vào hoặc đầu ra. Các chân này có bộ đệm đầu vào
Schmitt Trigger.
 Các chân của Port E được ghép kênh với các đầu vào tương tự. Khi được chọn
cho đầu vào tương tự, các chân này sẽ đọc là '0'.
 TRISE điều khiển hướng của các chân RE, ngay cả khi chúng đang được sử
dụng làm đầu vào tương tự. Người dùng phải đảm bảo giữ cấu hình các chân
làm đầu vào khi sử dụng chúng làm đầu vào tương tự.

Hình 2.10 Chức năng PORT E

Hình 2.11 Tóm tắt các thanh ghi liên kết với PORT E

 Nhóm sinh viên sử dụng cổng I/O của PIC16F877A như sau:
 PORT A: Chân dư
 PORT B : được sử dụng để nhận dữ liệu từ hai cảm biến ở dạng tín hiệu
điện áp và nhận dữ liệu cho nút nhấn
 PORT C: truyền dữ liệu lên khối hiển thị là LCD và led
 PORT D: truyền dữ liệu lên khối hiển thị là LCD
 PORT E: cổng dư
2.2 Các loại cảm biến sử dụng
a) Cảm biến lực
Cảm biến lực là thiết bị cảm biến dùng để chuyển đổi lực hoặc trọng lượng
thành tín hiệ điện áp.

Hình 2.12 Cảm biến lực


 thông số kỹ thuật
 Tải trọng: 10kg
 Điện áp hoạt động: 5V
 Vật liệu: thép
 Kích thước: 80x10x10 (mm)
 Kết nối cảm biến với module HX711
 Red(+Ex): Red
 Black(-Ex): Black
 Green(+Sig): Green
 White(-Sig): White
 nguyên tắc làm việc
 Khi không có lực tác động vào cảm biến thì không có điện áp trả về
 Khi có lực tác động vào cảm biến thì điện trở thay đổi nên có tín hiện điện
áp trả về
b) Module HX711

Hình 2.13 Module HX711

Do tín hiệu đầu ra của loadcell rất nhỏ, được tính bằng mV, nên tín hiệu này
không thể đưa trực tiếp vào vi điều khiển mà phải thông qua một bộ khuếch đại tín
hiệu cho loadcell đó là module HX711.

HX711 là module dùng để đọc sự thay đổi giá trọ điện trở của loadcell với bộ
ADC được tích hợp có độ phân giải là 24 bit. Tín hiệu đầu ra sẽ truyền cho vi điều
khiển thông qua 2 dây là SCK (serial clock) và DT (data).

 thông số kỹ thuật
 Điện áp hoạt động: 2.7 – 5 VDC
 Dòng tiêu thụ tối đa: 1.5 mA
 Tốc độ lấy mẫu: 10 – 80 mẫu/giây (có thể tùy chinh)
 Độ phân giải: 24 bit ADC
 Độ phân giả điện áp: 40mV
 Có 2 ngỏ vào: kênh A và kênh B
 Kết nối module HX711 với vi điều khiển
 VCC : kết nối điện áp cung cấp 5V
 GND: nối đất
 SCK: Nối chân RD1 để truyền tín hiệu về vi điều khiển
 DT: Nối chân RB2 để truyền tín hiệu về vi điều khiển
 Nguyên tắc làm việc
 Chân DT có nhiệm vụ truyền dữ liệu đã được biến đổi ADC với bộ phân
giải là 24 bit từ HX711 đến vi điều khiển, trong đó bit MSB được truyền đi
trước. Việc truyền các bít này được điều khiển thông qua xung clock được
tạo ở chân SCK. Sau khi truyền xong 24 bit dữ liệu (tương ứng 24 xung
clock), người dùng sẽ phải truyền thêm 1 – 3 bit để xác định hệ số khuếch
đại cho lần chuyển đổi ADC tiếp theo của HX711. Như vậy, tổng số xung
clock mà chíp vi điều khiển truyền cho chân SCK là 25 – 27 xung.
 Khi dữ liệu đầu ra chưa sẵn sàng cho việc truyền nhận thì chân DT ở mức
“1”. Khi đó chân SCK nên duy trì ở mức “0”. Khi chân DT chuyển từ mức
“1” xuống mức “0” thì việc truyền nhận dữ liệu đã sẵn sàng. Cứ 1 xung
clock đưa và chân SCK thì 1 bit dữ liệu sẽ được dịch chuyển từ HX711
sang vi điề khiển.
c) Cảm Biến siêu âm HC-SR04

Hình 2.14 Cảm biến siêu âm HC-SR04


 Cảm biến siêu âm SR04 sử dụng nguyên lý phản xạ sóng siêu âm. Cảm
biến gồm 2 module.1 module phát ra sóng siêu âm và 1 module thu sóng siêu
âm phản xạ về. Đầu tiên cảm biến sẽ phát ra 1 sóng siêu âm với tần số 40khz.
Nếu có chướng ngại vật trên đường đi, sóng siêu âm sẽ phản xạ lại và tác
động lên module nhận sóng. Bằng cách đo thời gian từ lúc phát đến lúc nhận
sóng ta sẽ tính được khoảng cách từ cảm biến đến chướng ngại vật.
 Khoảng cách = (thời gian * vận tốc âm thanh (340 m/s) / 2
 Thông số kỹ thuật
 Điện áp: 5V DC
 Dòng hoạt động: < 2mA
 Mức cao: 5V
 Mức thấp: 0V
 Góc tối đa: 15 độ
 Khoảng cách: 2cm – 450cm (4.5m)
 Độ chính xác: 3mm

 Kết nối cảm biến với vi điều khiển
 VCC : kết nối điện áp cung cấp –5V
 GND: nối đất
 Chân Trig: nối với chân RB0 của vi điều khiển
 Chân Echo: nối với chân RB1 của vi điều khiển
 Nguyên tắc làm việc

Hình 2.15 Sơ đồ kết nới vi điều khiển PIC 16F877A với cảm biến siêu âm HC-SR04

Sơ đồ kết nối vi điều khiển PIC16F877A với cảm biến siêu âm HC-SR04
được mô tả ở Hình 2.15. Hai chân I/O của vi điều khiển được kết nối với hai
chân TRIG và ECHO của cảm biến. Khi cảm biến được kích hoạt, bộ phận phát
sẽ phát ra sóng siêu âm đi đến vật thể cần xác định khoảng cách và dội ngược
lại bộ phận thu. Giả sử sóng siêu âm truyền trong môi trường không khí với
vận tốc bằng vận tốc âm thanh (v= 340 m/s). do đó khoảng cách cần xác định
sẽ bằng d = (v*t)/2. Trong đó, t là thời gian mà sóng siêu âm đi đến vật thể và
trở về.
Hình 2.16 mô tả chi tiết giản đồ thời gian quá trình truyền nhận sóng siêu âm
của cảm biến HC-SR04. Đầu tiên, một chân của vi điều khiển sẽ gửi một xung
ở mức “1” đến chân TRIG của SR04 trong khoảng thời gian lớn hơn 10 µs. Lúc
này, bộ phận phát của SR04 sẽ phát ra tám xung vuông với tần số 40 kHz. Khi
sóng siêu âm bắt đầu được phát ra, chân ECHO sẽ được đưa lên mức cao cho
đến khi bộ phận thu nhận được sóng siêu âm phản hồi về. Khoảng thời gian mà
chân ECHO duy trì ở mức cao này chính là thời gian mà sóng siêu âm đi đến
vật cản và trở về bộ phận thu. Tuy nhiên, nếu khoảng thời gian này lớn hơn
38ms thì có thể kết luận là không có vật cản.

Hình 2.16 Biểu đồ thời gian của cảm biến siêu âm HC-SR04
2.4 Thành phần hiển thị LCD
LCD (Liquid Crystal Display) là thiết bị ngoại vi dùng để hiển thị dữ liệu một
cách trực quan. Module LCD 16x2 chuyên dùng hiển thị ký tự trong bảng
Hình 2.17 Thành phần hiển thị LCD

 thông số kỹ thuật
 Điện áp hoạt động: 5V
 Mô-đun gồm 32”ô” được phân bố trên 16 cột và 2 hàng
 Sơ đồ chân và mô tả chân của Mô-đun LCD 16x2
 Chân VSS: chân nhóm của LCD
 Chân VCC: chân cấp nguồn của LCD
 Chân VEE : điều chỉnh độ tương phản của LCD
 Chân RS: Chuyển đổi giữa Thanh ghi Lệnh/Dữ liệu
 Chân RW: Chuyển đổi màn hình LCD giữa Thao tác Đọc/Ghi
 Chân E: Phải được giữ ở mức cao để thực hiện thao tác Đọc/Ghi
 Chân D0 – D7: Chân dùng để gửi lệnh hoặc dữ liệu lên LCD
 Chân A: Đèn LED bình thường giống như hoạt động để chiếu sáng màn
hình LCD
 Chân K : Hoạt động giống như đèn LED bình thường để chiếu sáng : CD
được kết nối với GND
 Kết nối chân giữa LCD và vi điều khiển
 Chân RS kết nối chân RC0 của vi điều khiển
 Chân RW nối chân RC4 của vi điều khiển
 Chân E nối chân RC3 của vi điều khiển
 Chân D4 nối chân RD0 của vi điều khiển
 Chân D5 kết nối chân RD1 của vi điều khiển
 Chân D6 nối chân RD2 của vi điều khiển
 Chân D7 kết nối chân RD3 của vi điều khiển
2.5 Các mạch điện quan trọng

a) mạch nguồn

 công dụng
Cung cấp điện áp 5V ổn định để cấp nguồn cho vi điều khiển và các thành
phần điện từ khác

Hình 2.18 Mạch nguồn


 linh kiện đã qua sử dụng
 Công tắc
 hai khối
 Tụ điện :104 uF, 2200uF, 1000uF
 Dẫn đến
 BJT B688
 IC7805
 Điện trở: 220 Ω
 điốt
 Tác dụng của các thành phần
 Tụ C4 có tác dụng lọc điện áp cấp vào chân Vi của IC 7805, có tác dụng
ngăn nguồn vào đột ngột làm dạng sóng điện áp vào bị răng cưa
 Tụ C5 có tác dụng cấp điện áp tạm thời cho chân Vi khi nguồn bị sụt áp
đột ngột
 Tụ C6 có tác dụng lọc nhiễu điện áp đầu ra lộn xộn
 Tụ C7 dùng để cung cấp điện áp tạm thời cho tải khi điện áp tải giảm đột
ngột
 Điốt để ngăn dòng điện ngược từ tải tiêu thụ
 IC 7805 cung cấp điện áp đầu ra +5V không đổi cho nguồn điện áp đầu
vào thay đổi
 Điện trở công suất: giảm cường độ dòng điện để tránh sự cố, cháy dây
hoặc thiết bị
 BJT B688: khuếch đại dòng điện
b) Giao tiếp UART-RS232

 UART
UART (Universal Asynchronous Receiver – Transmitter) là mạch tích hợp
dùng trong truyền dữ liệu nối tiếp giữa máy tính và các thiết bị ngoại vi
 đặc trưng
 Truyền một bit trên một đơn vị thời gian với tốc độ dữ liệu xác định
 Tín hiệu “0” tương đương với điện áp 0VDC
 Tín hiệu “1” tương đương với điện áp từ 3,3 đến 5VDC
 RS232 (Chuẩn khuyến nghị 232)
Kết nối các thiết bị ngoại vi với máy

 đặc trưng
 Kết nối tối đa 2 thiết bị
 Khoảng cách kết nối tối đa cho phép để bảo mật dữ liệu là 15m , tốc độ
20 Kbit/s
 Tốc độ truyền dữ liệu phổ biến: 1200 bps, 4800 bps, 9600 bps và
19200bps
 Mức logic điện áp tiêu chuẩn “0” : +3VDC ÷ +15 VDC( SPACE)
 Điện áp tiêu chuẩn mức logic “1” : -15 VDC ÷ -3 VDC( MARK)
 Giao tiếp UART-RS232
Để kết nối boear từ vi điều khiển với cổng COM trên máy tính ta cần sử dụng
RS232 để kết nối. Sơ đồ nối dây sử dụng giao tiếp UART- RS232 được mô tả như
hình 2.9
Hình 2.19 Sơ đồ nối dây
1. Chân 1 (C1+): Nguồn cấp đầu vào dương cho bộ điều khiển tín hiệu.
2. Chân 2 (C1-): Nguồn cấp đầu vào âm cho bộ điều khiển tín hiệu.
3. Chân 3 (C2+): Nguồn cấp đầu ra dương cho bộ điều khiển tín hiệu.
4. Chân 4 (C2-): Nguồn cấp đầu ra âm cho bộ điều khiển tín hiệu.
5. Chân 5 (T2OUT): Tín hiệu đầu ra TTL tương ứng với tín hiệu RS232
đầu vào.
6. Chân 6 (T2IN): Tín hiệu đầu vào TTL tương ứng với tín hiệu RS232 đầu
ra.
7. Chân 7 (R2IN): Tín hiệu đầu vào RS232 tương ứng với tín hiệu TTL
đầu ra.
8. Chân 8 (R2OUT): Tín hiệu đầu ra RS232 tương ứng với tín hiệu TTL
đầu vào.
9. Chân 9 (R1OUT): Tín hiệu đầu ra RS232 tương ứng với tín hiệu TTL
đầu vào.
10.Chân 10 (R1IN): Tín hiệu đầu vào RS232 tương ứng với tín hiệu TTL
đầu ra.
11.Chân 11 (T1IN): Tín hiệu đầu vào TTL tương ứng với tín hiệu RS232
đầu ra.
12.Chân 12 (T1OUT): Tín hiệu đầu ra TTL tương ứng với tín hiệu RS232
đầu vào.
13.Chân 13 (C3+): Nguồn cấp đầu vào dương cho bộ điều khiển tín hiệu.
14.Chân 14 (C3-): Nguồn cấp đầu vào âm cho bộ điều khiển tín hiệu.
15.Chân 15 (C4+): Nguồn cấp đầu ra dương cho bộ điều khiển tín hiệu.
16.Chân 16 (C4-): Nguồn cấp đầu ra âm cho bộ điều khiển tín hiệu.
Các chân C1+ và C1- được sử dụng để cấp nguồn cho bộ điều khiển tín
hiệu, trong khi các chân C2+ và C2- được sử dụng để cấp nguồn cho các
thiết bị khác được kết nối với IC. Các chân R1IN, R1OUT, T1IN và T1OUT
được sử dụng để kết nối với các thiết bị RS232 khác, trong khi các chân
R2IN, R2OUT, T2IN và T2OUT được sử dụng để kết nối với các thiết bị TTL
khác. Các chân C3+ và C3-, C4+ và C4- thường không được sử dụng trong
các ứng dụng thông thường.

Hình 2.20 Các chân của MAX232

Sơ đồ đấu dây của MAX232 với năm tụ điện 1uF được kết nối giữa (C1+ và
C1-), (C2+ và C2-), (V+ và Vcc), (V- và GND), (Vcc và GND)
Theo sơ đồ đấu dây như hình 2.9, chúng ta chỉ sử dụng 1 đường truyền: T1IN
(chân 11) và T1OUT (chân 14), R1IN (chân 13) và R1OUT (chân 12)

 Sơ đồ chân RS232

Hình 2.21 Sơ đồ chân RS232

Đây là một cách sử dụng:

 Chân 2 RXD : nhận dữ liệu – kết nối với chân RC7 của vi điều khiển
Chân 3 TXD : Truyền dữ liệu – kết nối với chân RC6 của vi điều khiển
2.6 .Timer 1

 Các tính năng của bộ đếm thời gian1


 Bộ định thời/bộ đếm 16 bit bao gồm hai thanh ghi TMR1H và TMR1L có
thể đọc và ghi
 Timer2 có thể hoạt động ở chế độ hẹn giờ hoặc bộ đếm được chọn bởi bit
TMR1CS
 Trong chế độ định thời T1 tăng ở mỗi chu kỳ lệnh, bộ đếm tăng mỗi khi
đồng hồ đầu vào tỷ lệ đặt trước bên ngoài tích tắc
 Có một bộ chia tỷ lệ trước
 Một ngắt xảy ra khi tràn từ FFFh →000h
 Sơ đồ khối Timer1
Hình 2.22 Sơ đồ khối Timer1

 Áp dụng
Khởi tạo timer1 với bộ chia trước là 2, giá trị đầu vào của thanh ghi TMR1 là
0, khi đó giá trị TMR1 chính là thời gian ECHO từ mức “1” xuống mức “0”
( thời gian sóng siêu âm đi đén vật thể và trở về).
CHƯƠNG 3 : NGUYÊN TẮC LÀM VIỆC
3.1 Nguyên lý làm việc của mạch

Hình 3.1 nguyên tắc làm việc


3.2 Tác dụng của từng mạch điện
Ø dao động

- Nếu tinh thể 4MHz được sử dụng thì chu kỳ của một lệnh là 40ns
- Để đạt được độ ổn định của bộ dao động rất cao, Tinh thể thạch anh thường
được sử dụng làm thiết bị xác định tần số để tạo ra một loại mạch dao động
khác thường được gọi là Bộ tạo dao động tinh thể thạch anh, (XO).

Ø Đặt lại mạch

· MCLR: đặt lại đầu vào, hoạt động thấp


· Có bộ lọc tiếng ồn
· Bộ lọc sẽ phát hiện và bỏ qua các xung nhỏ

Ø Nhận tín hiệu từ cảm biến

· Nhận tín hiệu từ cảm biến gửi về vi điều khiển xử lý

Ø Mạch nạp dữ liệu


· Dùng để nạp chương trình lập trình sẵn cho vi điều khiển
· Một số mạch sạc thông dụng như: PICkit3, Burn E….
Ø Cái nút

· Nút ấn dùng để điều khiển các thiết bị: động cơ DC, bóng đèn, hoặc
chuyển đổi trạng thái giữa tự động và thủ công
Ø Màn hình LCD

· Cắm các chân của LCD để hiển thị nhiệt độ và độ


· Có chỗ cắm biến trở để điều chỉnh độ tương phản của LCD
Ø Kết nối các thiết bị công cộng

· Mạch chuyển đổi ADC 24bit Loadcell HX711 được sử dụng để đọc
giá trị điện trở thay đổi từ cảm biến Loadcell (thường rất nhỏ không
thể đọc trực tiếp bằng VĐK) với độ phân giải ADC 24bit và chuyển
sang giao tiếp 2 dây (Clock và Data) để gửi dữ liệu về Vi điều khiển,
thích hợp để sử dụng với Loadcell trong các ứng dụng đo cân nặng.

Ø Giao tiếp RS232

Chức năng của các chân như sau:


+ chân 1 : Data Carrier Detect (DCD) : Phát tín hiệu mang dữ liệu
+ chân 2: Receive Data (RXD) : Nhận dữ liệu
+ chân 3 : Transmit Data (TXD) : Truyền dữ liệu
+ chân 4 : Data Termial Ready (DTR) : Đầu cuối dữ liệu sẵn sàng được kích
hoạt bởi bộ phận khi muốn truyền dữ liệu
+ chân 5 : Singal Ground ( SG) : Mass của tín hiệu
+ chân 6 : Data Set Ready (DSR) : Dữ liệu sẵn sàng, được kích hoạt bởi bộ
truyền khi nó sẵn sàng nhận dữ liệu
+ chân 7 : Request to Send : yêu cầu gửi,bô truyền đặt đường này lên mức hoạt
động khi sẵn sàng truyền dữ liệu
+ chân 8 : Clear To Send (CTS) : Xóa để gửi ,bô nhận đặt đường này lên mức
kích hoạt động để thông báo cho bộ truyền là nó sẵn sàng nhận tín hiệu
+ chân 9 : Ring Indicate (RI) : Báo chuông cho biết là bộ nhận đang nhận tín
hiệu rung chuông

Ø ghim phụ

· Dùng để kết nối các linh kiện điện tử hoặc các thiết bị khác khi cần
Ø dẫn thử nghiệm

· Kiểm tra xem mạch còn hoạt động bình thường không
CHƯƠNG 4 : LƯU ĐỒ THUẬT TOÁN
4.1 Lưu đồ thuật toán của chương trình chính

Hình 4.1 Lưu đồ thuật toán của chương trình chính

 Giải thích lưu đồ


 Bắt đầu chương trình
 Đầu tiên, chúng ta sẽ thiết lập I/O xác định các chân đầu vào và đầu
ra
 Khởi tạo các biến cần thiết với kiểu dữ liệu dùng cho chương trình
 Tiếp theo, khởi tạo các thành phần: timer1 để xác định thời gian mà
sóng siêu âm đi đến vật thể và trở về.
 Viết chương trình cho các cảm biến: cảm biến siêu âm, cảm biến
lực.
 Hiển thị chiều cao, cân nặng trên màn hình LCD
 Giao tiếp với máy tính để đọc thông số cân nặng và chiều cao
 Kết thúc chương trình
4.2 Lưu đồ thuật toán giao tiếp với LCD

Hình 4.2 Sơ đồ alogorithm giao tiếp với LCD

 Giải thích lưu đồ


 Bắt đầu chương trình
 Đầu tiên chúng ta sẽ khai báo các chân của vi điều khiển tương ứng
với các chân của LCD
 Sau đó khai báo vào thư viện LCD
 Cài đặt đầu vào và đầu ra
 LCD khởi động với thời gian trễ 0,2 giây
 Hiển thị Chiều cao và cân nặng lên màn hình LCD
 Kết thúc chương trình
4.3Lưu đồ thuật toán đo chiều cao của cảm biến siêu âm

Hình 4.3 Lưu đồ thuật toán của chương trình đo chiều cao bằng cảm biến siêu âm

 Giải thích lưu đồ


 Bắt đầu chương trình
 Thiết lập Timer 1 ( TMR1 sẽ tăng lên 1 sau mỗi 1 µs)
 Thiết lập chân TRIG lên 1 trong 10 µs ( để bộ phát bắt đầu phát 8
xung vuông với tần số 40kHz).
 Reset Timer 1
 Kiểm tra điều kiện (ECHO = 0 && TMR1 < 1000)
* Đúng: Quay lại chờ chân ECHO xuống mức “0”
* Sai: Reset Timer 1
 Sau khi Reset Timer 1 xong t tiếp tục kiểm tra điều kiện (ECHO = 1
&& i < 25000)
* Sai: Cho i = TMR1 rồi quay lại kiểm tra điều kiện
* Đúng: - Kiểm tra tiếp điều kiện i > 24990
+ Đúng: Hiển thị LCD “Out of Range” ) → Quay về 1
+ Sai: Hiển thị LCD ( Giá trị chiều cao) → Delay 100 ms và quay về 1.
 Kết thúc chương trình

Hình 4.4 Lưu đồ thuật toán của chương trình đo cân nặng bằng cảm biến lực
 Giải thích lưu đồ
 Bắt đầu chương trình
 Xác định khối lượng sàn cân (tấm đế) đang đặt lên bàn cân ( sàn cân ban
đầu).
 Đọc giá trị cân nặng “WEIGHT = Present value – Weight floor”.
 Tách giá trị của thanh ghi “WEIGHT” thành các số đơn vị, chục,..
 Hiển thị giá trị cân nặng lên LCD
 Kết thúc chương trình.

CHƯƠNG 5 : CHƯƠNG TRÌNH


5.1 Lập trình trên CCS
#include <loadcell.h>

#FUSES NOWDT, NOBROWNOUT, NOLVP


#use delay(crystal = 4MHz)
#use RS232(baud=9600, xmit=pin_c6,rcv=pin_c7,bits=9)
#define LCD_ENABLE_PIN PIN_C5
#define LCD_RS_PIN PIN_D3
#define LCD_RW_PIN PIN_C4
#define LCD_DATA4_PIN PIN_D4
#define LCD_DATA5_PIN PIN_D5
#define LCD_DATA6_PIN PIN_D6
#define LCD_DATA7_PIN PIN_D7
#include <lcd.c>

#define echo input(PIN_B1)


#define trig PIN_B0

#define DOUT PIN_D0


#define PD_SCK PIN_D1

float distance;

int16 i;
unsigned int32 ReadCount(){
unsigned int32 Count = 0; // thanh ghi Count dung de luu gia tri bien doi ADC 24bit
unsigned int8 j, convert_1, convert_2, convert_3;
output_high(DOUT);
output_low(PD_SCK);
Count = 0;
while(input(DOUT));

for (j = 0 ; j < 24 ; j++){


output_high(PD_SCK);
Count = Count << 1;
output_low(PD_SCK);
if(input(DOUT))
{
Count++;
}
}
output_high(PD_SCK); // Tao xung clock thu 25
Count = Count|0x80; // Thuc hien phep toan logic OR
output_low(PD_SCK);
convert_1 = MAKE8(Count, 0);
convert_2 = MAKE8(Count, 1);
convert_3 = MAKE8(Count, 2);
convert_2 = (convert_2 & 0b11111000);
Count = MAKE16(convert_3, convert_2);
return(Count*1.12);
}
unsigned int donvi, chuc, tram, nghin;
unsigned int16 KHOI_LUONG, weigh;

void main(){
set_tris_c(0);
set_tris_d(0);
set_tris_B(0b00000001);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
set_timer1(0); // set timer to 0 for fresh count
lcd_init();
lcd_gotoxy(1,1);
printf(lcd_putc, " CAN DIEN TU ");
delay_ms(1000);
weigh = ReadCount();
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("\fHeight:");
lcd_gotoxy(15,1);
lcd_putc("cm");
lcd_gotoxy(1,2);
lcd_putc("Weight:");
lcd_gotoxy(15,2);
lcd_putc("kg");

while(TRUE)
{
KHOI_LUONG = ReadCount() - weigh;
donvi = KHOI_LUONG % 10;
chuc = (KHOI_LUONG / 10) % 10;
tram = (KHOI_LUONG / 100) % 10;
nghin = (KHOI_LUONG / 1000) % 10;

output_high(trig);
delay_us(10); // 10us pulse
output_low(trig);

while(echo==0); // until the echo pin become high


setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
set_timer1(0); // set timer to 0 for fresh count
while(echo==1); // continue to the counting until echo pin become low
setup_timer_1(T1_DISABLED);
i = get_timer1();
distance=(float)i*0.01725f; // f = 4MHz/4 = 1MHz -> T = 1/1MHz = 1us.
// speed of sound in air 340m/s = 34.000cm/1.000.000us = 0.0345 cm/us
// distance = speed * time = 0.0345 * time
// actual distance = (0.0345*time)/2 = 0.01725*time (go to the target and return)
lcd_gotoxy(9,1);
printf(LCD_PUTC,"%.1f",24.0f - distance);

lcd_gotoxy(9,2);
printf(lcd_putc, "%d.%d%d%d" , nghin, tram, chuc, donvi );

delay_ms(500); // delay 0.5 sec for new measurement

printf("%.1f",24.0f - distance);
printf("@");
printf("%d.%d%d%d",nghin, tram, chuc, donvi );
printf("@");

}
}
5.2 Lập trình trên Visual Studio 2013
Ø Giao diện

Ø Chương trình

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using Emgu.CV;
using Capture = Emgu.CV.Capture;
using Emgu.CV.Structure;
using System.Drawing.Imaging;
using System.Diagnostics;
using Aspose.Words;
using Aspose.Words.Tables;
using pbl_1.Resport.AsposeWordExtension;
namespace pbl_1
{
public partial class Form1 : Form
{

Capture _camera;
String FileName = DateTime.Now.ToString("dd-MM-yyyy-HH-mm-ss") + ".png";
string FolderName = @"E:\PBL3 VI DIEU KHIEN\pbl\1\pbl_1\pbl_1\bin\Debug\Luuanh";

string a = string.Empty;
string b = string.Empty;
private object ofdOpenFile;

public Form1()
{
InitializeComponent();
serialPort1.DataReceived += NHAN_DATA;
}

private void Form1_Load(object sender, EventArgs e)


{
khoi_tao_bang();
loadData();
}

private void loadData()


{
DataTable my_data = new DataTable();
my_data.Load(Program.Database.SelectSQL("SELECT * FROM khachhang"));
dataGridView1.DataSource = my_data;
}

private void khoi_tao_bang()


{
dataGridView1.AutoGenerateColumns = false;
const int NumberColumn = 10;
dataGridView1.ColumnCount = NumberColumn;
string[] list = new string[NumberColumn] { "STT","ID", "Hovaten", "Gioitinh", "Ngaykham", "Diachi",
"Sodienthoai", "Cannang","chieucao","Anh" };
string[] header_name = new string[NumberColumn] { "STT", "ID", "Ho va ten", "Gioi tinh", "Ngay
kham", "Dia chi", "So dien thoai", "Can nang", "Chieu cao","Anh" };
int[] width_col = new int[NumberColumn] { 50,150, 200, 100, 200, 200, 150, 100, 100, 300 };

for (int i = 0; i < NumberColumn; i++)


{
dataGridView1.Columns[i].Name = list[i];
dataGridView1.Columns[i].DataPropertyName = list[i];
dataGridView1.Columns[i].HeaderText = header_name[i];
dataGridView1.Columns[i].Width = width_col[i];
dataGridView1.Columns[i].ValueType = typeof(String);
dataGridView1.Columns[i].Visible = true;
}
}

private void btnthem_Click(object sender, EventArgs e)


{
{
//String FileName = DateTime.Now.ToString("dd-MM-yyyy-HH-mm-ss") + ".png";
// string FolderName = @"C:\Users\philo\Downloads\1\1\pbl_1\pbl_1\bin\Debug\Luuanh\";
DISPLAY.Image.Save(FolderName + FileName, ImageFormat.Png);
}

try
{
// lệnh đúng
String sql = "insert into khachhang (ID, Hovaten, Gioitinh, Ngaykham, DiaChi,Sodienthoai, Cannang,
chieucao, Anh) values ('"
+ cbbID.Text + "','"
+ cbbten.Text + "','"
+ cbbgioitinh.Text + "','"
+ ngaykham.Text + "' ,'"
+ cbbdiachi.Text + "','"
+ cbbsodienthoai.Text + "' ,'"
+ tbcannang.Text + "','"
+ tbchieucao.Text + "','"
+ (FolderName + FileName) + "')";
OleDbDataReader reader = Program.Database.SelectSQL(sql);

loadData();
}
catch
{
MessageBox.Show("Có lỗi");
}
}

private void btxoa_Click(object sender, EventArgs e)


{
DialogResult hoi_lai = MessageBox.Show("bạn có chắc chắn xoá không?", "Delete File",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
// Ctrl + K + D
if (hoi_lai == DialogResult.Yes)
{
String sql = "Delete from khachhang where (ID = " + cbbID.Text + ")";
Program.Database.UpdateSQL(sql);
loadData();
}
}

private void btcapnhap_Click(object sender, EventArgs e)


{
try
{
String sql = "Update khachhang Set Hovaten = '" + cbbten.Text +
"', Gioitinh = '" + cbbgioitinh.Text +
"', Ngaykham = '" + ngaykham.Text +
"' , DiaChi = '" + cbbdiachi.Text +
"', Sodienthoai = '" + cbbsodienthoai.Text +
"', Cannang = '" + tbcannang.Text +
"' , chieucao = '" + tbchieucao.Text +
"' where (ID = " + cbbID.Text + ")";
Program.Database.UpdateSQL(sql);
loadData();
}
catch
{
MessageBox.Show("Có lỗi");
}

private void bttimkiem_Click(object sender, EventArgs e)


{
try
{
DataTable my_data = new DataTable();
my_data.Load(Program.Database.SelectSQL("SELECT * FROM khachhang where ID =" +
tbmskh.Text + ""));
dataGridView1.DataSource = my_data;
}
catch
{
MessageBox.Show("ID khách hàng phải là số nguyên");
}

private void btthoat_Click(object sender, EventArgs e)


{
Application.Exit();
}

private void dataGridView1_DoubleClick(object sender, EventArgs e)


{

int row = dataGridView1.CurrentCell.RowIndex;


cbbID.Text = dataGridView1.Rows[row].Cells["ID"].FormattedValue.ToString();
cbbID.Enabled= false;
cbbten.Text = dataGridView1.Rows[row].Cells["Hovaten"].FormattedValue.ToString();
cbbgioitinh.Text = dataGridView1.Rows[row].Cells["Gioitinh"].FormattedValue.ToString();
ngaykham.Text = dataGridView1.Rows[row].Cells["Ngaykham"].FormattedValue.ToString();
cbbdiachi.Text = dataGridView1.Rows[row].Cells["Diachi"].FormattedValue.ToString();
cbbsodienthoai.Text = dataGridView1.Rows[row].Cells["Sodienthoai"].FormattedValue.ToString();
tbcannang.Text = dataGridView1.Rows[row].Cells["Cannang"].FormattedValue.ToString();
tbchieucao.Text = dataGridView1.Rows[row].Cells["chieucao"].FormattedValue.ToString();

pictureBox2Des.ImageLocation = dataGridView1.Rows[row].Cells["Anh"].FormattedValue.ToString();

}
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
for (int i = 0; i < dataGridView1.RowCount; i++)
{
dataGridView1.Rows[i].Cells[0].Value = Convert.ToString(i + 1);
}
}

private void timer2_Tick(object sender, EventArgs e)


{
lb_Clock.Text = DateTime.Now.ToString();

private void btncornect_Click(object sender, EventArgs e)


{
if (!serialPort1.IsOpen) serialPort1.Open();
timer2.Start();
timer1.Start();
{
_camera = new Capture(0);
_camera.ImageGrabbed += _camera_ImageGrabbed;
_camera.Start();
}
}

private void _camera_ImageGrabbed(object sender, EventArgs e)


{
Mat frame = new Mat();
_camera.Retrieve(frame);
DISPLAY.Image = frame.ToImage<Bgr, Byte>().Bitmap;
}

private void btndis_Click(object sender, EventArgs e)


{
serialPort1.Close();
_camera.Stop();
}

private void NHAN_DATA(object sender, EventArgs e)


{
a = serialPort1.ReadTo("@");
b = serialPort1.ReadTo("@");
Height(a);
Weight(b);
}
public delegate void mydelegate(string s);
private void Weight(string s)
{
if (tbcannang.InvokeRequired)
{
mydelegate D = Weight;

tbcannang.Invoke(D, s);
}
else
{
tbcannang.Text = s + " kg";
}
}

private new void Height(string s)


{
if (tbchieucao.InvokeRequired)
{
mydelegate D = Height;
tbchieucao.Invoke(D, s);
}
else
{
tbchieucao.Text = s + " cm";
}
}

private void In_Click_1(object sender, EventArgs e)


{
var homNay = DateTime.Now;
Document baoCao = new Document(@"E:\PBL3 VI DIEU KHIEN\pbl\1\pbl_1\pbl_1\Template\
Mau_Bao_Cao.doc");

int row = dataGridView1.CurrentCell.RowIndex;

//Bước 2: Điền các thông tin cố định


baoCao.MailMerge.Execute(new[] { "Ngay_Thang_Nam_BC" }, new[] { string.Format("Đà Nẵng, ngày
{0} tháng {1} năm {2}", homNay.Day, homNay.Month, homNay.Year) });
baoCao.MailMerge.Execute(new[] { "ID" }, new[]
{ dataGridView1.Rows[row].Cells["ID"].FormattedValue.ToString() });
baoCao.MailMerge.Execute(new[] { "Ho_Ten" }, new[]
{dataGridView1.Rows[row].Cells["Hovaten"].FormattedValue.ToString()});
baoCao.MailMerge.Execute(new[] { "Gioi_Tinh" }, new[]
{dataGridView1.Rows[row].Cells["Gioitinh"].FormattedValue.ToString() });
baoCao.MailMerge.Execute(new[] { "Ngay_Kham" }, new[]
{ dataGridView1.Rows[row].Cells["Ngaykham"].FormattedValue.ToString() });
baoCao.MailMerge.Execute(new[] { "Dia_Chi" }, new[]
{ dataGridView1.Rows[row].Cells["Diachi"].FormattedValue.ToString() });
baoCao.MailMerge.Execute(new[] { "SDT" }, new[]
{ dataGridView1.Rows[row].Cells["Sodienthoai"].FormattedValue.ToString() });
baoCao.MailMerge.Execute(new[] { "Chieu_Cao" }, new[]
{ dataGridView1.Rows[row].Cells["chieucao"].FormattedValue.ToString() });
baoCao.MailMerge.Execute(new[] { "Can_Nang" }, new[]
{ dataGridView1.Rows[row].Cells["Cannang"].FormattedValue.ToString() });
baoCao.MailMerge.Execute(new[] { "Thoi_Gian" }, new[] { string.Format("{0:hh:mm:ss tt}",
DateTime.Now) });

baoCao.SaveAndOpenFile("BaoCao.doc");
}

private void btin_Click(object sender, EventArgs e)


{
cbbID.Text = "";
cbbID.Enabled = true;
cbbten.Text = "";
cbbgioitinh.Text = "";
ngaykham.Text = "";
cbbdiachi.Text = "";
cbbsodienthoai.Text = "";
tbcannang.Text = "";
tbchieucao.Text = "";
pictureBox2Des.Image = null;

}
}
}
CHƯƠNG 6 : THIẾT KẾ MẠCH VÀ MẪU SẢN PHẨM
6.1 Bố cục PCB

Hình 6.1a Bố cục PCB


Hình 6.1b layout mạch

6.2 Quy trình lập dự án


Hình 6.2 Mạch sau khi in và đang lắp ráp linh kiện

Hình 6.4 Mạch sau khi ráp linh kiện


6.3 Mô hình thực tế
Hình 6.5 Mô hình thực tế
Hình 6.5 Mô hình thực tế
CHƯƠNG 7 : TÀI LIỆU THAM KHẢO
1. Bộ định thời PIC16F877A. OpenLabPro. [Trực tuyến] [Trích dẫn: 23 5 2022.]
https://openlabpro.com/guide/pic16f877a-timer/.
2. Các cổng I/O kỹ thuật số trong PIC16F877A. Blog của Mreeco. [Trực tuyến] [Trích
dẫn: 24 5 2022.]
http://mreecopk.blogspot.com/2013/08/digitalinputoutputfor16f877A.html.
3. Đặng Phước Vinh . Lập trình Vi điều khiển PIC và thiết bị ngoại vi. : Nhà xuất bản
khoa học và kỹ thuật, 2021.

You might also like