TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN ĐIỆN TỬ VIỄN THÔNG BÁO CÁO BÀI TẬP LỚN MÔN KỸ THUẬT VI XỬ LÝ ĐỀ TÀI THIẾT KẾ HỆ MẠCH HIỂN THỊ LED Giáo viên hướng dẫn TS Nguyễn Huy Hoàng Mã lớp 124829 Nhóm. LỜI MỞ ĐẦU Với sự phát triển không ngừng của khoa học kỹ thuật đặc biệt là ngành điện tử đã được ứng dụng rất nhiều trong công nghiệp. Trong lĩnh vực điều khiển, từ khi công nghệ chế tạo loại vi mạch lập trình phát triển đã đem đến các kỹ thuật điều khiển hiện đại có nhiều ưu điểm hơn so với việc sử dụng các mạch điều khiển lắp ráp các linh kiện rời kích thước nhỏ, giá thành rẻ, độ làm việc tin cậy, công suất tiêu thụ nhỏ. Ngày nay, trong lĩnh vực điều khiển đã được ứng dụng rộng rãi trong các thiết bị, sản phẩm phục vụ cho nhu cầu sinh hoạt hàng ngày của con người như máy giặt, đồng hồ báo thức,… đã giúp cho đời sống của chúng ta càng hiện đại và tiện nghi hơn. Chúng em đã chọn đề tài “Thiết kế mạch hiển thị LCD đơn giản, sử dụng vi điều khiển ATmega328P” để hoàn thành bài tập lớn môn Kỹ thuật vi xử lý, cũng như để đáp ứng mong muốn tìm hiểu và làm một sản phẩm điện tử cụ thể từ một dòng vi điều khiển. Đề tài “Thiết kế mạch hiển thị LCD” là một đề tài quen thuộc, có thể thực hiện trên rất nhiều dòng vi điều khiển nhưng do kiến thức còn hạn chế nên đề tài chúng em làm còn nhiều thiếu sót. Chúng em mong nhận được những ý kiến nhận xét từ phía thầy cũng như các bạn để góp phần hoàn thiện sản phẩm hơn.
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ - VIỄN THÔNG
*****
BÁO CÁO BÀI TẬP LỚN MÔN KỸ THUẬT VI XỬ LÝ
ĐỀ TÀI: THIẾT KẾ HỆ MẠCH HIỂN THỊ LED
Giáo viên hướng dẫn: TS Nguyễn Huy Hoàng
Mã lớp: 124829
Nhóm: 14
HÀ NỘI – 6/2021
1
Trang 2MỤC LỤC
LỜI MỞ ĐẦU 3
DANH MỤC HÌNH ẢNH 4
DANH MỤC BẢNG 4
CHƯƠNG 1: MÔ TẢ ĐỀ TÀI 5
CHƯƠNG 2: LẬP KẾ HOẠCH 6
2.1 Bảng công việc 6
2.2 Bảng phân công công việc 6
CHƯƠNG 3: THIẾT KẾ HỆ THỐNG 7
3.1 Sơ đồ khối chức năng 7
3.2 Giới thiệu về vi điều khiển atmega328p 7
3.3 Giới thiệu về LCD 16x2 10
3.4 Mô phỏng trên proteus 12
3.5 Code 12
3.6 Kết quả 18
CHƯƠNG 4: KẾT LUẬN 19
TÀI LIỆU THAM KHẢO 20
Trang 3LỜI MỞ ĐẦU
Với sự phát triển không ngừng của khoa học kỹ thuật đặc biệt là ngành điện tử đã được ứng dụng rất nhiều trong công nghiệp Trong lĩnh vực điều khiển, từ khi công nghệ chế tạo loại vi mạch lập trình phát triển đã đem đến các kỹ thuật điều khiển hiện đại có nhiều ưu điểm hơn so với việc sử dụng các mạch điều khiển lắp ráp các linh kiện rời kích thước nhỏ, giá thành rẻ, độ làm việc tin cậy, công suất tiêu thụ nhỏ
Ngày nay, trong lĩnh vực điều khiển đã được ứng dụng rộng rãi trong các thiết bị, sản phẩm phục vụ cho nhu cầu sinh hoạt hàng ngày của con người như máy giặt, đồng hồ báo thức,… đã giúp cho đời sống của chúng ta càng hiện đại và tiện nghi hơn
Chúng em đã chọn đề tài “Thiết kế mạch hiển thị LCD đơn giản, sử dụng vi điều khiển ATmega328P ” để hoàn thành bài tập lớn môn Kỹ thuật vi xử lý, cũng như để
đáp ứng mong muốn tìm hiểu và làm một sản phẩm điện tử cụ thể từ một dòng vi điều khiển
Đề tài “Thiết kế mạch hiển thị LCD” là một đề tài quen thuộc, có thể thực hiện
trên rất nhiều dòng vi điều khiển nhưng do kiến thức còn hạn chế nên đề tài chúng em làm còn nhiều thiếu sót Chúng em mong nhận được những ý kiến nhận xét từ phía thầy cũng như các bạn để góp phần hoàn thiện sản phẩm hơn
3
Trang 4DANH MỤC HÌNH ẢNH
Hình 1: Sơ đồ khối chức năng 7
Hình 2:Vi điều khiển ATmega328P 8
Hình 3: LCD16x2 10
Hình 4: Mô phỏng bằng Proteus 12
Hình 5: Kết quả mô phỏng mạch 18
DANH MỤC BẢNG Bảng 1: Bảng thời gian thực hiện công việc 6
Bảng 2: Bảng phân công công việc 6
Bảng 3: Chức năng các chân 9
Bảng 4: Chức năng các chân LCD16x2 11
Trang 5CHƯƠNG 1: MÔ TẢ ĐỀ TÀI
Đặt vấn đề
Bài toán đặt ra là thiết kế mạch hiển thị trên LCD, sử dụng vi điều khiển
ATmega328P Đây là bài toán khá quen thuộc, có nhiều cách giải quyết bài toán này Vi điều khiển có tác dụng nhận tín hiệu rồi xử lý thông tin và hiển thị ra màn hình LCD
Từ việc phân tích và khảo sát trên đây, nhóm đã đưa ra các vấn đề
chính cần giải quyết của bài toán đặt ra là:
- Tìm hiểu kiến thức về ATmega328P, LED 7 thanh và LCD
- Xây dựng sơ đồ khối
- Mô phỏng mạch trên phần mềm proteus
- Nạp code cho vi xử lý
- Tổng hợp và viết báo cáo
5
Trang 6CHƯƠNG 2: LẬP KẾ HOẠCH
2.1 Bảng công việc
thông tin về vi điều khiển
ATmega328P
năng của mạch
khối có trong mạch
mạch hiển thị đèn giao thông
phỏng lại mạch
Bảng 1: Bảng thời gian thực hiện công việc
2.2 Bảng phân công công việc
Tìm hiểu đề tài
Thiết kế hệ thống
Hoàn thiện sản phẩm
Bảng 2: Bảng phân công công việc
Trang 7CHƯƠNG 3: THIẾT KẾ HỆ THỐNG
3.1 Sơ đồ khối chức năng
Hình 1: Sơ đồ khối chức năng
3.2 Giới thiệu về vi điều khiển ATmega328P
ATmega328P là một bộ vi điều khiển tiên tiến và nhiều tính năng Nó là một trong những vi điều khiển nổi tiếng của Atmel vì nó được sử dụng trong bo mạch arduino UNO Nó là một bộ vi điều khiển thuộc họ vi điều khiển megaMVR của Atmel (Cuối năm 2016, Atmel được Microchip Technology Inc mua lại) Các vi điều khiển được sản xuất trong họ megaMVR được thiết kế để xử lý các bộ nhớ chương trình lớn và mỗi vi điều khiển trong họ này chứa lượng ROM, RAM, các chân I / O và các tính năng khác nhau và được sản xuất với các chân đầu ra khác nhau, từ 8 chân đến hàng trăm chân Mạch bên trong của ATmega328P được thiết kế với tính năng tiêu thụ dòng điện thấp Con chip này chứa 32 kilobyte bộ nhớ flash trong, 1 kilobyte EEPROM và 2 kilobyte SRAM EEPROM và bộ nhớ flash là bộ nhớ lưu thông tin và thông tin đó vẫn thoát ra
7
Trang 8mỗi khi nguồn điện bị ngắt nhưng SRAM là bộ nhớ chỉ lưu thông tin cho đến khi có điện
và khi ngắt nguồn điện tất cả thông tin được lưu trong SRAM sẽ bị xóa
Hình 2:Vi điều khiển ATmega328P
Đặc tính / Thông số kỹ thuật của ATmega328P
Thiết kế hiệu suất cao
Tiêu thụ ít điện năng
Tổng số chân ngõ vào Analog là 6
Chứa 32 kilobyte bộ nhớ flash
Chứa 2 kilobyte SRAM
Chứa 1 kilobyte EEPROM
Tốc độ xung nhịp 16 megahertz
Nhiệt độ tối thiểu và tối đa -40 độ C đến 105 độ C
Tổng số chân I / O kỹ thuật số là 14 chân
RISC tiên tiến
Khóa chức năng chương trình để bảo mật mã lập trình
Chứa tổng cộng ba bộ định thời, hai 8bit và một 16 bit
Tổng số chân I / O là 23 chân
Tổng số kênh PWM là 6
Điện áp hoạt động tối thiểu và tối đa từ 1.8V DC đến 5.5V DC
Sơ đồ chân
Trang 9Số thứ
tự
chân
Mô tả Chức năng Mô tả chức năng
Khi chân reset này ở mức thấp, bộ vi điều khiển và chương trình của nó sẽ được reset
2 PD0 Chân kỹ thuật số (RX) Chân đầu vào cho giao tiếp nối tiếp
3 PD1 Chân kỹ thuật số (TX) Chân đầu ra cho giao tiếp nối tiếp
4 PD2 Chân kỹ thuật số Chân 4 được sử dụng làm ngắt ngoài 0
5 PD3 Chân kỹ thuật số(PWM) Chân 5 được sử dụng làm ngắt ngoài 1
6 PD4 Chân kỹ thuật số Chân 6 được sử dụng cho nguồn bộ đếmbên ngoài Timer0
7 Vcc Điện áp dương Nguồn dương của hệ thống
9 XTAL Dao động tinh thể
Chân này nối với một châncủa bộ dao động tinh thể để cung cấp xung nhịp bên ngoài cho chip
10 XTAL Dao động tinh thể Chân này nối với chân còn lại của bộ daođộng tinh thể để cung cấp xung nhịp bên
ngoài cho chip
11 PD5 Chân kỹ thuật số(PWM) Chân 11 được sử dụng cho nguồn bộ đếmbên ngoài Timer1
12 PD6 Chân kỹ thuật số(PWM) Bộ so sánh analog dương i / ps
13 PD7 Chân kỹ thuật số Bộ so sánh analog âm i / ps
14 PB0 Chân kỹ thuật số Nguồn đầu vào bộ đếm hoặc bộ hẹn giờ
15 PB1 Chân kỹ thuật số(PWM) Bộ đếm hoặc bộ hẹn giờ so sánh khớp A
16 PB2 Chân kỹ thuật số(PWM) Chân này hoạt động như lựa chọn slave i /p.
17 PB3 Chân kỹ thuật số(PWM)
Chân này được sử dụng làm đầu ra dữ liệu master và đầu vào dữ liệu slave cho SPI
18 PB4 Chân kỹ thuật số
Chân này hoạt động như một đầu vào xung nhịp master và đầu ra xung nhịp slave
Trang 10Bảng 3: Chức năng các chân
3.3 Giới thiệu về LCD 16x2
Hình 3: LCD16x2
3 VEE Điều chỉnh độ tương phản ( cần được gắn với biến trở)
RS = 0: Đưa LCD vào chế độ ghi lệnh
RS = 1: Đưa LCD vào chế độ ghi dữ liệu(dữ liệu xuất lên màn hình)
RW = 0: Vi điều khiển truyền dữ liệu vào LCD
Trang 11RW =1: Vi điều khiển đọc dữ liệu từ LCD
6 E E = 0: Vô hiệu hóa đọc/ghi E = 1: Cho phép LCD đọc/ghi
E chuyển từ mức 1 về 0(hoặc 0 về 1): bắt đầu đọc/ghi LCD
Bảng 4: Chức năng các chân LCD16x2
11
Trang 123.4 Mô phỏng trên proteus
Hình 4: Mô phỏng bằng Proteus
3.5 Code
/*
* AssemblerApplication1.asm
*
* Created: 6/10/2021 7:26:25 AM
* Author: DELL
*/
;//////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////
.equ fclk = 16000000
.def temp = R16
.equ lcd_D7_port = PORTD
.equ lcd_D7_bit = PORTD7
.equ lcd_D7_ddr = DDRD
.equ lcd_D6_port = PORTD
.equ lcd_D6_bit = PORTD6
.equ lcd_D6_ddr = DDRD
.equ lcd_D5_port = PORTD
.equ lcd_D5_bit = PORTD5
.equ lcd_D5_ddr = DDRD
.equ lcd_D4_port = PORTD
Trang 13.equ lcd_D4_bit = PORTD4
.equ lcd_D4_ddr = DDRD
.equ lcd_D3_port = PORTD
.equ lcd_D3_bit = PORTD3
.equ lcd_D3_ddr = DDRD
.equ lcd_D2_port = PORTD
.equ lcd_D2_bit = PORTD2
.equ lcd_D2_ddr = DDRD
.equ lcd_D1_port = PORTD
.equ lcd_D1_bit = PORTD1
.equ lcd_D1_ddr = DDRD
.equ lcd_D0_port = PORTD
.equ lcd_D0_bit = PORTD0
.equ lcd_D0_ddr = DDRD
.equ lcd_E_port = PORTB
.equ lcd_E_bit = PORTB1
.equ lcd_E_ddr = DDRB
.equ lcd_RS_port = PORTB
.equ lcd_RS_bit = PORTB0
.equ lcd_RS_ddr = DDRB
; LCD module information
.equ lcd_LineOne = 0x00 ; start of line 1
.equ lcd_LineTwo = 0x40 ; start of line 2
; LCD instructions
.equ lcd_Clear = 0b00000001
.equ lcd_Home = 0b00000010
.equ lcd_EntryMode = 0b00000110
.equ lcd_DisplayOff = 0b00001000
.equ lcd_DisplayOn = 0b00001100
.equ lcd_FunctionReset = 0b00110000
.equ lcd_FunctionSet8bit = 0b00111000
.equ lcd_SetCursor = 0b10000000
;//////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////
.org 0x0000
jmp start
.org INT_VECTORS_SIZE
title1:
.db "BTL VXL- Nhom 14",0
mssv1:
.db "Mssv : 20163142 ",0
mssv2:
.db "Mssv : 20182718 ",0
mssv3:
.db "Mssv : 20182717 ",0
author1:
.db "1 : NgoHongPhong",0,0
author2:
.db "2 : DoanDinhPhan",0,0
author3:
.db " 3 : NongThiOanh",0,0
start:
13
Trang 14ldi temp,low(RAMEND)
out SPL,temp
ldi temp,high(RAMEND)
out SPH,temp
; C?u hình c?ng giao ti?p
sbi lcd_D7_ddr, lcd_D7_bit
sbi lcd_D6_ddr, lcd_D6_bit
sbi lcd_D5_ddr, lcd_D5_bit
sbi lcd_D4_ddr, lcd_D4_bit
sbi lcd_D3_ddr, lcd_D3_bit
sbi lcd_D2_ddr, lcd_D2_bit
sbi lcd_D1_ddr, lcd_D1_bit
sbi lcd_D0_ddr, lcd_D0_bit
sbi lcd_E_ddr, lcd_E_bit
sbi lcd_RS_ddr, lcd_RS_bit
; lcd_init_8d(void)
call lcd_init_8d
; lcd_write_string(title)
ldi ZH, high(title1)
ldi ZL, low(title1)
ldi temp, lcd_LineOne
call lcd_write_string_8d
call delayTx1mS
; lcd_write_string(author)
ldi ZH, high(author1)
ldi ZL, low(author1)
ldi temp, lcd_LineOne
call lcd_write_string_8d
//call delayTx1mS
ldi ZH, high(mssv1)
ldi ZL, low(mssv1)
ldi temp, lcd_LineTwo
call lcd_write_string_8d
call delayTx1mS
ldi ZH, high(author2)
ldi ZL, low(author2)
ldi temp, lcd_LineOne
call lcd_write_string_8d
//call delayTx1mS
ldi ZH, high(mssv2)
ldi ZL, low(mssv2)
ldi temp, lcd_LineTwo
call lcd_write_string_8d
call delayTx1mS
ldi ZH, high(author3)
ldi ZL, low(author3)
ldi temp, lcd_LineOne
call lcd_write_string_8d
Trang 15//call delayTx1mS
ldi ZH, high(mssv3)
ldi ZL, low(mssv3)
ldi temp, lcd_LineTwo
call lcd_write_string_8d
call delayTx1mS
loop:
rjmp loop
;//////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////
lcd_init_8d:
; Power-up delay
ldi temp, 100
call delayTx1mS
; Reset the LCD controller.
ldi temp, lcd_FunctionReset
call lcd_write_instruction_8d
ldi temp, 10
call delayTx1mS
ldi temp, lcd_FunctionReset
call lcd_write_instruction_8d
ldi temp, 200
call delayTx1uS
ldi temp, lcd_FunctionReset
call lcd_write_instruction_8d
ldi temp, 200
call delayTx1uS
; Function Set instruction
ldi temp, lcd_FunctionSet8bit
call lcd_write_instruction_8d
ldi temp, 80
call delayTx1uS
; Display On/Off Control instruction
ldi temp, lcd_DisplayOff
call lcd_write_instruction_8d
ldi temp, 80
call delayTx1uS
; Clear Display instruction
ldi temp, lcd_Clear
call lcd_write_instruction_8d
ldi temp, 4
call delayTx1mS
; Entry Mode Set instruction
ldi temp, lcd_EntryMode
call lcd_write_instruction_8d
15
Trang 16ldi temp, 80
call delayTx1uS
; Display On/Off Control instruction
ldi temp, lcd_DisplayOn
call lcd_write_instruction_8d
ldi temp, 80
call delayTx1uS
ret
lcd_write_string_8d:
push ZH
push ZL
lsl ZL
rol ZH
ori temp, lcd_SetCursor
call lcd_write_instruction_8d
ldi temp, 80
call delayTx1uS
lcd_write_string_8d_01:
lpm temp, Z+ ; get a character
cpi temp, 0 ; check for end of string
breq lcd_write_string_8d_02
call lcd_write_character_8d
ldi temp, 80
call delayTx1uS
rjmp lcd_write_string_8d_01
lcd_write_string_8d_02:
pop ZL
pop ZH
ret
lcd_write_character_8d:
sbi lcd_RS_port, lcd_RS_bit
cbi lcd_E_port, lcd_E_bit
call lcd_write_8
ret
lcd_write_instruction_8d:
cbi lcd_RS_port, lcd_RS_bit
cbi lcd_E_port, lcd_E_bit
call lcd_write_8
ret
lcd_write_8:
sbi lcd_D7_port, lcd_D7_bit
sbrs temp, 7
cbi lcd_D7_port, lcd_D7_bit
sbi lcd_D6_port, lcd_D6_bit
sbrs temp, 6
cbi lcd_D6_port, lcd_D6_bit
sbi lcd_D5_port, lcd_D5_bit
sbrs temp, 5
cbi lcd_D5_port, lcd_D5_bit
sbi lcd_D4_port, lcd_D4_bit
sbrs temp, 4
Trang 17cbi lcd_D4_port, lcd_D4_bit
sbi lcd_D3_port, lcd_D3_bit
sbrs temp, 3
cbi lcd_D3_port, lcd_D3_bit
sbi lcd_D2_port, lcd_D2_bit
sbrs temp, 2
cbi lcd_D2_port, lcd_D2_bit
sbi lcd_D1_port, lcd_D1_bit
sbrs temp, 1
cbi lcd_D1_port, lcd_D1_bit
sbi lcd_D0_port, lcd_D0_bit
sbrs temp, 0
cbi lcd_D0_port, lcd_D0_bit
sbi lcd_E_port, lcd_E_bit
call delay1uS
cbi lcd_E_port, lcd_E_bit
call delay1uS
ret
;//////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////
delayYx1mS:
call delay1mS ; delay for 1 mS
sbiw YH:YL, 1 ; update the the delay counter
brne delayYx1mS ; counter is not zero
delayTx1mS:
call delay1mS
dec temp
brne delayTx1mS
delay1mS:
push YL
push YH
ldi YL, low (((fclk/1000)-18)/4)
ldi YH, high(((fclk/1000)-18)/4)
delay1mS_01:
sbiw YH:YL, 1
brne delay1mS_01
; arrive here when delay counter is zero
pop YH
pop YL
ret
delayTx1uS:
call delay1uS
dec temp
brne delayTx1uS
delay1uS:
push temp
pop temp
push temp
pop temp
ret
17
Trang 18;//////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////
3.6 Kết quả
Hình 5: Kết quả mô phỏng mạch
Mạch hiển thị tên và mã số sinh viên từng thành viên trong nhóm trên màn hình LCD
CHƯƠNG 4: KẾT LUẬN
Sau một thời gian tìm hiểu và được sự hướng dẫn tận tình của thầy Nguyễn
Huy Hoàng chúng em đã hoàn thành bài tập lớn “Thiết kế mạch hiển thị
LED” Với đề tài này chúng em đã ứng dụng một phần nhỏ kiến thức về vi
điều khiển ATmega328P Trong thời gian thực hiện bài tập lớn này chúng em
đã thu được những kết quả như sau: