Đề tài Đọc nhiệt độ hiển thị lên LCD

Với sự phát triển không ngừng của khoa học công nghệ, cuộc sống con người ngày càng trở nên tiện nghi và hiện đại hơn. Điều đó đem lại cho chúng ta nhiều giải pháp tốt hơn, đa dạng hơn trong việc xử lý những vấn đề tưởng chừng như rất phức tạp gặp phải trong cuộc sống. Việc ứng dụng các thành tựu khoa học kỹ thuật hiện đại trong tất cả các lĩnh vực đã và đang rất phổ biến trên toàn thế giới, thay thế dần những phương thức thủ công , lạc hậu và ngày càng được cải tiến hiện đại hơn, hoàn mỹ hơn. Cùng với sự phát triển chung đó, nước ta cũng đang mạnh mẽ tiến hành công cuộc công nghiệp hóa và hiện đại hóa đất nước để theo kịp sự phát triển của các nước trong khu vực và trên thế giới. Trong đó lĩnh vực điện tử đang ngày càng đóng vai trò quan trọng trong việc phát triển kinh tế và đời sống con người. Sự phổ biến của nó đóng góp không nhỏ tới sự phát triển của tất cả các ngành sản xuất, giải trí, .trong những năm gần đây đặc biệt trong lĩnh vực tự động nhất là nhiệt độ, nó đã có sự phát triển mạnh mẽ với nhiều hình thức, phương pháp tiếp cận, chia sẻ thông tin hiện đại và toàn diện hơn.

