Giáo trình vi điều khiển – Vi xử lý

Chuẩn giao tiếp I2C là chuẩn giao tiếp 2 dây: gồm tín hiệu SDA(tín hiệu dữ liệu) và tín hiệu xung Clock SCL. Chuẩn giao tiếp I2C có giao thức kiểu Master/Slaver. Trong đó, thiết bị chủ điều khiển mọi hoạt động của quá trình giao tiếp. Các ưu điểm: - Đơn giản, tốc độ truyền nhanh - Giao diện nối tiếp - Đồng bộ - Hai chiều I2C là giao tiếp đồng bộ: - Dữ liệu được truyền theo tín hiệu xung clock (SCL) - Tín hiệu SCL điều khiển khi nào thì dữ liệu thay đổi và khi nào thì dữ liệu được đọc I2C là giao tiếp master/slaver: - Master sẽ là nơi phát xung clock (SCL), do đó nó sẽ điều khiển quá trình truyền nhận - Tín hiệu xung clock (SCL) là chung cho tấc cả các Slaver - Slaver chỉ có thể đưa tín hiệu SCL xuống mức thấp để ngăn chặn cuộc truyền I2C là giao tiếp 2 chiều:

pdf131 trang | Chia sẻ: nguyenlam99 | Lượt xem: 1074 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Giáo trình vi điều khiển – Vi xử lý, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA INT SODEM; //CHUONG TRINH CON PHUC VU NGAT DAT SAU #INT_EXT #INT_EXT VOID NGATNGOAI() { // XOA CO NGAT NGOAI CLEAR_INTERRUPT(INT_EXT); // CAM NGAT TRONG CHUONG TRINH CON PHUC VU NGAT DISABLE_INTERRUPTS(GLOBAL); SODEM++; // CHO PHEP NGAT TOAN CUC ENABLE_INTERRUPTS(GLOBAL); } VOID HIENTHI(INT A) { INT HC, HDV; HC=A/10; HDV=A%10; OUTPUT_LOW(PIN_A4); OUTPUT_D(MAP[HC]); DELAY_MS(15); OUTPUT_HIGH(PIN_A4); GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA OUTPUT_LOW(PIN_A5); OUTPUT_D(MAP[HDV]); DELAY_MS(15); OUTPUT_HIGH(PIN_A5); } VOID MAIN() { // CAI DAT VAO RA CHO CONG B SET_TRIS_B(0xFF); // CHO PHEP NGAT NGOAI ENABLE_INTERRUPTS(INT_EXT); // CAI DAT SUON NGAT EXT_INT_EDGE(H_TO_L); // CHO PHEP NGAT TOAN CUC ENABLE_INTERRUPTS(GLOBAL); // VONG LAP DOI NGAT WHILE(1) { HIENTHI(SODEM); } } Như vậy, lúc viết chương trình có dùng ngắt bằng CCS, ta có những lưu ý sau: GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA - Trong chương trình chính (main), chúng ta cài đặt ngắt: cho phép ngắt cụ thể, cho phép ngắt toàn cục. Đợi ngắt - Chương trình con xử lý ngắt là chương trình con nằm ngay sau chỉ thị biên dịch #INT_XXX, trong đó XXX là tên của ngắt cụ thể. Ví dụ: #INT_EXT: ngắt ngoài - Trong chương trình con xử lý ngắt: xóa cờ ngắt, cấm ngắt toàn cục đề phòng khi đang xử lý ngắt có ngắt xảy ra. Sau khi xử lý dữ liệu trong chương trình con xử lý ngắt, ta cho phép ngắt toàn cục lại. Tên một số ngắt của PIC như sau: - INT_EXT: ngắt ngoài - INT_TIMER0: ngắt timer 0 - INT_TIMER1: ngắt timer 1 - INT_TIMER2: ngắt timer 2 - INT_RDA: ngắt nhận đủ kí tự trong truyền thông máy tính - INT_RB: ngắt thay đổi trạng thái các chân RB7-RB4 Trong phần tiếp theo, ta sẽ khảo sát một số ngắt tiêu biểu như ngắt ngoài INT, ngắt thay đổi trạng thái các chân cao PORTB, ngắt tràn Timer 0, ngắt tràn Timer 1. Các ngắt ngoại vi khác sẽ được nhắc đến khi nghiên cứu các modun ngoại vi này. 6.4 Ngắt ngoài: 6.4.1 Hoạt động: - Nguồn ngắt: là xung đi vào chân RB0 của vi điều khiển PIC - Sự kiện ngắt: sự kiện ngắt xảy ra khi có xung đi vào chân RB0 của vi điều khiển. Xung là xung sườn dương hay sườn âm phụ thuộc bit cài đặt chọn dạng xung, bit INTEDG ( bit 6 của thanh ghi PTION_REG) là 1 hay không. - Bit cho phép ngắt: Để cho phép ngắt ngoài, bit cho phép ngắt ngoài INTIE (bit 4 của thanh ghi INTCON) phải được set lên 1. Ngoài ra, bit cho phép ngắt toàn cục GIE (bit 7 của thanh ghi INTCON) cũng phải được set lên 1. - Cờ ngắt: bit cờ ngắt ngoài là bit INTIF (bit 1 của thanh ghi INTCON) được tự động set lên 1 khi có sự kiện ngắt ngoài xảy ra. Cờ này phải được xóa bằng chương trình (cụ thể là trong chương trình con phục vụ ngắt) để vi điều khiển quản lý chính xác các lần ngắt kế tiếp. GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA 6.4.2 Quản lý ngắt ngoài trong chương trình CCS: Trong chương trình chính, cài đặt ngắt: - Cài đặt chân RB0 là chân vào: SET_TRIS_B(0x01) - Cài đặt dạng xung đầu vào là sườn dương hay sườn âm: EXT_INT_EDGE(H_TO_L) hoặc EXT_INT_EDGE(L_TO_H) - Cho phép ngắt ngoài: ENABLE_INTERRUPTS(INT_EXT) - Cho phép ngắt toàn cục: ENABLE_INTERRUPTS(GLOBAL) Chương trình con phục vụ ngắt đặt sau chỉ định biên dịch #INT_EXT: #INT_EXT Định nghĩa chương trình con Trong chương trình con phục vụ ngắt: - Xóa cờ ngắt: CLEAR_INTERRUPT(INT_EXT) - Cấm ngắt toàn cục, đề phòng lúc đang xử lý ngắt, lại có ngắt xảy ra: DISABLE_INTERRUPTS(GLOBAL) - Xử lý ngắt đó: tùy thuộc vào ý đồ của người lập trình - Cho phép ngắt toàn cục: ENABLE_INTERRUPTS(GLOBAL) 6.5 Ngắt Thay Đổi Trạng Thái Các Chân RB7-RB4: 6.5.1 Hoạt động: - Nguồn ngắt: là trạng thái của một trong các chân RB7-RB4 của vi điều khiển PIC - Sự kiện ngắt: sự kiện ngắt xảy ra khi có sự thay đổi trạng thái (1-0 hay 0-1) của một trong các chân RB7-RB4 của PortB - Bit cho phép ngắt: Để cho phép ngắt này, bit cho phép ngắt RBIE (bit 3 của thanh ghi INTCON) phải được set lên 1. Ngoài ra, bit cho phép ngắt toàn cục GIE (bit 7 của thanh ghi INTCON) cũng phải được set lên 1. - Cờ ngắt: bit cờ ngắt ngoài là bit RBIF (bit 0 của thanh ghi INTCON) được tự động set lên 1 khi có sự kiện ngắt ngoài xảy ra. Cờ này phải được xóa bằng chương trình (cụ thể là trong chương trình con phục vụ ngắt) để vi điều khiển quản lý chính xác các lần ngắt kế tiếp. GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA Lưu ý quan trọng: Khi sử dụng ngắt này trong các ứng dụng xử lý các xung đầu vào RB4-RB7, ví dụ như phím bấm chẳng hạn, ta cần lưu ý điểm sau. Giả sử như ban đầu phím bấm chưa bấm, đầu vào RB ở mức 1, khi bấm phím RB xuống mức 1, như vậy có 1 sự kiện ngắt xảy ra. Tuy nhiên, khi thả phím bấm ra, RB lên mức 1, tức cũng có một sự thay đổi trạng thái của chân RB7-RB4, nên cũng có ngắt xảy ra. Vì vậy, việc ấn và nhả phím bấm được tính 2 lần ngắt. Cần để ý điều này khi lập trình. Vấn đề thứ 2 là cần sử dụng một lệnh đọc cổng B để loại bỏ trạng thái mismatch lúc xảy ra ngắt ở các chân này. 6.5.2 Quản lý ngắt RB trong chương trình CCS: Trong chương trình chính, cài đặt ngắt: - Cài đặt chân RB4-RB7 là chân vào: SET_TRIS_B(0xF0) - Cho phép ngắt RB: ENABLE_INTERRUPTS(INT_RB) - Cho phép ngắt toàn cục: ENABLE_INTERRUPTS(GLOBAL) Chương trình con phục vụ ngắt đặt sau chỉ định biên dịch #INT_RB: #INT_RB Định nghĩa chương trình con Trong chương trình con phục vụ ngắt: - Xóa cờ ngắt: CLEAR_INTERRUPT(INT_RB) - Cấm ngắt toàn cục, đề phòng lúc đang xử lý ngắt, lại có ngắt xảy ra: DISABLE_INTERRUPTS(GLOBAL) - Đoc cổng B để loại bỏ trạng thái mismatch - Xử lý ngắt đó: tùy thuộc vào ý đồ của người lập trình, chú ý đến số lần ngắt - Cho phép ngắt toàn cục: ENABLE_INTERRUPTS(GLOBAL) 6.6 Ngắt Timer 0: 6.6.1 Hoạt động: - Nguồn ngắt: là trạng thái tràn của thanh ghi bộ đếm timer 0, TMR0 vi điều khiển PIC GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA - Sự kiện ngắt: sự kiện ngắt xảy ra khi có sự tràn của TMR0, tức là khi TMR0=255 rồi bị xóa - Bit cho phép ngắt: Để cho phép ngắt này, bit cho phép ngắt TMR0IE (bit 5 của thanh ghi INTCON) phải được set lên 1. Ngoài ra, bit cho phép ngắt toàn cục GIE (bit 7 của thanh ghi INTCON) cũng phải được set lên 1. - Cờ ngắt: bit cờ ngắt ngoài là bit TMR0IF (bit 2 của thanh ghi INTCON) được tự động set lên 1 khi có sự kiện ngắt ngoài xảy ra. Cờ này phải được xóa bằng chương trình (cụ thể là trong chương trình con phục vụ ngắt) để vi điều khiển quản lý chính xác các lần ngắt kế tiếp. 6.6.2 Quản lý ngắt Timer 0 trong chương trình CCS: Trong chương trình chính, cài đặt ngắt: - Gán giá trị ban đầu cho thanh ghi TMR0, tùy thuộc vào thời gian mà người lập trình muốn (xem lại bài 3): SET_TIMER0(giá trị) - Cho phép ngắt timer 0: ENABLE_INTERRUPTS(INT_TIMER0) - Cho phép ngắt toàn cục: ENABLE_INTERRUPTS(GLOBAL) Chương trình con phục vụ ngắt đặt sau chỉ định biên dịch #INT_TIMER0: #INT_TIMER0 Định nghĩa chương trình con Trong chương trình con phục vụ ngắt: - Xóa cờ ngắt: CLEAR_INTERRUPT(INT_TIMER0) - Cấm ngắt toàn cục, đề phòng lúc đang xử lý ngắt, lại có ngắt xảy ra: DISABLE_INTERRUPTS(GLOBAL) - Xử lý ngắt đó: tùy thuộc vào ý đồ của người lập trình, chú ý đến số lần ngắt - Gán lại giá trị ban đầu cho thanh ghi TMR0 (tùy thuộc vào ý đồ của người lập trình): SET_TIMER0(giá trị) - Cho phép ngắt toàn cục: ENABLE_INTERRUPTS(GLOBAL) GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA CHƯƠNG 7: MỘT SỐ ỨNG DỤNG CỦA VI ĐIỀU KHIỂN ỨNG DỤNG 1: CÁC PHƯƠNG PHÁP HIỂN THỊ TRONG CÁC THIẾT BỊ DÙNG VI ĐIỀU KHIỂN Hiện nay, trong hầu hết các thiết bị nhúng đều có sử dụng các khối hiển thị. Mục đích cho người dùng giám sát, cài đặt và hiển thị các thông số của thiết bị cũng như đối tượng cần giám sát điều khiển. Có rất nhiều phương pháp hiển thị, có thể kể ra như sau: - Hiển thị cảnh báo, báo lỗi: thông thường dùng led đơn. Có thể hiển thị theo kiểu dùng nhiều màu khác nhau hoặc bật tắt v.v - Hiển thị số liệu: dùng led 7 đoạn, LCD hoặc LCD đồ họa v.v - Hiển thị trên máy tính: dùng các phần mềm điều khiển giám sát, kết nối thiết bị và máy tính thông qua chuẩn RS232 hoặc các chuẩn mạng (giám sát từ xa) Trong bài này sẽ giới thiệu 2 cách hiển thị đầu, phần hiển thị bằng máy tính sẽ được đề cập trong bài học về chuẩn giao tiếp RS232. 7.1 Hiển thị bằng led đơn: Đây là cách hiển thị đơn giản nhất. Thông thường cách hiển thị này dùng để báo một trạng thái nào đấy của thiết bị như trạng thái làm việc của nguồn (lỗi hoặc không lỗi), cũng như các khối chức năng khác. Có rất nhiều loại led đơn dùng để hiển thị. Phương pháp đơn giản như sau: Hình 2.1: Hiển thị led đơn GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA Các led này sáng khi được cấp áp cỡ 2 V, dòng 10-20mA. Nếu dùng một chân ra từ vi điều khiển để bật tắt led, phải dùng thêm điện trở hạn dòng,hạn áp. Tính toán như sau: Muốn bật đèn, ta cho chân ra vi điều khiển lên mức cao nối với đầu vào của mạch trên. Như ta biết, chân ra vi điều khiển ở mức logic cao có điện áp 5V. Cho điện áp rơi trên led là 2V, dòng qua là 15mA. Suy ra, điện áp rơi trên trở là 3V. Dòng qua led chính là dòng qua điện trở và bằng 15mA. Suy ra, điện trở dùng: R=3/15mA=200 ohm. Chọn điện trở tiêu chuẩn 220 ohm (Điện trở tiêu chuẩn: 10, 11, 12, 13, 15, 16, 18, 20, 22, 24, 27, 30, 33, 36, 39, 43, 47, 51, 56, 62, 68, 72, 82, 91 và các bội số) 7.2 Hiển thị bằng led bảy đoạn- 7 segment led: 7.2.1 Cấu tạo của led 7 đoạn: Hình 2.2: Led 7 đoạn Một led 7 đoạn thực ra là gồm 7 led đơn nối với nhau (8 led đơn nêu có thêm dấu chấm-dp). Có 2 loại: GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA - Chung catod: các đầu catod (cực âm) được nối chung với nhau và nối với đất, các đầu anod a,b,c,d,e,f,g,h được đưa ra ngoài (các chân) nhận tín hiệu điều khiển. Khi cấp điện áp 5v cho mỗi đầu anod, led tương ứng với đầu đó sẽ sáng - Chung anod: các đầu anod (cực âm) được nối chung với nhau và nối với nguồn, các đầu catod a,b,c,d,e,f,g,h được đưa ra ngoài (các chân) nhận tín hiệu điều khiển. Muốn led đơn nào sáng chỉ việc đưa chân catod của led tương ứng xuống mức 0V. Hình 2.3: Cấu tạo của 2 loại led 7 đoạn 7.2.2 Hiển thị 1 led 7 đoạn dùng vi điều khiển: GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA Như đã giới thiệu ở phần trên, thực chất led 7 đoạn gồm 8 hoặc 7 led đơn nối với nhau. Vì vậy để điều khiển thanh led đơn sáng, cách thực hiện phần cứng như hình 2.1. Cụ thể hơn, như dùng led chung anod như hình vẽ trên. Mỗi đầu vào a,b,c,d,e,f,g,h được nối với một chân của vi điều khiển, tương ứng là RB0, RB1, ..RB7, thông qua các điện trở phân áp 200 ohm, đầu anod chung được nối với nguồn. Để led đơn sáng đơn giản ta đưa chân vi điều khiển nối với led đó xuống mức thấp. Như trên hình 2.4 trên, để led 7 đoạn hiển thị số 2 thì các led a,b,d,e,g sáng; các led c, f tắt. Giá trị sáng tương ứng chân vi điều khiển nối vào ở mức 0, giá trị tắt tương ứng với chân vi điều khiển nối với ở mức 1. Do đó nội dung của thanh ghi PORTB là: 0 0 1 0 0 1 0 0 Đây là mã led 7 đoạn của số 2 Như vậy, chúng ta lưu ý một điều rằng, dữ liệu xuất ra led 7 đoạn là mã led tương ứng với số cần xuất Mã led tương ứng với các số từ 0 đến 9 là: 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 Cách điều khiển led 7 đoạn chung catod thì ngược lại. 7.2.3 Hiển thị nhiều led 7 đoạn dùng vi điều khiển: Trong thực tế, ta phải dùng nhiều led 7 đoạn để hiển thị. Vậy giải quyết việc hiển thị nhiều led như thế nào? Ví dụ: để hiển thị số 35 bằng 2 led 7 đoạn. Đối chiếu với cách hiển thị 1 led 7 đoạn, ta nghĩ đơn giản chỉ là dùng 1 cổng hiển thị số 3, 1 cổng khác hiển thị số 5. GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA Như vậy ta mất 2 cổng. Hiển thị 4 led thì mất 4 cổng => toàn bộ chân trên vi điều khiển dùng cho việc hiển thị ledKhông còn chân để giao tiếp với các thiết bị khác như bàn phím, đầu vào số khác v.v Không khả thi! Ta có phương pháp tiết kiệm chân hơn để giải quyết: Hình 2.5: Hiển thị 2 led 7 đoạn Các chân dữ liệu (chân sẽ nhận mã led từ vi điều khiển) được nối tương ứng với nhau và nối vào 1 cổng của vi điều khiển, chẳng hạn như cổng B Chân nguồn của 2 led được điều khiển bởi 2 chân trên vi điều khiển, chằng hạn chân RA4 và RA5 như trên hình, thông qua cực B của 2 transistor pnp. Quá trình hiển thị con số 35 trên 2 led sẽ như sau: - Cho chân RA4 (chân nối với led hàng chục) xuống mức thấp, transistor thứ nhất mở do tiếp giáp BE thuận, chân RA5 lên mức cao (chân nối với led hàng đơn vị), transistor thứ hai không mở. Vậy chỉ có led hàng chục được cấp nguồn. - Cho cổng B xuất dữ liệu mã led của số 3. Chỉ có led hàng chục được cấp nguồn nên chỉ có led này sáng - Tạo thời gian trễ 10-20ms GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA - Điều khiển tương tự cho led hàng đơn vị được cấp nguồn, led hàng chục không cấp nguồn, xuất dữ liệu mã led số 5 ra cổng B. Led đơn vị hiển thị số 5. - Tạo thời gian trễ 10-20ms - Quay lại bước thứ nhất Như vậy, số 3 hiển thị 10ms, số 5 hiển thị 10ms và quay vòng như vậy. Thời gian này rất nhanh, do hiệu ứng của mắt, ta cảm giác như số 35 hiển thị cùng lúc. Bài toán được giải quyết, ta chỉ mất có 10 chân để điều khiển 2 led. Cách hiển thị nhiều led cũng tương tự như vậy. Cũng giải thích thêm lí do dùng transistor nối vào RA4, RA5. Do chân vi điều khiển có dòng khoảng vài chục mA, đây là chân cấp nguồn cho led 7 đoạn, mỗi led đơn trong Led 7 đoạn mất 20mA vây cả led 7 đoạn mất trên 100mA. Vì vậy ta phải dùng transistor để khuếch đại dòng. 2.3 Hiển thị dùng LCD: D 7 14 D 6 13 D 5 12 D 4 11 D 3 10 D 2 9 D 1 8 D 0 7 E 6 RW 5 R S 4 V SS 1 V D D 2 V EE 3 LM016L Hình 2.6: Các chân LCD 7.3.1 Các chân cơ bản của LCD 2 dòng 16 kí tự: • VSS: Chân đất • VCC: Chân nguồn GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA • VEE: Chân hiệu chỉnh độ sáng của LCD • RS: – =0: LCD sẽ nhận lệnh từ vi điều khiển – =1: LCD sẽ nhận kí tự từ vi điều khiển để hiển thị • R/W: – =1: Vi điều khiển đọc dữ liệu từ LCD – =0: Vi điều khiển ghi dữ liệu lên LCD Thông thường Vi điều khiển chủ yếu ghi dữ liệu lên LCD nên chân này thường nối đất • E: Chân cho phép (Enable). Sau khi lệnh hoặc dữ liệu đã được chuẩn bị trên đường dữ liệu, tạo xung mức cao-mức thấp sẽ bắt đầu quá trình LCD nhận dữ liệu hoặc lệnh từ vi điều khiển. • D0-D7: các chân dữ liệu, nơi vi điều khiển truyền lệnh hoặc dữ liệu lên LCD. 7.3.2 Khởi tạo LCD: LCD có nhiều độ làm việc, có thể kể ra như sau: - Chế độ 1 dòng hay 2 dòng - Chế độ giao tiếp 4 bit hay 8 bit - Chế độ font 5*8 hoặc 5*10 - Ngoài ra còn có thể thay đổi vị trí hiển thị kí tự v.v Vì vậy, trước khi bắt đầu quá trình hiển thị một chuỗi kí tự nào đó, ta cần quá trình khởi tạo để cài đặt các chế độ này. Vi điều khiển thực hiện quá trình khởi tạo này bắt cách ghi đến LCD một chuỗi các lệnh. Căn cứ vào chức năng của các chân vi điều khiển được giới thiệu ở trên, ta đưa ra qui trình của việc gửi một lệnh từ Vi điều khiển đến LCD: - Cho chân R/W=0 để xác định đây là ghi xuống LCD (thông thường chân này được nối đất, nên mặc định chân này ở mức 0, ta không cần quan tâm đến nữa) GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA - Cho chân RS=0 để xác định đây là lệnh mà vi điều khiển gửi xuống LCD (phân biệt với RS=1, gửi kí tự hiển thị) - Gửi mã lệnh xuống LCD theo các đường dữ liệu (RD0-RD7 nếu dùng chế độ 8 bit, R4- R7 nếu dùng chế độ 4 bit) - Đưa chân E (chân cho phép- Enable) lên mức cao, mức 1 - Tạo trễ vài chu kì lệnh - Đưa chân E xuống mức thấp, mức 0 Mã lệnh như đã giới thiệu trong phần trên tùy thuộc vào từng lệnh, ở đấy giới thiệu một số lệnh cơ bản như sau: . Lệnh cài đặt chế độ làm việc: 0 0 1 DL N F - - • DL: – = 1: 8 bit – = 0: 4 bit • N: – = 1: 2 dòng – = 0 1 dòng • F: – = 1: font 5x10 dot – = 0: font 5x8 dot . Lệnh đặt chế độ tăng giảm địa chỉ: 0 0 0 0 0 1 I/D S • I/D: – = 1 tăng địa chỉ – = 0 giảm địa chỉ GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA • S: – =1: Cài đặt di chuyển cùng địa chỉ . Lệnh đặt chế độ hiển thị: 0 0 0 0 1 D C B • D: Cho phép hiển thị • C: cài đặt hiển thị con trỏ • B: nhấp nháy vị trí kí tự . Lệnh đặt vị trí hiển thị của kí tự: 1 ĐC ĐC ĐC ĐC ĐC ĐC ĐC • Địa chỉ dòng 1: 00- 0F • Địa chỉ dòng 2: 40-4F Vì vậy, muốn hiển thị đầu dòng thứ nhất, mã lệnh sẽ là 0x80 muốn hiển thị đầu dòng thứ hai, mã lệnh sẽ là 0xC0 . Lệnh xóa màn hình: mã lệnh 0x01 . Lệnh trở về đầu dòng thứ nhất: mã lệnh 0x02 Chi tiết có thề xem datasheet đi kèm 7.3.3 Ghi kí tự lên LCD để hiển thị: Sau khi thực hiện quá trình khởi tạo để gửi các lệnh cài đặt chế độ làm việc cùa LCD, kí tự sẽ được hiển thị lên LCD bất kì khi nào vi điều khiển muốn gửi. Quá trình gửi kí tự gồm các bước sau: - Cho chân R/W=0 để xác định đây là ghi xuống LCD (thông thường chân này được nối đất, nên mặc định chân này ở mức 0, ta không cần quan tâm đến nữa) GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA - Cho chân RS=1 để xác định đây là kí tự mà vi điều khiển gửi xuống LCD (phân biệt với RS=0, gửi lệnh) - Gửi mã ascii của kí tự cần hiển thị xuống LCD theo các đường dữ liệu (RD0-RD7 nếu dùng chế độ 8 bit, R4-R7 nếu dùng chế độ 4 bit) - Đưa chân E (chân cho phép- Enable) lên mức cao, mức 1 - Tạo trễ vài chu kì lệnh - Đưa chân E xuống mức thấp, mức 0 7.3.4 Giới thiệu một thư viện cho LCD 4 bit và bài tập ứng dụng: File: LCD_lib_4bit: #include #define LCD_RS PIN_B2 #define LCD_EN PIN_B3 #define LCD_D4 PIN_B4 #define LCD_D5 PIN_B5 #define LCD_D6 PIN_B6 #define LCD_D7 PIN_B7 #define Line_1 0x80 #define Line_2 0xC0 #define Clear_Scr 0x01 #separate void LCD_Init ();// ham khoi tao LCD #separate void LCD_SetPosition ( unsigned int cX );//Thiet lap vi tri con tro #separate void LCD_PutChar ( unsigned int cX );// Ham viet1kitu/1chuoi len LCD #separate void LCD_PutCmd ( unsigned int cX) ;// Ham gui lenh len LCD #separate void LCD_PulseEnable ( void );// Xung kich hoat GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA #separate void LCD_SetData ( unsigned int cX );// Dat du lieu len chan Data //khoi tao LCD********************************************** #separate void LCD_Init () { LCD_SetData ( 0x00 ); delay_ms(20); /*Cho cho lcd khoi tao */ output_low ( LCD_RS );// che do gui lenh LCD_SetData ( 0x03 ); /* khoi tao che do 4 bit */ LCD_PulseEnable(); LCD_PulseEnable(); LCD_PulseEnable(); LCD_SetData ( 0x02 ); /* tao giao dien 4 bit */ LCD_PulseEnable(); /* send dual nibbles hereafter, MSN first */ LCD_PutCmd ( 0x2C ); /* function set (all lines, 5x7 characters) */ LCD_PutCmd ( 0x0C ); /* display ON, cursor off, no blink */ LCD_PutCmd ( 0x06 ); /* entry mode set, increment & scroll left */ LCD_PutCmd ( 0x01 ); /* clear display */ // Init for BarGraph } GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA #separate void LCD_SetPosition ( unsigned int cX ) { /* this subroutine works specifically for 4-bit Port A */ LCD_SetData ( swap ( cX ) | 0x08 ); LCD_PulseEnable(); LCD_SetData ( swap ( cX ) ); LCD_PulseEnable(); } #separate void LCD_PutChar ( unsigned int cX ) { /* this subroutine works specifically for 4-bit Port A */ output_high ( LCD_RS ); LCD_PutCmd( cX ); output_low ( LCD_RS ); } #separate void LCD_PutCmd ( unsigned int cX ) { LCD_SetData ( swap ( cX ) ); /* send high nibble */ LCD_PulseEnable(); LCD_SetData ( swap ( cX ) ); /* send low nibble */ LCD_PulseEnable(); GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA } #separate void LCD_PulseEnable ( void ) { output_high ( LCD_EN ); delay_us ( 3 ); // was 10 output_low ( LCD_EN ); delay_ms ( 3 ); // was 5 } #separate void LCD_SetData ( unsigned int CX ) { output_bit ( LCD_D4, CX & 0x01 ); output_bit ( LCD_D5, CX & 0x02 ); output_bit ( LCD_D6, CX & 0x04 ); output_bit ( LCD_D7, CX & 0x08 ); } Chương trình ứng dụng: GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA RA0/AN02 RA1/AN13 RA2/AN2/VREF-/CVREF4 RA4/T0CKI/C1OUT6 RA5/AN4/SS/C2OUT7 RE0/AN5/RD8 RE1/AN6/WR9 RE2/AN7/CS10 OSC1/CLKIN13 OSC2/CLKOUT14 RC1/T1OSI/CCP2 16 RC2/CCP1 17 RC3/SCK/SCL 18 RD0/PSP0 19 RD1/PSP1 20 RB7/PGD 40 RB6/PGC 39 RB5 38 RB4 37 RB3/PGM 36 RB2 35 RB1 34 RB0/INT 33 RD7/PSP7 30 RD6/PSP6 29 RD5/PSP5 28 RD4/PSP4 27 RD3/PSP3 22 RD2/PSP2 21 RC7/RX/DT 26 RC6/TX/CK 25 RC5/SDO 24 RC4/SDI/SDA 23 RA3/AN3/VREF+5 RC0/T1OSO/T1CKI 15 MCLR/Vpp/THV1 UDK PIC16F877A C1 30pF C2 30pF X1 CRYSTAL R9 4K D 7 14 D 6 13 D 5 12 D 4 11 D 3 10 D 2 9 D 1 8 D 0 7 E 6 RW 5 R S 4 VS S 1 VD D 2 VE E 3 LCD1 LM016L #include #fuses HS, NOLVP, NOWDT, NOPROTECT #use delay (clock=4000000) //Use built-in function: delay_ms() & delay_us() #include "LCD_LIB_4BIT.c" VOID MAIN() { LCD_INIT(); LCD_PUTCHAR('X'); DELAY_MS(1000); LCD_PUTCHAR('I'); DELAY_MS(1000); LCD_PUTCHAR('N'); DELAY_MS(1000); LCD_PUTCHAR(' '); GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA DELAY_MS(1000); LCD_PUTCHAR('C'); DELAY_MS(1000); LCD_PUTCHAR('H'); DELAY_MS(1000); LCD_PUTCHAR('A'); DELAY_MS(1000); LCD_PUTCHAR('O'); PHẦN THỰC HÀNH: Bài 7.1: Hiển thị 1 led 7 đoạn Bài 7.2: Thiết kế mạch trên Proteus như hình dưới a. Lập trình cho 2 led hiển thị số 35 b. Lập trình hiển thị số đếm từ 0-99 Bài 7.3 Thiết kế mạch trên Proteus như hình dưới Lập trình thực hiển hiển thị họ tên, thay đổi các chế độ hiển thị bằng cách gửi lệnh lên LCD Chương trình hiển thị LED 7 đoạn void tinhtoan_hienthi(int16 x) { int16 nghin,tram,chuc,donvi; nghin=x/1000; x=x%1000; tram=x/100; GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA x=x%100; chuc=x/10; donvi=x%10; output_d(maled[nghin]); output_low(pin_b0); delay_ms(5); output_high(pin_b0); output_d(maled[tram]); output_low(pin_b1); delay_ms(5); output_high(pin_b1); output_d(maled[chuc]); output_low(pin_b2); delay_ms(5); output_high(pin_b2); output_d(maled[donvi]); output_low(pin_b3); delay_ms(5); output_high(pin_b3); } GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA CHƯƠNG 7: MỘT SỐ ỨNG DỤNG CỦA VI ĐIỀU KHIỂN ỨNG DỤNG 2: ĐIỀU CHẾ ĐỘ RỘNG XUNG-PWM 7.5 Nguyên lý hoạt động: Bộ điều chế độ rộng xung tạo xung hình chữ nhật trên 2 chân RC1/CCP2 và RC2/CCP1- giá trị xung ở 2 chân là ngược nhau (bù nhau). Thực ra đây là một chức năng của modun CCP gồm 3 chức năng: Comparation, Capture, PWM. Nguyên lý tạo xung như sau: Khi Thanh ghi bộ đếm của bộ định thời Timer 2 đạt giá trị bằng giá trị của thanh ghi PR2, đầu ra xung RC2/CCP1 được set lên mức cao. TMR2 được reset về 0, sau đó đếm lên, khi TMR2 đạt giá trị bằng độ rộng xung, chân RC2/CCP1 được reset về 0. TMR2 tiếp tục đếm lên cho đến khi bằng giá trị PR2 thì chu trình sẽ lặp lại như lúc đầu. Xung ra ở chân RC1/CC21 là bù của xung trên chân RC2/CCP1 . 7.6 Chu kỳ xung: Để xác định chu kỳ xung ta đưa ra phân tích như sau: Như đã tìm hiểu về cách làm việc của các bộ timer, ta biết: sau mỗi chu kì lệnh giá trị của TMR2 sẽ tăng lên 1 đơn vị. Nếu dùng bộ chia tần số, giả sử là 1: N thì sau N chu kì lệnh giá trị của TMR2 mới tăng lên 1 đơn vị. Mỗi chu kì lệnh gồm 4 chu kì xung. GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA Chu kì xung chính là khoảng thời gian từ lúc TMR2=0 cho đến khi TMR2=PR2. Suy ra, để tăng PR2 đơn vị, hay chính là chu kì xung sẽ bằng: Ở đây, Tosc là chu kì xung của vi điều khiển hay chu kì của thạch anh N là tỉ lệ chia tần số. Ví dụ: với thạch anh Fosc=4Mhz, N=4, ta có chu kì xung tối đa đạt được là khi PR2=255 (PR2 là thanh ghi 8 bit) T=(255+1)*4*(1/4Mhz)*4=1024µs Tức tần số xung là: F=1/T=976Hz= 1KHz. 7.7 Độ rộng xung: Độ rộng xung là giá trị 10 bit : trong đó 8 bit cao được ghi vào thanh ghi CCPR1L, và 2 bit thấp ghi vào 2 bit 5 và 4 của thanh ghi CCP1CON : Độ rộng xung PWM được xác định theo công thức: PWM Duty Cycle= (CCPR1L:CCP1CON)*Tosc*N Trong đó, CCPR1L là thanh ghi 8 bit, CCP1CON là 2 bit 5 và 4 của thanh ghi điều khiển CCP1CON. N là tỉ lệ chia tần số. 7.8 Qui trình thực hiện xuất xung PWM: Gồm các bước: - Cài đăt modun CCP chức năng PWM: setup_CCP1(CCP_PWM) - Cài đặt Timer 2: setup_timer_2 (mode, period, 1) Trong đó, mode có thể là: T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16, nghĩa là tắt Timer2 hoặc định tỉ lệ bộ chia tần số Period chính là giá trị của thanh ghi PR2 để xác định chu kì của xung GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA - Cài đặt độ rộng xung: set_pwm1_duty(value); Trong đó, value là giá trị CCPR1L:CCP1CON Và độ rộng xung được tính theo công thức: PWM Duty Cycle= value*Tosc*N 7.9 Ứng dụng PWM trong điều khiển tốc độ động cơ 1 chiều: 6 5 4 1 2 U1 OPTOCOUPLER-NPN R1 2K2 R2 1K R3 10K +12V D1 DIODE +12V 6 5 4 1 2 U2 OPTOCOUPLER-NPN Q5 NPN R6 2K2 R5 1K R7 10k +12V Q2 NPN R11 10k D32 DIODE RA0/AN02 RA1/AN13 RA2/AN2/VREF-/CVREF4 RA4/T0CKI/C1OUT6 RA5/AN4/SS/C2OUT7 RE0/AN5/RD8 RE1/AN6/WR9 RE2/AN7/CS10 OSC1/CLKIN13 OSC2/CLKOUT14 RC1/T1OSI/CCP2 16 RC2/CCP1 17 RC3/SCK/SCL 18 RD0/PSP0 19 RD1/PSP1 20 RB7/PGD 40 RB6/PGC 39 RB5 38 RB4 37 RB3/PGM 36 RB2 35 RB1 34 RB0/INT 33 RD7/PSP7 30 RD6/PSP6 29 RD5/PSP5 28 RD4/PSP4 27 RD3/PSP3 22 RD2/PSP2 21 RC7/RX/DT 26 RC6/TX/CK 25 RC5/SDO 24 RC4/SDI/SDA 23 RA3/AN3/VREF+5 RC0/T1OSO/T1CKI 15 MCLR/Vpp/THV1 UDK PIC16F877A C1 30pF C2 30pF X1 CRYSTAL R9 4KRV1 10K +5V RL? OMI-SH-205D Q? MPSA05 +88.8 D 7 14 D 6 13 D 5 12 D 4 11 D 3 10 D 2 9 D 1 8 D 0 7 E 6 R W 5 R S 4 V S S 1 V D D 2 V E E 3 LCD1 LM016L BÀI TẬP: 1. Lập trình để xuất xung PWM có tần số là 1KHZ, độ rộng xung là 50% 2. Ứng dụng PWM GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA CHƯƠNG 7: MỘT SỐ ỨNG DỤNG CỦA VI ĐIỀU KHIỂN ỨNG DỤNG 3: GIAO TIẾP VI ĐIỀU KHIỂN VÀ MÁY TÍNH 7.10 Giới thiệu: Chuẩn giao tiếp nối tiếp RS232 là chuẩn phần cứng, qui định các chân nối và mức điện áp được sử dụng bởi một số các thiết bị giao tiếp nối tiếp với nhau. Ngày nay, chuẩn này trở nên thông dụng trong việc ghép nối máy tính với thiết bị ngoại vi. Các loại vi điều khiển, vi xử lý cũng sử dụng chuẩn này trong việc truyền thông mạng vi điều khiển hoặc giữa vi điều khiển với máy tính. Vì vậy, chuẩn RS232 thường được dùng để máy tính điều khiển và giám sát hệ thống vi điều khiển trong các ứng dụng công nghiệp. Một số ưu điểm của chuẩn: - Sơ đồ kết nối đơn giản - Tiết kiệm được dây dẫn - Có thể dùng để kết nối với vi điều khiển và PLC Tính năng Plug-in Plug-out, nghĩa là có thể lắp đặt thiết bị truyền khi máy tính đang hoạt động 7.11 Chuẩn RS232: 7.11.1 Chuẩn điện áp: Bit có 2 logic 0 và 1. Theo chuẩn RS232, logic 0 (SPACE) tương ứng với điện áp -25 đến -3n V Logic 1 (Mark) tương ứng với điện áp 3 đến 25 V Khoảng điện áp từ -3 đến 3 là không xác định GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA 7.11.2 Chuẩn giao thức: Giao thức RS232 qui định truyền 1 frame tại một thời điểm. Một Frame truyền bao gồm: 1 bit start, 7 hoặc 8 bit dữ liệu ASCII của kí tự, bit Parity (kiểm tra chẵn lẻ) và kết thúc bởi 1 bit Stop. Ví dụ sau đây là frame truyền 1 kí tự ‘A’, mã ASCII của ‘A’ là 41h, nếu truyền trong 7 bit dữ liệu sẽ là 100 0001. GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA 7.11.3 Các qui định khác của chuẩn RS232: 7.11.4 Tốc độ truyền: Các tốc độ truyền thông dụng là: 1200bps, 4800bps, 9600bps, 19200bps 7.12 Sơ đồ chân: Chuẩn RS232 qui định sử dụng 2 loại đầu nối chuẩn DB25 (25 chân) và DB9 (9 chân) Vi điều khiển thường dùng đầu nối 9 chân DB9 GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA 7.13 Phương thức truyền 7.13.1 Sơ đồ kết nối qua modem: DTE- Data Terminal Equipment: Thiết bị đầu cuối dữ liệu, có thể là máy tính, vi điều khiển, PLC DCE- Data Communication Equipment: Thiết bị truyền dữ liệu, ví dụ Modem 7.13.2 Sơ đồ kết nối không qua modem: Đây là sơ đồ hay dùng cho việc truyền dữ liệu giữa máy tính và vi điều khiển Kết nối không bắt tay: Trường hợp này phải đảm bảo cài đặt cho cả hai DTE cùng tốc độ truyền, số bit dữ liệu, dạng kiểm tra lỗi Parity và Số bit STOP. Chú ý: Do chuẩn RS232 trên máy tính qui định mức điện áp cho logic 0 là 3 đến 25V, logic 1 là -25 đến -3V, trong khi mức điện áp tương ứng trên vi điều khiển là 0 và 5V nên cần có bộ chuyển đổi đồng bộ điện áp là MAX232 làm trung gian cho kết nối này Kết nối Có bắt tay: DTE DCE DTE DCE GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA Đây là hình thức truyền có bắt tay, có quá trình thăm dò hỏi đáp trước khi bắt đầu truyền. Giả sử DTE1 muốn truyền dữ liệu đến DTE2. Trước hết DTE1 phải đưa chân RTS (Request to send) lên mức tích cực và bắt đầu thăm dò tín hiệu từ chân CTS (Clear to Send) của mình. Nếu DTE2 đã sẵn sàng để nhận dữ liệu, DTE2 sẽ đưa chân RTS của mình lên mức tích cực. Chân này nối với chân CTS của DTE1. Vì vậy, DTE1 sẽ nhận được tín hiệu tích cực thông qua chân CTS và biết rằng DTE2 đã sẵn sàng nhận dữ liệu. DTE1 bắt đầu truyền dữ liệu. Nếu DTE1 chủ động muốn nhận dữ liệu từ DTE2. DTE1 đưa chân DTR (Data terminal Ready) lên mức tích cực để báo với với DTE2 rằng nó đã sẵn sàng và muốn nhận dữ liệu. Nếu DTE2 cũng sẵn sàng để truyền dữ liệu, nó sẽ đưa chân DSR (Data Set Ready) để báo với DTE1 là nó cũng đã chuẩn bị dữ liệu sẵn sàng để gửi đến DTE1. Và sau đó, DTE2 bắt đầu truyền dữ liệu cho DTE1. 7.14 Kết nối giao tiếp máy tính và vi điều khiển PIC 16F877A qua chuẩn RS232: 7.14.1 Sơ đồ phần cứng: Vi điều khiển PIC 16F877A hỗ trợ giao tiếp nối tiếp theo chuẩn RS232. Cứng thức truyền theo kiểu không bắt tay: Gồm 2 đường truyền, đường truyền dữ liệu từ PIC đến máy tính thông qua chân RC6, đường nhận dữ liệu từ máy tính truyền đến thông qua chân RC7. Do qui định mức điện áp cho các logic 0 và 1 trên PIC là 0 và 5V, trong khi mức điện áp cho 2 logic đó ở máy tính là 3 đến 25V và -25 đến -3V, GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA nên cần có một bộ chuyển đổi điện áp cho đồng bộ. Người ta hay sử dụng chip MAX232 để làm nhiệm vụ này. Ở 2 đầu của dây nối ta sử dụng 2 đầu nối DB9. Có chân RX( chân số 2) của đầu nối này nối với TX (chân số 3) của đầu nối kia và ngược lại. 2 max của 2 đầu nối được nối với nhau. Sơ đồ nối từ vi điều khiển PIC ra chip MAX232 như sau: GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA Chân nhận dữ liệu trên vi điều khiển PIC RC6 được nối với chân 12 trên MAX232. Chân truyền dữ liệu trên vi điều khiển PIC RC7 được nối với chân 12 trên MAX232. Chân 13,14 trên MAX232 được nối với chân 3 (truyền dữ liệu đến máy tinh) và chân 2 (nhận dữ liệu từ máy tính). Giái trị các tụ dùng là theo datasheet. 7.14.2 Phần mềm trên máy tính: - Có thể sử dụng Visual Basic, Visual C, MatLab, LabView, Delphi v.v Phần mềm dùng Visual Basic: Visual Basic sử dụng một ActiveX MSCOMM, là một component trong thư viện Visual Basic để dùng để giúp máy tính giao tiếp với thiết bị ngoại vi. 7.14.2.1 Các bước để sử dụng MSCOM Lấy component MSCOMM từ thư viện ra ToolBox GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA Bước 1: Kích chuột phải lên ToolBox, chọn Components GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA Bước 2: Hiện ra thư viện Components, chọn Microsoft Comm Control 6.0 , nhấn Apply, Hình chiếc điện thoại sẽ hiện ra trên thanh ToolBox. Đây chính là MSCOMM, Cách để đưa đối tượng này vào ứng dụng tương tự như các đối tượng khác trong ToolBox. 7.14.2.2 Các thuộc tính quan trọng của MSCOMM: - Setting: Cú pháp: MSCOMM1.Setting= “BBBB,P,D,S” BBBB: Tốc độ truyền, chọn 9600 hoặc 19200 P: Dạng của bit kiểm tra lỗi chẵn lẻ GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA D: Số bit dữ liệu 7 hoặc 8, mặc định là 8. S: số bit STOP, 1,1.5 hoặc 2 Ví dụ: MSCOMM1.Setting= “9600,O,8,1” + CommPort: dạng object.CommPort = value. Value là chỉ số của cổng Com có giá trị từ 1 ‐> 16 và mặc định có giá trị =1. Các bạn cần phải thiết lập thông số này trước khi mở cổng. Sẽ có lỗi error 68 (Device unavailable) nếu như không mở được cổng này. + InBuferSize: thiết lập hoặc trả lại kích thước của bộ đệm nhận, tính = byte. Mặc định là 1024 byte. Các bạn không được nhầm lẫn với đặc tính InBufferCount là số byte đang chờ trong bộ đệm nhận. + InputLen : object.InputLen [ = value ] thiết lập hoặc trả lại số byte mỗi lần thuộc tính Input đọc trong bộ đệm nhận. Mặc định giá trị Value=0 tức là thuộc tính Input sẽ đọc hết nội dung của bộ đệm nhận khi thuộc tính này được gọi. Nếu số kí tự trong bộ đệm nhận không = InputLen thì thuộc tính Input sẽ trả lại kí tự rỗng “”. Ví thế bạn cần phải chọn cách kiểm tra InBufferCount để chắc chắn số kí tự yêu cầu đã có đủ trước khi dùng lệnh .Input. Tính chất này rất là có ích khi đọc dữ liệu một máy mà dữ liệu ra được định dạng bằng các khối có kích thước cố định. + InputMode: object.InputMode [ = value ] . Value = 0 hay = comInputModeText dữ liệu nhận được dạng văn bản kiểu kí tự theo chuẩn ANSI. Dữ liệu nhận được sẽ là một sâu. Value=1 hay = comInputModeBinary dùng nhận mọi kiểu dữ liệu như kí tự điều khiển nhúng, kí tự NULL,.. Giá trị nhận được từ Input sẽ là một mảng kiểu Byte. + OutBuferSize: giống như InBuferSize, mặc định là 512. + ParityReplace: thiết lập và trả lại kí tự thay thế kí tự không đúng trong lỗi giống nhau. + PortOpen: thiết lập và trả lại tính trạng của cổng(đóng hoặc mở). object.PortOpen [ = value ]. value = true cổng mở. value =false cổng đóng và xóa toàn bộ dữ liệu trong bộ đệm nhận và truyền. Cần phải thiết lập thuộc tính CommPort đúng với tên của cổng trước khi mở cổng giao tiếp. Thêm vào đó, cổng giao tiếp của thiết bị của bạn phải hỗ trợ giá trị trong thuộc tính Setting thì thiết bị của bạn mới hoạt động đúng, còn không thì nó sẽ hoạt động rất dở hơi nếu không nói là nó chạy không tốt. Đường DTR và RTS luôn giữ lại trạng thái của cổng. GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA + RthresHold: object.Rthreshold [ = value ] value kiểu số nguyên. Thiết lập số kí tự nhận được trước khi gây lên sự kiện comEvReceive. Mặc định = 0 tức là không có sự kiện OnComm khi nhận được dữ liệu. Thiết lập = 1 tức là sự kiện OnComm xảy ra khi bất kì kí tự nào được chuyển đến bộ đệm nhận. + Settings: object.Settings [ = value ] thiết lập hoặc trả lại các thông số tần số baud, bít dữ liệu, bít chẵn lẻ, bít stop. Nếu Value không có giá trị khi mở sẽ gây ra lỗi 380 (Invalid property value). + SThreshold: thiết lập và và trả lại số kí tự nhỏ nhất được cho phép trong bộ đệm gửi để xảy ra sự kiện OnComm = comEvSend . Theo mặc định giá trị này = 0 tức là khi truyền sẽ không gây ra sự kiện OnComm. Nếu thiết lập thông số này =1 thì sự kiện OnComm xảy ra khi bộ đệm truyền rỗng. Sự kiện OnComm = comEvSend chỉ xảy ra khi mà số kí tự trong bộ đệm truyền nhỏ hơn hoặc = Sthreshold. Nếu số kí tự trong bộ đệm này luôn lớn hơn Sthreshold thì sự kiện này không thể xảy ra. Truyền nhận dữ liệu: + CommEvent: trả lại phần lớn sự kiện giao tiếp hoặc có lỗi. CommEvent xảy ra khi có lỗi hoặc khi xảy ra sự kiện nào đó. Sau đây là một số hằng số lỗi: Sự kiện Giá trị Miêu tả sự kiện comEventBreak 1001 Xảy ra khi nhận được một tín hiệu Break. comEventFrame 1004 Lỗi hệ thống. Phần cứng phát hiện ra một lỗi hệ thống comEventOverrun 1006 Xảy ra khi cổng tự tràn( Overrun). Một kí tự không được đọc từ phần cứng trước khi kí tự tiếp theo tới và do đó kí tự này bị mất. comEventRxOver 1008 Xảy ra khi bộ đệm nhận bị tràn. Không có đủ chỗ cho dữ liệu trong bộ đệm nhận. comEventRxParity 1009 Lỗi Parity. Phần cứng phát hiện ra một lỗi Parity. comEventTxFull 1010 xảy ra khi bộ đệm truyền bị đầy. Bộ đệm truyền bị đầy trong khi ghi dữ liệu lớn vào bộ đệm comEventDCB 1011 Một lỗi không mong muốn khi đang khôi phục lại lỗi điều khiển thiết bị( DCB – Device Control Block) cho cổng Một số sự kiện : Sự kiện Giá trị Miêu tả sự kiện comEvSend 1 Xảy ra khi số kí tự trong bộ đệm truyền nhỏ hơn giá trị GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA SthresHold. comEvReceive 2 Xảy ra khi bộ đệm nhận được số kí tự bằng giá trị RthresHold. Sự kiện này được tạo ra liên tục cho tới khi bạn dùng thuộc tính Input để lấy hết dữ liệu từ trong bộ đệm nhận. RcomEvCTS 3 Xảy ra khi có thay đổi trong đường CTS( Clear To Send) comEvDSR 4 Xảy ra khi thay đổi trong đường DSR( Data Set Ready). Sự kiện này chỉ xảy ra khi đường DSR thay đổi từ 1 ‐> 0. comEvCD 5 Xảy ra khi có thay đổi trong đường CD( Carrier Detect) comEvRing 6 Phát hiện chuông (Ring).Một số UART không hỗ trợ sự kiện này. comEvEOF 7 Xảy ra khi nhận được kí tự kết thúc file ( kí tự 26 trong bảng mã ASCII) + EOFEnable : object.EOFEnable [ = value ] quyết định các hành động nếu MSComm tìm thấy kí tự kết thúc file. Nếu value=true khi tìm thấy kí tự kết thúc file thì sẽ gây lên sự kiện comEvEOF trong OnCommEvent. Nếu value= false thì sẽ không gây lên sự kiện này. + InBufferCout: trả lại số kí tự đang có trong bộ đệm nhận Bạn có thể xoá bộ đệm nhận bằng cách đặt thuộc tính này =0 . Không nhầm với thuộc tính InBufferSize là tổng kích thước của bộ đệm nhận. + Input: nhận và xoá dữ liệu trong bộ đệm nhận. Nếu InputMode là comInputModeText thì giá trị trả về sẽ là một xâu tức có kiểu String , dữ liệu dạng text trong một biến kiểu Variant. Nếu InputMode = comInputModeBinary thì thuộc tính này sẽ trả lại dữ liệu dạng nhị phân dưới dạng một mảng kiểu byte trong một biến Variant. + OutBufferCount: trả lại số kí tự trong bộ đệm truyền. + Output: ghi dữ liệu vào bộ đệm truyền. có thể truyền kiểu text hoặc kiểu nhị phân. Nếu truyền bằng kiểu text thì cho một biến Variant = kiểu String, nếu truyền kiểu nhị phân thì cho cho Output= variant = một mảng kiểu Byte. GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA 7.14.3 Các bước cơ bản để thực hiện việc truyền và nhận từ máy tính dùng VB: 1. Cài đặt thuộc tính Setting qui định tốc độ truyền và khung truyền Ví dụ: MSCOMM1.Setting= “9600,N,8,1” 2. Qui định thuộc tính RThreshold xác định số kí tự nhận được trong bộ đệm nhận làm phát sinh sự kiện Oncomm. Ở đây nói thêm về sự kiện Oncomm: Đây có thể là sự kiện lỗi, sự kiện bộ đệm nhận nhận được N kí tự (N= RThreshold), sự kiện bộ đệm truyền truyền đi N kí tự (N=SThreshold) v.v Vì vậy, nếu ta muốn sau khi bộ đệm nhận nhận đúng N kí tự thì tiến hành lấy dữ liệu vào biến nào đó để xử lý ta phải cài đặt trước thuộc tính RThreshold bằng N: MSCOMM1.RThreshold=N Và khi có N kí tự đến bộ đệm nhận, sự kiện OnComm sẽ xảy ra và lập tức chương trình VB sẽ nhảy vào hàm Private Sub MSComm1_OnComm() Thân hàm End Sub Trong thân hàm, ta sẽ xử lý dữ liệu. Ví dụ đọc dữ liệu vào biến: Biến= MSCOMM1.INPUT 3. Qui định dạng dữ liệu nhận được dạng Text hay Binary bằng thuộc tính InputMode Ví dụ: Nhận dạng dữ liệu dạng Binary mscomm1.InputMode= comInputModeBinary Nhận dữ liệu dạng Text MSComm1.InputMode=comInputModeText GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA 4. Muốn truyền dữ liệu đi dùng thuộc tính Output o MSCOMM1.Output= chuỗi cần truyền 7.15 Phần mềm trên vi điều khiển: Sử dụng phần mềm CCS để lập trình cho vi điều khiển PIC Các phần cần thiết khi muốn giao tiếp với máy tính : - Khai báo đúng tốc độ thạch anh đang dùng, nếu sai sẽ không truyền được #use delay(clock=4000000) // Dùng thạch anh 4MHZ - Khai báo cài đặt truyền thông cho vi điều khiển theo chuẩn RS 232 sử dụng #use rs232 (tham số cài đặt 1, tham số cài đặt 2, ) Các tham số cài đặt có rất nhiều, chúng ta chỉ quan tâm đến một số các tham số cơ bản sau: o BAUD=x: Tốc độ truyền, hay dùng 9600 hoặc 19200. Lưu ý là tốc độ truyền phải giống như cài đặt trên máy tính Ví dụ: BAUD=9600 o XMIT= Pin: Qui định chân truyền dữ liệu là chân chức năng nào trên vi điều khiển, ví dụ: vi điều khiển 16F là RC6 Ví dụ: XMIT=PIN_C6 o RCV= Pin: Qui định chân nhận dữ liệu là chân chức năng nào trên vi điều khiển, ví dụ: vi điều khiển 16F là RC7 Ví dụ: RCV=PIN_C7 o Parity=x: Khai báo dạng kiểm tra chẵn lẻ, x= N, E hoặc O. Lưu ý là phải giống như cài đặt Parity của phần mềm trên máy tính Ví dụ: Parity=N o Bits= n: Số bit dữ liệu, có thể là 7 hoặc 8 GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA o Stop=n: Số bit Stop, mặc định là 1 - Hàm nhận dữ liệu: o KBhit(): cho biết trạng thái bộ đệm nhận có dữ liệu hay không Bằng 0 nếu chưa có dữ liệu đến Bằng 1 nếu đã có dữ liệu đến Cú pháp: value= KBhit() o Getc(): Cú pháp: value=getc() Hàm đợi cho đến khi vi điều khiển nhận được 1 kí tự và đọc kí tự vào biến value. Vì hàm đợi nhận kí tự nên nếu không muốn mất thời gian đợi ta nên dùng hàm Kbhit() để xem vi điều khiển đã nhận kí tự hay không trước khi dùng hàm này để đọc kí tự. - Hàm truyền chuỗi kí tự: Printf() Cú pháp: Printf(Chuỗi kí tự cần truyền) Hàm này truyền đi một chuỗi kí tự từ vi điều khiển Có thể định dạng chuỗi kí tự cần truyền bằng %nt n là số kí tự cần truyền ví dụ: %2.3 nghĩa là truyền 2 kí tự phần nguyên và 3 kí tự thập phân t là dạng truyền, có thể là một trong các dạng sau: c Character s String or character u Unsigned int d Signed int Lu Long unsigned int GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA Ld Long signed int x Hex int (lower case) X Hex int (upper case) Lx Hex long int (lower case) LX Hex long int (upper case) f Float with truncated decimal g Float with rounded decimal e Float in exponential format w Unsigned int with decimal place inserted. Specify two numbers for n. The first is a total field width. The second is the desired number of decimal places. - Hàm truyền 1 kí tự: Putc() Cú pháp: Putc(kí tự cần truyền) 7.16 Ví dụ về truyền dữ liệu giữa máy tính và vi điều khiển: (Xem file đính kèm- dài quá- không có tiền in- chịu khó cóp nhé- sorry) GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA CHƯƠNG 7: MỘT SỐ ỨNG DỤNG CỦA VI ĐIỀU KHIỂN ỨNG DỤNG 3: CHUẨN GIAO TIẾP I2C- CHIP ĐỒNG HỒ THỜI GIAN THỰC DS1307 7.17 Cuẩn giao tiếp I2C: a. Sơ đồ chuẩn giao tiếp I2C: Chuẩn giao tiếp I2C là chuẩn giao tiếp 2 dây: gồm tín hiệu SDA(tín hiệu dữ liệu) và tín hiệu xung Clock SCL. Chuẩn giao tiếp I2C có giao thức kiểu Master/Slaver. Trong đó, thiết bị chủ điều khiển mọi hoạt động của quá trình giao tiếp. Các ưu điểm: - Đơn giản, tốc độ truyền nhanh - Giao diện nối tiếp - Đồng bộ - Hai chiều I2C là giao tiếp đồng bộ: - Dữ liệu được truyền theo tín hiệu xung clock (SCL) - Tín hiệu SCL điều khiển khi nào thì dữ liệu thay đổi và khi nào thì dữ liệu được đọc I2C là giao tiếp master/slaver: - Master sẽ là nơi phát xung clock (SCL), do đó nó sẽ điều khiển quá trình truyền nhận - Tín hiệu xung clock (SCL) là chung cho tấc cả các Slaver - Slaver chỉ có thể đưa tín hiệu SCL xuống mức thấp để ngăn chặn cuộc truyền I2C là giao tiếp 2 chiều: - Cùng một thời điểm, cả hai thiết bị có thể truyền và nhận dữ liệu. Tuy nhiên, Master sẽ qui định luồng dữ liệu truyền. b. Mức tín hiệu: Chuẩn giao tiếp I2C sử dụng 2 dây tín hiệu : - SDA: Serial DAta, tín hiệu dữ liệu nối tiếp, truyền dữ liệu đến hoặc đi từ Master. - SCL: Serial Clock, tín hiệu xung đồng hồ qui định khi nào thì dữ liệu được đọc hoặc khi nào dữ liệu được ghi. Tín hiệu này do Master điều khiển Các trạng thái đặc biệt tạo nên 1 giao tiếp I2C là: - Start: kí hiệu là S GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA - stop: kí hiệu là P - Data: dữ liệu: GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA - Kết thúc trạng thái stop, SCL và SDA lên mức cao cho biết trạng thái của đường truyền là đang rỗi. c. Khung truyền: - Ghi dữ liệu từ Master đến Slaver: - Đọc dữ liệu từ Slaver: 7.18 Chip đồng hồ thời gian thực: Hình dáng: Sơ đồ kết nối GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA Các thanh ghi chức năng: Qui trình gửi lệnh để ghi 1 byte từ vi điều khiển đến DS1307: - Tạo trạng thái Start: i2c_start(); - Gửi địa chỉ của DS1307: địa chỉ mặc định là 0xd0 cùng với bit qui đinh hướng truyền dữ liệu, 0: i2c_write(0xd0); - Gửi địa chỉ byte nhớ trên DS1307 cần ghi: i2c_write(address); - Gửi dữ liệu đến DS1307: i2c_write(data); GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA - Tạo trạng thái Stop: i2c_stop(); Qui trình gửi lệnh để đọc 1 byte dữ liệu từ DS1307 lên vi điều khiển: - Tạo trạng thái Start: i2c_start(); - Gửi địa chỉ của DS1307: địa chỉ mặc định là 0xd0: i2c_write(0xd0); - Gửi địa chỉ byte nhớ trên DS1307 cần ghi: i2c_write(address); - Tạo lại trạng thái Start: i2c_start(); - Gửi địa chỉ của DS1307: địa chỉ mặc định là 0xd0 cùng với bit qui đinh hướng truyền dữ liệu, 1: i2c_write(0xd1); - Dùng lệnh đọc dữ liệu: data=i2c_read(0); - Tạo trạng thái Stop: i2c_stop(); 3. Chương trình mẫu: Chương trình chính: #include #use delay(clock=8000000) #fuses HS,NOWDT,NOPROTECT,NOLVP #include "ds1307.c" #include void main(void) { int8 sec,min,hour,day,date,month,year; char second_digit1, second_digit2, min_digit1, min_digit2,hour_digit1,hour_digit2; write_ds1307(0,sec & 0x7F); // enable oscillator(bit 7 =0) lcd_init(); //write_ds1307(2,0x15); while(true) GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA { sec=read_ds1307(0); // read second min=read_ds1307(1); // read minute hour=read_ds1307(2); // read hour second_digit2 = (sec / 0x10) ; second_digit1 = (sec % 0x10) ; min_digit2 = (min / 0x10) ; min_digit1 = (min % 0x10); hour_digit2= (hour/0x10); hour_digit1=hour%0x10; lcd_putcmd(0x80); printf(lcd_putchar,"RTC: "); printf(lcd_putchar,"%u",hour_digit2); printf(lcd_putchar,"%u",hour_digit1); printf(lcd_putchar," : "); printf(lcd_putchar,"%u",min_digit2); printf(lcd_putchar,"%u",min_digit1); printf(lcd_putchar,": "); printf(lcd_putchar,"%u",second_digit2); printf(lcd_putchar,"%u",second_digit1); delay_ms(500); GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA } } Chương trình con DS1307.c #define DS1307_SDA PIN_C4 #define DS1307_SCL PIN_C3 #use i2c(master, sda=DS1307_SDA, scl=DS1307_SCL) //========================== // KHOI TAO DS1307 //========================== void init_DS1307() { output_float(DS1307_SCL); output_float(DS1307_SDA); } //========================== // GHI 1 BYTE ĐẾN DS1307 //========================== void write_DS1307(byte address, BYTE data) { short int status; i2c_start(); i2c_write(0xd0); i2c_write(address); i2c_write(data); i2c_stop(); i2c_start(); GIÁO TRÌNH VI ĐIỀU KHIỂN – VI XỬ LÝ GV: TRẦN THÁI ANH ÂU NGÀNH KỸ THUẬT ĐIỀU KHIỂN VÀ TỰ ĐỘNG HÓA status=i2c_write(0xd0); while(status==1) { i2c_start(); status=i2c_write(0xd0); } } //========================== //DOC 1 BYTE TU DS1307 //========================== BYTE read_DS1307(byte address) { BYTE data; i2c_start(); i2c_write(0xd0); i2c_write(address); i2c_start(); i2c_write(0xd1); data=i2c_read(0); i2c_stop(); return(data);} }

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

  • pdfgt_vixuly_vidieukhien_8269.pdf