Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 58 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
58
Dung lượng
2,03 MB
Nội dung
Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh CHƯƠNG II: BàiTậpLớnMônViXử Lý Trang Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng I GVHD: Nguyễn Trọng Khanh PIC 16F877A PIC viết tắt “Programable Intelligent Computer”, tạm dịch “máy tính thông minh khả trình” hãng Genenral Instrument đặt tên cho vi điều khiển họ PIC1650 thiết kế để dùng làm thiết bị ngoại vi cho vi điều khiển CP1600 Vi điều khiển sau nghiên cứu phát triển thêm từ hình thành nên dòng vi điều khiển PIC ngày CÁC DÒNG PIC VÀ CÁCH LỰA CHỌN VI ĐIỀU KHIỂN PIC - Các kí hiệu vi điều khiển PIC: PIC12xxxx: độ dài lệnh 12 bit PIC16xxxx: độ dài lệnh 14 bit PIC18xxxx: độ dài lệnh 16 bit C: PIC có nhớ EPROM (chỉ có 16C84 EEPROM) F: PIC có nhớ flash LF: PIC có nhớ flash hoạt động điện áp thấp LV: tương tự LF, kí hiệu cũ Bên cạnh số vi điệu khiển có kí hiệu xxFxxx EEPROM, có thêm chữ A cuối flash (ví dụ PIC16F877 EEPROM, PIC16F877A flash) Ngoài có thêm dòng vi điều khiển PIC dsPIC Ở Việt Nam phổ biến họ vi điều khiển PIC hãng Microchip sản xuất Cách lựa chọn vi điều khiển PIC phù hợp: Trước hết cần ý đến số chân vi điều khiển cần thiết cho ứng dụng Có nhiều vi điều khiển PIC với số lượng chân khác nhau, chí có vi điều khiển có chân, có vi điều khiển 28, 40, 44, … chân Cần chọn vi điều khiển PIC có nhớ flash để nạp xóa chương trình nhiều lần Tiếp theo cần ý đến khối chức tích hợp sẵn vi điều khiển, chuẩn giao tiếp bên Sau cần ý đến nhớ chương trình mà vi điều khiển cho phép BàiTậpLớnMônViXử Lý Trang Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh Ngoài thông tin cách lựa chọn vi điều khiển PIC tìm thấy sách “Select PIC guide” nhà sản xuất Microchip cung cấp NGÔN NGỮ LẬP TRÌNH CHO PIC Ngôn ngữ lập trình cho PIC đa dạng Ngôn ngữ lập trình cấp thấp có MPLAB (được cung cấp miễn phí nhà sản xuất Microchip), ngôn ngữ lập trình cấp cao bao gồm C, Basic, Pascal, … Ngoài có số ngôn ngữ lập trình phát triển dành riêng cho PIC PICBasic, MikroBasic,… SƠ ĐỒ CHÂN VI ĐIỀU KHIỂN PIC16F877A MỘT VÀI THÔNG SỐ VỀ VI ĐIỀU KHIỂN PIC16F877A Đây vi điều khiển thuộc họ PIC16Fxxx với tập lệnh gồm 35 lệnh có độ dài 14 bit Mỗi lệnh thực thi chu kì xung clock Tốc độ hoạt động tối đa cho phép 20 MHz với chu kì lệnh 200ns Bộ BàiTậpLớnMônViXử Lý Trang Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh nhớ chương trình 8Kx14 bit, nhớ liệu 368x8 byte RAM nhớ liệu EEPROM với dung lượng 256x8 byte Số PORT I/O với 33 pin I/O Các đặc tính ngoại vi bao gồm khối chức sau: Timer0: đếm bit với chia tần số bit Timer1: đếm 16 bit với chia tần số, thực chức đếm dựa vào xung clock ngoại vivi điều khiển hoạt động chế độ sleep Timer2: đếm bit với chia tần số, postcaler Hai Capture/so sánh/điều chế độ rông xung Các chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port), SPI I2C Chuẩn giao tiếp nối tiếp USART với bit địa Cổng giao tiếp song song PSP (Parallel Slave Port) với chân điều khiển RD, WR, CS bên Các đặc tính Analog: kênh chuyển đổi ADC 10 bit Hai so sánh Bên cạnh vài đặc tính khác vi điều khiển như: Bộ nhớ flash với khả ghi xóa 100.000 lần Bộ nhớ EEPROM với khả ghi xóa 1.000.000 lần Dữ liệu nhớ EEPROM lưu trữ 40 năm Khả tự nạp chương trình với điều khiển phần mềm Nạp chương trình mạch điện ICSP (In Circuit Serial Programming) thông qua chân Watchdog Timer với dao động Chức bảo mật mã chương trình Chế độ Sleep Có thể hoạt động với nhiều dạng Oscillator khác BàiTậpLớnMônViXử Lý Trang Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh SƠ ĐỒ KHỐI VI ĐIỀU KHIỂN PIC16F877A BàiTậpLớnMônViXử Lý Trang Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh TỔ CHỨC BỘ NHỚ Cấu trúc nhớ vi điều khiển PIC16F877A bao gồm nhớ chương trình (Program memory) nhớ liệu (Data Memory) BỘ NHỚ CHƯƠNG TRÌNH - Bộ nhớ chương trình vi điều khiển PIC16F877A nhớ flash, dung lượng nhớ 8K word (1 word = 14 bit) phân thành nhiều trang (từ page0 đến page 3) - Như nhớ chương trình có khả chứa 8*1024 = 8192 lệnh (vì lệnh sau mã hóa có dung lượng word (14 bit) - Để mã hóa địa 8K word nhớ chương trình, đếm chương trình có dung lượng 13 bit (PC) - Khi vi điều khiển reset, đếm chương trình đến địa 0000h (Reset vector) Khi có ngắt xảy ra, đếm chương trình đến địa 0004h (Interrupt vector) - Bộ nhớ chương trình không bao gồm: Bộ nhớ stack không địa hóa đếm chương trình Bộ nhớ stack đề cập cụ thể phần sau BỘ NHỚ DỮ LIỆU Bộ nhớ liệu PIC nhớ EEPROM chia làm nhiều bank Đối với PIC16F877A nhớ liệu chia làm bank Mỗi bank có dung lượng 128 byte, bao gồm ghi có chức đặc biệt SFG (Special Function Register) nằm vùng địa thấp BàiTậpLớnMônViXử Lý Trang Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh ghi mục đích chung GPR (General Purpose Register) nằm vùng địa lại bank Các ghi SFR thường xuyên sử dụng (ví dụ ghi STATUS) đặt tất cà bank nhớ liệu giúp thuận tiện trình truy xuất làm giảm bớt lệnh chương trình BàiTậpLớnMônViXử Lý Trang Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh Sơ đồ cụ thể nhớ liệu PIC16 BàiTậpLớnMônViXử Lý Trang Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh II TỔNG QUAN VỀ DS1307 Sơ đồ chân DS1307 DS1307 chip đồng hồ thời gian thực (RTC : Real-time clock), khái niệm thời gian thực dùng với ý nghĩa thời gian tuyệt đối mà người sử dụng, tình giây, phút, giờ…DS1307 sản phẩm Dallas Semiconductor (một công ty thuộc Maxim Integrated Products) Chip có ghi 8-bit chứa thời gian là: giây, phút, giờ, thứ (trong tuần), ngày, tháng, năm Ngoài DS1307 có ghi điều khiển ngõ phụ 56 ghi trống dùng RAM DS1307 đọc ghi thông qua giao diện nối tiếp I2C (TWI AVR) nên cấu tạo bên đơn giản DS1307 xuất gói SOIC DIP có chân sau: Các chân DS1307 mô tả sau: - X1 X2: ngõ kết nối với thạch anh 32.768KHz làm nguồn tạo dao động cho chip - VBAT: cực dương nguồn pin 3V nuôi chip - GND: chân mass chung cho pin 3V Vcc - Vcc: nguồn cho giao diện I2C, thường 5V dùng chung với vi điều khiển Chú ý Vcc không cấp nguồn VBAT cấp DS1307 hoạt động (nhưng không ghi đọc được) - SQW/OUT: ngõ phụ tạo xung vuông (Square Wave / Output Driver), tần số xung tạo lập trình Như chân không liên quan đến chức DS1307 đồng hồ thời gian thực, bỏ trống chân nối mạch BàiTậpLớnMônViXử Lý Trang Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh - SCL SDA đường giao xung nhịp liệu giao diện I2C mà tìm hiểu TWI AVR Có thể kết nối DS1307 mạch điện đơn giản hình Mạch ứng dụng đơn giản DS1307 Cấu trúc bên DS 1307 BàiTậpLớnMônViXử Lý Trang 10 Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh #include #fuses nowdt,noprotect,nolvp,xt,put #use delay(clock=4000000) #define DS1307_SDA PIN_C4 #define DS1307_SCL PIN_C3 #use i2c(Master,fast,sda = PIN_C4, scl=PIN_C3) #use fast_io(a) #use fast_io(b) #use fast_io(d) #byte porta=0x05 #byte portb=0x06 #byte portd=0x08 #bit a1 = porta.1 #bit a2 = porta.2 #bit a3 = porta.3 #bit b1 = portb.1 #bit b2 = portb.2 #bit b3 = portb.3 int gio,phut,giay,thu,ngay,thang,nam; int cdgiay,cdgio,cdphut; int cddvgiay,cdchucgiay,cddvphut,cdchucphut,cddvgio,cdchucgio; int setgiay,setphut,setgio; int g; void nhandulieu (); void caidat(); void main() { enable_interrupts(int_ext); enable_interrupts(int_RB); BàiTậpLớnMônViXử Lý Trang 44 Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh enable_interrupts(global); set_tris_a(0b001110); set_tris_b(0b00010001); set_tris_d(0b00000000); porta = 0; portb = 0; portd = 0; output_float(DS1307_SCL); output_float(DS1307_SDA); delay_ms(100); while(1) { b1 = 0; b2=b3=1; portd=giay; delay_ms(3); b2 = 0; b1=b3=1; portd=phut; delay_ms(3); b3 = 0; b1=b2=1; portd=gio; delay_ms(3); } } #int_ext void nhandulieu() { BàiTậpLớnMônViXử Lý Trang 45 Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh I2C_start(); I2C_write(0xD0); I2C_write(0x00); I2C_start(); I2C_write(0xD1); giay = I2C_read(1); phut = I2C_read(1); gio = I2C_read(1); thu = I2C_read(1); = I2C_read(1); thang = I2C_read(1); nam = I2C_read(0); I2C_stop(); giay = giay & 0x7F; phut = phut & 0x7F; gio = gio & 0x3F; } #INT_RB void caidat() { Cdgiay=cddvgiay=cdchucgiay=0; Cdphut=cddvphut=cdchucphut=0; Cdgio=cddvgio=cdchucgio=0; portd = 0; b1=0; b2=1; b3=1; g =1; while(g) BàiTậpLớnMônViXử Lý Trang 46 Nhóm: 09 Trường Cao Đẳng Kỹ Thuật Cao Thắng GVHD: Nguyễn Trọng Khanh { if(a1==0) { while (a1==0) {} if (b1==0) { if (cdgiay >=59 ){cdgiay=0;} else { cdgiay++;} cddvgiay = cdgiay%10; cdchucgiay=(cdgiay/10)