doc86 trang | Chia sẻ: tuandn | Ngày: 02/05/2013 | Lượt xem: 1859 | Lượt tải: 9download
Bạn đang xem nội dung tài liệu Đề tài Đọc nhiệt độ hiển thị lên LCD, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
 Với sự phát triển không ngừng của khoa học công nghệ, cuộc sống con người ngày càng trở nên tiện nghi và hiện đại hơn. Điều đó đem lại cho chúng ta nhiều giải pháp tốt hơn, đa dạng hơn trong việc xử lý những vấn đề tưởng chừng như rất phức tạp gặp phải trong cuộc sống. Việc ứng dụng các thành tựu khoa học kỹ thuật hiện đại trong tất cả các lĩnh vực đã và đang rất phổ biến trên toàn thế giới, thay thế dần những phương thức thủ công , lạc hậu và ngày càng được cải tiến hiện đại hơn, hoàn mỹ hơn. Cùng với sự phát triển chung đó, nước ta cũng đang mạnh mẽ tiến hành công cuộc công nghiệp hóa và hiện đại hóa đất nước để theo kịp sự phát triển của các nước trong khu vực và trên thế giới. Trong đó lĩnh vực điện tử đang ngày càng đóng vai trò quan trọng trong việc phát triển kinh tế và đời sống con người. Sự phổ biến của nó đóng góp không nhỏ tới sự phát triển của tất cả các ngành sản xuất, giải trí, ...trong những năm gần đây đặc biệt trong lĩnh vực tự động nhất là nhiệt độ, nó đã có sự phát triển mạnh mẽ với nhiều hình thức, phương pháp tiếp cận, chia sẻ thông tin hiện đại và toàn diện hơn. Với lòng đam mê, yêu thích của mình trong lĩnh vực này, nhóm đã quyết định chọn đề tài “ĐỌC NHIỆT ĐỘ HIỂN THỊ LÊN LCD” làm đề tài môn học. Trong thời gian thực hiện đề tài cộng với kiến thức còn nhiều hạn chế, nên trong cuốn đồ án này không tránh khỏi những thiếu sót, nhóm thực hiện rất mong được sự đóng góp ý kiến của thầy cô và các bạn sinh viên. Nhóm sinh viên thực hiện đề tài LỜI CẢM ƠN Trong suốt khóa học tại XXX, với sự giúp đỡ của quý thầy cô và giáo viên hướng dẫn về mọi mặt từ nhiều phía và nhất là trong thời gian thực hiện đề tài, nên đề tài đã được hoàn thành đúng thời gian qui định. Nhóm thực hiện xin chân thành cảm ơn đến : Quí thầy cô trong khoa Điện tử -Tin học đã giảng dạy những kiến thức chuyên môn làm cơ sở để thực hiện tốt đồ án môn học và đã tạo điều kiện thuận lợi cho chúng em hoàn tất đồ án môn học này. Đặc biệt, Thầy XXX ,giáo viên hướng dẫn đề tài đã nhiệt tình giúp đỡ và cho nhóm thực hiện những lời chỉ dạy quý báu, giúp nhóm thực hiện định hướng tốt trong khi thực hiện đề tài. Tất cả bạn bè đã giúp đỡ và động viên trong suốt quá trình làm đề tài. TP.HCM Ngày 29 Tháng 5 năm 2011 Nhóm sinh viên thực hiện NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN ---o0o--- Tp. Hồ Chí Minh, ngày… tháng …năm 2010 Giảng viên hướng dẫn NGUYỄN TRỌNG KHANH c CHƯƠNG 1:CHƯƠNG DẪN NHẬP I) ĐẶT VẤN ĐỀ : Trong công nghiệp và trong đời sống có rất nhiều yếu tố ảnh hưởng đến quá trình sản xuất và ảnh hưởng đến con người. Trong đó nhiệt độ là yếu tố thường được đề cập đến nhiều nhất. Vì vậy sự ra đời của các mạch điện tử đo nhiệt độ là rất cần thiết. Với sự phát triển của khoa học kỹ thuật, vi điều khiển ra đời đã giúp cho chúng ta có thể dễ dàng thiết kế các mạch đo nhiệt độ với độ chính xác cao, đáng tin cậy… mà chi phí không cao II) GIỚI HẠN ĐỀ TÀI : Với quy mô là đồ án tốt môn học, nên nhóm chúng em đã cố gắng hết sức làm những gì mà giảng viên yêu cầu, nhưng do kiến thức còn hạn chế nên chúng em chỉ thực hiện được những yêu cầu sau : Hiển thị nhiệt độ lên LCD Nhập thông số cài đặt nhiệt độ từ nút nhấn Báo động khi nhiệt độ quá mức cho phép. III) MỤC ĐÍCH NGHIÊN CỨU : Mục đích trước hết khi thực hiện đề tài này là để hoàn tất chương trình môn học để đủ điều kiện hoàn thành yêu cầu của môn học. Cụ thể khi nghiên cứu đề tài là chúng em muốn phát huy những thành quả ứng dụng của vi điều khiển để váo một mạch thực tế. Nó còn là kinh nghiệm cho chúng em tiến đên đồ án tốt nghiệp sắp tới. Ngoài ra quá trình thực hiện đề tài là một cơ hội để chúng em tự kiểm tra lại những kiến thức đã học ở trường. Đồng thời phát huy tính sáng tạo, khả năng giải những vấn đề do nhu cầu đặt ra IV) ĐỐI TƯỢNG NGHIÊN CỨU: 1.Các phương án điều khiển và xử lý dữ liệu 2.Tìm hiểu về vi xử lý PIC16F877A 3.Tìm hiểu về LCD 4.Tìm hiểu về cảm biến nhiệt độ LM35 5. Ứng dụng viết chương trình xử lí CHƯƠNG 2 : GIỚI THIỆU VỀ CÁC LINH KIỆN 2.1) Giới thiệu về PIC: 2.1.1) Sơ lược về vi điều khiển PIC 16F877A: Sơ đồ chân :  Hình 2.1 Sơ đồ chân PIC 16F877A Sơ đồ nguyên lý:  Hình 2.2 Sơ đồ nguyên lý PIC 16F877A Nhận xét: Từ sơ đồ chân và sơ đồ nguyên lý ở trên, ta rút ra các nhận xét ban đầu như sau : PIC16F877A có tất cả 40 chân 40 chân trên được chia thành 5 PORT, 2 chân cấp nguồn, 2 chân GND, 2 chân thạch anh và một chân dùng để RESET vi điều khiển. 5 port của PIC16F877A bao gồm : PORTB : 8 chân PORTC : 8 chân PORTD : 8 chân PORTA : 6 chân PORT E : 3 chân. Mỗi chân của vi điều khiển PIC 16F877A có một chức năng khác nhau. Trong đó có một số chân đa công dụng: mỗi chân có thể hoạt động như một đường xuất nhập hoặc là một chân chức năng đặc biệt dùng để giao tiếp với các thiết bị ngoại vi. 2.1.2) Cấu trúc phần cứng của PIC 16F877A: PIC là tên viết tắt của “ Programmable Intelligent computer” do hãng General Instrument đặt tên cho con vi điều khiển đầu tiên của họ. Hãng Micrchip tiếp tục phát triển sản phầm này và cho đến hàng đã tạo ra gần 100 loại sản phẩm khác nhau. PIC16F887A là dòng PIC khá phổ biến, khá đầy đủ tính năng phục vụ cho hầu hết tất cả các ứng dụng thực tế. Đây là dòng PIC khá dễ cho người mới làm quen với PIC có thể học tập và tạo nền tản về họ vi điều khiển PIC của mình. Cấu trúc tổng quát của PIC16F877A như sau : 8K Flash Rom 368x8 bytes Ram 256 bytes EFPROM 5 port vào ra với tín hiệu điều khiển độc lập 2 bộ định thời Timer0 và Timer2 8 bit 1 bộ định thời Timer1 16 bit có thể hoạt động ở cả chế độ tiết kiệm năng lượng với nguồn xung clock ngoài 2 bộ Capture/ Compare/ PWM 1 bộ biến đổi Analog -> Digital 10 bit, 8 ngõ vào 2 bộ so sánh tương tự 1 bộ định thời giám sát (Watch Dog Timer) 1 cổng song song 8 bit với các tín hiệu điều khiển 1 cổng nối tiếp 15 nguồn ngắt Sơ đồ khối  Hình 2.3 Sơ đồ khối bên trong của vi điều khiển 16F877A 2.1.3) Một số chế độ đặt biệt của vi điều khiển PIC 16F877A: 2.1.3.1) Dao động: PIC16F877A có thể hoạt động trong bốn chế độ dao động khác nhau: LP low-power crystal XT crystal/resonatpor HS high-speed crystal/resonatpor RC resistor/capacitor  Hình 2.4 Các chế độ dao động Trong các chế độ LP, XT và HS chúng ta sử dụng thạch anh dao động nối vào các chân OSC1 và OSC2 để tạo dao động. Việc lựa chọn tụ trong dao động thạch anh được lựa chọn dựa vào bảng sau:  Hình 2.5 Giá trị tụ trong dao động thạch anh Tụ có giá trị lớn sẽ mang tính ổn định của dao động nhưng làm tăng thời gian khởi động. Cách tính chu kỳ máy: Ví dụ ta sử dụng thạch anh 10Mhz. Khi đó: Tần số dao động của thạch anh là Fosc = 10Mhz thì chu kỳ dao động của thạch anh là Tosc = 1/Fosc= 1/10*106(s). Chu kỳ máy: T_instruction = 4*Tosc = 4/10*106(s) = 0.4 µs = 400 ns 2.1.3.2) Reset: PIC16F877A có thể bị reset bởi nhiều nguyên nhân khác nhau: Power-on Reset (POR) MCLR Reset during sleep MCLR Reset during normal operation WDT Reset (during normal operation) WDT Wake-up (during sleep) Brown-out Reset (BOR)  Hình 2.6 Các chế độ reset 2.1.3.4) Interrupts: PIC16F877A có nhiều nguồn ngắt khác nhau. Đây là một số ngắt tiêu biểu: - Ngắt ngoài xảy ra trên chân INT. - Ngắt do Timer0. - Ngắt do Timer1. - Ngắt do Timer2. - Ngắt do thay đổi trạng thái trên các chân PortB. - Ngắt so sánh điện thế. - Ngắt do Port song song. - Ngắt USART. - Ngắt nhận dữ liệu. - Ngắt truyền dữ liệu . - Ngắt chuyển đổi ADC. - Ngắt màn hình LCD. - Ngắt hoàn tất ghi EEPROM. - Ngắt module CCP. - Ngắt Module SSP. * Các thanh ghi chức năng ngắt: INTCON, PIE1, PIR1, PIE2, PIR2 (các thanh ghi này sẽ được nghiên cứu ở các phần sau).  Hình 2.7 Các chế độ ngắt 2.1.3.5) Bộ định thời giám sát (Watch Dog Timer – WDT):  Hình 2.8 Bộ định thời giám sát WDT 2.1.3.6) Tổ chức bộ nhớ: Cấu trúc bộ nhớ của vi điều khiển PIC16F877A bao gồm bộ nhớ chương trình (Program memory) và bộ nhớ dữ liệu (Data Memory) 2.1.3.6.1) Bộ nhớ chương trình:  Hình 2.9 Bộ nhớ chương trình PIC 16F877A Bộ nhớ chương trình của vi điều khiển PIC16F877A là bộ nhớ Flash, dung lượng 8K word (1 word chứa 14bit) và được phân thành nhiều trang như hình trên. Để mã hóa được địa chỉ 8K word bộ nhớ chương trình, thanh ghi đếm chương trình PC có dung lượng 13 bit. Khi vi điều khiển reset, bộ đếm chương trình sẽ trỏ về địa chỉ 0000h. Khi có ngắt xảy ra thì thanh ghi PC sẽ trỏ đến địa chỉ 0004h. Bộ nhớ chương trình không bao gồm bộ nhớ Stack và không được địa chỉ hóa bởi bộ đếm chương trình. 2.1.3.6.2) Bộ nhớ dữ liệu: Bộ nhớ dữ liệu của PIC l bộ nhớ EEPROM được chia ra làm nhiều bank. Bộ nhớ dữ liệu của PIC16F877A được chia thành 4 bank. Mỗi bank có dụng lượng 128 byte. Nếu như 2 bank bộ nhớ dữ liệu của 8051 phân chia riêng biệt : 128 byte đầu tiên thuộc bank1 là vùng Ram nội chỉ để chứa dữ liệu, 128 byte còn lại thuộc bank 2 là cùng các thanh ghi có chức năng đặc biệt SFR mà người dùng không được chứa dữ liệu khác trong đây thì 4 bank bộ nhớ dữ liệu của PIC16F877A được tổ chức theo cách khác. Mỗi bank của bộ nhớ dữ liệu PIC16F877A bao gồm cả các thanh ghi có chức năng đặc biệt SFR nằm ở các các ô nhớ địa chỉ thấp và các thanh ghi mục đích dùng chung GPR nằm ở vùng địa chỉ còn lại của mỗi bank thanh ghi. Vùng ô nhớ các thanh ghi mục đích dùng chung này chính là nơi người dùng sẽ lưu dữ liệu trong quá trình viết chương trình. Tất cả các biến dữ liệu nên được khai báo chứa trong vùng địa chỉ này. Trong cấu trúc bộ nhớ dữ liệu của PIC16F877A, các thanh ghi SFR nào mà thường xuyên được sử dụng (như thanh ghi STATUS) sẽ được đặt ở tất cả các bank để thuận tiện trong việc truy xuất. Sở dĩ như vậy là vì, để truy xuất một thanh ghi nào đó trong bộ nhớ của 16F877A ta cần phải khai báo đúng bank chứa thanh ghi đó, việc đặt các thanh ghi sử dụng thường xuyên giúp ta thuận tiên hơn rất nhiều trong quá trình truy xuất, làm giảm lệnh chương trình.  Hình 2.10 Bộ nhớ dữ liệu PIC 16F877A Dựa trên sơ đồ 4 bank bộ nhớ dữ liệu PIC16F877A ta rút ra các nhận xét như sau : - Bank0 gồm các ô nhớ có địa chỉ từ 00h đến 77h, trong đó các thanh ghi dùng chung để chứa dữ liệu của người dùng địa chỉ từ 20h đến 7Fh. Các thanh ghi PORTA, PORTB, PORTC, PORTD, PORTE đều chứa ở bank0, do đó để truy xuất dữ liệu các thanh ghi này ta phải chuyển đến bank0. Ngoài ra một vài các thanh ghi thông dụng khác ( sẽ giới thiệu sau) cũng chứa ở bank0 - Bank1 gồm các ô nhớ có địa chỉ từ 80h đến FFh. Các thanh ghi dùng chung có địa chỉ từ A0h đến Efh. Các thanh ghi TRISA, TRISB, TRISC, TRISD, TRISE cũng được chứa ở bank1 - Tương tự ta có thể suy ra các nhận xét cho bank2 và bank3 dựa trên sơ đồ trên. Cũng quan sát trên sơ đồ, ta nhận thấy thanh ghi STATUS, FSR… có mặt trên cả 4 bank. Một điều quan trọng cần nhắc lại trong việc truy xuất dữ liệu của PIC16F877A là : phải khai báo đúng bank chứa thanh ghi đó. Nếu thanh ghi nào mà 4 bank đều chứa thì không cần phải chuyển bank. Vùng Ram đa mục đích Vùng RAM đa mục đích có chiều rộng 8 bit và có thể được truy nhập trực tiếp hoặc gián tiếp thông qua thanh ghi FSR. Vùng RAM đa mục đích được phân phối ở các Bank như sau: - Bank 0: 96 Bytes từ địa chỉ 20h đến địa chỉ 7Fh. - Bank 1: 80 Bytes từ địa chỉ A0h đến địa chỉ EFh. - Bank 2: 96 Bytes từ địa chỉ 110h đến địa chỉ 16Fh. - Bank 3: 96 Bytes từ địa chỉ 190h đến địa chỉ 1EFh. Vùng thanh ghi chức năng đặc biệt Các thanh ghi chức năng đặc biệt được sử dụng bởi bộ xử lý trung tâm CPU hoặc các module ngoại vi để điều khiển hoạt động của VĐK. Các thanh ghi chức năng đặc biệt này được chia làm 2 loại: loại thứ nhất dùng cho các chức năng của CPU, loại thứ 2 dùng cho các chức năng ngoại vi. 2.1.3.7) Thanh ghi trạng thái (Status Register): Thanh ghi này có mặt ở cả 4 bank thanh ghi ở các địa chỉ 03h, 83h, 103h và 183h : chứa kết quả thực hiện phép toán của khối ALU, trạng thái reset và các bit chọn bank cần truy xuất trong bộ nhớ dữ liệu.  Hình 2.11 Status Register Bit 7 IRP: Bit lựa chọn bank thanh ghi (Sử dụng cho định địa chỉ gián tiếp). 1 = Bank 2, 3 (100h – 1FFh ) 0 = Bank 0, 1 (00h – FFh) Bit 6 – 5 RP1 – RP0: Bit lựa chọn bank thanh ghi (Dùng trong định điạ chỉ trực tiếp). 11 = Bank 3 ( 180h – 1FFh) 10 = Bank 2 (100h – 17Fh) 01 = Bank 1 (80h – FFh) 00 = Bank 0 (00h – 7Fh) Each bank is 128 bytes Bit 4 TO: Bit báo hiệu hoạt động của WDT. 1: Lệnh xóa WDT hoặc Sleep xảy ra. 0: WDT hoạt động. Bit 3 PD: Bit báo công suất thấp ( Power down bit). 1: Sau khi nguồn tăng hoặc có lệnh xóa WDT. 0: Thực thi lệnh Sleep. Bit 2 Z: bit Zero 1: Khi kết quả của một phép toán bằng 0. 0: Khi kết quả của một phép toán khác 0. Bit 1 DC: Digit Carry 1: Có một số nhớ được sinh ra bởi phép cộng hoặc phép trừ 4 bit thấp. 0: Không có số nhớ sinh ra. Bit 0 C: cờ nhớ (Carry Flag) 1: Có một số nhớ sinh ra bởi phép cộng hoặc phép trừ. 0: Không có số nhớ sinh ra. 2.1.3.8) Thanh ghi tùy chọn (Option Reg Register): Thanh ghi tùy chọn chứa các bit điều khiển để cấu hình cho các chứa năng như: ngắt ngoài, Timer 0 chức năng kéo lên Vdd của các chân Port B, và thời gian chờ của WDT. Hhình 2.12 Option-Reg Register Bit 7 RBPU : Bit cho phép PORTB được kéo lên nguồn. 1: Không cho phép PORTB kéo lên nguồn. 0: Cho phép PORTB kéo lên nguồn. Bit 6 INTEDG: Bít lựa chọn cạnh tác động ngắt (INTERRUPT EDGE) 1: Ngắt sẽ được tác động bởi cạnh lên của chân RB0/INT 0: Ngắt sẽ được tác động bởi cạnh xuống của chân RB0/INT Bit 5 T0CS: Bit lựa chọn nguồn xung Clock cho Timer 0 1: Xung Clock cung cấp bởi nguồn ngoài qua chân RA4/T0CKI 0: Xung Clock cung cấp bởi nguồn dao động nội. Bit 4 T0SE: Bit lựa chọn cạnh nào của xung clock tác động lên timer 0 1: Cạnh xuống 0: Cạnh lên Bit 3 PSA: Bit quyết định tốc độ đếm PS2:PS0 sẽ tác động lên Timer 0 hay WDT 1: Tốc độ đếm PS2:PS0 sẽ tác động lên WDT 0: Tốc độ đếm PS2:PS0 sẽ tác động lên Timer 0 Bit 2-0 PS2:PS0: Dùng để lựa chọn tốc độ đếm của timer hay WDT  2.1.3.9) Thanh ghi điều khiển ngắt INTCON (Interrupt Control Register):  Hình 2.13 Intcon Register Bit 7 GIE: Bit cho phép ngắt toàn cục 1: Cho phép ngắt toàn cục 0: Không cho phép ngắt Bit 6 PEIE: Bit cho phép ngắt khi ghi vào EEPROM hoàn tất. 1: Cho phép ngắt ghi vào EEPROM hoạt động 0: Không cho phép ngắt ghi vào EEPROM hoạt động Bit 5 TMR0IE: Bit cho phép ngắt khi timer 0 tràn 1: Cho phép ngắt khi timer 0 tràn 0: Không cho phép ngắt khi timer 0 tràn Bit 4 INTE: Bit cho phép ngắt ngoại vi trên chân RB0/INT 1: Cho phép ngắt ngoại vi 0: Không cho phép ngắt ngoại vi Bit 3 RBIE: Cho phép ngắt khi trạng thái PORTB thay đổi 1: Cho phép 0: Không cho phép Bit 2 TMR0IF: Cờ báo ngắt Timer 0 1: Timer 0 tràn 0: Timer 0 chưa tràn Bit 1 INTF:Cờ báo ngắt ngoài RB0/INT 1: Có ngắt 0: Không xảy ra ngắt. Bit 0 RBIF:Cờ báo ngắt khi có thay đổi trạng thái PORTB 1: Có thay đổi 0: Không có thay đổi xảy ra trên PORTB Chế độ Capture (Bắt giữ): 1: Một Capture thanh ghi TMR1 xảy ra( phải được xóa bằng phần mềm) 0: Không xảy ra Capture thanh ghi TMR1 Chế độ Compare ( So sánh): 1: Khi các giá trị so sánh trong thanh ghi TMR1 được thỏa ( phải được xóa bằng phần mềm) 0: Khi các giá trị so sánh trong thanh ghi TMR1 không được thỏa Chế độ PWM: Không sử dụng trong chế độ này Bit 1 TMR2IF: Cờ báo ngắt xảy ra khi giá trị trong thanh ghi TMR2 bằng trong thanh ghi PR2 1: Giá trị trong thanh ghi TMR2 bằng thanh ghi PR2 (phải được xóa bằng phần mềm) 0: Giá trị trong thanh ghi TMR2 chưa bằng thanh ghi PR2 Bit 0 TMR1IF: Cờ báo tràn thanh ghi TMR1 1: Thanh ghi TMR1 tràn (phải được xóa bắng phần mềm) 0: Thanh ghi TMR1 chưa tràn 2.1.3.10 ) Thanh ghi Work và tập lệnh của PIC 16F877A: Đây là thanh ghi rất đặc biệt trong PIC16F877A. Nó có vai trò tương tự như thanh ghi Accummulator của 8051, tuy nhiên tầm ảnh hưởng của nó rộng hơn rất nhiều. Tập lệnh của PIC16F877A có tất cả 35 lệnh thì số lệnh có sự “góp mặt” của thanh ghi W là 23 lệnh. Hầu hết các lệnh của PIC16F877A đều liên quan đến thanh ghi W. Ví dụ như, trong PIC chúng ta không được phép chuyển trực tiếp giá trị của một thanh ghi này qua thanh ghi khác mà phải chuyển thông qua thanh ghi W. Thanh ghi W có 8 bit và không xuất hiện trong bất kỳ bank thanh ghi nào của bộ nhớ dữ liệu của 16F877A. Mỗi dòng lệnh trong PIC16F877a được mô tả trong 14 bit. Khi ta thực hiện một lệnh nào đó, nó phải lưu địa chỉ của thanh ghi bị tác động (chiếm 8 bit) và giá trị một hằng số k nào đó (thêm 8 bit nữa) là 16 bit, vượt quá giới hạn 14 bit. Do vậy ta không thể nào tiến hành một phép tính toàn trực tiếp nào giữa 2 thanh ghi với nhau hoặc giữa một thanh ghi với một hằng số k. Hầu hết các lệnh của PIC16F877A đều phải liên quan đến thanh ghi W cũng vì lý do đó. Khi thực hiện một dòng lệnh nào đó, thì PIC sẽ không phải tốn 8 bit để lưu địa chỉ của thanh ghi W trong mã lệnh ( vì được hiểu ngầm). Có thể xem thanh ghi W là thanh ghi trung gian trong quá trình viết chương trình cho PIC16F877A. PIC16F877A có tất cả 35 lệnh và được trình bày khá rõ trong datasheet. Em sẽ đính kèm tập lệnh ở phần cuối cùng của bài báo cáo. Trong chương trình, em sử dụng ngôn ngữ asembly để viết. Trình biên dịch là Mplab được Microchip cung cấp miễn phí cho người dùng. 2.1.3.11) Khái quát về chức năng các Port trong vi điều khiển PIC 16F877A: Cổng xuất nhập (I/O port) chính là phương tiện mà vi điều khiển dùng để tương tác với thế giới bên ngoài. Sự tương tác này rất đa dạng và thông qua quá trình tương tác đó, chức năng của vi điều khiển được thể hiện một cách rõ ràng. Một cổng xuất nhập của vi điều khiển bao gồm nhiều chân (I/O pin), tùy theo cách bố trí và chức năng của vi điều khiển mà số lượng cổng xuất nhập và số lượng chân trong mỗi cổng có thể khác nhau. Bên cạnh đó, do vi điều khiển được tích hợp sẵn bên trong các đặc tính giao tiếp ngoại vi nên bên cạnh chức năng là cổng xuất nhập thông thường, một số chân xuất nhập còn có thêm các chức năng khác để thể hiện sự tác động của các đặc tính ngoại vi nêu trên đối với thế giới bên ngoài. Chức năng của từng chân xuất nhập trong mỗi cổng hoàn toàn có thể được xác lập và điều khiển được thông qua các thanh ghi SFR liên quan đến chân xuất nhập đó. Vi điều khiển PIC16F877A có 5 cổng xuất nhập, bao gồm PORTA, PORTB, PORTC, PORTD và PORTE 2.1.3.11.1)Port A và thanh ghi TRIS A: PORTA gồm có 6 chân. Các chân của PortA, ta lập trình để có thể thực hiện được chức năng “hai chiều” : xuất dữ liệu từ vi điều khiển ra ngoại vi và nhập dữ liệu từ ngoại vi vào vi điều khiển. Hình 2.14:Sơ đồ khối chân RA3:RA0 và chân RA5 và của chân RA4/TOCKI của cổng A Port A gồm 6 chân từ RA0 đến RA5. Việc ghi giá trị vào thanh ghi TRISA sẽ qui định các chân của Port A là input hay output(nếu là 1 thì là input, là output nếu là 0). Việc đọc thanh ghi Port A sẽ đọc trạng thái của các chân ở Port A. Việc ghi giá trị vào thanh ghi Port A sẽ thay đổi trạng thái của các chân Port A. Riêng chân RA4 được tích hợp chức năng là chân cung cấp xung clock ngoài cho Timer 0 (RA4/T0CKI). Những chân khác của Port A được đa hợp với các chân ngõ vào Analog của ADC và chân ngõ vào điện thế so sánh của bộ so sánh Comparator. Hoạt động của những chân này được quy định bằng những bit tương ứng trong các thanh ghi ADCCON1 và CMCON1. Khi các chân của Port A được sử dụng làm ngõ vào Analog thì các bit trong thanh ghi TRISA phải được set bằng 1. Chức năng các chân trong Port A.  Hình 2.15: PORT A Function Ngoài ra, PORTA còn có các chức năng quan trọng sau : - Ngõ vào Analog của bộ ADC : thực hiện chức năng chuyển từ Analog sang Digital - Ngõ vào điện thế so sánh - Ngõ vào xung Clock của Timer0 trong kiến trúc phần cứng : thực hiện các nhiệm vụ đếm xung thông qua Timer0… - Ngõ vào của bộ giao tiếp MSSP (Master Synchronous Serial Port). Các thanh ghi FSR liên quan đến PORTA bao gồm: PORTA (địa chỉ 05h) : chân giữ vai trò