Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 66 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
66
Dung lượng
5,01 MB
Nội dung
BỘ CÔNG NGHIỆP TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP HCM KHOA CÔNG NGHỆ ĐIỆN TỬ #" Đồ Án Tốt nghiệp Đề Tài: LẬP TRÌNH C CHO HỌ VI ĐIỀU KHIỂN 8051 Đồ Án Tốt Nghiệp PHẦN I TỔNG QUAN ĐỀ TÀI I ĐẶT VẤN ĐỀ: Ngày nay, ứng dụng Vi điều khiển sâu vào đời sống sinh hoạt sản xuất c người Thực tế hầ u hết thiết bị điện dân dụng hi ện có góp mặt Vi Điều Khiển vi xử lí Ứng dụng vi điều khiển thiết kế hệ thống làm giả m chi phí thiết kế hạ giá thành sản phẩm đồng thời nâng cao tính ổn định thiết bị hệ thống.Trên thị trường có rấ t nhiều họ vi điều khiển: họ 8051 Intel, 68HC11 Motorola, Z80 hãng Zilog, PIC hãng Microchip, H8 Hitachi,vv… Vi ệc phát triển ứng dụng hệ vi xử lý đòi hỏi hiểu biết ph ần cứng phần mềm, mà hệ vi xử lý sử dụng để giải toán khác Tính đa dạng ứng dụng phụ thuộc vào việc lựa chọn hệ vi xử lý cụ thể vào kỹ thuật lập trình Ngày vi xử lý có mặt nhiều thiết bị điện tử đại: từ đầu đĩa CD, máy thu hình, máy ghi hình, dàn âm HiFi, điều khiển lò sưởi thiết bị điều khiển dùng công nghiệp Lĩnh vực ứng dụng hệ vi xử lý rộng lớn: từ nguyên cứu khoa học, truyền liệu, đến công nghiệp, lượng, giao thông y tế… Tùy theo kinh nghiệm mức độ thông thạ o mà sử dụng ngơn ++ ngữ khác hợp ngữ như: C, C , Visual basic để có chương trình chất lượng cao II NỘI DUNG CỦA ĐỀ TÀI: Sơ lược vi điều khiển AT89C51 Khảo sát vi điều khiển AT89C2051 hãng ATMEL • Gồm sơ đồ chân linh kiện • Sơ đồ khối AT89C2051 • Các nội dụng ứng dụng AT89C2051 Giới thiệu phần mềm Keil Software µViSion Ứng dụng ngơn ngữ C Assembly điều khiển lập trình led • Ứng dụng cho led đơn, led đoạn, led ma trận… Kết luận hướng phát triển đề tài SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang Đồ Án Tốt Nghiệp PHẦN II NỘI DUNG ĐỀ TÀI CHƯƠNG 1: GIỚI THIỆU BỘ VI ĐIỀU KHIỂN 89C2051 89C51 I.GIỚI THIỆU BỘ VI ĐIỀU KHIỂN 89C2051 9 9 9 9 9 9 9 I.1 CÁC ĐẶC ĐIỂM Tương thích với sản phẩm họ MSC-51 2K byte nhớ Flash lập trình Khả :1000 chu kì ghi/xóa Tầm điện áp hoạt động từ 2,7 V đến 6V Tầm tần số hoạt động từ Hz đến 21 MHz mức khóa nhớ chương trình (program memory) RAM bên (internal RAM) có dung lượng 128 x bit 15 đường I/O lập trình định thời /đếm 16 bit nguồn (nguyên nhân ) ngắt Kênh nối tiếp UART lập trình Các ngõ kích LED trực tiếp Mạch so sánh tương tự chip (on-chip analog comparator) Các chế độ nghỉ công suất thấp chế độ giảm cơng suất I.2 MƠ TẢ Chip AT89C2051 chip vi điều khiển CMOS bit điện áp thấp, hiệu suất cao có 2K byte nhớ Flash đọc, xóa lập trình PEROM (Flash programmable and erasable readonly memory) Linh kiện sản xuất cách sử dụng công nghệ nhớ không thay đổi mật độ cao Atmel tương thích với tập tệp MCS-51 chuẩn cơng nghiệp Bằng cách kết hợp CPU 8-bit đa linh hoạt với Flash chip đơn tinh thể , Atmel AT89C2051 chip vi điều khiển mạnh cung cấp giải pháp linh động cao mang lại hiệu giá thành cho nhiều ứng dụng điều khiển nhúng (embedded control application) AT89C2051 cung cấp đặc tính chuẩn sau : nhớ Flash 2K byte , 128 byte RAM , 15 đường I/O, định thời/đếm 16- bit , kiến trúc ngắt hai mức vector, port nối tiếp hồn tồn song cơng , mạch so sánh tương tự xác, mạch dao động tạo xung clock chip Ngoài AT89C2051 thi ết kế có mạch logic tĩnh cho hoạt động giảm đến tần số Hz hỗ trợ chế độ tiết kiệm công suất lựa chọn phần mềm Chế dộ ngh ĩ ( idle mode ) dùng CPU cho phép RAM, định thời/đếm, port nối tiếp h ệ thống ngắt tiếp tục hoạt động Chế độ giả m cơng suất trì nội dung RAM làm dừng mạ ch dao động, không cho phép c khác chip hoạt động lần reset cứng (nghĩa ta thiết lập lại trạng thái ban đầu [reset] cho chiop mạch điện bên ngoài) SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang Đồ Án Tốt Nghiệp I.3 CẤU HÌNH CHÂN Hình 1.1 I.4 SƠ ĐỒ KHỐI SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang Đồ Án Tốt Nghiệp Hình 1.2 # # # # # # # # # # # # # # # # # # # # # # # # RAM ADDR REGISTER: ghi địa RAM RAM: vùng nhớ truy cập ngẫu nhiên (RAM) FLASH: vùng nhớ FLASH B REGISTER:thanh ghi B ACC: chứa STACK POINTER: trỏ vùng nhớ xếp chồng PROGRAM ADDRESS REGISTER: ghi địa chương trình TMP1: ghi tạm TMP2: ghi tạm ALU: đơn vị số học/logic BUFFER: đệm PC INCREMENTER: tăng ghi đếm chương trình PC INTERRUPT, SERIAL PORT AND TIMER BLOCKS: khối ngắt, port nối tiếp định thời PROGRAM COUNTER: đếm chương trình PC PSW: từ trạng thái chương trình TIMING AND CONTROL:mạch logic điều khiển định thời INSTRUCTION REGISTERED: ghi lệnh DPTR: trỏ liệu PORT1 LATCH: chốt port PORT3 LATCH: chốt port ANALOG COMPARTOR:bộ so sánh tương tự OSC:mạch dao động PORT DRIVERS: mạch kích port PORT DRIVERS: mạch kích port I.5 MÔ TẢ CHÂN VCC Chân cấp điện áp Vcc cho chip GND Chân nối đất Port Port port I/O (port nhập/xuất: input/output port) hai chiều 8-bit Các chân củ a port từ P1.2 đến P1.7 cung cấp mạch kéo lên bên (internal pull-ups) Các chân P1.0 P1.1 yêu cầu mạ ch kéo lên bên P1.0 P1.1 sử dụng làm ngõ vào dương (AIN0) ngõ vào âm (ÁIN), theo thứ tự, mạch so sánh tương tự xác chip (on – chip precision analog comparator) Các mạch đệm ngõ (output buffer) port hút dịng 20mA kích trự c tiếp thị LED Khi logic ghi đến chân port 1, chân sử dụng làm ngõ vào Khi chân từ P1.2 đến P1.7 sử dụng làm ngõ vào kéo xuống mức thấp từ bên ngồi, chúng cung cấp dịng (IIL) mạch kéo lên bên Port nhận liệu chương trình hay kiệu mã (code data) thời gian lập trình kiểm tra nhớ Flash Port Các chân port từ P3.0 đến P3.5, P3.7 chân I/O hai chiều v ới mạ ch kéo lên bên P3.6 nối dây cứng làm ngõ vào nối đến ngõ mạch so sánh chip truy cập chân I/O có mục đ ích tổng quát Các mạch đệm ngõ port hút dịng 20mA.Khi logíc ghi đến chân port 3, chân kéo lên mức cao mạch kéo lên bên sử dụng làm ngõ vào Khi ngõ vào, chân port kéo xuống mức thấp mạch bên cung cấp dòng (I IL) SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang Đồ Án Tốt Nghiệp mạch kéo lên Các chân củ a port sử dụng cho chức đặc biệt khác AT89C2051 liệt kê ( bảng 11,1) Port nhận số tín hiệu điều khiển để lập trình kiểm tra nhớ Flash Bảng 1.1 RST Ngõ vào reset (thiết lập lạ i trạng thái ban đầu) Tất chân I/O reset đến mức logíc sau RST lên mức cao Việc trì chân RST mức cao chu kỳ máy mạch dao động hoạt động reset chip XTAL Ngõ vào đến mạch khuếch đại dao động đảo ngõ vào đến mạch tạo xung clock bên XTAL Ngõ từ mạch khuếch đại dao động đảo I.6 CÁC ĐẶC TÍNH CỦA MẠCH DAO ĐỘNG XTAL XTAL ngõ vào ngõ ra, theo thứ tự, mạch khu ếch đại đảo cấu hình để trở thành mạch dao động chip trình bày hình 1.3 Một tinh thể thạch anh hoặ c mạch cộng hưởng gố m sử dụng Để kích chip từ nguồnxung clock bên ngồi, chân XTAL khơng kết nối chân ATAL kích trình bày hình 1.4 Khơng có u cầu v ề chu kỳ nhiệm vụ (duty cycle) tín hiệu xung clock bên ngồi ngõ vào đến mạch ngõ vào đến mạ ch tạo xung clock bên đ i qua flipflop làm nhiệm vụ chia tần số, đặc tính điện áp tối thiểu tối đa mức cao mức thấ p phải xem xét Hình 1.3 kết nối mạch dao động Lưu ý: C1,C2=30pF ± 10pF thạch anh ; C1,C2=40pF ± 10pF cộng hưởng gốm Hình 1.4: Cấu hình kích xung clock bên ngồi SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang Đồ Án Tốt Nghiệp I.7CÁC THANH GHI CHỨC NĂNG ĐẶC BIỆT SFR Bảng 1.2 Các giá trị reset đồ SFR AT89C2051 M ột đồ vùng nhớ chip đượ c gọi không gian ghi chức đặc biệt SFR (special function registor) trình bày (bảng 1.2) Lưu ý tất địa bị chiếm ghi này, địa khơng bị chiếm khơng th ực chip Các truy cập đọ c đến địa trường hợp tổng quát, trả liệu ngẫu nhiên truy cập ghi có tác động khơng rõ ràng Phần mêm người sử dụng không nên ghi logic đến vị trí nhớ khơng đượ c liệt kê chúng sử dụng sản phẩm tương lai để đáp ứng đặt tính Trong trường hợp đó, giá trị reset giá trị khơng tích cực bit luôn I.8 CÁC GIỚI HẠN TRÊN MỘT SỐ LỆNH AT89C2051 thành viên tiết kiệm có hiệu giá thành họ vi đièu khiển phát triển Atmel Chip chứa 2K nhớ chương trình Flash Chip hồn tồn tương thích với kiến trúc MCS-51và lập trình cấch sử dụng tập lệnh MCS-51 nhiên, có vài cân nhắc mà ta ohải ý sử dụng số lập trình chip Tất lệnh liên quan đến hoạt động nhảy r ẽ nhánh s ẽ bị giới hạn, chẳn hạn địa đíh rơ i vào không gian nhớ chip, không gian 2K byte với AT89C2051 Vấn đề trách nhiệm nguowif lập trình phần mềm Thí dụ, lệnh LJMP 7E0H lệnh hợp lệ AT89C2051 (có 2K byte nhớ chương trình)trong lệnh LJMP 900H lệnh không hợp lệ SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang Đồ Án Tốt Nghiệp Các lệnh rẽ nhánh LCALL,LMJP, ACALL, AJMP,SJMP ,JMP@A+DPTR- Các lệnh rẽ nhánh không điều kiện thực thi miễn người lập trình lư u ý r ằng địa đ ích r ẽ nhánh ph ải nằm giới hạn vật lý kích thước nhớ chương trình (các vị trí nhớ từ 00H đến 7FFH AT89C2051) Việc vi phạm giới hạn khong gian vật lý gây hành vi khơng biết chương trình CJNE [ ], DJNZ [ ], JB, JNB, JC, JNC, JBC, JZ, JNZ - Với lệnh r ẽ nhánh có điều kiện này, quy luật giống áp dụng Một lần nữa, việc vi phạm giơis hạn nhớ vật lý làm cho chương trình thực hti khơng Đối với ứng dụng bao gồm cách ngắ t, vị trí địa củ a chương trình phục vụ ngắt (interrupt service rountine) bình thường cấu trúc họ 89C2051 bảo toàn Các lệnh liên quan đến MOVX, nhớ liệu AT89C2051 chứa 128 byte nhớ liệu bên (intenal data memory) Như AT89C2051,kích thước xếp chồng (stack depth) giới hạn tới 128 byte, đay dung lượng RAM có sẳn Việ c truy cạp nhớ bên ngồi khơng hỗ trợ chip việc thưc thi chương trình bên ngồi khơng hỗ trợ Như khơng có lệnh MOVX [ ] chứa chương trình Một trình dịch hợp ngữ (assembler) điển hình 89C51 dịch lệnh này,ngay chúng viế t dạng vi phạm giới hạn đề cập Ngườ i sử dụng vi điều khiển phải có trách nhiệm phải biết tính chất vật lý giới hạn linh kiện sử dụng điều chỉnh lệnh sử dụng cách thích hợp Các giới hạn cho ta thấy khuyết điểm At89C2051 I.9 CÁC BIT KHỐ BỘ NHỚ CHƯƠNG TRÌNH V ới chip AT89C2051 ta có bit khố (lock bit), bit để lại khơng lập trình (U) lập trình (P) đẻ nhận thêm tính chất liệt kê bảng 11.3 Các bit khố chương trình LB1 LB2 U U P U U U Loại bảo vệ Khơng có tính chất khố chương trình Việc lập trình thêm cho nhớ Flash bị cấm Tương tự chế độ 2, việc kiểm tra bị cấm Lưu ý: bit khố bị xố thao tác xoá chip Bảng 1.3:Các chế độ bảo vệ bit khoá I.10 CHẾ ĐỘ NGHỈ Trong chế đọ nghỉ CPU tự ngủ, tất ngoại vi khác chip điều hoạt động điều trì trạng thái chế độ tích cực Chế đọ yêu cầu phần mềm Nội dung RAM chip tất tren ghi chức đặc biệt điều giữ nguyên không thay đổi thời gian chế độ Chế độ nghỉ kết thúc cách ngắt phép hoăc cách reset phần cứng Các chân P1.0 P1.1 thiết lập không sử dụng mạch kéo lên bên thiết lập có mạch kéo lên bên Cũng cần lưu ý chế độ nghỉ kết thúc b ởi reset cứng, chip tiếp tụ c thực thi chương trình bình thường từ nơi chương trình bị rời bỏ, đến chu kỳ máy trướ c giải thuật reset bên lấy quyền điều khiển Phần cứng chip ngăm cản việc truy cập đến RAM bên chế độ không cấm việc truy cập đến cá chân port Để laọi bỏ khả có mộ t thao tác không mong đợi đến chân port ch ế độ nghỉ đượ c kết thúc reset, lẹnh theo sau lệnh yêu cầu chế nghỉ lệnh ghi đến chân port nhớ SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang Đồ Án Tốt Nghiệp I.11 CHẾ ĐỘ GIẢM CÔNG SUẤT Trong chế độ giảm công suất, mạch dao động bị dừng lệnh yêu cầu chế độ giảm công suất lệnh sau đượ c thực thi RAM chip ghi chức đặc biệt giữ lại giá tr ị chúng cho đén chế độ giảm công suất kết thúc.Lối khỏi chế độ giảm cơng suất sử dụng reset cứng Reset định nghĩ a lại ghi chua\cứ đặc bi ệt không làm thay đổi Ram chip Reset không nên kích hoạt trươc điện áp VCC khơi phục đến mức hoạ t động bình thường reset phải trì tích cực đủ lâu phép mạch hoạt động trở lại trở nên ổn định Các chân P1.0 P1.1 thiết lập không sử dụng mạch kéo lên bên ngồi thiết lập có mạch kéo lên bên ngồi I.12 LẬP TRÌNH FLASH AT89C2051 thị trường có dải nhớ chương trình PEROM chip la 2K byte trạng thái xóa (nghĩa toàn nội dung byte FFH) sẳn sàng lập trình Dải nh chương trình lập trình byte cho thời điểm Một dãi lập trình, để lập trình lại byte khơng trống, tồn dải nhớ xóa điện Bộ điếm địa bên AT89C2051 có đếm địa PEROM bên trong, đếm luôn thiết lập 00H cạnh lên RST tăng lên cách áp dụng xung trở thành mức dương (positve going pluse) đến chân XTAL1 Giải thuật chương trình Để lập trình AT89C2051, theo trình tự sau Trình tự cấp điện: Cấp điện chân VCC GND Thiêt lập RST XTLA1 đến mức thấp (GND) Thiết lâp RST lên mức cao (‘H’) Thiết lập chân P3.2 lên mức cao (‘H’) Áp dụng tổ hợp mức logic ‘H’ ‘L’ thích hợp đên chân P3.3, P3.4, P3.5 P3.7 để chọn thao tác lập trình trình bày bảng chế độ lập trình PEROM (PEROM proramming modes table) Để lập trình kiểm tra dải nhớ chương trình: Đặt liệu byte chhương trình ( hay cịn gọi byte mã) vị trí 00h đến chân từ P1.0 đến P1.7 Tăng RST lên 12V phép lập trình Đưa xung đến chân P3.2 để lập trình byte dải PEROM bit khóa Chu kỳ ghi byte tự định thời điển hình chiếm 1.2ms Để kiểm tra liệu lập trình, giảm thấp RST từ 12V xuống mức logic cao ‘H’ thiết lập chân từ P3.3 đến P3.7 đến mức logic thích hợp Dữ liệu xuất đọc chân port Để lập trình byte vị trí địa kế tiếp, đưa xung đến XTAL1 để tăng đếm địa bên (internal address counter) đặt liệu đến chân port Lập lại bước từ đến 8, thay đổi liệu tăng đếm địa cho toàn dải byte hoăc kết thúc tập tin đối tượng (object file) 10.Trình tự ngắt nguồn điện Thiết lập XTLA1 đến mức thấp (‘L’) Thiết lập RST đến mức thấp (‘L’) Tắt nguồn cấp điện cho VCC SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang Đồ Án Tốt Nghiệp Data Polling: AT89C2051 có Data Polling để việc kế t thúc chu kỳ ghi Trong thời gian chu kỳ ghi, việc thử đọc byte sau đượ c ghi dẫn đến việc lấy bù liệu ghi chân P1.7 Một chu kỳ ghi kết thúc, liệu có hiệu lực tất ngõ chu kỳ bắt đầu Data Polling bắt đầu lúc sau khki chu kỳ ghi khởi động Ready/ Busy : Tiến trình lập trình byte giám sát tín hiệu ngõ RDY/ BSY Chân P3.1 kéo xuống mức th ấp sau chân P3.2 trở thành mức cao thời gian lập trình trạng thái bận (BUSY) Chân P3.1 kéo lên mức cao lấn việc lập trình kết thúc chhỉ trạng thái sẳn sàng (READY) Program verify ( kiểm tra ch ưong trình ): Nếu bit khóa LB1 LB2 khơng lập trình, liệu chương trình đọc ngược thơng qua đường liệu để kiểm tra: Reset đếm địa bên 00H để mang RST từ ‘L’ lên ‘H’ Đặt tín hiệu thích hợp để đọc liệu chương trình đọc liệu ngõ chân port Đưa xung đến chân XTAL để tăng đếm địa bên Đọc byte liệu chân port Lập lại bước tồn dải nhớ chương trình đọc Các bit khóa khong thể đượ c kiểm tra trực tiếp Việc kiểm tra bit khóa nhận cách tuân theo tính chất cho phép chúng Chip erase (xóa chip): Tồn dải PEROM (2K byte) hai bit khóa đựơc xóa điện sử dụng tổ hợp thích hợp tín hiệu điều khiển cách giữ cho chân P3.2 mức thấp 10ms Dải nhớ chương trinhd ghi vớ i tất bit điều thao tác xóa chip va phải thực trước byte nhớ khơng trống lập trình lại Reading the signature bytes (đọc byte chữ ký ): Các byte chữ ký đọc với thủ tục viêc kiểm tra bình thường vị trí nhớ 000H, 001H, 002H, ngoại trừ chân P3.3 chân P3.5 phải kéo xuống mức logic thấp Các giá trị trả sau: (000H) = 1EH sản xuất Atmel (001H) = 21H 89C2051 I.13CÁC CHẾ ĐỘ LẬP TRÌNH FLASH Các chế độ lập trình Flash tóm tắt bảng 1.4 SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 10 Đồ Án Tốt Nghiệp Nhiều chương trình mẫu chương sử dụng đoạn mã bắt đầu sau: #include Các tậ p tin định nghĩa ghi lưu thư mục C:\KEIL\C51\INC Đoạn mã sau trích từ tập tin định nghĩa ghi cho port song song I/O sfr sfr sfr sfr P0 P1 P2 P3 = = = = 0x80; 0x90; 0xA0; 0xB0; / 8-bit I/O Port P0 / 8-bit I/O Port P1 / 8-bit I/O Port P2 / 8-bit I/O Port P3 Bạn định giá trị SFRs cách trực tiếp mã nguồn C tiêu đề flie sfr IE = 0xA8; sbit EA = IE^7; // Interrupt Enable register at SFR address 0xA8 // global Interrupt Enable Flag (bit of SFR IE) Chú ý: Khi bạn lấy ghi giá trị ghi đặc biệt bạn cần phải khai báo SFR tập tin nguồn Bit ký hiệu SFR định nghĩa cho bit địa ghi SFR, mà định vị theo địa 0x80, 0x88, 0x90 … 0xF8 Register Banks ( ghi lưu trữ ) Vi điều khiển 8051 xây dựng dựa vào vùng nhớ với tám ghi thông dụng (R0 –R70) Mỗi ghi ghi byte đơn Tám ghi đa dụng quản lý việc lưu trữ ghi lưu trữ 8051 cung cấp ghi lưu trữ mà bạn sử dụng Quá trình làm việc ghi dễ dàng nhận thấy bạn thực ngắt Dùng cho chương trình C 8051 ta khơng cần chọn mở ghi chương trình mặc đinh chọn ghi lưu trữ Các ghi lưu trữ 1, 2, quá trình ngắt để tránh việc lưu trữ khôi phục ngăn xếp Các điều kiện ngắt ( Interrupt Service Routines ) Trình biên dịch C51 cho phép viết điều kiện ngắt C trình biên dịch sử dụng cách hiệ u mã khởi đầu mã kết thúc điều tiết mở ghi lưu trữ Các điều kiện ngắt khai báo sau: void function_name (void) interrupt interrupt_number [using register_bank] Chỉ số ngắ t (interrupt number) giúp xác định địa véc tơ ngắt hàm ngắt Sử dụng bảng sau để xác định số ngắt: Interrupt Number Address Interrupt Number Address (EXTERNAL INT 0) 0003h 16 0083h (TIMER/COUNTER 0) 000Bh 17 008Bh (EXTERNAL INT 1) 0013h 18 0093h (TIMER/COUNTER 1) 001Bh 19 009Bh (SERIAL PORT) 0023h 20 00A3h (TIMER/COUNTER 2) 002Bh 21 00ABh (PCA) 0033h 22 00B3h 003Bh 23 00BBh SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 52 Đồ Án Tốt Nghiệp 0043h 24 00C3h 004Bh 25 00CBh 10 0053h 26 00D3h 11 005Bh 27 00DBh 12 0063h 28 00E3h 13 006Bh 29 00EBh 14 0073h 30 00F3h 15 007Bh 31 00FBh Việc sử dụng thuộc tính ta rõ ghi lưu trữ suốtt thời gian thực hàm ngắt Nhữ ng điều ngắ t khoảng ngắn hiệu khơng sử dụng thuộc tính, chúng sử dụng ghi lưu trữ bạn kiểm chứng hai đoạn mã essembler xem hiệu chúng Chú ý: Các hàm kèm theo ều ki ện ngắt cần phải biên tập với thị NOAREGS Việc bảo đảm việc biên dịch không phát sinh việc thay đổi ghi tuyệt đối Ví dụ sau cho ta thấy hàm ngắt tiêu biểu: #include // Special Function Registers of 80C51 CPU #pragma NOAREGS // not use absolute register symbols (ARx) // for functions called from interrupt routines static void HandleTransmitInterrupt (void) { : : } static void HandleReceiveInterrupt (void) { : : } // for other code it is save to use ARx symbols #pragma AREGS static void com_isr (void) interrupt using { if (TI) HandleTransmitInterrupt (); if (RI) HandleReceiveInterrupt (); } Trong ví dụ ều kiện ngắt chi số ngắt thiết lập Tên hàm ngắt com_isr Khi lệnh ngắt thực kéo theo, mã mục l ưu vào ghi CPU ch ọn ghi lưu trữ Khi thủ tục ngắt kết thúc giá trị ghi khôi phục Sau đoạn mã sinh lậnh ngắ t kể Chú ý nội dung ghi lưu trữ hoán đổi khơi phục lại sau ; FUNCTION com_isr (BEGIN) 0000 C0E0 PUSH ACC ; Save the Accumulator and Data Pointer 0002 C083 PUSH DPH 0004 C082 PUSH DPL 0006 C0D0 PUSH PSW ; Save PSW (and the current Register Bank) 0008 75D008 MOV PSW,#08H ; This selects Register Bank SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 53 Đồ Án Tốt Nghiệp : : 0052 0054 0056 0058 005A D0D0 D082 D083 D0E0 32 POP POP POP POP RETI PSW DPL DPH ACC ; Restore PSW (and prior reg bank) ; Restore the Accumulatorand DPTR ; FUNCTION com_isr (END) Các ghi cho phép ngắt (Interrupt Enable Registers) 8051 cung cấp điều kiện ngắt cho nhiều chip ngoạ i vi Q trình ngắt hồn toàn phụ thuộc vào bit EA Interrupt Enable (IE) SFR Khi bit EA lên mức trình ngắt thực Khi bit EA xuống mức q trình ngắt bị vơ hiệu Mỗi q trình ngắt kiểm sốt than ghi IE SFR Tên số chip 8051 có ghi IE Kiểm tra tài liệu chip để tận dụng trình ngắt Các port song song vào/ra (Parallel Port I/O) Một chip 8051 bình thường có port vào song song mà bạn kết nối với thiết bị ngoại vi Chúng Port 0, Port 1, Port 2, Port Một số IC 8051 mở rơng có tới Port xuất nhập Port Direction Width Alternate use P0 I/O bits Mux'd 8-bit bus: A0-A7 & D0-D7 P1 I/O bits P1.0-P1.7: Available for user I/O P2 I/O bits Mux'd 8-bit bus: A8-A15 P3 I/O bits P3.0: RXD (Serial Port Receive) P3.1: TXD (Serial Port Transmit) P3.2: /INT0 (Interrupt input) P3.3: /INT1 (Interrupt input) P3.4: T0 (Timer/Counter Input) P3.5: T1 (Timer/Counter Input) P3.6: /WR (Write Data Control) P3.7: /RD (Read Data Control) Các Port IC 8051 bình thường khơng có liệu ghi ều khiển Thay vào đó, chân Port 1, Port 2, Port chân tăng lên mà chúng đầu nhập hay đầu xuất Để ghi giá trị vào Port bạn đơn gi ản ghi giá trị tùng chân Port Để lấy giá trị t Port trước hết giá trị chân phải ghi ( giá trị ban đầu sau RESET ) Ví dụ sau chương trình ghi xuất giá trị Port I/O: sfr P1 = 0x90; sfr P3 = 0xB0; sbit DIPswitch = P1^4; sbit greenLED = P1^5; // SFR definition for Port // SFR definition for Port // DIP switch input on Port bit // green LED output on Port bit void main (void) { unsigned char inval; SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 54 Đồ Án Tốt Nghiệp inval = 0; // initial value for inval while (1) { if (DIPswitch == 1) { // check if input P1.4 is high inval = P1 & 0x0F; // read bit from P1 greenLED = 0; // set output P1.5 to low } else { // if input P1.4 is low greenLED = 1; // set output P1.5 to high } P3 = (P3 & 0xF0) | inval; // output inval to P3.0 P3.3 } } Timer/Counter ( định thời đếm ) IC 80C52 có ba Timer/Counter (Timer 0, Timer 1, Timer 2) Timer Timer có c thơng thường Timer có khả ứ ng dụng cao Các timer hoạt động độc lập với với kiểu định thời, kiểu đếm, kiểu phát tốc độ baud (cho Port tuần tự) Chương trình sau ví dụ dùng Timer tạo xung vng có tần số 10KHz #include /* * Timer Interrupt Service Routine: executes every 100 clock cycles */ static unsigned long overflow_count = 0; void timer1_ISR (void) interrupt { overflow_count++; // Increment the overflow count } /* * MAIN C function: sets Timer1 for 8-bit timer w/reload (mode 2) * The timer counts to 255, overflows, is reloaded with 156, and * generates an interrupt */ void main (void) { TMOD = (TMOD & 0x0F) | 0x20; // Set Mode (8-bit timer with reload) TH1 = 256 - 100; // Reload TL1 to count 100 clocks TL1 ET1 TR1 EA // Enable Timer Interrupts // Start Timer Running // Global Interrupt Enable = = = = TH1; 1; 1; 1; while (1); // Do Nothing (endless-loop): the timer ISR will SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 55 Đồ Án Tốt Nghiệp // occur every 100 clocks Since the 80C51 CPU runs // at 12 MHz, the interrupt happens 10 KHz } Bộ biến đổi tương tự – số Các biến đổi t ương tự số A/D linh kiện có số thành viên họ 8051 phổ biến Các biến đổi A/D thường ều ển thông qua ghi chủ ADCON, ghi gán cho vị trí cịn trống đoạn nhớ dành cho SFR, chi ADCON cho phép ng ười sử dụng chọn lựa kênh cần biến đổi A/D, bặ đầu biến đổi kiểm tra trạng thái lần biến đổi Các biến đổi A/D điển hình cần 40 chu kỳ lệnh để hoàn tất việc biến đổi chúng cấu hình để t ạo ngắ t vào lúc hoàn tất việc biến đổi, việc làm cho vi điều khiển định hướng đế n vector ngắt cụ thể dành cho việc biến đổi A/D thông thường khuyết điể m biế n đổi A/D yêu c ầu vi điều khiể n phải mức tính cực thay vào nghỉ để chờ ngắt việc biến đổi hoàn tất Kết việc biến đổi đọc từ SFR khác cặp SFR, phụ thuộc vào độ phân giãi biến đổi Chương trình sau ví dụ chuyển đổi tương tự từ tín hiệu ngõ vào sang số: #include #include void main (void) { unsigned char chan_2_convert; SCON = 0x50; TMOD |= 0x20; TH1 = 0xA0; TR1 = 1; TI=1; channel // Configure the serial port // Configure A/D to sequentially convert each input ADCCON1 = 0x7C; // 0111 1100 while (1) { unsigned int conv_val; unsigned char channel; // Start a conversion and wait for it to complete chan_2_convert = (chan_2_convert + 1) % 8; ADCCON2 = (ADCCON2 & 0xF0) | chan_2_convert; SCONV = 1; while (ADCCON3 & 0x80); / Read A/D data and print it out channel = ADCDATAH >> 4; SVTH:Lê Văn Long & Đặng Đức Trung CDDT6K Trang 56 Đồ Án Tốt Nghiệp conv_val = ADCDATAL | ((ADCDATAH & 0x0F)