Tài liệu thí nghiệm vi xử lý

Để đảm bảo module LCD hoàn tất một thao tác điều khiển, người lập trình có thể dùng một trong hai phương pháp. Cách thứ nhất là sử dụng chương trình con tạo trễ để chờ module hoàn thành lệnh hiện thời. Thời gian chờ cụ thể của module LCD cần phải xem cụ thể trong mô tả kỹ thuật của vi mạch HD44780. Cách thứ hai là sau mỗi lần truy xuất đến module LCD, người lập trình cần liên tục đọc trạng thái của module LCD và kiểm tra bit thứ 7 của byte trạng thái nhận được. Nếu bit này là 1 thì LCD vẫn còn đang bận, chương trình cần tiếp tục chờ. Nếu bit này là 0 thì LCD đã hoàn tất thao tác hiện thời và sẵn sàng cho thap tác điều khiển khác.

pdf80 trang | Chia sẻ: huyhoang44 | Lượt xem: 568 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Tài liệu thí nghiệm vi xử lý, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Trong bài thí nghiệm đầu tiên, vòng lặp lệnh được dùng để tiêu hao thời gian của vi điều khiển. Tuy nhiên, cách sử dụng vòng lặp lệnh đòi hỏi nhiều công sức tinh chỉnh để có được độ trễ chính xác. Mặt khác, khi sử dụng vòng lặp lệnh sẽ tiêu tốn thời gian hoạt động của CPU. Để tạo ra các khoảng thời gian chính xác người ta thường dùng ngoại vi timer. Timer (bộ định thì) thường được dùng để đo khoảng thời gian. Thực chất Timer là một bộ đếm với xung đếm có tần số cố định và biết trước. Khi xác định được số xung đếm và biết chu kỳ của xung thì có thể tính được thời gian. Timer của 8051 có thể hoạt động ở chế độ 8- bit hoặc 16-bit. Tùy theo số xung đếm cần nhiều hay ít mà có thể cấu hình Timer ở chế độ tương ứng. 3.2 LẬP TRÌNH SỬ DỤNG TIMER Timer là ngoại vi on-chip của 8051, để cấu hình và điều khiển ngoại vi này, người lập trình có thể truy xuất vào các thanh ghi tương ứng trong vùng SFR (địa chỉ 80h đến FFh). Đối với Timer đó là các thanh ghi TMOD, THx, TLx, TCON. Trong đó, THx và TLx chứa giá trị hiện thời của bộ đếm xung. Ví dụ, để cấu hình Timer0 hoạt động ở chế độ 8-bit MOV TMOD, #02h Để khởi tạo giá trị đầu cho Timer0 MOV TH0, #HIGH(-50000) ; giá trị khởi động là -50000 MOV TL0, #LOW(-50000) Để chờ hết khoảng thời gian đã định trước, người lập trình có thể quan sát cờ TFx. Cờ này sẽ lên 1 mỗi khi Timerx bị tràn, tức là giá trị bộ đếm xung quay trở lại giá trị 0 (zero) JNB TF0, $ ; chờ Timer0 tràn sau 50000 chu kỳ máy Nếu timer hoạt động ở chế độ 16 bit, sau khi timer tràn ta phải nạp lại giá trị đầu cho timer. Khi Timer chạy ở chế độ 2, thanh ghi đếm TLx sẽ được tự nạp lại khi timer tràn, vì vậy chương trình không cần dừng timer để nạp lại giá trị đầu . Ví dụ, để cấu hình Timer0 hoạt động ở chế độ 8-bit: MOV TMOD, #02h HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 35/80 Để khởi tạo giá trị đầu cho Timer0 MOV TH0, #(-50) ; giá trị khởi động là -50 MOV TL0, #(-50) Để khởi động timer, set cờ TR SETB TR0 Để chờ hết khoảng thời gian đã định trước, người lập trình có thể quan sát cờ TFx. Cờ này sẽ lên 1 mỗi khi Timerx bị tràn, tức là giá trị bộ đếm xung quay trở lại giá trị 0 (zero) JNB TF0, $ ; chờ Timer0 tràn sau 50000 chu kỳ máy Để tạo xung tuần hoàn, ta chỉ cần đảo chân port và xóa cờ tràn TF. Lưu ý là timer chạy độc lập với CPU, có nghĩa là trong khi CPU đang thực thi câu lệnh, timer vẫn chạy Xung có thể được tạo ra như sau: LOOP: JNB TF0,$ CPL P1.0 CLR TF0 SJMP LOOP HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 36/80 CHƯƠNG 4 THÍ NGHIỆM HIỂN THỊ DÙNG LED 7 ĐOẠN 4.1 LÝ THUYẾT CƠ BẢN Led 7 đoạn thường được dùng để hiển thị các chữ số hoặc chữ cái đơn giản. Giao tiếp này cho phép người không rành về kỹ thuật cũng có thể sử dụng hệ thống thông qua việc đọc các thông tin hiển thị trên led. Ví dụ nhiều led 7 đoạn có thể được dùng để hiển thị số điện thoại tại các buồng gọi điện thoại công cộng, hoặc các giá trị giây tại các trục đèn giao thông. Cấu tạo của led 7 đoạn gồm 8 led đơn được nối chung cực anode (dạng led anode chung) hoặc nối chung cực cathode (dạng led cathode chung). Các đoạn led đơn này được đặt tên là a, b, c, d, e, f, g và dấu chấm dp. Để hiển thị một giá trị lên led 7 đoạn, cần cấp điện áp lên chân chung và các tín hiệu điều khiển đoạn tương tự như điều khiển các led đơn. Hình 29 Led 7 đoạn dạng anode chung Để hiển thị một giá trị số lên led 7 đoạn, người lập trình cần xuất các giá trị để điều khiển các led a, b,, g và dp. Tuy nhiên, dữ liệu trong các hệ thống vi xử lý thường tồn tại dưới dạng nhị phân, dạng này không thể trực tiếp hiển thị lên led 7 đoạn. Do đó cần phải thực hiện chuyển đổi từ mã biểu diễn nhị phân sang mã biểu diễn lên led 7 đoạn. Việc chuyển đổi này có thể thực hiện bằng phần cứng với vi mạch chuyển mã hoặc dùng phần mềm (phương pháp tra bảng, look-up table). HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 37/80 4.2 THIẾT KẾ PHẦN CỨNG Hình 30 Sơ đồ thiết kế khối led 7 đoạn HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 38/80 Khối led 7 đoạn gồm có 4 led anode chung dùng vi mạch 74x47 để chuyển từ mã BCD (một dạng mã nhị phân trong hệ thống vi xử lý) sang mã 7 đoạn (mã cho phép hiển thị lên led 7 đoạn). Khối led 7 đoạn được thiết kế để hoạt động với cơ chế 3 bus. Trong cơ chế này, Port0 và Port2 được dùng để làm bus dữ liệu và bus địa chỉ. Hai tín hiệu đọc ghi của bus điều khiển nằm trên Port3. Mỗi ngoại vi hoặc bộ nhớ trong chế độ 3 bus sẽ được gán địa chỉ thông qua mạch giải mã địa chỉ. Dữ liệu cần được ghi ra một vi mạch chốt 74x573 vì bus dữ liệu thông thường ở trạng thái Hi-Z. Trong sơ đồ thiết kế khối led 7 đoạn ở trên, 4 bit thấp của bus dữ liệu sẽ được dùng để chứa mã BCD của số cần hiển thị, 4 bit cao chứa tín hiệu điều khiển khóa của mỗi led. Giá trị BCD sẽ đi qua vi mạch chuyển mã 74x47, ngõ ra của vi mạch này là các tín hiệu lái các đoạn A đến G của led 7 đoạn dạng anode chung. Các tín hiệu dữ liệu và điều khiển được lấy từ ngõ ra của vi mạch chốt ‘573. Đó là do bus dữ liệu của MCU có tính Hi-Z, nên khi hết chu kỳ truy xuất, các đường dữ liệu sẽ mất hết giá trị. Vi mạch chốt ‘573 giúp đảm bảo dữ liệu vẫn tiếp tục tồn tại sau khi MCU không còn truy xuất đến khối led (MCU phải liên tục hiển thị từng led sau một khoảng thời gian nhất định, thường là vài ms). Tín hiệu cho phép chốt ‘573 tích cực mức cao và được tạo ra bằng cách NOR tín hiệu giải mã địa chỉ nCS0 từ 74x138 với tín hiệu cho phép ghi nWR. Địa chỉ của ‘573 này là 0000h. Cũng theo sơ đồ trên, vì tín hiệu đoạn A đến F của các led 7 đoạn được nối chung nên tất cả các led 7 đoạn đều nhận được cùng một dữ liệu khi MCU truy xuất đến. Tuy nhiên chỉ có duy nhất 1 led 7 đoạn được phép hiển thị bằng cách mở khóa BJT cho led đó. Tín hiệu mức 0 tại cực B của BJT A1015 sẽ làm cho BJT dẫn bão hòa và cực C của BJT sẽ có giá trị gần 5V (gần bằng điện thế tại cực E) cung cấp nguồn 5V cho led 7 đoạn. 4.3 GIAO TIẾP KHỐI LED 7 ĐOẠN Như đã phân tích ở trên, khối Led 7 đoạn được thiết kế như là 1 ngoại vi dạng ánh xạ bộ nhớ, với tín hiệu chọn địa chỉ là CS0 như Hình 31. Hình 31 Tín hiệu chọn chip cho khối LED 7 đoạn A.15 A.14 A.13 nCS.3 nCS.2 nCS.6 nCS.5 nCS.7 nCS.[0..7] nCS.4 nCS.1 VCC nCS.0 U104 74LS138 A 1 B 2 C 3 Y0 15 Y1 14 Y2 13 Y3 12 Y4 11 Y5 10 Y6 9 Y7 7 G1 6 G2A 4 G2B 5 UA3A 74HC02 2 3 1 nWR nCS.0 LED7SEG_CS HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 39/80 Một ngoại vi hoặc bộ nhớ dữ liệu ngoài (off-chip) được thiết kế để hoạt động với cơ chế 3 bus có thể được truy xuất bằng câu lệnh MOVX. Câu lệnh này chứa các thông tin gồm địa chỉ của ngoại vi hoặc ô nhớ cần truy xuất, dạng lệnh là đọc hoặc ghi. MOVX A, @DPTR ; đọc ngoại vi tại địa chỉ trong DPTR vào A Khi câu lệnh đọc được thực thi, 8051 sẽ thực hiện các bước sau: Đặt địa chỉ cần đọc lên bus địa chỉ A0-A15 (tức là Port0 và Port2), giá trị này sẽ làm cho tín hiệu giải mã địa chỉ tương ứng được phép tích cực. Ra lệnh đọc bằng tín hiệu điều khiển nRD (bit P3.7). Đưa dữ liệu đọc được từ bên ngoài vào thanh ghi A thông qua bus dữ liệu (Port0). MOVX @DPTR, A ; ghi A ra ngoại vi tại địa chỉ trongDPTR Khi câu lệnh ghi được thực thi, 8051 sẽ thực hiện các bước sau: Đặt địa chỉ cần ghi lên bus địa chỉ A0-A15, giá trị này sẽ làm cho tín hiệu giải mã địa chỉ tương ứng được phép tích cực. Đặt dữ liệu trong thanh ghi A lên bus dữ liệu. Ra lệnh ghi bằng tín hiệu nWR (bit P3.6). Hình 32 Giản đồ định thì của lệnh đọc/ghi ngoại vi trong chế độ 3 bus Điều quan trọng trong việc hiển thị một giá trị lên led 7 đoạn là cần phải chuyển biểu diễn của giá trị tính toán trong MCU (thường là dạng nhị phân) sang dạng hiển thị được lên led 7 đoạn (thường gọi là mã 7 đoạn). HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 40/80 Với phương pháp giải mã phần cứng, giá trị cần ghi ra vi mạch chuyển mã 74x47 phải là mã BCD. Như vậy trong chương trình, người lập trình cần chuyển từ giá trị nhị phân cần hiển thị sang dạng mã BCD. Ví dụ, để hiển thị giá trị 25h (tức là giá trị 37 thập phân), người lập trình cần chuyển giá trị 25h này thành hai số BCD là 3 và 7 (thường được biểu diễn trong hệ thống là 37h). Sau đó lần lượt ghi ra led 7 đoạn tương ứng. Hàm thực hiện việc chuyển đổi này thường được gọi là BIN2BCD (Binary to BCD). Để hiển thị được nhiều led 7 đoạn, người thiết kế có thể dùng một trong hai phương pháp chủ yếu. Thứ nhất là phương pháp quét led (4 led 7 đoạn của EME-MC8 được hiển thị bằng phương pháp quét led). Trong phương pháp này một led 7 đoạn sẽ được hiển thị trong một khoảng thời gian nhất định sau đó sẽ chuyển sang hiển thị led 7 đoạn khác. Chu trình này được lặp liên tục với tốc độ hiển thị tổng cộng của các led 7 đoạn phải đảm bảo lớn hơn 24 hình/s (tức là tối đa là 40ms cho một lần hiển thị tất cả các led). Để có thể dùng phương pháp quét led, tín hiệu điều khiển các đoạn A đến G của các led được nối chung. Tuy nhiên các led sẽ không hiển thị dữ liệu giống nhau vì tín hiệu cấp nguồn cho led sẽ được điều khiển thông qua một khóa dùng BJT như sơ đồ mạch. Phương pháp hiển thị thứ hai là phương pháp chốt led. Lúc này nguồn cấp cho mỗi led luôn được mở, tuy nhiên mỗi led sẽ có các tín hiệu điều khiển đoạn A đến G riêng biệt và thường là ngõ ra của một vi mạch chốt ví dụ như 74x573. Phương pháp này đòi hỏi phải có một số lượng vi mạch chốt bằng với số lượng led 7 đoạn. Muốn hiển thị lên led, người lập trình chỉ cần ghi mã hiển thị của led ra vi mạch chốt tương ứng. 4.4 HIỂN THỊ MỘT SỐ TỪ 0-9 LÊN 1 LED 7 ĐOẠN 4.4.1 Sử dụng hợp ngữ Như đã thấy ở thiết kế phần cứng, để có thể hiển thị một số lên led 7 đoạn, người lập trình cần xuất giá trị BCD của số cần hiển thị ra 4 bit thấp của vi mạch ‘573, 4 bit cao sẽ được dùng để chọn led nào được phép sáng. Giả sử ta cần hiển thị lên led 7 đoạn ngoài cùng bên phải (LED 0) , như vậy, giá trị của 4 bit cao sẽ là 1110 để làm tín hiệu LED0 bằng 0, kích dẫn BJT Q401. Nếu ta muốn hiển thị số 5, 4 bit thấp sẽ có giá trị là 0101. Giá trị này sẽ được IC giải mã chuyển từ BCD sang mã 7 đoạn để hiển thị LED. Vậy, giá trị cần xuất ra là 11100101B hay là E0H. Vì ‘573 được thiết kế để giao tiếp với MCU thông qua cơ chế 3 bus nên người lập trình cần dùng lệnh MOVX dạng ghi, trong đó DPTR trỏ đến địa chỉ 0000h. HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 41/80 Đoạn chương trình sau sẽ hiển thị số 5 lên Led 7 đoạn số 0. MOV A, #0E0h ; hiển thị 5 lên led 7 đoạn SỐ 0 MOV DPTR, #0000h ; trỏ đến ‘573 của khối led 7 đoạn MOVX @DPTR, A ; ghi giá trị ra ‘573 Để dễ hơn trong việc ghi 10 giá trị từ 0 đến 9 ra led 7 đoạn, người lập trình có thể sử dụng phương pháp tra bảng để tận dụng khả năng dùng vòng lặp, trong đó nội dung bảng tra chính là 10 giá trị sẽ lần lượt được xuất ra ‘573 TABLE: DB 0E0h, 0E1h, 0E2h, ... Câu lệnh sau cho phép tra lấy nội dung trong bảng MOV DPTR, #TABLE ; trỏ đến bảng tra MOV A, #0 ; thứ tự của phần tử cần lấy trong bảng MOVC A, @A+DPTR ; A = 0E0h 4.4.2 Sử dụng ngôn ngữ C Như đã nói ở trên, khối LED 7 đoạn được thiết kế như là một ngoại vi ở địa chỉ 0x0000 - 0x1FFF ở vùng nhớ dữ liệu ngoài của 8051. Để truy xuất đến vùng nhớ này ta sử dụng con trỏ như sau: Hình 33 Sử dụng con trỏ để giao tiếp LED 7 đoạn Với cách viết này, con trỏ p là một biến con trỏ chỉ đến vùng nhớ dữ liệu ngoài vì nó được khai báo với từ khóa xdata . HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 42/80 Ta gán giá trị 0x0000 vào p để làm nó trỏ đến địa chỉ 0x0000 ở vùng nhớ ngoài. Câu lệnh *p = 0xE5 sẽ xuất giá trị 0xE5 ra địa chỉ 0x0000 ở vùng nhớ ngoài, tương tự như các câu lệnh hợp ngữ ở phần trên. Ngoài cách truy cập thông qua con trỏ, ta có thể định nghĩa một macro chỉ đến ô nhớ 0x0000 và dùng nó để xuất giá trị ra LED như sau Hình 34 Định nghĩa một ngoại vi ánh xạ bộ nhớ Để khai báo bảng hằng số trong bộ nhớ chương trình và tra bảng này như ở phần trên, ta khai báo 1 mảng với từ khóa "code" và truy cập thông qua chỉ số như ví dụ sau: Hình 35 Thực hiện bảng tra dùng ngôn ngữ C 4.5 HIỂN THỊ ĐỒNG THỜI GIÁ TRỊ SỐ LÊN CẢ 4 LED 7 ĐOẠN Thiết kế của kit thí nghiệm không cho phép hiển thị 4 số khác nhau lên cả 4 led một cách đồng thời. Để có thể nhìn thấy 4 giá trị cùng 1 lúc ta dùng phương pháp quét LED. HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 43/80 Ví dụ như ta cần hiển thị 4 số 1234 ra 4 LED. Để làm được điều này, ta sẽ cho LED0 hiển thị số 4 trong một thời gian T, sau đó tắt LED0 và cho LED1 hiển thị số 3 cũng trong thời gian T. Tương tự cho LED2 và LED3. Như vậy, các LED sẽ lần lượt sáng/tắt. Trong 1 giây số lần sáng của mỗi LED sẽ là 1s/4T. Như vậy, quá trình hiển thị 4 số 1234 lên LED 7 đoạn như sau: Hình 36 Lưu đồ chương trình quét LED Nhờ vào hiệu ứng lưu ảnh của mắt người, nếu LED sáng tắt đủ nhanh thì mắt người sẽ không nhận ra hiện tượng chớp nháy. Theo lý thuyết, nếu số lần LED sáng tắt lớn hơn 24 lần trong 1 giây thì mắt người coi như LED sáng liên tục. Như vậy, thời gian T càng nhỏ thì mắt người càng thấy hình ảnh ổn định. Cách thức để ghi giá trị ra 1 led tương tự như trong thí nghiệm 1. Tuy nhiên, tín hiệu cho phép led sẽ lần lượt được tích cực để hiển thị 4 giá trị lên 4 led 7 đoạn khác nhau. Như vậy, 4 START Turn off all LEDs LED 0 display number 1 Delay T LED 1 display number 2 Delay T LED 2 display number 3 Delay T LED 3 display number 4 Delay T HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 44/80 bit cao sẽ lần lượt có các giá trị là 0111, 1011, 1101, 1110; và 4 bit thấp sẽ chứa mã BCD của số cần hiển thị ra led (tức là 0001, 0010, 0011, 0100). Người lập trình cũng có thể sử dụng phương pháp tra bảng để lấy giá trị xuất ra LED. TABLE: DB 071h, 0B2h, 0D3h, 0E4h HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 45/80 CHƯƠNG 5 THÍ NGHIỆM HIỂN THỊ DÙNG LCD 5.1 LÝ THUYẾT CƠ BẢN Để có thể hiển thị thông tin linh hoạt và tiết kiệm năng lượng, hệ thống có thể sử dụng module LCD. Có nhiều loại module LCD, trong đó thông dụng là loại hiển thị 2 hàng 16 ký tự. Module LCD có thể được dùng để hiển thị các thông tin dạng ký tự. Vì được tích hợp sẵn bộ lái LCD nên việc điều khiển module LCD tương đối đơn giản. Các tín hiệu điều khiển module LCD gần giống với các tín hiệu của một MCU hoạt động theo cơ chế 3 bus. Module LCD đã được thiết kế chuẩn để cho phép ta có thể giao tiếp với LCD do một hãng bất kỳ sản xuất với điều kiện là các LCD có sử dụng cùng IC điều khiển HD44780. Phần lớn các module LCD sử dụng giao tiếp 14 chân trong đó có 8 đường dữ liệu, 3 đường điều khiển và 3 đường cấp nguồn. Kết nối được bố trí dưới dạng 1 hàng 14 chân hoặc 2 hàng 7 chân. Các chân 1 và 2 là các chân cấp nguồn Vss, Vdd. Chân 3 Vee là chân điều khiển độ tương phản của màn hình. Chân 4 là đường RS, đây là chân điều khiển lệnh. Khi RS = 0 thì dữ liệu ghi vào LCD được hiểu là các lệnh, dữ liệu đọc từ LCD được hiểu là trạng thái của nó. Chân 5 là đường điều khiển đọc ghi R/nW, mức thấp sẽ cho phép ghi vào LCD, mức cao cho phép đọc ra từ LCD. Chân 6 là đường điều khiển cho phép E. Các chân còn lại chứa dữ liệu 8-bit vào hoặc ra LCD. Chân số Tên Chức năng 1 VSS Đất 2 VDD Cực + của nguồn điện 3 VEE Tương phản (constrast) 4 RS Register Select (Chọn thanh ghi) 5 R/W Read/Write 6 E Cho phép (Enable) 7 D0 Bit 0 của dữ liệu 8 D1 Bit 1 của dữ liệu HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 46/80 9 D2 Bit 2 của dữ liệu 10 D3 Bit 3 của dữ liệu 11 D4 Bit 4 của dữ liệu 12 D5 Bit 5 của dữ liệu 13 D6 Bit 6 của dữ liệu 14 D7 Bit 7 của dữ liệu 5.1.1 Chức năng các chân của LCD Module LCD được điều khiển thông qua một tập lệnh chuẩn. Bảng sau tóm tắt các lệnh điều khiển LCD. Command (Lệnh) RS RW Nhị phân Hex D7 D6 D5 D4 D3 D2 D1 D0 NOP (No operation = không làm gì cả) 0 0 0 0 0 0 0 0 0 0 00 Clear display (xóa hiển thị) 0 0 0 0 0 0 0 0 0 1 01 Display & Cursor home (hiển thị và đặt cursor ở góc trái phía trên) 0 0 0 0 0 0 0 0 1 x 02 hoặc 03 Character Entry mode (Chế độ nhập ký tự) 0 0 0 0 0 0 0 1 I/D S 04 đến 07 Display On/Off & Cursor 0 0 0 0 0 0 1 D U B 08 đến 0F HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 47/80 (Tắt mở hiển thị và cursor) Display/Cursor Shift (Dịch curson/hiển thị) 0 0 0 0 0 1 D/C R/L x x 10 đến 1F Function set (Đặt chức năng) 0 0 0 0 1 8/4 2/1 10/7 x x 20 đến 3F Set CGRAM address (Đặt địa chỉ CGRAM) 0 0 0 1 A A A A A A 40 đến 7F Set DDRAM address (Đặt địa chỉ DDRAM) 0 0 1 A A A A A A A 80 đến FF Busy Flag & Addr (Cờ bận và bộ đếm địa chỉ) 0 1 BF Bộ đếm địa chỉ Read Data (Đọc dữ liệu từ CGRAM hoặc DDRAM) 1 0 Dữ liệu đọc Write Data (Ghi dữ liệu vào CGRAM hoặc DDRAM) 1 1 Dữ liệu ghi Chú thích: I/D: 1 =Increment *, 0=Decrement R/L: 1 = Right shift, 0 = Left shift HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 48/80 S: 1 = Display shift on, 0 = Display shift off * D: 1 = Display on, 0 = Diaplay off * U: 1 = Cursor underline on, 0=Underline off * B: 1 = Cursor blink on, 0 = cursor blink off * D/C: 1 = Display shift, 0 = cursor move 8/4: 1 = 8 bit interface *, 0 = 4 bit interface 2/1: 1 = chế độ 2 hàng, 0 = chế độ 1 hàng * 10/7: 1=5x10 dot format, 0=5x7 dot format * x = don’t care * = đặt ban đầu 5.1.2 Tóm tắt tập lệnh điều khiển LCD Các dữ liệu được hiển thị lên LCD dựa vào một tập ký tự chuẩn. Các dữ liệu 8-bit sẽ được chuyển thành ký tự hiển thị dựa trên bảng ký tự chuẩn này. Bảng 4 Bảng ký tự chuẩn cho LCD HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 49/80 Định thì giao tiếp các tín hiệu điều khiển của LCD có thể được xem thêm trong mô tả kỹ thuật của vi mạch HD44780. 5.2 THIẾT KẾ PHẦN CỨNG Hình 37 Sơ đồ thiết kế giao tiếp LCD LCD được thiết kế để hoạt động với cơ chế 3 bus, tức là phải bật ON SW_CC1 và SW_CC3. 8 đường dữ liệu D0-D7 chứa dữ liệu hiển thị hoặc lệnh điều khiển LCD được ghi vào LCD thông qua vi mạch chốt 74x573, trong đó tín hiệu cho phép chốt CS được tạo ra từ mạch giải mã địa chỉ. U501 74HC573 D0 2 D1 3 D2 4 D3 5 D4 6 D5 7 D6 8 D7 9 LE 11 OE 1 Q0 19 Q1 18 Q2 17 Q3 16 Q4 15 Q5 14 Q6 13 Q7 12 nWR UA01D 74HC02 11 12 13 nCS.3 J501 LCD 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 R501 20 VCC VCC R502 1k R503 10k RS E R/nW RS ENABLE D.[0..7] + ENABLE = P3.3 + RS = P3.5 D.7 D.6 D.5 D.4 D.3 D.2 D.1 D.0 HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 50/80 Hai tín hiệu điều khiển E và RS của LCD được kết nối đến P3.3 và P3.5 của 8051. Người sử dụng phải bật ON hai switch này trên SW_CC4 để có thể điều khiển LCD. Như vậy, SW_CC4 phải bật ON tổng cộng 6 switch tương ứng với các bit 0, 1, 4, 5, 6, 7 của Port 3, tức là các tín hiệu RXD, TXD, E, RS, nWR, nRD Hình 38 Cài đặt SW_CC4 của Port 3 để điều khiển LCD 5.3 LẬP TRÌNH GIAO TIẾP LCD Vì giao tiếp thông qua cơ chế 3 bus nên người lập trình cần dùng câu lệnh MOVX phối hợp với việc điều khiển hai tín hiệu E (P3.4) và RS (P3.5) để truy xuất LCD theo đúng định thì ghi. Để điều khiển LCD, trước tiên cần khởi động và đặt cấu hình cho LCD. Việc này được thực hiện bằng cách gửi một số lệnh khởi động đến LCD. Lệnh thứ nhất mà ta gửi báo cho LCD biết ta sẽ giao tiếp với nó thông qua bus dữ liệu 4-bit hay 8-bit. Ta cũng chọn font ký tự là 5x8. Điều này được thực hiện bằng cách gửi lệnh 38h đến LCD. Lưu ý là đường RS phải giữ ở mức thấp để báo cho LCD biết đang nhận lệnh. Tiếp theo ta cần gửi lệnh 0Eh. Lệnh này dùng để bật LCD và tắt con trỏ ký tự. Byte thứ 3 được gửi thêm để cài đặt một số tham số hoạt động của LCD. Ví dụ ta có thể gửi lệnh 06h để ra lệnh cho con trỏ tự động dịch phải mỗi HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 51/80 khi ta gửi một ký tự hiển thị cho nó. Lệnh MOVX có thể được dùng để truy xuất đến module LCD với DPTR chứa địa chỉ của thao tác cụ thể. Để đảm bảo module LCD hoàn tất một thao tác điều khiển, người lập trình có thể dùng một trong hai phương pháp. Cách thứ nhất là sử dụng chương trình con tạo trễ để chờ module hoàn thành lệnh hiện thời. Thời gian chờ cụ thể của module LCD cần phải xem cụ thể trong mô tả kỹ thuật của vi mạch HD44780. Cách thứ hai là sau mỗi lần truy xuất đến module LCD, người lập trình cần liên tục đọc trạng thái của module LCD và kiểm tra bit thứ 7 của byte trạng thái nhận được. Nếu bit này là 1 thì LCD vẫn còn đang bận, chương trình cần tiếp tục chờ. Nếu bit này là 0 thì LCD đã hoàn tất thao tác hiện thời và sẵn sàng cho thap tác điều khiển khác. MOVX A, @DPTR ; đọc trạng thái LCD JB ACC.7, wait ; nếu busy thì nhảy đến wait ; nếu không thì tiếp tục 5.4 VIẾT CHƯƠNG TRÌNH HIỂN THỊ CHUỖI LÊN LCD Khối LCD được kết nối với 8051 thông qua cơ chế 3 bus, trong đó 8 đường dữ liệu của LCD được nối đến bus dữ liệu của MCU, 3 đường điều khiển được nối đến ngõ ra của khối giải mã địa chỉ. Như vậy lệnh MOVX sau có thể được dùng để đọc hoặc ghi LCD, trong đó DPTR chứa địa chỉ của thao tác tương ứng MOVX A, @DPTR ; lệnh đọc LCD MOVX @DPTR, A ; lệnh ghi LCD Giả sử ta cần ghi chuỗi "Hello" lên LCD. Trước tiên cần khởi động LCD theo mô tả ở phần trên. Sau đó, lần lượt ghi mã của các ký tự ‘H’, ‘e’, ‘l’, ‘l’, ‘o’ đến LCD theo bảng ký tự của LCD. Lưu ý là sau mỗi lần truy xuất module LCD cần chờ cho thao tác hiện thời được hoàn tất trước khi bắt đầu thao tác khác. Để dễ dàng hơn trong việc lấy các ký tự và xuất ra LCD, người lập trình có thể dùng phương pháp tra bảng như sau Message: DB ‘Hello’ Nên thiết kế chương trình bằng cách sử dụng các chương trình con để có thể sử dụng lại. Ví dụ, một chương trình con có tên lcd_init có nhiệm vụ khởi động module LCD, chương trình HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 52/80 con write_char có nhiệm vụ ghi 1 byte dữ liệu hiển thị đến LCD, chương trình con write_command có nhiệm vụ ghi 1 byte lệnh đến LCD. Mã nguồn chương trình mẫu hiển thị một chuỗi lên LCD có thể download trên trang web của bộ môn điện tử. HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 53/80 CHƯƠNG 6 THÍ NGHIỆM VỚI CÔNG TẮC ĐƠN VÀ BÀN PHÍM MA TRẬN 6.1 LÝ THUYẾT CƠ BẢN Công tắc (Switch) là linh kiện cơ khí được dùng để nối 2 hoặc nhiều tiếp điểm lại với nhau khi có tác động. Thông thường Switch có 2 tiếp điểm (Switch đơn). Để giao tiếp switch đơn có hai cách giao tiếp như sau. Hình 39 Giao tiếp phím nhấn Ở cách phía trên, một điện trở kết nối nguồn VCC và 1 đầu của switch, đầu này lấy tín hiệu ra đưa vào chân vi điều khiển, đầu còn lại nối với GND. Khi Switch không đóng, tín hiệu ra sẽ là HIGH (logic 1). Khi Switch đóng, tín hiệu ra sẽ là LOW (logic 0). Cách kết nối này là sử dụng điện trở kéo lên (pull-up resistor) Cách giao tiếp còn lại thì hoàn toàn ngược lại, dùng điện trở kéo xuống (pull-down resistor). HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 54/80 Trên bàn phím ma trận, các phím nhấn được tổ chức thành dạng ma trận, ở đó một đầu của phím nối vào các hàng, đầu còn lại nối vào các cột như Hình 40. Hình 40 Tổ chức bàn phím ma trận Với cách kết nối trên, khi ta nhấn một phím thì hàng và cột sẽ được kết nối với nhau. Từ số hàng và cột trên ta có thể suy ra vị trí phím được nhấn. 6.2 THIẾT KẾ PHẦN CỨNG Trên kit thí nghiệm, bàn phím ma trận gồm có 16 phím được tổ chức thành 4 hàng, bốn cột và kết nối tới PORT 1. Hình 41 Kết nối bàn phím ma trận VCC R602 10K R603 10K R604 10K R605 10K R606 10K SW338 BUTTON1 SW340 BUTTON2 SW343 BUTTON3 SW344 BUTTON4 R607 10K R608 10K SW347 BUTTON5 SW348 BUTTON6 SW349 BUTTON7 SW352 BUTTON8 SW354 BUTTON9 SW357 BUTTON10 SW361 BUTTON11 SW362 BUTTON12 SW363 BUTTON13 SW364 BUTTON14 SW365 BUTTON15 SW368 BUTTON16 VCC P1.0 P1.1 P1.2 P1.3 R601 10K P1.4 P1.5 P1.7 P1.6 HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 55/80 Như trên Hình 41, bốn hàng của bàn phím kết nối vào P1.0, P1.1, P1.2 và P1.3. Bốn cột kết nối vào P1.4, P1.5, P1.6 và P1.7. 6.3 PHẦN MỀM GIAO TIẾP Để giao tiếp bàn phím ma trận ta sử dụng kỹ thuật quét phím. Ta có thể quét phím theo hàng hoặc theo cột. Sau đây trình bày quá trình quét phím theo cột. Đầu tiên, ta xuất giá trị 1 ra các chân giao tiếp hàng (P1.0 đến P1.3) để có thể sử dụng các chân này làm input. Cho cột 0 (P1.4) bằng 0 và 3 cột còn lại lên 1. Nếu như có bất kỳ phím nào trên cột 0 được nhấn, hàng tương ứng sẽ được kết nối vào cột 0 và sẽ có giá trị là 0. Như vậy ở lần quét này ta biết được có phím nào trên cột 0 được nhấn. Tương tự, Cho cột 1 (P1.5) bằng 0 và 3 cột còn lại lên 1. Nếu như có bất kỳ phím nào trên cột 0 được nhấn, hàng tương ứng sẽ được kết nối vào cột 1 và sẽ có giá trị là 0. Như vậy ở lần quét này ta biết được có phím nào trên cột 1 được nhấn. Làm tương tự đối với cột 2 và cột 3. Như vậy, một chu kỳ quét phím sẽ quét qua lần lượt 4 cột, và phát hiện được có phím nhấn trên toàn bộ các phím trên ma trận phím. Thời gian quét hết 4 cột là rất nhanh so với tốc độ nhấn và nhả phím của tay người, vì vậy đảm bảo khi bất kỳ phím nào được nhấn, quá trình quét phím sẽ phát hiện được. 6.4 RUNG PHÍM VÀ CHỐNG RUNG Với phím nhấn cơ khí, tiếp điếm cơ khí sau khi được nhấn hay nhả sẽ bị rung động. Do đó, khi nhấn hay nhả phím sẽ tạo ra một chuỗi các xung thay vì một xung đơn như ở Hình 42. Hình 42 Phím đơn bị rung khi nhấn hay nhả Khi đó, nếu ta dùng tín hiệu này để xác định số lần phím nhấn thì kết quả sẽ bị sai lệch. Để có kết quả đúng ta cần chống rung (debounce). HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 56/80 Có hai cách để chống rung là chống rung bằng phần cứng và chống rung bằng phần mềm. Hình 43 Chống rung bằng phần cứng Hình 43 trình bày cách chống rung bằng phần cứng, sử dụng một tụ điện khoảng 0.1 uF mắc như trong hình. Tụ này phối hợp với điện trở kéo lên hoặc kéo xuống sẽ lọc đi các xung hẹp sinh ra do quá trình rung phím. Cách thứ hai là sử dụng phần mềm để chống rung. Cách chống rung đơn giản nhất là đọc tín hiệu ra hai lần liên tiếp sau một khoảng thời gian trễ thích hợp, nếu 2 lần này mà kết quả đọc được giống nhau thì ta cho là kết quả đúng, nếu kết quả là sai thì ta lại đọc lần thứ 3 cũng sau thời gian T, nếu kết quả giống như lần đọc thứ 2 thì coi như kết quả lần này là đúng, còn nếu không thì lại lặp lại quá trình. Thời gian T thường được chọn là 50ms. Ta có thể tăng độ chính xác bằng cách giảm thời gian T và tăng số lần đọc lên. Ví dụ phím được coi là trả về giá trị 1 nếu như ta đọc được liên tiếp 20 lần cùng giá trị 1 với mỗi lần đọc cách nhau 1ms. HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 57/80 CHƯƠNG 7 THÍ NGHIỆM GIAO TIẾP QUA CỔNG NỐI TIẾP 7.1 LÝ THUYẾT CƠ BẢN Truyền thông nối tiếp là một phần rất quan trọng trong các hệ thống xử lý. Đối với 8051, việc truyền nối tiếp được thực hiện thông qua ngoại vi cổng nối tiếp. Ngoại vi này cho phép người lập trình giao tiếp với bên ngoài thông qua giao thức truyền nối tiếp 8 bit dữ liệu, 1 stop bit. Tốc độ truyền có thể lập trình được bằng phần mềm. 7.1.1 Khung truyền nối tiếp bất đồng bộ Khi không có dữ liệu gửi thì đường tín hiệu duy trì ở trạng thái cao (trạng thái Mark). Bắt đầu của một ký tự dữ liệu được chỉ bởi mức thấp trong thời gian 1 bit. Bit này được gọi là bit bắt đầu (Start bit). Rồi sau đó các bit dữ liệu được gửi ra trên đường tín hiệu lần lượt từng bit một (bắt đầu với LSB). Từ dữ liệu có thể 5, 6, 7, hoặc 8 bit và có thể theo sau là bit kiểm tra chẵn lẻ P (Parity bit). Tiếp theo các bit dữ liệu và P (nếu có sử dụng kiểm tra chẵn lẻ), đường tín hiệu được trả về mức cao trong ít nhất thời gian 1 bit để giúp nhận biết kết thúc ký tự. Bit này còn gọi là bit dừng (Stop bit), một số hệ thống cũ có thể sử dụng 2 bit dừng. Thuật ngữ tốc độ baud dùng để chỉ tốc độ dữ liệu nối tiếp được truyền. Tốc độ baud được định nghĩa là 1/(thời gian giữa những chuyển tiếp tín hiệu). Thí dụ: Nếu tín hiệu thay đổi cứ sau 3.33 ms thì tốc độ baud là 1/3.33ms = 300 bd (hay baud). Chú ý là tốc độ này tổng quát thì khác với tốc độ định nghĩa theo bps (bits/giây). Các tốc độ baud thông dụng là 300, 600, 1200, 2400, 4800, 9600, và 19200 baud (hiện nay các số này còn cao hơn nữa, thường giới hạn với truyền bất đồng bộ là 100000 baud). Bộ thí nghiệm EME-MC8 đã sử dụng cổng nối tiếp này để giao tiếp với chương trình HyperTerminal trên máy tính, từ đó cho phép người dùng có thể sử dụng các chức năng của chương trình monitor. HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 58/80 Trong thực tế, cổng nối tiếp của 8051 có thể giao tiếp với cổng RS-232 trên máy tính thông qua một vi mạch chuyển đổi từ TTL sang RS-232 như MAX232. Việc truyền thông tin chỉ cần 3 dây TXD, RXD, và GND nếu không dùng bắt tay bằng phần cứng. 7.2 THIẾT KẾ PHẦN CỨNG Trên kit thí nghiệm, cổng nối tiếp của 8051 được nối đến cổng DB9 trên mạch thông qua vi mạch chuyển đổi từ TTL sang RS-232 (MAX232) và nối với cổng USB qua IC chuyển đổi FTDI232. Điều này cho phép kết nối DB9 với cổng COM của máy tính hoặc cổng USB của kit với cổng USB của máy tính để giao tiếp máy tính với serial port của 8051. Chân của DB25 (chân số) Chân của DB9 (chân số) Viết tắt Tên đầy đủ 2 3 TD Transmit Data 3 2 RD Receive Data 4 7 RTS Request To Send 5 8 CTS Clear To Send 6 6 DSR Data Set Ready 7 5 SG Signal Ground 8 1 CD Carrier Detect 20 4 DTR Data Terminal Ready 22 9 RI Ring Indicator HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 59/80 Hai tín hiệu dùng cho giao tiếp là TXD và RXD trên Port 3 của 8051. Như vậy, người lập trình cần bật ON hai switch này (của SW_CC4) để có thể dùng cổng nối tiếp. Hình 44 Sơ đồ kết nối cổng nối tiếp và cài đặt switch tương ứng 7.3 PHẦN MỀM GIAO TIẾP Để truyền nhận dữ liệu thông qua cổng nối tiếp, người lập trình chỉ cần khởi động nó bằng các thao tác: truy xuất thanh ghi SMOD để cài đặt chế độ làm viêc; truy xuất Timer 1 để điều khiển tốc độ baud (EME-MC8 sử dụng thạch anh 11.0592MHz, cho phép tạo tốc độ baud với sai số là 0%). MOV SMOD, #52h ; khởi động ở chế độ 2 MOV TH1, #... ; cài đặt tốc độ Để có thể ghi hoặc đọc dữ liệu từ cổng nối tiếp, người lập trình cần truy xuất thanh ghi SBUF bằng các chương trình con JNB TI, $ ; chờ phát xong byte trước đó CLR TI ; chuẩn bị phát byte kế MOV SBUF, A ; phát + C112 1uF U107 FT232RL VCCIO 4 VCC 20 USBDM/D- 16 USBDP/D+ 15 NC 8 RESET 19 NC1 24 OSCI 27 OSCO 28 3V3OUT 17 AGND 25 GND 7 GND 18 GND 21 TEST 26 CBUS4 12 CBUS3 14 CBUS2 13 CBUS1 22 CBUS0 23 RI 6 DCD 10 DSR 9 DTR 2 CTS 11 RTS 3 RXD 5 TXD 1 VCC + C108 10uF J1 USB/B/Fe 1 2 3 4 USBD+ USBD- R102 FERRITE C109 10n C110 100n C111 100n P101 RS232 5 9 4 8 3 7 2 6 1 DB9, SOCKET TXD RXD RB1 330DB2 LED-TX DB3 LED-RX RBL2 330 VCCUSB TYPE B FEMALE RB2 0R RB3 0R + C105 10u + C104 10u + C106 10u +C107 10u VCC U105 MAX232 C1+ 1 C1- 3 C2+ 4 C2- 5 V+ 2 V- 6 R1OUT 12 R2OUT 9 T1IN 11 T2IN 10 R1IN 13 R2IN 8 T1OUT 14 T2OUT 7 TXD_232 RXD_232 TXD RXD HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 60/80 Hoặc JNB RI, $ ; chờ nhận xong 1 byte CLR RI ; nhận byte kế MOV A, SBUF ; byte kế nằm trong A HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 61/80 CHƯƠNG 8 THÍ NGHIỆM LẬP TRÌNH NGẮT CHO 8051 8.1 LÝ THUYẾT CƠ BẢN Ngắt là tính năng rất quan trọng của vi xử lý, cho phép chương trình phục vụ một ngoại vi khi cần mà không cần phải mất thời gian hỏi vòng (polling) các ngoại vi. Với 8051, khi xảy ra sự kiện ngắt, ví dụ như timer tràn, chương trình sẽ quay về một địa chỉ cố định trong bộ nhớ chương trình, địa chỉ này được gọi là vector ngắt của ngoại vi. Từ địa chỉ này, chương trình thực hiện một lệnh nhảy đến địa chỉ của chương trình phục vụ ngắt. Để cho phép ngắt, người lập trình phải cho phép bit tương ứng trong thanh ghi IE Người lập trình cũng có thể chọn mức ưu tiên cho ngắt thông qua thanh ghi IP HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 62/80 8.2 LẬP TRÌNH SỬ DỤNG NGẮT Một chương trình assembly sử dụng ngắt, ví dụ ngắt timer 0 sẽ có cấu trúc như sau: Hình 45 Lập trình ngắt dùng assembly Khi timer 0 tràn, chương trình sẽ quay về địa chỉ 000BH, từ đó nhảy đến TO_ISR, sau khi gặp lệnh RETI thì quay về lệnh kế tiếp từ thời điểm thực thi ngắt. LẬP TRÌNH SỬ DỤNG NGẮT TRÊN KIT THÍ NGHIỆM Trên kit thí nghiệm, bảng vector ngắt được chương trình monitor dời về địa chỉ 2000H. Do đó khi lập trình, ta phải dời bảng vector ngắt lên địa chỉ 2000H như sau HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 63/80 Hình 46 Lập trình ngắt dùng assembly, với bảng vector ngắt tại 2000H Nếu sử dụng C để lập trình, ta chỉnh các thông số cấu hình cho project như đã nói ở phần lập trình C và lập trình bình thường Hình 47 Lập trình ngắt dùng C Dòng 15: "void T0ISR (void) interrupt 1 using 0" có ý nghĩa khai báo hàm T0ISR là trình phục vụ ngắt cho ngắt Timer 0 (ngắt số 1 trong bảng sau) và sử dụng bank thanh ghi 0 HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 64/80 HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 65/80 CHƯƠNG 9 THÍ NGHIỆM ĐIỀU KHIỂN ADC 9.1 LÝ THUYẾT CƠ BẢN Vi mạch ADC được sử dụng để chuyển đổi các tín hiệu từ dạng tương tự sang dạng số. Cũng cần phải nói thêm về tín hiệu tương tự. Đó là các tín hiệu liên tục trong miền thời gian và biên độ. Trong thực tế, hầu hết các tín hiệu vật lý đều tồn tại dưới dạng tương tự. Muốn xử lý được các tín hiệu này bằng các hệ thống số thì cần phải chuyển đổi các tín hiệu tương tự này sang dạng số và vi mạch ADC (Analog to Digital Converter) thực hiện công việc đó. 9.2 THIẾT KẾ PHẦN CỨNG Kit thí nghiệm sử dụng vi mạch chuyển đổi ADC0809. Sơ đồ kết nối như hình sau Hình 48 Sơ đồ kết nối với ADC0809 Có thể thấy là ADC0809 được thiết kế để giao tiếp với 8051 thông qua cơ chế 3 bus. Tín hiệu giải mã địa chỉ cho ADC được lấy ra từ mạch giải mã địa chỉ 74x138. Các tín hiệu điều khiển HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 66/80 chủ yếu là START và OE đều được tổ hợp từ tín hiệu giải mã địa chỉ nCS2. Tần số chuyển đổi của ADC (tín hiệu CLK) được chia ra từ tín hiệu dao động của 8051 bằng IC đếm 74x393. Tín hiệu EOC (tích cực khi đã chuyển đổi xong được nối đến header để sử dụng khi cần). ADC0809 có thể chuyển đổi lên đến 8 kênh. Trong đó kênh 0 đã được nối sẵn đến một biến trở để người sử dụng có thể thử nghiệm hoạt động của ADC một cách nhanh chóng. Để chọn kênh, 3 đường địa chỉ thấp của bus địa chỉ (A0, A1, A2) đã được sử dụng. Như vậy, người lập trình có thể truy xuất đến 8 địa chỉ thấp nhất của nCS2 để truy xuất đến 8 kênh này. 9.3 PHẦN MỀM GIAO TIẾP Vì ADC0809 được thiết kế để hoạt động với cơ chế 3 bus và tín hiệu giải mã địa chỉ là từ chân nCS2 nên người lập trình cần dùng các lệnh truy xuất không gian bộ nhớ dữ liệu ngoài để truy cập ADC, cụ thể là lệnh MOVX. Các bước cụ thể gồm: thứ nhất, người lập trình cần yêu cầu ADC0809 thực hiện chuyển đổi một kênh cụ thể bằng cách tích cực tín hiệu START và 3 đường địa chỉ (dùng tín hiệu ALE). Với kết nối phần cứng này, khi tín hiệu START tích cực thì đường ALE cũng tích cực. Như vậy chỉ cần dùng một lệnh ghi ra ngoại vi tại địa chỉ tương ứng là được MOV DPTR, #nCS2 ; kết hợp địa chỉ ADC với địa chỉ kênh MOVX @DPTR, A ; ra lệnh chuyển đổi kênh tương ứng Sau khi chờ một khoảng thời gian (thường lấy khoảng 100us), hoặc chờ mức tích cực trên chân EOC, người lập trình cần đọc từ ADC bằng cách tích cực chân OE. Điều này cũng được thực hiện bằng lệnh đọc ngoại vi MOVX A, @DPTR HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 67/80 CHƯƠNG 10 THÍ NGHIỆM GIAO TIẾP CẢM BIẾN NHIỆT ĐỘ 10.1 LÝ THUYẾT CƠ BẢN DS18S20 là vi mạch số đo độ C 9-bit với chức năng cảnh báo khi nhiệt độ vượt quá một ngưỡng trên hoặc dưới lập trình được. Vi mạch thông tin trên bus 1 dây (1-Wire bus), tức là chỉ cần 1 chân port để thông tin giữa cảm biến và MCU. Tầm đo của vi mạch trong khoảng - 55oC đến +125oC với độ chính xác tối đa là 0.5oC. Bên cạnh đó, DS18S20 có thể được cấp nguồn trực tiếp thông qua đường dữ liệu. Mỗi DS18S20 có chứa một mã nối tiếp 64-bit duy nhất, điều đó cho phép nhiều vi mạch có thể cùng hoạt động trên cùng bus 1 dây. DS18S20 gồm 3 chân: GND, DQ, và VDD, trong đó DQ là chân vào và ra của dữ liệu. Giao thức bus 1 dây (1-Wire) là một giao thức được Dallas định nghĩa. Đường điều khiển cần có điện trở kéo lên vì tất cả các vi mạch đều được kết nối đến bus thông qua 1 cổng 3 trạng thái hoặc cực máng hở (chân DQ). Trong hệ thống bus này, MCU (master) nhận dạng và định địa chỉ các vi mạch trên bus bằng mã địa chỉ 64-bit. Vì mỗi vi mạch có một mã nhận dạng 64- bit duy nhất nên gần như là không giới hạn số vi mạch kết nối trên bus. 10.2 Sơ đồ khối DS18S20 Chức năng cốt lõi của DS18S20 là chuyển đổi trực tiếp nhiệt độ thành tín hiệu số. Ngõ ra cảm biến nhiệt có độ phân giải 9-bit, tương ứng 0.5oC mỗi bước. DS18S20 khởi động ở trạng thái nghỉ công suất thấp, để khởi động đo nhiệt độ và chuyển đổi tương tự sang số, MCU (master) phải thực hiện lệnh Convert T [44h]. Sau khi chuyển đổi, kết quả được lưu vào thanh ghi nhiệt độ 2-byte trong bộ nhớ và DS18S20 trở lại trạng thái nghỉ. HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 68/80 Dữ liệu ngõ ra của DS18S20 được hiệu chỉnh theo độ C. Dữ liệu nhiệt độ được lưu trữ dưới dạng số bù 2 16-bit (mở rộng dấu). Bit dấu (S) chỉ nhiệt độ dương (S=0) hay âm (S=1). Định dạng thanh ghi nhiệt độ Mối quan hệ giữa dữ liệu số và nhiệt độ Sau khi DS18S20 thực hiện chuyển đổi nhiệt độ, giá trị này được so sánh với giá trị nhiệt độ cảnh báo được lưu trong 2 thanh ghi 8-bit TH và TL. Tuy nhiên chỉ các bit từ 8 đến 1 trong thanh ghi nhiệt độ được so sánh. Nếu nhiệt độ ngoài ngưỡng, tức là cao hơn TH hoặc thấp hơn TL, thì một điều kiện cảnh báo xuất hiện và cờ cảnh báo được đặt lên bên trong DS18S20. Nếu nhiệt độ trở lại bình thường thì điều kiện cảnh báo bị tắt ở lần chuyển đổi nhiệt độ kế tiếp. Định dạng thanh ghi TH và TL Bộ nhớ DS18S20 được tổ chức như sau HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 69/80 Bản đồ bộ nhớ DS18S20 Bộ nhớ DS18S20 bao gồm bộ nhớ RAM và bộ nhớ EEPROM để lưu trữ thanh ghi cảnh báo TH và TL. Byte 0 và 1 của bộ nhớ RAM chứa LSB và MSB của thanh ghi nhiệt độ. Các byte này là chỉ đọc. Byte 2 và 3 dùng để truy xuất thanh ghi TH và TL. Byte 4 và 5 được dành riêng để sử dụng bên trong vi mạch. Byte 6 và 7 chứa các thanh ghi COUNT REMAIN và COUNT PER oC, được dùng để tính các kết quả phân giải mở rộng (xem thêm trong mô tả kỹ thuật của DS18S20, phần OPERATION – MEASURING TEMPERATURE). Byte 8 là byte chỉ đọc và chứa CRC của byte từ 0 đến 7 của bộ nhớ RAM. Dữ liệu được viết vào byte 2 và 3 của RAM sử dụng lệnh Write Scratchpad [4Eh]; dữ liệu được phát với LSB của byte 2. Bộ nhớ RAM có thể được đọc sử dụng lệnh Read Scratchpad [BEh] sau khi viết dữ liệu. Khi đọc bộ nhớ RAM, dữ liệu được phát với LSB của byte 0. Để chuyển TH và TL từ RAM vào bộ nhớ EEPROM, MCU (master) phải thực thi lệnh Copy Scratchpad [48h]. Hệ thống bus 1 dây (1-Wire bus) Hệ thống này sử dụng một master (chủ của bus) để điều khiển một hoặc nhiều slave (tớ của bus). DS18S20 luôn là slave. Khi chỉ có một slave, hệ thống được gọi là “single-drop”, khi có nhiều slave, hệ thống được gọi là “multi-drop”. Tất cả dữ liệu và lệnh đều được phát với LSB trước tiên. Mỗi thiết bị giao tiếp với đường dữ liệu thông qua cổng 3 trạng thái hoặc cực máng hở. Khả năng này cho phép thiết bị giải phóng đường dữ liệu khi thiết bị không phát dữ liệu đến bus, do đó bus có sẵn để các thiết bị khác sử dụng. Bus 1 dây cần một điện trở kéo lên khoảng 5k, HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 70/80 do đó trạng thái nghỉ của bus là mức cao. Nếu bus được giữ ở mức thấp nhiều hơn 480μs, các thiết bị trên bus sẽ bị reset. Chuỗi thao tác để truy xuất DS18S20 như sau: Khởi động: bao gồm một xung reset được phát bởi master, và xung có mặt được phát bởi slave. Định thì khởi động Lệnh ROM: sau khi master phát hiện được sự có mặt của slave, nó có thể ra lệnh ROM. Các lệnh này hoạt động trên các mã 64-bit duy nhất của mỗi slave và cho phép master truy xuất đến một thiết bị cụ thể trên bus. Các lệnh này cũng cho phép master xác định loại và số lượng thiết bị trên bus. Có 5 lệnh ROM, mỗi lệnh dài 8-bit, bao gồm SEARCH ROM [F0h], READ ROM [33h], MATCH ROM [55h], SKIP ROM [CCh], ALARM SEARCH [ECh]. Lệnh chức năng DS18S20: sau khi master đã dùng lệnh ROM để xác định được slave mà nó cần thông tin, master có thể ra các lênh chức năng DS18S20. Các lệnh này bao gồm: CONVERT T [44h], WRITE SCRATCHPAD [4Eh], READ SCRATCHPAD [BEh], COPY SCRATCHPAD [48h], RECALL E2 [B8h], READ POWER SUPPLY [B4h]. HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 71/80 Định thì khe thời gian đọc/ghi HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 72/80 Lưu đồ lệnh ROM HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 73/80 Lưu đồ lệnh chức năng DS18S20 Chuỗi thao tác này là bắt buộc cho mỗi lần truy xuất DS18S20. 10.3 THIẾT KẾ PHẦN CỨNG Tín hiệu giao tiếp giữa 8051 và DS18S20 thông qua chuẩn 1-Wire là P3.4. Như vậy, người sử dụng cần bật ON switch này trên SW-CC4. HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 74/80 Hình 49 Sơ đồ kết nối DS18B20 10.4 PHẦN MỀM GIAO TIẾP Người lập trình cần dùng các lệnh SETB, CLR để thao tác trên bit P3.4 theo giao thức điều khiển DS18S20. JE01 SENSOR_CON 1 2 3 RE01 10k VCC VCC SENSOR_OUT = P3.4 SENSOR_OUT HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 75/80 CHƯƠNG 11 THÍ NGHIỆM VỚI VI MẠCH DAC MCP4922 11.1 LÝ THUYẾT CƠ BẢN Vi mạch chuyển đổi DAC được sử dụng để chuyển tín hiệu từ dạng số sang dạng tương tự. DAC thường được dùng để tạo ngõ ra giao tiếp giữa hệ thống số với thế giới analog bên ngoài. Vi mạch DAC MCP4922 là vi mạch chuyển đổi số sang tương tự 12-bit dùng giao tiếp SPI của Microchip. Dưới đây là bảng chức năng chân của vi mạch Chân VDD là ngõ vào nguồn cung cấp dương, điện áp có thể thay đổi từ 2.7V đến 5.5V. Chân nCS là chân ngõ vào cho phép của vi mạch. Chân này phải được giữ ở mức thấp để cho phép vi mạch làm việc. SCK là ngõ vào clock nối tiếp. SDI là chân ngõ vào dữ liệu nối tiếp tương thích SPI. Ngõ vào nLDAC ở mức thấp sẽ cho phép chuyển thanh ghi chốt ngõ vào sang thanh ghi DAC.(chốt ngõ ra). Chân này cũng có thể nối đến GND nếu dùng cạnh lên của nCS. Chân nSHDN ở mức thấp sẽ làm cho DAC ở vào trạng thái nghỉ. Các ngõ ra DAC là VOUTA và VOUTB. Tín hiệu ngõ ra này thay đổi giữa AVSS và VDD, trong đó chân AVSS là chân GND của tín hiệu analog. Các ngõ vào VREFA và VREFB là các ngõ vào điện áp tham khảo. 11.2 THIẾT KẾ PHẦN CỨNG Trên kit thí nghiệm, vi mạch MCP4922 được thiết kế giao tiếp với MCU thông qua giao tiếp SPI. Các tín hiệu SCK, SDI, nLDAC, và DAC_nCS từ MCP4922 được nối đến DIP-SW4 cấu hình trước khi nối vào MCU. Do đó, cần bật ON các switch này để kết nối tín hiệu điều khiển của EME-MC8 vào module MCU tương ứng. HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ Như vậy, để điều khiển các tín hiệu n bằng các lệnh thông qua thanh ghi port P1. 11.3 PHẦN MỀM GIAO TIẾP Vì tín hiệu điều khiển MCP4922 cho phép thao tác trên thanh ghi P1 từ 8051 vào MCP4922 CLR SCK MOV SDI, C SETB SCK Ví dụ để xuất các mức điện áp 0V, 1V, 2.5V, 4V, và 5V ra ngõ ra c trình có thể làm như sau: Vì MCP4922 là DAC 12-bit với điện áp tha 5V/4096 = 1.22mV/LSB. Như v cần xuất ra MCP4922 để tạo ra các mức điện áp nh Vì độ phân giải này có thể tạo ra sai số ở ng vi mạch tạo điện áp tham khảo chính xác MCP1541. Vi mạch n xác ở ngõ ra, do đó, MCP4922 sẽ có độ phân giải l Dùng các chương trình dịch dữ liệu v ày, người lập trình cần truy xuất đến các bit trên port 1 được kết nối trực tiếp đến các bit của port 1 n . Ví dụ đoạn mã sau có thể được dùng để dịch 1 bit ; tạo xung clock ; dịch cờ C ; vào MCP4922 ủa MCP492 m khảo là 5V nên độ phân giải t ậy, người lập trình có thể tính ra được các giá trị nhị phân ư yêu cầu. õ ra của MCP4922 nên người thiết kế có thể d ày tạo điện áp 4.096V chính à 1mV/LSB. ào và ra ở phần trên để ghi dữ liệu vào MCP492 76/80 ên các lệnh dữ liệu 2, người lập ương ứng là ùng 2. HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ CHƯƠNG 12 12.1 LÝ THUYẾT CƠ BẢN Led ma trận có thể dùng để hiển thị thông tin đến từng điểm ảnh. Do đó, led ma trận có thể biểu diễn được chữ số, chữ cái, v (thường là màu đỏ), hoặc đa sắc. Đối với dạng đa sắc, một điểm ảnh chứa đến 2 led với m khác nhau (ví dụ màu đỏ và màu xanh lá cây). S thêm một số màu trung gian. Quá trình này có th xung điều khiển của từng màu (t cả hai chân anode và cathode của led đều đ Led ma trận Led ma trận được hiển thị bằng ph thường là 1/8 (hoặc 1/16). Điều n (hoặc 16) lần quét hàng (hoặc cột). Khi quét led ma trận cần quan tâm đến d dòng đỉnh qua led vì thông số này s phương pháp quét cột, nếu mỗi led cần d tối đa của 1 cột sẽ là 8 led x 5mA = 40mA. Tuy nhiên vì led ch của chu kỳ quét nên dòng đỉnh của xung quét phải đ Các chân của vi mạch số thường không thể cung cấp đủ d THÍ NGHIỆM VỚI LED MA TRẬN à các hình ảnh khác. Led ma trận có thể là d ử dụng phối hợp hai màu này có th ể được thực hiện bằng cách thay đổi độ rộng ức là thời gian sáng của từng led màu). Đối với led ma trận, ược đưa ra thành tín hiệu điều khiển. ương pháp quét từng hàng hoặc từng cột. Chu kỳ quét ày có nghĩa là một khung hình sẽ được hiển thị đầy đủ sau 8 òng trung bình và ẽ quyết định độ sáng của led. Ví dụ với led 8 h òng trung bình là 5mA để sáng thì dòng trung bình ỉ hiển thị trong 1/8 (hoặc 1/16) ạt đến 8x40mA = 360mA (hoặc 720mA). òng như thế này. Do đó các tín hi 77/80 ạng đơn sắc àu ể sinh ra àng dùng ệu HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 78/80 lái led cần phải được đệm với các linh kiện dòng lớn như transistor để đảm bảo đủ dòng cho từng led. Để hiển thị được một ký tự chữ hoặc số, chương trình cần một bảng font để chuyển giữa giá trị bên trong MCU thành giá trị hiển thị lên led ma trận tương tự như với led 7 đoạn. Bảng font này có thể được ghi trực tiếp vào chương trình. 12.2 THIẾT KẾ PHẦN CỨNG Led ma trận trên kit là led có kích thước 8x8 với phương pháp quét led là quét cột (vì mỗi cột đã được đệm với dãy transistor ULN2803 có dòng tối đa lên đến 500mA). Led có hàng là anode và cột là cathode. Thiết kế sẽ sử dụng vi mạch ULN2803 cho phép kéo dòng lên đến 500mA ở phía cột và BJT B562 ở phía hàng vì phía cột sẽ gánh dòng tối đa lên đến 8 led đồng thời. Để hiển thị một điểm ảnh thì dữ liệu xuất ra trên hàng phải là mức 0 vì khi đó khóa BJT sẽ dẫn làm cho hàng được cấp nguồn VCC, dữ liệu xuất trên cột sẽ là mức 1 vì ULN2803 hoạt động như cổng đảo nên tín hiệu lái cột sẽ có điện áp là mức 0 (tức là gần GND) cho phép các led trên cột tương ứng được sáng. Hình 50 Sơ đồ mạch phía cột của khối led ma trận Hình 51 Sơ đồ mạch phía hàng của khối led ma trận HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 79/80 Các tín hiệu dữ liệu hàng và cột được thiết kế theo phương pháp 3 bus. Do đó, led ma trận được điều khiển thông qua hai vi mạch chốt 74x573, một chốt dữ liệu của từng hàng và một dùng để chọn cột quét. Tín hiệu cho phép chốt dữ liệu được tổ hợp từ tín hiệu giải mã địa chỉ và tín hiệu cho phép ghi nWR. Giải mã địa chỉ được thiết kế bằng 74138 với địa chỉ cụ thể của hàng và cột có thể xem trong bản đồ bộ nhớ. 12.3 PHẦN MỀM GIAO TIẾP Để có thể hiển thị lên led ma trận, phương pháp được chọn là quét cột. Mỗi cột sẽ được hiển thị trong một khoảng thời gian nhất định sau đó chuyển sang cột kế tiếp. Vì led ma trận có kích thước 8x8 nên xung dòng quét cột sẽ là 1/8. Để đảm bảo hiển thị rõ, toàn bộ bảng hiển thị phải được quét trong vòng trước 40ms (25 hình/s). Như vậy mỗi cột sẽ có thời gian hiển thị tối đa là 5ms (tuy nhiên nên dùng thời gian trễ là 1ms). Nếu thời gian hiển thị nhỏ hơn thì tần số quét sẽ tăng, tuy nhiên lúc này dòng trung bình có thể không đủ để led sáng tốt. Do đó không thể giảm thời gian quét xuống quá nhỏ, trung bình nên chọn vào khoảng 1-3ms (giá trị cụ thể còn tùy thuộc vào loại led). Trước tiên, người lập trình cần chuyển đổi giá trị cần hiển thị thành dạng có thể hiển thị lên led ma trận bằng cách dùng phương pháp tra bảng để tra trên bảng font. Lưu ý là một dữ liệu hiển thị sẽ được chuyển thành 8 byte dữ liệu hiển thị (vì led ma trận có 8 cột). Để hiển thị được 1 cột, người lập trình cần xuất 1 byte ra hàng (1 byte trong 8 byte tra được từ bảng font), cho phép cột đó, chờ một khoảng thời gian và chuyển sang hiển thị cột kế tiếp với qui trình tương tự. Sau khi hết 8 cột, qui trình hiển thị được lặp lại từ đầu. Ví dụ ta muốn hiển thị ký tự chữ A lên led ma trận. Hình 52 Chữ A trên led ma trận 8x8 HƯỚNG DẪN THÍ NGHIỆM VI XỬ LÝ 80/80 Để có thể hiển thị được chữ A lên led ma trận, trước tiên cần xác định địa chỉ của chốt hàng và cột bằng bản đồ bộ nhớ. Địa chỉ này sẽ được dùng để xuất các dữ liệu ra led. Bước kế tiếp là chuẩn bị dữ liệu để xuất. Vì phương pháp quét là quét cột nên dữ liệu xuất ra cột sẽ lần lượt là 10000000B, 01000000B, 00100000B, 00010000B, 00001000B, 00000100B, 00000010B, 00000001B (mức tích cực của 1 cột là mức cao). Mỗi lần xuất cách nhau 1ms, sau khi đã chuẩn bị dữ liệu trên hàng. Dữ liệu xuất trên hàng sẽ được lấy ra bằng phương pháp tra bảng. Nhìn vào hình ảnh của chữ A dự định hiển thị, ta có thể xác định được các mã xuất ra 8 hàng của 1 cột lần lượt là 03h, 0EDh, 0EEh, 0EEh, 0EDh, 03h, 0FFh, 0FFh (đây chính là font của chữ A). Dùng dẫn xuất DB để khai báo chuỗi dữ liệu này như sau CharA: DB 03h, 0EDh, 0EEh, 0EEh, 0EDh, 03h, 0FFh, 0FFh Dẫn xuất DB không phải là một lệnh của MCU. Đó là một hướng dẫn để trình biên dịch ghi sẵn các giá trị cho từng byte vào trong bộ nhớ chương trình tại địa chỉ có nhãn là CharA. Dẫn xuất này nên được đặt trong phân đoạn dữ liệu hoặc cuối của chương trình chính. MCU sẽ dùng chuỗi lệnh sau để thực hiện tra bảng (look-up table) MOV A, #n ; n = cột cần hiển thị MOV DPTR, #CharA MOVC A, @A+DPTR Để đọc được mã của chữ A cần hiển thị tại cột thứ n. Lúc này n sẽ thay đổi từ 0 (cho cột đầu tiên) đến 7 (cho cột cuối cùng). Quá trình này sẽ được lặp liên tục.

Các file đính kèm theo tài liệu này:

  • pdflabmanual_cs2_8218.pdf
Tài liệu liên quan