Đồ án này gồm tất cả những vấn đề liên quan tới tiếp cận một con vi điều khiển , lý thuyết về xung clock , cách tiếp cận các ngoại vi , cách kết nối với cảm biến thực (trong đề tài này thay IC nhiệt độ bằng một biến trở tinh chỉnh) của dòng vi điều khiển ARM 7 (LPC 2103) . tài liệu này chỉ mang tính chất tham khảo , có cả phần source code (đính kèm trong project) . Phần báo cáo + source code + giải thuật là phần hoàn chỉnh cho đồ án , không nên copy hoàn toàn , chỉ tìm hiểu , từ đó có thể có những hướng phát triển lên cho những ứng dụng liên quan tới bộ ADC của vi điều khiển như xử lý âm thanh , lấy mẫu tín hiệu
46 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 6642 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đồ án ARM 7( LPC2103) analysic Temperature + display LCD, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
MỤC LỤC
VI ĐIỀU KHIỂN LPC2103
I. Giới thiệu chung về LPC2103
1. LPC2103
2. Các module của LPC2103
a. Clock(APB divider)
b. GPIO
c. Timer
d. ADC
II. Text LCD
Sơ đồ chân
Thanh ghi và cách điều khiển
THỰC HIỆN ĐỒ ÁN
Phần cứng LPC2103
Lưu đồ , Giải thuật và chương trình
Kết quả
Giới Thiệu Chung Về LPC2103
LPC 2103
Tổng quan về LPC2103:
LPC2103 là vi điều khiển 32-bit được xây dựng trên nền cấu trúc ARM7TDMI-S CPU với khả năng mô phỏng thời gian thực và bộ nhớ flash tốc độ cao dung lượng 32 kB. Vùng nhớ nội được mở rộng đến 128-bit địa chỉ và một cấu hình tăng tốc đặc biệt giúp cho việc thực thi các lệnh 32-bit chỉ trong một chu kì xung nhịp. Với các ứng dụng nhỏ, LPC2103 hỗ trợ tập lệnh 16-bit (Thumb mode) giúp giảm 30% kích thước mà không gây ra bất lợi đáng kể so với việc sử dụng tập lệnh 32-bit thực hiện cùng chức năng.
Nhờ vào kích thước nhỏ và tiết kiệm năng lượng, LPC2103 rất lí tưởng cho các ứng dụng đòi hỏi khắt khe về cực tiểu hóa kích thước. Phạm vi giao tiếp truyền thông nối tiếp rất rộng sử dụng UARTs, SPI (Serial Peripheral Interface) – SSP (Serial Synchronous Port) và I2C kết hợp với SRAM 8 kB giúp LPC2103 thích hợp với nhiều loại cổng truyền thông và các giao thức chuyển đổi.Với các Timer 32-bit và 16-bit, ADC 10-bit, PWM, 32 chân xuất nhập đa dụng (GPIO) và các chân ngắt ngoài, LPC2103 đặc biệt thích hợp với các ứng dụng điều khiển trong công nghiệp, y khoa, cổng thông tin, truyền thông đa phương tiện… .
Các tính năng cơ bản:
Vi điều khiển 32-bit dòng ARM7TDMI-S, có hỗ trợ tập lệnh 16-bit tích hợp trong chip 48 chân.
RAM tĩnh 8 kB và bộ nhớ flash 32 kB. 128-bit giao tiếp cho phép hoạt động tốc độ cao với tần số 70 MHz.
ISP (In System Programming) / IAP (In Appication Programming) thông qua phần mềm bootloader trên chip, xóa một sector hoặc toàn bộ chip trong 100ms và lập trình 256 bytes trong 1ms.
Giao tiếp nhúng ICE-RT cho phép quan sát điểm breakpoint và watchpoint. Các phục vụ ngắt vẫn tiếp tục được thực thi trong khi đang debug tác vụ nền với phần mềm quan sát thời gian thực RealMonitor trên chip.
8 kênh chuyển đổi A/D 10-bit, thời gian chuyển đổi 2.44 μs mỗi kênh.
2 bộ timers/counters 32-bit (bao gồm 7 kênh capture và 7 kênh compare) và 2 bộ timers/counters 16-bit (3 kênh capture, 7 kênh compare).
Đồng hồ thời gian thực RTC (Real-Time Clock) tiết kiệm năng lượng với nguồn cấp độc và xung nhịp ngõ vào 32 kHz.
Giao diện nối tiếp bao gồm 2 UARTs (16C550), 2 bus I2C tốc độ cao (400kbits/s), SPI và SSP
Vector điều khiển ngắt có địa chỉ truy cập và có mức ưu tiên xác lập được.
32 chân xuất nhập đa dụng (GPIO) mức 5V và 3 chân ngắt ngoài (tích cực theo cạnh hoặc theo mức).
Với tần số xung clock đưa vào trong khoảng 10MHz-25MHz, CPU có thể hoạt động với tần số đạt tối đa 70 MHz lập trình được thông qua bộ PLL (Phase Locked Loop) trên chip, thời gian thiết lập 100μs.
Bộ tạo dao động tích hợp trên chip với thạch anh ngoài, tầm hoạt động từ 1 MHz-25 MHz.
3 chế độ tiết kiệm năng lượng bao gồm : Idle mode, Power-down mode và Power-down mode with RTC.
Chức năng cho phép / không cho phép riêng lẻ từng thành phần ngoại vi nhằm tối ưu hóa nguồn năng lượng.
Đưa vi điều khiển trở lại chế độ hoạt động bình thường từ Power-down mode nhờ ngắt ngoài hoặc RTC.
Sơ đồ khối vi điều khiển LPC2103:
Sơ đồ chân LPC2103 ( đóng gói theo kiểu LQFP48):
Bảng mô tả chức năng các chân của LPC2103:
Ký hiệu
Số thứ tự
Loại
Mô tả
P0.0
đến
P0.31
I/O
Port 0 : Port 0 là port xuất nhập 32-bit, có thể điều khiển riêng lẻ từng bit. 31 chân đầu tiên của port 0 (P0.0-P0.30) được sử dụng như các chân xuất nhập số đa dụng 2 chiều (I/O), trong khi chân P0.31 là chân xuất. Hoạt động của các chân của port 0 phụ thuộc vào chức năng từng chân được chọn thông qua khối kết nốichân (Pin Connect Block).
P0.0/TXD0/ MAT3.1
13
I/O
P0.0 : Chân xuất nhập đa dụng (GPIO).
O
TXD0 : Ngõ xuất dữ liệu của UART0.
O
MAT3.1 : Ngõ ra PWM của Timer 3, kênh 1.
P0.1/RXD0/ MAT3.2
14
I/O
P0.1 : Chân xuất nhập đa dụng (GPIO).
I
RXD0 : Ngõ nhận dữ liệu của UART0.
O
MAT3.2 : Ngõ ra PWM của Timer 3, kênh 2.
P0.2/SCL0/ CAP0.0
18
I/O
P0.2 : chân xuất nhập đa dụng (GPIO).
I/O
SCL0 : I2C clock I/O, ngõ ra cực máng để hở.
I
CAP0.0 : Ngõ vào Capture của Timer 0, kênh 0.
P0.3/SDA0/ MAT0.0
21
I/O
P0.3 : Chân xuất nhập đa dụng (GPIO).
I/O
SDA0 : I2C dữ liệu I/O, ngõ ra cực máng để hở.
O
MAT0.0 : Ngõ ra PWM của Timer 0, kênh 0.
P0.4/SCK0/ CAP0.1
22
I/O
P0.4 : Chân xuất nhập đa dụng (GPIO).
I/O
SCK0 : Clock nối tiếp cho SPI0. ngõ ra SPI clock từ master hoặc ngõ vào slave.
I
CAP0.1 : Ngõ vào Capture của Timer 0, kênh 1.
P0.5/MISO0/ MAT0.1
23
I/O
P0.5 : Chân xuất nhập đa dụng (GPIO).
I/O
MISO0 : Ngõ vào master ngõ ra slave của SPI0. Dữ liệu ngõ vào SPI master hay dữ liệu ngõ ra từ SPI slave.
O
MAT0.1 : Ngõ ra PWM của Timer 0, kênh 1.
P0.6/MOSI0/ CAP0.2
24
I/O
P0.6 : Chân xuất nhập đa dụng (GPIO).
I/O
MOSI0 : Ngõ ra master ngõ vào slave của SPI0. Dữ liệu ngõ ra từ SPI master hay dữ liệu ngõ vào SPI slave.
I
CAP0.2 Ngõ vào Capture của Timer 0, kênh 2.
P0.7/SSEL0/ MAT2.0
28
I/O
P0.7 : Chân xuất nhập đa dụng (GPIO).
I
SSEL0 : Lựa chọn giao tiếp SPI0 như một Slave.
O
MAT2.0 : Ngõ ra PWM của Timer 2, kênh 0.
P0.8/TXD1/ MAT2.1
29
I/O
P0.8 : Chân xuất nhập đa dụng (GPIO).
O
TXD1 : Ngõ xuất dữ liệu của UART1.
O
MAT2.1 : Ngõ ra PWM của Timer 2, kênh 1.
P0.9/RXD1/ MAT2.2
30
I/O
P0.9 : Chân xuất nhập đa dụng (GPIO).
I
RXD1 : Ngõ nhận dữ liệu của UART1.
O
MAT2.2 : Ngõ ra PWM của Timer 2, kênh 2.
P0.10/RTS1/ CAP1.0/ AD0.3
35
I/O
P0.10 : Chân xuất nhập đa dụng (GPIO).
O
RTS1 : Yêu cầu gửi tín hiệu vào cho UART1.
I
CAP1.0 : Ngõ vào Capture của Timer 1, kênh 0.
I
AD0.3 : ADC 0, ngõ vào 3.
P0.11/CTS1/ CAP1.1/ AD0.4
36
I/O
P0.11 : Chân xuất nhập đa dụng (GPIO).
I
CTS1 : Xóa để gửi tín hiệu vào cho UART1.
I
CAP1.1 : Ngõ vào Capture của Timer 1, kênh 1.
I
AD0.4 : ADC 0, ngõ vào 4.
P0.12/DSR1/ MAT1.0/ AD0.5
37
I/O
P0.12 : Chân xuất nhập đa dụng (GPIO).
I
DSR1 : Bộ dữ liệu sẵn sàng thiết lập kết nối ngõ vào UART1.
O
MAT1.0 : Ngõ ra PWM của Timer 1, kênh 0.
I
AD0.5 : ADC 0, ngõ vào 5.
P0.13/DTR1/ MAT1.1
41
I/O
P0.13 : Chân xuất nhập đa dụng (GPIO).
O
DTR1 : Thiết bị đầu cuối dữ liệu sẵn sàng kết nối ngõ ra UART1.
O
MAT1.1: Ngõ ra PWM của Timer 1, kênh 1.
P0.14/DCD1/ SCK1/EINT1
44
I/O
P0.14 : Chân xuất nhập đa dụng (GPIO).
I
DCD1 : Phát hiện sóng mang dữ liệu ngõ vào UART1.
I/O
SCK1 : Clock nối tiếp cho SPI1. Ngõ ra SPI clock từ master hoặc ngõ vào slave.
I
EINT1 : Ngõ vào ngắt ngoài 1.
P0.15/RI1/ EINT2
45
I/O
P0.15 : Chân xuất nhập đa dụng (GPIO).
I
RI1: Ngõ vào chỉ thị của UART1.
I
EINT2: Ngõ vào ngắt ngoài 2.
P0.16/EINT0 /MAT0.2
46
I/O
P0.16 : Chân xuất nhập đa dụng (GPIO).
I
EINT0 : Ngõ vào ngắt ngoài 0.
O
MAT0.2 : Ngõ ra PWM của Timer 0, kênh 2.
P0.17/CAP1.2 /SCL1
47
I/O
P0.17 : Chân xuất nhập đa dụng (GPIO).
I
CAP1.2 : Ngõ vào Capture của Timer 1, kênh 2.
I/O
SCL1 : Ngõ I/O clock I2C1, ngõ ra cực máng để hở.
P0.18/CAP1.3 /SDA1
48
I/O
P0.18 : Chân xuất nhập đa dụng (GPIO).
I
CAP1.3 : Ngõ vào Capture của Timer 1, kênh 3.
I/O
SDA1 : Ngõ I/O dữ liệu I2C1, ngõ ra cực máng để hở.
P0.19/MAT1.2 /MISO1
1
I/O
P0.19 : Chân xuất nhập đa dụng (GPIO).
O
MAT1.2 : Ngõ ra PWM của Timer 1, kênh 2.
I/O
MISO1 : Ngõ vào master ngõ ra slave của SSP. Dữ liệu ngõ vào SSP master hay dữ liệu ngõ ra từ SSP slave.
P0.20/MAT1.3 /MOSI1
2
I/O
P0.19 : Chân xuất nhập đa dụng (GPIO).
O
MAT1.3 : Ngõ ra PWM của Timer 1, kênh 3.
I/O
MOSI1 : Ngõ ra master ngõ vào slave của SSP. Dữ liệu ngõ ra từ SSP master hay dữ liệu ngõ vào SSP slave.
P0.21/SSEL1/ MAT3.0
3
I/O
P0.21: Chân xuất nhập đa dụng (GPIO).
I
SSEL1 : Lựa chọn giao tiếp SPI1 như một Slave.
O
MAT3.0 : Ngõ ra PWM của Timer 3, kênh 0.
P0.22/AD0.0
32
I/O
P0.22 : Chân xuất nhập đa dụng (GPIO).
I
AD0.0 : ADC 0, ngõ vào 0.
P0.23/AD0.1
33
I/O
P0.23 : Chân xuất nhập đa dụng (GPIO).
I
AD0.1 : ADC 0, ngõ vào 1.
P0.24/AD0.2
34
I/O
P0.24 : Chân xuất nhập đa dụng (GPIO).
I
AD0.2 : ADC 0, ngõ vào 2.
P0.25/AD0.6
38
I/O
P0.25 : Chân xuất nhập đa dụng (GPIO).
I
AD0.6 : ADC 0, ngõ vào 6.
P0.26/AD0.7
39
I/O
P0.26 : Chân xuất nhập đa dụng (GPIO).
I
AD0.7 : ADC 0, ngõ vào 7.
P0.27/TRST/ CAP2.0
8
I/O
P0.27 : Chân xuất nhập đa dụng (GPIO).
I
TRST: Test Reset cho giao tiếp JTAG
I
CAP2.0 : Ngõ vào Capture của Timer 2, kênh 0.
P0.28/TMS/ CAP2.1
9
I/O
P0.28 : Chân xuất nhập đa dụng (GPIO).
I
TMS : Test Mode Select cho giao tiếp JTAG.
I
CAP2.1 : Ngõ vào Capture của Timer 2, kênh 1.
P0.29/TCK/ CAP2.2
10
I/O
P0.29 : Chân xuất nhập đa dụng (GPIO).
I
TCK : Test clock cho giao tiếp JTAG.
I
CAP2.2 : Ngõ vào Capture của Timer 2, kênh 2.
P0.30/TDI/ MAT3.3
15
I/O
P0.30 : Chân xuất nhập đa dụng (GPIO).
I
TDI : Test dữ liệu vào cho giao tiếp JTAG.
O
MAT3.3 : Ngõ ra PWM của Timer 3, kênh 3.
P0.31/TDO
16
O
P0.31 : Chân chỉ xuất đa dụng (GPIO).
I
TDO : Test dữ liệu ra cho giao tiếp JTAG.
RTXC1
20
I
Ngõ vào mạch dao động RTC.
RTXC2
25
O
Ngõ ra từ mạch dao động RTC.
RTCK
26
I/O
Ngõ ra trả về Test Clock.
X1
11
I
Ngõ vào mạch dao động và mạch phát xung nội.
X2
12
O
Ngõ ra bộ khuếch đại dao động.
DGBSEL
27
I
Chân lựa chọn chế độ sửa lỗi (Debug select): Ở mức thấp, vi điều khiển hoạt động bình thường. Ở mức cao, chế độ sửa lỗi được kích hoạt.
6
I
Ở mức thấp, chân cài đặt lại thiết bị, đưa các I/O ports và các ngoại vi về trạng thái mặc định, bộ xử lí bắt đầu thực hiên lại tại địa chỉ 0.
VSS
7, 19, 43
I
Ground (0 V).
VSSA
31
I
Analog ground (0 V) : được cách ly để giảm nhiễu
VDDA
42
I
Analog 3V3 power supply : được cách ly để giảm nhiễu. Điện áp này dùng để cung cấp cho bộ PLL trên chip đồng thời là mức điện áp mẫu cho bộ ADC.
VDD(1V8)
5
I
1.8V core power supply : Đây là nguồn áp cấp cho các mạch bên trong chip.
VDD(3V3)
17, 40
I
3.3V pad power supply : Đây là nguồn áp cấp cho các I/O ports.
VBAT
4
I
RTC power supply : điện áp 3V3 ở chân này cung cấp năng lượng cho bộ RTC.
*Pin connect block :
Các chân của vi điều khiểu có nhiều chức năng , dùng cho các bộ riêng biệt trong LPC2103 . Để sử dụng vào những mục đích đó thì thanh ghi chức năng ( REGISTER DESCRIPTION ) sẻ quyết định những chân vào những bộ cụ thể . Gồm có hai thanh ghi : PINSEL0 và PINSEL1 :
- Đây là hai thanh ghi chọn chức năng cho chân của vi điều khiển. Riêng
con LPC2103 chỉ có một Port 0 duy nhất gồm 32 chân đánh dấu từ P0.0
đến P0.31. Mỗi chân thường có từ 3 đến 4 công dụng. Chức năng mặc
định là chân xuất nhập chung (tức dùng điều khiển Led hoặc LCD hoặc
nhận phím bấm… tức làm bất cứ gì mà không dùng đến module thiết kế
sẵn bên trong VĐK).
- PINSEL0 điều khiển cho 16 chân đầu, còn PINSEL1 điều khiển 16 chân
còn lại . Bít thứ 0 và 1 của PINSEL0 sẽ điều khiển cho P0.0, bít thứ 2 và 3 điều
khiển cho P0.1. Tương tự cho các chân còn lại, tức 2 bít điều khiển cho 1
chân. Chẳng hạn P0.0 có 3 chức năng, chức năng thứ 0 là GPIO, thứ 1 là
TXD0 (chân Transmitter của UART0) và thứ 2 là MAT3.1(PWM thứ 1
của timer 3) vậy nếu bít 1và 0 của PINSEL0 có giá trị là 00 thì P0.0 là
GPIO, nếu là 01 thì là TXD0 và 10 là MAT3.1. Giá tri 11 không được sử
dụng. Các chức năng cũng như thứ tự chức năng của mỗi chân có thể xem dưới đây :
PINSEL0 : pin function select register 0 ( 0xE002 C000)
Pin name Value Function Value after reset
1:0 P0.0 0 0 GPIO Port 0.0 0
0 1 TXD0 (UART0)
1 0 MAT3.1(Timer 3)
1 1 Reserved
3:2 P0.1 0 0 GPIO Port 0.1 0
0 1 RXD0 (UART0)
1 0 MAT3.2 (Timer 3)
1 1 Reserved
5:4 P0.2 0 0 GPIO Port 0.2 0
SCL0 (I2C0)
0 1
1 0 CAP0.0 (Timer 0)
1 1 Reserved
7:6 P0.3 0 0 GPIO Port 0.3 0
SDA0 (I2C0)
0 1
1 0 MAT0.0 (Timer 0)
1 1 Reserved
9:8 P0.4 0 0 GPIO Port 0.4 0
0 1 SCK0 (SPI0)
1 0 CAP0.1 (Timer 0)
1 1 Reserved
11:10 P0.5 0 0 GPIO Port 0.5 0
0 1 MISO0 (SPI0)
1 0 MAT0.1 (Timer 0)
1 1 Reserved
13:12 P0.6 0 0 GPIO Port 0.6 0
0 1 MOSI0 (SPI0)
1 0 CAP0.2 (Timer 0)
1 1 Reserved
15:14 P0.7 0 0 GPIO Port 0.7 0
0 1 SSEL0 (SPI0)
1 0 MAT2.0 (Timer 2)
1 1 Reserved
17:16 P0.8 0 0 GPIO Port 0.8 0
0 1 TXD1 (UART1)
1 0 MAT2.1 (Timer 2)
1 1 Reserved
19:18 P0.9 0 0 GPIO Port 0.9 0
0 1 RXD1 (UART1)
1 0 MAT2.2 (Timer 2)
1 1 Reserved
21:20 P0.10 0 0 GPIO Port 0.10 0
0 1 RTS1(UART1)
1 0 CAP1.0 (Timer 1)
1 1 AD0.3
23:22 P0.11 0 0 GPIO Port 0.11 0
0 1 CTS1 (UART1)
1 0 CAP1.1 (Timer 1)
1 1 AD0.4
25:24 P0.12 0 0 GPIO Port 0.12 0
0 1 DSR1 (UART1)
1 0 MAT1.0 (Timer 1)
1 1 AD0.5
27:26 P0.13 0 0 GPIO Port 0.13 0
0 1 Reserved
1 0 MAT1.1 (Timer 1)
1 1 DTR1 (UART1)
29:28 P0.14 0 0 GPIO Port 0.14 0
0 1 EINT1
1 0 SCK1 (SSP1)
1 1 DCD1 (UART1)
31:30 P0.15 0 0 GPIO Port 0.15 0
0 1 EINT2
1 0 Reserved
1 1 RI1 (UART1)
PINSEL0 : pin function select register 0 ( 0xE002 C000)
PINSEL1 Pin Name Value Function Value after reset
3:2 P0.17 0 0 GPIO Port 0.17 0
SCL1 (I2C1)
0 1
1 0 CAP1.2 (Timer 1)
1 1 Reserved
5:4 P0.18 0 0 GPIO Port 0.18 0
(I2C1)
0 1 SDA1
1 0 CAP1.3 (Timer 1)
1 1 Reserved
7:6 P0.19 0 0 GPIO Port 0.19 0
0 1 MISO1 (SPI1)
1 0 MAT1.2 (Timer 1)
1 1 Reserved
9:8 P0.20 0 0 GPIO Port 0.20 0
0 1 MOSI1 (SPI1)
1 0 MAT1.3 (Timer 1)
1 1 Reserved
11:10 P0.21 0 0 GPIO Port 0.21 0
0 1 SSEL1 (SPI1)
1 0 MAT3.0 (Timer 3)
1 1 Reserved
13:12 P0.22 0 0 GPIO Port 0.22 0
0 1 Reserved
1 0 Reserved
1 1 AD0.0
15:14 P0.23 0 0 GPIO Port 0.23 0
0 1 Reserved
1 0 Reserved
1 1 AD0.1
17:16 P0.24 0 0 GPIO Port 0.24 0
0 1 Reserved
1 0 Reserved
1 1 AD0.2
19:18 P0.25 0 0 GPIO Port 0.25 0
0 1 Reserved
1 0 Reserved
1 1 AD0.6
21:20 P0.26 0 0 GPIO Port 0.26 0
0 1 Reserved
1 0 Reserved
1 1 AD0.7
23:22 P0.27 0 0 GPIO Port 0.27 0
0 1 TRST (JTAG)
1 0 CAP2.0 (Timer 2)
1 1 Reserved
25:24 P0.28 0 0 GPIO Port 0.28 0
0 1 TMS (JTAG)
1 0 CAP2.1 (Timer 2)
1 1 Reserved
27:26 P0.29 0 0 GPIO Port 0.29 0
0 1 TCK (JTAG)
1 0 CAP2.2 (Timer 2)
1 1 Reserved
29:28 P0.30 0 0 GPIO Port 0.30 0
0 1 TDI (JTAG)
1 0 MAT3.3 (Timer 3)
1 1 Reserved
31:30 P0.31 0 0 GPIO Port 0.31 0
0 1 TDO (JTAG)
1 0 Reserved
1 1 Reserved
Các module của LPC 2103
Clock (APD divider and PLL)
- ARM có một bộ PLL là một bộ nhân tần số. Tức là khi thạch anh đầu vào của bạn chỉ là12MHz và bạn muốn hoặt động ở tần số 60MHz (hỗ trợ cao nhất đến 70Mhz) thì bạn cần nhân 5 tần số ngõ vào. Điều này được thực hiện thông qua thanh ghi PLLCON, PLLCFGvà PLLFEED. Và thường được khai báo sẵn trong file startup.s mặc định của Keil C.
- Clock sinh ra thông qua PLL gọi là Cclk. Cclk quyết định tốc độ thực thi lệnh cũng như tốc độAHB bus (các bus có tốc độ cao trong VĐK như bus bộ nhớ).
- Bên cạnh đó thì ARM còn có một bộ chia tần số gọi là bộ VPB divider. Clock sinh rathông qua bộ chia VPB sẽ quyết định tốc độ của VPB bus và có tên là Pclk. Bus nàythường được dùng để giao tiếp với các thiết bị ngoại vi (nhằm tránh gây hiện tượng nghẽn cổ chai do tốc độ của các thiết bị ngoại vi chậm hơn tốc độ của VĐK). Bên cạnhđó còn dùng để điều khiển Timer (nếu dùng nguồn clock nội thì cứ mỗi xung của Pclk sẽtăng timer count lên 1, còn nếu dùng xung ngoài thì cứ mỗi cạnh lên của Pclk thì VĐK sẽ kiểm tra tín hiệu ở ngõ Capture). Bộ VPB được quyết định bởi thanh ghi VPBDIV. Vídụ, nếu bạn cho VPBDIV = 0x00000002 thì tức là Pclk sẽ có tần số bằng ½ tần số của Cclk . Trong đề tài này thì Pclk = 30Mhz .
GPIO
- Đặc tính :
+ Mỗi chân port GPIO đều có hai tính năng truy xuất thông thường và truy xuất nhanh thông qua cách cấu hình thanh ghi .
+ Tất cả các port sau khi reset được mặc định là GPIO .
- Ứng dụng :
+ mục địch I/O thông thường (general purpose I/O)
+ điều khiển Led và các thiết bị bên ngoài .
+ Controlling off-chip devices .
+ nhận biết ngõ vào số (sensing digital inputs ) .
- Pin description :
- Khi dùng đến chức năng nào trong vi điều khiển , điều quan trọng là phải nắm rõ được nhiệm vụ , chức năng của từng thanh ghi liên quan đến bộ đó . ở đây ta đề cập đến các thanh ghi : IOPIN , IOSET, IODIR, IOCLR …
+ IOPIN : Đây là thanh ghi dùng để đọc trạng thái của các chân, không cần biết chân đó đang là Input hay Output. Mỗi bit trong thanh ghi IOPIN sẽ tương ứng trạng thái của một chân trong P0 . Bạn có thể ghi thẳng vào thanh ghi này các giá trị cần xuất ra cho các chân, lưu ý là tất cả các chân sẽ bị thay đổi theo giá trị mà bạn gán. Khác với thanh ghi IOSET hay IOCLR là chỉ các vị trí bạn gán 1 thì port đó mới thay đổi giá trị .
+ IOSET và IOCLR : 2 thanh ghi dùng để thay đổi trạng thái của các chân. Nếu bạn ghi bit 1vào thanh ghi IOSET thì tại vị trí tương ứng chân đó sẽ có logic mức cao. Còn nếu bạn ghi bit 1 vào thanh ghi IOCLR thì tại vị trí tương ứng chân đó sẽ có logic mức thấp (chú ý ghi 1 vào IOCLR, ghi 0 vào sẽ không có tác dụng) .
+ IODIR : Thanh ghi dùng để quyết định một chân là Input hay Output. Cái này chỉ có tác dụng khi chân đó là GPIO(nếu đó không phải là GPIO thì việc là output hay input sẽ do các module có sẵn trong VĐK phụ trách). Bật bit nào lên thì Port tương ứng với bít đó sẽ là output, mặc định sẽ là input .
Khi reset chế độ mặc định của thì thanh ghi SCS = 0x00000000 ở chế độ GPIO nếu SCS = 0x00000001 bạn vào chế độ FastGPIO). Thanh ghi tương đương như các thanh ghi GPIO nhưng tốc độ cải thiện 3.5 lần ( có thể sinh ra những tín hiệu có tần số cao hơn) .
-Tương tự với các thanh ghi FIODIR, FIOMASK, FIOPIN, FIOSET, FIOCLR.Sự khác biệt lớn nhất giữ Fast GPIO và Slow GPIO là tốc độ đáp ứng chênh nhau khoảng 3.5 lần, tức là tần số bạn có khả năng sinh ra ở các chân có thể cao lên gấp 3.5 lần. Và điều khác biệt thứ hai là khi ghi hoặc đọc dữ liệu vào các thanh ghi FIOPIN, FIOSET hay FIOCLR thì chỉ các bit nào trong thanh ghi FIOMASK là 0 thì mới được đọc hoặc ghi. Ví dụ muốn cho các chân từ P0.0 đến P0.15 lên 1 và giữ nguyên giá trị cho các chân còn lại, có thể gán cho IOMASK=0xFFFF0000 và gán cho FIOPIN = 0xFFFFFFFF. Lúc đó các chân từ P0.16 trở đi sẽ bị che .
Timer
-Giới thiệu :
+ Timer nếu dùng làm bộ định thời thì nguồn clock sẽ là Pclk tức clock đã
được chia nhờ bộ chia VPB .
+ Mỗi Timer có các thanh ghi điều khiển con như sau: IR, TCR, TC, PR, PC, MCR, MR0, MR1, MR2, MR3, CCR, CR1, CR2, CR3, EMR, CTCR, PWMCON. Ví dụ tương ứng với Timer0 thì ta có thanh ghi
T0IR, T0TC
-Các thanh ghi :
+ IR (Interupt register): thanh ghi gồm 8 bít, 4 bít đầu dùng cho Matchinterupts (Tức ngắt xảy ra khi Timer đạt đến một giá trị định trước) và 4 bít sau dùng cho Capture interupts (Tức ngắt xảy ra khi có xung kích ở chân CAP được định trước), mỗi khi có ngắt xảy ra thì bit tương ứng trong thanh ghi IR sẽ được bật (bít 0 cho Match0…, bít 4 cho Capture0). Thanh ghi này thường được dùng để kiểm tra nguồn gây ra ngắt sau khi đã vào chương trình phục vụ ngắt. Nếu ghi 1 vào bất cứ bít nào trong thanh ghi IR có nghĩa là xóa tín hiệu ngắt của nguồn ngắt tương ứng .
+ TCR (Timer Control register): chỉ dùng 2 bít đầu, bít thứ 0 để bắt đầu chạy timer nếu bật lên 1 và dừng nếu xuống 0. Bít thứ 1 nếu được bật lên 1 sẽ reset timer ở lần kích cạnh lên tiếp theo của Pclk .
+ CTCR (Count Control register): dùng chọn các chế độ Timer/Counter .
+ TC (Timer counter): (32 bits) Mỗi lần thanh ghi PC đạt đến giá trị của thanh ghi PR thì nó sẽ reset về 0 và thanh ghi TC sẽ cộng 1. Nếu đạt đến 0xFFFFFFFF thì thanh ghi TC sẽ quay về 0, không sinh ra ngắt nhưng
việc sinh ngắt có thể được điều khiển bằng thanh ghi Match .
+ PR (Prescale register) :(32 bits) giá trị cận trên cho thanh ghi PC .
+ PC (Prescale Counter): tăng 1 mỗi khi có cạnh lên của Pclk. PR và PC thường dùng để chia tần số của Pclk khi tác động lên thanh ghi TC . Ví dụ khi cho PR = 0 thì cứ mỗi mỗi clock của Pclk sẽ tăng TC lên 1, nếu PR=1 thì cứ 2 clock của PCLK sẽ tăng 1 giá trị của TC… Như vậy sẻ dễ thấy nguồn clock thật sự dùng cho timer sẽ đi qua 2 bộ chia, từ Cclk tức là clock thật của vi điều khiển, sẽ qua bộ VPB để thành Pclk, từ Pclk dùng thanh ghi PR để chia tiếp bộ Pclk .
+ MR (Match register): Gồm 4 thanh ghi MR0 – MR3. Mỗi thanh ghi lưu một giá trị mà khi thanh ghi TC đạt đến giá trị đó thì sẽ sinh ra một ngắt, hoặc reset timer hoặc dừng timer tùy thuộc vào giá trị của thanh ghi
MCR .
+ MCR (Match Control register): lần lượt 3 bít đầu điều khiển cho thanh ghi MR0, … 3 bít cuối cho MR3. Nếu bít 1 được bật thì sẽ sinh ra ngắt, bít 2 bật thì sẽ reset timer, bít 3 bật thì dừng (Pause) timer .
+ EMR (External Match register): 4 bít đầu tương ứng giá trị của 4 ngõ ra MAT0.0… MAT0.3 (giả sử đang dùng timer0). Khi TC đạt đến giá trị của một thanh ghi MR nào đó thì nó có thể làm chân MAT tương ứng của thanh ghi đó lên 1 hoặc xuống 0 hoặc đổi giá trị. Việc này được điều khiển bởi các bít còn lại trong thanh ghi EMR. Mỗi 2 bít còn lại sẽ điều khiển cho một MR. Ví dụ EMR[5:4] sẽ điều khiển cho MR0. Lần lượt nhận các giá trị: 00: không là gì cả, 01: xuống mức thấp, 10: bật lên mức cao, 11: đảo giá trị ở chân MAT tương ứng .
ADC
- Bộ ADC trong LPC2103 gồm 10 bít chuyển đổi từ analog sang digital ,chế độ power mode ,tầm đo từ 0V->VDD(3V3) , chuyển đổi 10 bit mất >= 2.44us.
- Ngõ vào AD0.7:0 : có thể chuyển đổi tại bất cứ chân nào trong số 8 ngõ vào analog này , lưa ý khi sử dụng thì mức tính hiệu (mức volt) đưa vào ko quá mức V3A .VDD (3V3) đây là điện áp tham khảo . còn VDDA , VSSA là hai chân analog power và ground .
- Các thanh ghi dùng trong bộ ADC :
+ ADCR : thanh ghi điều khiển , nó phải được ghi cấu hình hoạt động bộ ADC , chọn ngõ vào analog , chế độ hoạt động …
+ ADGDR : thanh ghi A/D global Data Register , chứa bít Done va kết quả của lần chuyển đổi gần nhất .
+ ADSTAT : thanh ghi trạng thái (A/D status register) . chứa cờ Done và Overrun của tất cả các kênh A/D , củng như là cờ ngắt (interrupt flag).
+ADINTEN : thanh ghi cho phép ngắt (A/D interrupt enable register), chưa bít cho phép ngắt của mỗi kênh A/D
+ ADDR0 -> ADDR7 : đây là 8 thanh ghi chứa kết quả của 8 kênh đầu vào AD0.0 tới AD0.7
*Giới thiệu về thanh ghi A/D Control Register (AD0CR - 0xE003 4000) :
+ từ bít 7:0 (SEL) : đây là bít chọn kênh hoạt động của bộ ADC . kênh nào được chọn thì lên mức một . ở đây , ta sử dụng kênh ADC.0 (tức chân p0.22) trong đồ án này
+ bít 15:8 (CLKDIV) : đây là giá trị để chọn xung nhịp hoạt động cho bộ ADC . bộ APB clock (PCLK) sẻ chia cho giá trị này cộng một . ở đây ta chọn giá trị là 6 . tức là xung nhịp hoạt động tầm 4Mhz . lưa ý không được quá 4.5Mhz
+ bit 16 (BURST ) : đây là bít chon chế đọ burst hay chế độ hoạt động với software control và đòi hỏi 11 xung clock (mặc định là dùng cái này ) , giá trị reset bằng 0 .
+ bit 19:17 (CLKS) : là 3 bít chọn tần số xung clock và số bít dữ liệu ra . ở đây ta chọn 000 : 11clock/ 10bits
+ bit 20 : chưa dùng
+ bit 21 (PDN) : chọn bằng 1 (tức là chọn chế độ hoạt động) . Ngược lại nếu bằng 0 thì đang ở chế độ power – mode .
+ bit 23:22 : chưa dùng
+ bit 26:24 (START) : 001 . bắt đầu chuyển đổi
II . Text LCD
Sơ đồ chân
-Các Text LCD theo chuẩn HD44780U thường có 16 chân trong đó 14 chân kết nối với bộ điều khiển và 2 chân nguồn cho “đèn LED nền”. Thứ tự các chân thường được sắp xếp như sau: Bảng 1. Sơ đồ chân :
Chân số
Tên
Chức năng
1
VSS
Chân nối đất
2
VDD
Chân cấp nguồn
3
VEE
Chân này dùng để điều chỉnh độ tương phản của LCD.
4
RS
Chân chọn thanh ghi
5
R/W
Chân Read/Write
6
E
Chân cho phép (Enable).
7 - 14
D0 – D7
Tám đường của bus dữ liệu dùng để trao đổi thông tin với MPU.
Trong một số LCD 2 chân LED nền được đánh số 15 và 16 nhưng trong một số trường hợp 2 chân này được ghi là A (Anode) và K (Cathode). Hình 2 mô tả cách kết nối LCD với nguồn và mạch điều khiển .
-Chân 3 là chân điều khiển VEE dùng để thay đổi độ tương phản của màn hiển thị. Để thay đổi độ tương phản một cách linh hoạt ta gắn mạch chia áp dùng biến trở có đầu ra thay đổi đưa vào chân này.
-Chân 4 là đường RS (Register Select – chọn thanh ghi) đây là một trong 3 ngõ vào điều khiển lệnh. Khi chân này để ở mức thấp thì các dữ liệu được truyền đến LCD được xử lý như các mệnh lệnh và các dữ liệu đọc ra chỉ trạng thái của nó. Bằng cách đưa đường RS này lên mức cao thì dữ liệu ký tự có thể xuất/nhập trên module này.
-Chân 5 là đường R/W (read/write). Chân này được kéo xuống thấp để ghi các lệnh hay dữ liệu ký tự vào module hoặc được kéo lên mức cao để đọc dữ liệu ký tự hay thông tin trạng thái từ các thanh ghi .
-Chân 6 là đường E (enable), ngõ vào này dùng để khởi động việc chuyển các lệnh hay dữ liệu ký tự giữa module và các đường dữ liệu. Sau khi các tín hiệu được đặt lên bus D0-D7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân E.
+ Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào (chấp nhận) thanh ghi bên trong nó khi phát hiện một xung (high-to-low transition) của tín hiệu chân E.
+ Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện cạnh lên (low-to-high transition) ở chân E và được LCD giữ ở bus đến khi nào chân E xuống mức thấp.
-Chân 7 đến chân 14 là 8 đường bus dữ liệu (D0 đến D7). Dữ liệu có thể được chuyển đến và lấy ra khỏi bộ hiển thị LCD theo dạng 8 bit hay dạng 4 bit. Trong phần thiết kế này ta sử dụng chế độ truyền 4bit cho LCD vì nó có ít đường xuất nhập hơn
2. Các thanh ghi và cách điều khiển :
-Thanh ghi IR : Để điều khiển LCD, người dùng phải “ra lệnh” thông qua tám đường bus D0 - D7. Mỗi lệnh được nhà sản xuất LCD đánh địa chỉ rõ ràng. Người dùng chỉ việc cung cấp địa chỉ lệnh bằng cách nạp vào thanh ghi IR. Nghĩa là, khi ta nạp vào thanh ghi IR một chuỗi 8 bit, chíp HD44780 sẽ tra bảng mã lệnh tại địa chỉ mà IR cung cấp và thực hiện lệnh đó.
-Thanh ghi DR : Thanh ghi DR dùng để chứa dữ liệu 8 bit để ghi vào vùng RAM DDRAM hoặc CGRAM (ở chế độ ghi) hoặc dùng để chứa dữ liệu từ 2 vùng RAM này gởi ra cho MPU (ở chế độ đọc). Nghĩa là, khi MPU ghi thông tin vào DR, mạch nội bên trong chíp sẽ tự động ghi thông tin này vào DDRAM hoặc CGRAM. Hoặc khi thông tin về địa chỉ được ghi vào IR, dữ liệu ở địa chỉ này trong vùng RAM nội của HD44780 sẽ được chuyển ra DR để truyền cho MPU.
Giao tiếp 8 bit và 4 bit.
Như trình bày trong lệnh function set, có 2 mode để ghi và đọc dữ liệu vào LCD đó là mode 8 bit và mode 4 bit : - Mode 8 bit: Nếu bit DL trong lệnh function set bằng 1 thì mode 8 bit được dùng. Để sử dụng mode 8 bit, tất cả các lines dữ liệu của LCD từ D0 đến D7 (từ chân 7 đến chân 14) phải được nối với 1 PORT của chip điều khiển bên ngoài (ví dụ PORTC của ATmega32 trong ví dụ của bài này) như trong hình 3. Ưu điểm của phương pháp giao tiếp này là dữ liệu được ghi và đọc rất nhanh và đơn giản vì chip điều khiển chỉ cần xuất hoặc nhận dữ liệu trên 1 PORT. Tuy nhiên, phương pháp này có nhược điểm là tổng số chân dành cho giao tiếp LCD quá nhiều, nếu tính luôn cả 3 chân điều khiển thì cần đến 11 đường cho giao tiếp LCD. - Mode 4 bit: LCD cho phép giao tiếp với bộ điều khiển ngoài theo chế độ 4 bit. Trong chế độ này, các chân D0, D1, D2 và D3 của LCD không được sử dụng (để trống), chỉ có 4 chân từ D4 đến D7 được kết nối với chip bộ điều khiển ngoài. Các instruction và data 8 bit sẽ được ghi và đọc bằng cách chia thành 2 phần, gọi là các Nibbles, mỗi nibble gồm 4 bit và được giao tiếp thông qua 4 chân D7:4, nibble cao được xử lí trước và nibble thấp sau. Ưu điểm lớn nhất của phương pháp này tối thiểu số lines dùng cho giao tiếp LCD. Tuy nhiên, việc đọc và ghi từng nibble tương đối khó khăn hơn đọc và ghi dữ liệu 8 bit. Trong bài học này, tôi sẽ trình bày 2 chương trình con được viết riêng để ghi và đọc các nibbles gọi là Read2Nib và Write2Nib .
B.Thực Hiện Đồ Án
I. Phần cứng LPC 2103
1. board header và mạch LCD
- Mô hình đặt ra là : dùng cảm biến đọc nhiệt độ thực từ bên ngoài và hiển thị lên LCD nhưng mô hình hóa thực tế ở đây thay bằng một biến trở chỉnh (thay đổi mức volt) và sẻ đáp ứng được yêu cầu đặt ra .
-Trên board header gồm có chíp 2103, thạch anh 12Mhz có gắn sẵn cổng nạp DB9 , max 232 , các chân cắm ngõ ra và cổng JTAG . Nguồn cấp vào có thể thay đổi từ 5->7V .
- Phần cứng đi kèm là LCD hiển thị , trên đó có gắn kèm một biến trở chỉnh thay đổi mức volt , làm nguồn analog vào cho bộ ADC .
- LCD loại 16x2 , chế độ dùng 8 bít
- Cách kết nối phần cứng :
- chân P0.22 của vi điều khiển là chân ngõ vào Analog , được lấy từ biến trở , có nhiệm vụ thay đổi mức volt đầu vào , làm tín hiệu đầu vào cho việc chuyển đổi .
+ nguồn cấp hai đầu biến trở là : 0 – 3V3 . lấy từ board header 2103 . lưa ý : ở đây ta dùng chân VRFE = 3.3V , nên mức volt dao động đầu vào chỉ nằm trong tầm 0 – 3.3V .
+ chân P0.27 , P0.28 , P0.29 lần lượt được dùng làm 3 chân điều khiển cho LCD được nối tương ứng với các chân E , RW ,RS của LCD .
+ chân P0.00 -> P0.07 : là 8 bit data
+ nguồn cấp cho LCD : 0 – 5V , được lấy từ board header LPC 2103 .
*** sơ đồ kết nối chân :
Phần mền và giải thuật chương trình
Phần mền flag magic và keil C :
Phần mền flag magic : dùng để nạp chương trình thông qua cổng COM .
Phần mền keil C : đây là phần mền tạo project , và củng là trình biên dịch
*** Cách tạo một profect trong keil C :
- Mở keil c theo đường dẫn C:\program files\keil\keil.exe hoặt mở icon keil C ngoài màn hình
- Cửa sổ màn hình hiện ra : chọn project trên mục menu -> new uVision project :
Chọn đường dẫn lưa file : C:\Users\USER\Desktop\Baocaodoan 1 .Lưa lại tên là doan1. trong lúc này , thì trong thư mục chính đã có một project mang tên doan1. .uvproj . đây chính là project mà chúng ta đang làm việc .
Chọn LPC2103 của NXP : select special chip
Và tiếp tục :
Trong project chúng ta tạo ra , đã có sẵn statup.s : trong đây cho ta khai báo các thông số cần dùng như là PLL , VPBDIV … .. (configuration Wizard )
Tiếp đến click on file new và click on new :
Viết code lên và lưa lại với tên là doan1.c trong cùng thư mục mà ta đã tạo từ ban đầu :
Kế đến chúng ta sẻ add doan1.c vào project của chúng ta . Bằng cách Add files to Group :
Add doan1.c vào được ta sẻ thấy màn hình như sau :
Khai báo thông số và tạo file hex : targets options
- Phần output , đánh vào create Hex File . Phần Linker đánh vào use memory layout from Target Dialog .
- Kế đến nhấn ok
- Công việc cuối cùng nhấn Rebuild (hoặc F8 ) để biên dịch chương trình . lúc này trong thư mục mà chúng ta tạo đã có file Doan1.hex . đây chính là file mà chúng ta dùng để nạp chương trình .
Giải thuật và chương trình :
Sơ đồ giải thuật chương trình :
Chương trình hoạt động :
+ đầu tiên , chương trình sẻ hiện thị lên màn hình LCD một dòng chữ : HELLO , và LPC…2103
+ Sau đó chương trình sẻ đi vào hoạt động với bộ ADC , hiển thị lên góc trái màn hình là giá trị chuyển đổi số nguyên : 0 -> 1023 . còn hàng thứ hai sẻ là chuyển đổi sang giá trị thực với cấu trúc hiển thị :
KQ = …. VOLT
Và giá trị ở đây là giá trị thực đúng với giá trị mà ta đo được bằng VOM
- Khi thay đổi giá trị của biến trở đầu vào , tức là thay đổi mức volt vào ngõ vào analog , giá trị chuyển đổi được hiển thị ra màn hình LCD .
- Chương trình ở đây là ngôn ngữ C và trình biên dịch là phần mền Keil C .
- Chương trình :
#include
#define E 0x08000000; // E = p0.27
#define RW 0x10000000; // RW = p0.28
#define RS 0x20000000; // RS = p0.29
#define VPBDIV (*((volatile unsigned int *) 0xE01FC100))
unsigned int nghin=0;
unsigned int tram=0;
unsigned int chuc=0;
unsigned int donvi=0;
unsigned int val=0,result=0;
unsigned int anghin=0;
unsigned int atram=0;
unsigned int achuc=0;
unsigned int adonvi=0;
void goto_cursor(unsigned char i); // HÀM ĐẶT VỊ TRÍ CURSOR
void wrtcmd(unsigned int b); // HÀM GHI LỆNH (CMD)
void wrtdata(char a); // HÀM GHI DATA
void delay(unsigned int time); // HÀM DELAY
void phanchia(unsigned int val); // HÀM CHUYỂN ĐỔI
void phanchiahai(unsigned int result);
void initLCD(void);
int main(void)
{
int i=0,j=0,k=0,l=0;
int a,b,c,d;
char chuoihai[]={0x4C,0x50,0x43,0x2E,0x2E,0x2E,0x32,0x31,0x30,0x33};
char chuoi[]={0x48,0x65,0x7C,0x7C,0x6F};
char chuoiba[]={0x4B,0x51,0x20,0x3D,0x20};
char chuoibon[]={0x56,0x6F,0x7C,0x74} ;
char stri[4];
PINSEL0 |= 0x00000000;
PINSEL1 |= 0x00000000;
IODIR |= 0x380000FF; // P0.27;28;29 || P0.0->P0.7
initLCD();
delay(0x10000);
goto_cursor(0x06);
for(i=0;i<=4;i++)
{
wrtdata(chuoi[i]); // HELLO }
delay(0x1000000);
goto_cursor(0x43);
for(j=0;j<=9;j++)
{
wrtdata(chuoihai[j]); // LPC...2103
}
delay(0x2000000);
wrtcmd(0x01);
delay(0x50000);
goto_cursor(0x00);
stri[0] = nghin + 0x30 ;
stri[1] = tram + 0x30 ;
stri[2] = chuc + 0x30 ;
stri[3] = donvi + 0x30 ;
for(i=0;i<=3;i++)
{
wrtdata(stri[i]); // GIA TRI SO (0000)
}
delay(0x1000000);
PINSEL1 |= 0x3000; // CHAN P0.22 (AD0.0)
APBDIV = 0x02; //Pclk = 30Mhz
ADCR = 0x210601; // THANH GHI ADCR
ADCR |= 0x1000000; // START ( 001)
while(1)
{
do
{
val = ADDR0; // DOC GIA TRI VE
}
while ((val & 0x80000000) == 0); //WAIT COMPLETE
val = ((val >> 6) & 0x03FF); //EXTRACT RESULT
delay(0x10000);
result = val*((1000*3.3)/1023);
phanchia(val);
while ((val & 0x80000000) == 0); //WAIT COMPLETE
val = ((val >> 6) & 0x03FF); //EXTRACT RESULT
delay(0x10000);
result = val*((1000*3.3)/1023);
phanchia(val);
goto_cursor(0x00);
stri[0] = nghin + 0x30 ;
stri[1] = tram + 0x30 ;
stri[2] = chuc + 0x30 ;
stri[3] = donvi + 0x30 ;
for(i=0;i<=3;i++)
{
wrtdata(stri[i]); // KET QUA SO (0->1023)
}
goto_cursor(0x40);
for(k=0;k<=4;k++)
{
wrtdata(chuoiba[k]); // CHU KQ=
}
phanchiahai(result);
delay(0x10);
a = anghin + 48 ;
goto_cursor(0x45);
wrtdata(a);
goto_cursor(0x46);
wrtdata(0x2E); // DAU CHAM DONG (.)
delay(0x10);
b = atram + 48 ;
goto_cursor(0x47);
wrtdata(b);
delay(0x10);
c = achuc + 48 ;
goto_cursor(0x48);
wrtdata(c);
delay(0x5000);
d = adonvi + 48 ;
goto_cursor(0x49);
wrtdata(d);
delay(0x100);
goto_cursor(0x4B);
for(l=0;l<=3;l++)
{
wrtdata(chuoibon[l]); // GHI CHU VOLT
}
}
}
goto_cursor(0x46);
wrtdata(0x2E); // DAU CHAM DONG (.)
delay(0x10);
b = atram + 48 ;
goto_cursor(0x47);
wrtdata(b);
delay(0x10);
c = achuc + 48 ;
goto_cursor(0x48);
wrtdata(c);
delay(0x5000);
d = adonvi + 48 ;
goto_cursor(0x49);
wrtdata(d);
delay(0x100);
goto_cursor(0x4B);
for(l=0;l<=3;l++)
{
wrtdata(chuoibon[l]); // GHI CHU VOLT
}
}
}
void delay(unsigned int time )
{
unsigned long a=0;
for(a=0;a<=time;a++);
}
void initLCD(void)
{
wrtcmd(0x38);
wrtcmd(0x0E);
wrtcmd(0x01);
}
void wrtcmd(unsigned int b)
{
IOCLR |= 0x000000FF; // XOA GIA TRI O NGO RA
IOSET |= (b<<0);
IOCLR |= RS;
IOCLR |= RW;
IOSET |= E;
delay(0x010000); // DAT DO TRE CHO XUNG
IOCLR |=E;
}
unsigned long a=0;
for(a=0;a<=time;a++);
}
void initLCD(void)
{
wrtcmd(0x38);
wrtcmd(0x0E);
wrtcmd(0x01);
}
void wrtcmd(unsigned int b)
{
IOCLR |= 0x000000FF; // XOA GIA TRI O NGO RA
IOSET |= (b<<0);
IOCLR |= RS;
IOCLR |= RW;
IOSET |= E;
delay(0x010000); // DAT DO TRE CHO XUNG
IOCLR |=E;
}
void wrtdata(char a)
{
IOCLR |= 0x000000FF; // XOA GIA TRI NGO RA
IOSET |= (a<<0) ;
IOCLR |= RW;
IOSET |= RS; // CHO LCD BIET LA DANG GUI DATA
IOSET |= E;
delay(0x10000);
IOCLR |= E;
}
void goto_cursor(unsigned char i)
{
i |= 0x80;
wrtcmd(i);
}
void phanchia(unsigned int val)
{
unsigned int dumot=0,duhai=0,duba=0;
nghin = val/1000;
dumot = val%1000;
tram = dumot/100;
duhai = dumot%100;
chuc = duhai/10;
duba = duhai%10;
donvi = duba;
}
IOSET |= RS; // CHO LCD BIET LA DANG GUI DATA
IOSET |= E;
delay(0x10000);
IOCLR |= E;
}
void goto_cursor(unsigned char i)
{
i |= 0x80;
wrtcmd(i);
}
void phanchia(unsigned int val)
{
unsigned int dumot=0,duhai=0,duba=0;
nghin = val/1000;
dumot = val%1000;
tram = dumot/100;
duhai = dumot%100;
chuc = duhai/10;
duba = duhai%10;
donvi = duba;
}
void phanchiahai(unsigned int result)
{
unsigned int dubon=0,dunam=0,dusau=0;
anghin = result/1000;
dubon = result%1000;
atram = dubon/100;
dunam = dubon%100;
achuc = dunam/10;
dusau = dunam%10;
adonvi = dusau;
}
anghin = result/1000;
dubon = result%1000;
atram = dubon/100;
dunam = dubon%100;
achuc = dunam/10;
dusau = dunam%10;
adonvi = dusau;
}
III.Kết quả đạt được
- Kết quả chuyển đổi hoàn toàn phù hợp với thực tế đo được từ VOM , khi ta thay đổi giá trị đầu vào (vặn biến trở ) , thì giá trị liên tục được cập nhật , và kết quả được hiện thị lên LCD .
- Hình ảnh đạt được :
Tài Liệu Tham khảo :
+ user manual LPC 2103
+ datasheet LPC 2103
+ guider LCD HD44780U, datasheet