SlideShare a Scribd company logo
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
1
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
CHƯƠNG 1:
DẪN NHẬP
1. Đặt vấn đề:
Ngày nay với sự phát triển như vũ bão của công nghiệp điện tử, kỹ thuật số các hệ
thống đã và dang dần dần tự động hóa. Với kỹ thuật tiên tiến như vi xử lý, vi điều khiển, vi
mạch số, … được ứng dụng vào lĩnh vực điều khiển, thì các hệ thống điều khiển cơ khí thô sơ,
với tốc độ xử lý chậm chạp ít chính xác được thay thế bằng các hệ thống điều khiển tự động
với các chương trình thiết lập trước.
Robot có mặt hầu hết trong mọi lĩnh vực của đời sống chúng ta, từ lau nhà đến y học,
quân sự, từ máy pha cafe tự động đến Asimo,…và cuộc thi Robocon là một sân chơi lý thú với
những ai yêu thích, đam mê với Robot, đó chính là cơ hội tốt để khẳng định chính mình trên
lĩnh vực tự động, củng cố bổ sung thêm kiến thức toàn diện về lĩnh vực này. Chính vì lẽ đó,
em quyết định làm đề tài tốt nghiệp: “LẬP TRÌNH ĐIỀU KHIỂN MÔ HÌNH ROBOT DÒ
ĐƯỜNG DÙNG PIC 16F877A”.
2. Giới hạn đề tài:
Với thời gian mười hai tuần thực hiện đề tài cũng như trình độ chuyên môn có hạn, em đã
cố gắng hết sức để hoàn thành đồ án này nhưng chỉ giải quyết được những vấn đề sau:
o Manual trong lưới: Di chuyển trong lưới theo tín hiệu điều khiển từ Remote.
o Học đường: Di chuyển trong lưới theo tín hiệu điều khiển từ Remote đồng thời học tất
cả những vị trí đã đi qua.
o Chạy tự động: Di chuyển trong lưới theo những gì đã học trong chế độ học đường.
3. 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 ra trường. Cụ thể khi nghiên cứu đề tài này là em muốn phát huy thành quả ứng dụng của
vi điều khiển để tạo ra sản phẩm có ích trong môt lĩnh vực nào đó của đời sống. Không những
thế nó còn là tài liệu để cho các bạn tham khảo.
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 đã được học ở trường. Đồng thời phát huy sự sáng tạo, khả năng giải quyết vấn đề theo
yêu cầu đặt ra. Và đây cũng là dịp để chúng em khẳng định mình trước khi ra trường tham gia
vào các hoạt động sản xuất của xã hội.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
2
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
CHƯƠNG 2:
GIỚI THIỆU VI ĐIỀU KHIỂN PIC16F877A
VÀ CÁC LINH KIỆN DÙNG TRONG MẠCH
1. Giới Thiệu Chung Về Pic:
PIC bắt nguồn là chữ viết tắt của "Programmable Intelligent Computer" (Máy tính khả
trình thông minh) là một sản phẩm của hãng General Instruments đặt cho dòng sản phẩm đầu
tiên của họ là PIC1650. Lúc này, PIC1650 được dùng để giao tiếp với các thiết bị ngoại vi cho
máy chủ 16bit CP1600, vì vậy, người ta cũng gọi PIC với cái tên "Peripheral Interface
Controller" (Bộ điều khiển giao tiếp ngoại vi). CP1600 là một CPU tốt, nhưng lại kém về các
hoạt động xuất nhập, và vì vậy PIC 8-bit được phát triển vào khoảng năm 1975 để hỗ trợ hoạt
động xuất nhập cho CP1600. PIC sử dụng microcode đơn giản đặt trong ROM, và mặc dù,
cụm từ RISC chưa được sử dụng thời bây giờ, nhưng PIC thực sự là một vi điều khiển với
kiến trúc RISC, chạy một lệnh một chu kỳ máy (4 chu kỳ của bộ dao động).
Năm 1985, General Instruments bán bộ phận vi điện tử của họ, và chủ sở hữu mới hủy
bỏ hầu hết các dự án - lúc đó đã quá lỗi thời. Tuy nhiên PIC được bổ sung EEPROM để tạo
thành 1 bộ điều khiển vào ra khả trình. Ngày nay rất nhiều dòng PIC được xuất xưởng với
hàng loạt các module ngoại vi tích hợp sẵn (như USART, PWM, ADC...), với bộ nhớ chương
trình từ 512 Word đến 32K Word.
Họ vi điều khiển này có thể tìm mua dễ dàng tại thị trường Việt Nam. Giá thành không
quá đắt. Có đầy đủ các tính năng của một vi điều khiển khi hoạt động độc lập. Là một sự bổ
sung rất tốt về kiến thức cũng như về ứng dụng cho họ vi điều khiển mang tính truyền thống
như họ vi điều khiển 8051. Hiện nay tại Việt Nam cũng như trên thế giới có một số lượng lớn
người sử dụng họ vi điều khiển PIC, vì vậy họ vi điều khiển này được sử dụng khá rộng rãi.
Điều này tạo nhiều thuận lợi trong quá trình tìm hiểu và phát triển các ứng dụng, cũng như dễ
dàng trao đổi, học tập, dễ dàng tìm được sự chỉ dẫn khi gặp khó khăn,…đồng thời cũng được
sự hỗ trợ của nhà sản xuất về trình biên dịch, các công cụ lập trình, nạp chương trình từ đơn
giản đến phức tạp,… Do đó các tính năng đa dạng của vi điều khiển PIC không ngừng được
phát triển.
1.1. Các dòng Pic và cách lựa chọn Vi điều khiển Pic:
Các sản phẩm vi điều khiển PIC của Microchip có gần 100 loại sản phẩm từ họ 10Fxxx
đến các họ 12Cxxx, 12Fxxx, 16Cxx, 17Cxx, 16Fxx, 16Fxxx, 16FxxxA, 16LFxxxA, 18Fxxx,
18LFxxx, 18Fxxxx, 18LFxxxx,…
 Cách phân loại PIC theo chữ cái:
 Các họ PIC xxCxxx được đưa vào một nhóm, gọi là OTP (One Time
Programmable): chúng ta chỉ có thể lập trình và nạp chương trình cho nó được
một lần duy nhất.
 Nhóm thứ hai có chữ cái F hoặc LF: chúng ta gọi nhóm này là nhóm Flash,
nhóm này cho phép ghi xóa nhiều lần bằng các mạch điện thông thường.
 Cách phân loại theo hai con số đầu tiên của sản phẩm:
 Loại thứ nhất là dòng PIC cơ bản( Base – line ), gồm các PIC 12Cxxx, có độ
dài
12bit.
 Loại thứ hai là các dòng PIC 10F, 12F va 16F, gọi là dòng phổ thông ( Mid –
Range ), có dộ dài 14 bit.
 Loại thứ ba là dòng PIC 18( High – End ), có độ dài 16 bit.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
3
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Ở Việt Nam phổ biến nhất là các họ vi điều khiển PIC do hãng Microchip sản xuất. Cách
lựa chọn một vi điều khiển PIC phù hợp: Trước hết cần chú ý đến số chân của 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, thậm chí có
vi điều khiển chỉ có 8 chân,ngoài ra còn có các vi điều khiển 18, 28, 40, 44, … chân. Cần chọn
vi điều khiển PIC có bộ nhớ flash để có thể nạp xóa chương trình được nhiều lần hơn. Tiếp
theo cần chú ý đến các khối chức năng được tích hợp sẵn trong vi điều khiển, các chuẩn giao
tiếp bên trong. Sau cùng cần chú ý đến bộ nhớ chương trình mà vi điều khiển cho phép.
1.2. Ngôn ngữ lập trình cho Pic:
Ngôn ngữ lập trình cho PIC rất đa dạng. Ngôn ngữ lập trình cấp thấp có MPLAB (được
cung cấp miễn phí bởi nhà sản xuất Microchip), các ngôn ngữ lập trình cấp cao hơn bao gồm
C, Basic, Pascal, … Ngoài ra còn có một số ngôn ngữ lập trình được phát triển dành riêng cho
PIC như PICBasic, MikroBasic,…
1.3. Mạch nạp Pic:
Đây cũng là một dòng sản phẩm rất đa dạng dành cho vi điều khiển PIC. Có thể sử dụng
các mạch nạp được cung cấp bởi nhà sản xuất là hãng Microchip như: PICSTART plus,
MPLAB ICD 2, MPLAB PM 3, PRO MATE II. Có thể dùng các sản phẩm này để nạp cho vi
điều khiển khác thông qua chương trình MPLAB. Dòng sản phẩm chính thống này có ưu thế
là nạp được cho tất cả các vi điều khiển PIC, tuy nhiên giá thành rất cao và thường gặp rất
nhiều khó khăn trong quá trình mua sản phẩm.
2. Cấu trúc tổng quát Pic 16F877A:
Hình 2.1: Vi điều khiển PIC16F877A các dạng sơ đồ chân.
Đây là vi điều khiển thuộc họ PIC16Fxxx( 40 pin) với tập lệnh gồm 35 lệnh có độ dài 14
bit. Mỗi lệnh đều được thực thi trong một chu kì xung clock. Tần số hoạt động tối đa là 20
MHz với một chu kì lệnh là 200ns. Bộ nhớ chương trình 8K Flash ROM, bộ nhớ dữ liệu 368
bytes RAM và bộ nhớ dữ liệu EEPROM với dung lượng 256 bytes. Số Port In/Out (I/O) là 5
Port( A, B, C, D, E) với 33 pin I/O với tính hiệu điều khiển độc lập.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
4
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Hình 2.2: Sơ đồ khối vi điều khiển PIC16F877A.
 Các khối chức năng bên trong Pic16F877A:
 Timer0: bộ đếm 8 bit.
 Timer1: bộ đếm 16 bit với bộ chia tần số, có thể họat động trong cả chế độ tiết
kiệm năng lượng (Sleep Mode) với nguồn xung clock ngoài.
 Timer2: bộ đếm 8 bit.
 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ự (Compartor).
 1 bộ định thời giám sát (Watchdog Timer).
 15 nguồn ngắt (Interrupts)
 Cổng giao tiếp song song PSP (Parallel Slave Port) với các chân điều khiển RD,
WR, CS ở bên ngoài.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
5
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
 Các chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port), SPI và I2C.
 Chuẩn giao tiếp nối tiếp USART với 9 bit địa chỉ.
 Nạp được chương trình ngay trên mạch điện ICSP (In Circuit Serial
Programming)
thông qua 2 chân.
 Một vài đặc tính khác của vi điều khiển như:
 Được chế tao bằng công nghệ CMOS.
 Bộ nhớ flash với khả năng ghi xóa được 100.000 lần.
 Bộ nhớ EEPROM với khả năng ghi xóa được 1.000.000 lần.
 Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm.
 Khả năng tự nạp chương trình với sự điều khiển của phần mềm.
 Chức năng 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 nhau.
2.1. Sơ lược về các chân của Pic16F877A:
PIC16F877A là họ vi điều khiển có 40 chân, mỗi chân có một chức năng khác nhau.
Trong đó có một số chân đa công dụng( đa hợp): mỗi chân có thể họat động như một đường
xuất nhập ( I/O) 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.
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
bên ngoài. 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.1. Port A và thanh ghi TRISA:
PortA gồm 6 chân từ RA0-RA5. Việc ghi các giá trị vào thanh ghi TRISA sẽ quy định
các chân của PortA là Input hay Output. Nếu là 0 thì là Output, 1 là Input.
Việc đọc thanh ghi PortA sẽ đọc trạng thái các chân PortA. Việc ghi giá trị vào thanh ghi
PortA sẽ thay đổi trạng thái của các chân PortA.
Riêng chân RA4 được tích hợp thêm chức năng là chân cung cấp xung Clock ngoài cho
Timer0 (RA4/TOCKI). Những chân khác của PortA đượ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 qui địng bằng những Bit tương ứng trong thanh ghi ADCCON1 và
CMCON1. Khi các chân của PortA được sử dụng là ngõ vào Analog thì các Bit của thanh ghi
TRISA phải luôn bằng 1.
Hình 2.3: Chức năng các chân PortA.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
6
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Các thanh ghi SFR liên quan đến PORTA bao gồm:
 PORTA (địa chỉ 05h) : chứa giá trị các pin trong PORTA.
 TRISA (địa chỉ 85h) : điều khiển xuất nhập.
 CMCON (địa chỉ 9Ch) : thanh ghi điều khiển bộ so sánh.
 CVRCON (địa chỉ 9Dh) : thanh ghi điều khiển bộ so sánh điện áp.
 ADCON1 (địa chỉ 9Fh) : thanh ghi điều khiển bộ ADC.
2.1.2. Port B và thanh ghi TRISB:
PortB gồm 8 chân từ RB0-RB7. Việc ghi các giá trị vào thanh ghi TRISB sẽ quy định
các chân của PortB là Input hay Output. Nếu là 0 thì là Output, 1 là Input.
Việc đọc thanh ghi PortB sẽ đọc trạng thái các chân PortB. Việc ghi giá trị vào thanh ghi
PortB sẽ thay đổi trạng thái của các chân PortB.
Ba chân của PortB được đa hợp với chức năng In-Circuit Debugger và Low Voltage
Programming fuction: RB3/PGM, RB6/PGC và RB7/PGD.
Mỗi chân của PortB có một transistor kéo lên Vdd, chức năng này hoạt động khi Bit
RPBU được xóa. Chứ năng này sẽ tự động tắt khi chân Port đựơc quy địng là Input.
Bốn chân của Portb từ RB7-RB4 có chức năng ngắt (Interrupt) khi trạng thái chân Port
thay đổi (Khi chân Port được quy định là Ouput thì chức na7ng ngắt không họat động). Giá trị
chân Port được so sánh với giá trị được lưu lại trước đó, khi có trạng thái sai lệch giữa 2 giá trị
này, ngắt sẽ xảy ra với cờ ngắt RBIF INTCON<0> bật lên. Ngắt có thể làm cho Vi điều khiển
thoát khỏi trạng thái “SLEEP”.
Bất cứ một họat động truy xuất nào trên PortB sẽ xóa trạng thái sai lệch, kết thúc ngắt và
cho phép xóa cờ RBIF.
Hình 2.4: Chức năng các chân PortB.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
7
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Các thanh ghi SFR liên quan đến PORTB bao gồm:
 PORTB (địa chỉ 06h,106h) : chứa giá trị các pin trong PORTB.
 TRISB (địa chỉ 86h,186h) : điều khiển xuất nhập.
 OPTION_REG (địa chỉ 81h,181h) : điều khiển ngắt ngoại vi và bộ Timer0.
2.1.3. Port C và thanh ghi TRISC:
PortC gồm 8 chân từ RC0-RC7. Việc ghi các giá trị vào thanh ghi TRISC sẽ quy định
các chân của PortC là Input hay Output. Nếu là 0 thì là Output, 1 là Input.
Việc đọc thanh ghi PortC sẽ đọc trạng thái các chân PortC. Việc ghi giá trị vào thanh ghi
PortC sẽ thay đổi trạng thái của các chân PortC.
Các chân của PortC được đa gợp với các chức năng ngọai vi.
Khi các hàm chức năng ngoại vi được cho phép, ta cần quan tâm chặt chẽ tới giá trị các
Bit của thanh ghi TRISC và mặt định các chân này là Ouput, ngoài ra một số chức năng ngoại
vi khác sẽ tự động mặt định các chân là ngõ vào.
Hình 2.5: Chức năng các chân PortC.
Các thanh ghi điều khiển liên quan đến PORTC:
 PORTC (địa chỉ 07h) : chứa giá trị các pin trong PORTC.
 TRISC (địa chỉ 87h) : điều khiển xuất nhập.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
8
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
2.1.4. Port D và thanh ghi TRISD:
PortD gồm 8 chân từ RD0-RD7. Ngoài việc PortD được cấu trúc là một Port vừa xuất nhập nó
còn có thể họat động như một cổng song song bằng cách xét Bit PSPMODE, trong chế độ này
Buffer ngõ vào linh kiện TTL.
Hình 2.6: Chức năng các chân PortD.
Các thanh ghi liên quan đến PORTD bao gồm:
 Thanh ghi PORTD(địa chỉ 08h): chứa giá trị các pin trong PORTD.
 Thanh ghi TRISD(địa chỉ 88h): điều khiển xuất nhập.
2.1.5. PortE và thanh ghi TRISE:
PortE có 3 chân RE0/RD/AN5, RE1/WR/AN6 VÀ RE2/CS/AN7 có thể được cấu hình là
các chân xuất nhập.
Các chân của PortE có thể trở thành các chân điều khiển cho các cổng của Vi điều khiển
khi Bit PSPMODE được xét là 1. Trong chế độ này phải đảm bảo rằng các Bit từ 0 dến 2 cua
thanh ghi TRISE phải được xét bằng 1 để các chân này được cấu hình như các chân ngõ vào.
Ngoài ra các chân PortE còn được cấu hình như các ngõ vào Analog, tại chế độ này khi
đọc trạng thái các chân PortE sẽ cho ta giá trị 0.
Thanh ghi TRISE quy định chức năng xuất nhập của các chân PortE ngay cả khi nó được
sử dụng là các ngõ vào Analog.
Hình 2.7: Chức năng các chân PortE.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
9
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Các thanh ghi liên quan đến PORTE bao gồm:
 PORTE(địa chỉ 09h) : chứa giá trị các chân trong PORTE.
 TRISE(địa chỉ 89h) : điều khiển xuất nhập và xác lập các thông số cho chuẩn
giao tiếp PSP.
 ADCON1(địa chỉ 9Fh) : thanh ghi điều khiển khối ADC.
2.2. MCLR( MASTER CLEAR):
Ngõ vào MCLR( Reset) trên chân số 1 của Vi điều khiển. Khi đưa MCLR xuống thấp,
các thanh ghi bên trong Vi điều khiển sẽ được tải những giá trị thích hợp để khởi động lại hệ
thống.
Hình 2.8: Cách kết nối với chân MCLR.
2.3. Các chân nguồn:
PIC 16F877A vận hành với nguồn đơn 5V. Chân VDD( chân nguồn dương ) được nối
vào chân số 11 và 32. Chân VSS( chân mass ) được nối vào chân số 12 và 31.
2.4. Tổ chức bộ nhớ:
Bộ nhớ chương trình( 8K Flash ROM), bộ nhớ dữ liệu( 368 bytes RAM) và bộ nhớ dữ
liệu EEPROM( 256 bytes).
2.4.1. Tổ chức của bộ nhớ chương trình:
Bộ nhớ chương trình của vi điều khiển PIC16F877A là bộ nhớ Flash, có bộ đếm chương
trình( Program Counter) dài 13 bit có thể định địa chỉ cho 8K không gian bộ nhớ, 8K không
gian bộ nhớ được chia làm 8 trang bộ nhớ. Mọi sự truy cập ngoài vùng không gian này sẽ
không có tác dụng.
Bộ nhớ chương trình còn bao gồm một ngăn xếp( Stack) 8 mức.
Khi vi điều khiển được reset, bộ đếm chương trình sẽ chỉ đến địa chỉ 0000h (Reset
vector). Khi có ngắt xảy ra, bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h (Interrupt vector).
VCC
D5
1N4148
1
C7
104
VCC
R4 100
MCLR
0
SW1 RESET
R3
10K
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
10
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Hình 2.9: Ngăn xếp và bản đồ bộ nhớ chương trình.
2.4.2. Tổ chức của bộ nhớ dữ liệu:
Bộ nhớ dữ liệu của PIC được chia ra làm nhiều bank. Đối với PIC16F877A bộ nhớ dữ
liệu được chia ra làm 4 bank: bank 0, bank 1, bank 2 và bank 3. Mỗi bank có dung lượng 128
byte, bao gồm các thanh ghi có chức năng đặc biệt SFR (Special Function Register) nằm ở các
vùng địa chỉ thấp và các thanh ghi mục đích chung GPR (General Purpose Register) nằm ở
vùng địa chỉ còn lại trong bank. Các thanh ghi SFR thường xuyên được sử dụng (ví dụ như
thanh ghi STATUS) sẽ được đặt ở tất cà các bank của bộ nhớ dữ liệu giúp thuận tiện trong quá
trình truy xuất và làm giảm bớt lệnh của chương trình.
Các bank được lựa chọn bằng bitb RP0 và bit RP1 ở thanh ghi Status.
RP1:RP0 Bank
00 0
01 1
10 2
11 3
 Vùng RAM đa mục đích GPR:
Vùng RAM đa mục đích có chiều rộng là 8 bit và được truy xuất trực tiếp hoặc gián tiếp
thông qua thanh ghi FSR. Đây là các thanh ghi dữ liệu thông thường, người sử dụng có thể tùy
theo mục đích chương trình mà có thể dùng các thanh ghi này để chứa các biến số, hằng số,
kết quả hoặc các tham số phục vụ cho chương trình.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
11
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Hình 2.10: Ngăn xếp và bản đồ bộ nhớ chương trình.
Sơ đồ bộ nhớ dữ liệu PIC16F877A
 Vùng thanh ghi chức năng đặc biệt SFR:
Đây là các thanh ghi chức năng dặc biệt được sử dụng bởi bộ sử lý trung tâm và các hàm
chức năng ngoại vi để điều khiển họat động của các thiết bị. Có thể phân thanh ghi SFR làm
hai lọai: tloại thứ nhất dùng để thiết lập và điều khiển các khối chức năng bên ngoài (ví dụ như
ngắt, so sánh, PWM, …) và loại thứ hai dùng cho các chức năng bên trong của Vi điều khiển(
các phép tímh toán số học, truy xuất số liệu,…).
2.4.3. Thanh ghi đếm chương trình PC ( Program Counter):
Thanh ghi đếm chương trình( PC ) chứa địa chỉ của lệnh được thực hiện kế tiếp. Bộ đếm
chương trình (PC) có độ rộng 13 bit. Byte thấp là thanh ghi PCL, nó có thể đọc và ghi.
Ba bit cao là thanh ghi PCH (PC<12:8>) không cho phép đọc nhưng nó cho phép ghi
gián tiếp thông qua thanh ghi PCLATH. Khi Reset thì ba bit cao của PC sẽ bị xoá.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
12
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
 Ngăn xếp stack:
Stack cho phép 8 lệnh gọi chương trình con và ngắt hoạt động. Stack chứa địa chỉ mà chương
trình chính sẽ quay trở về thực hiện từ chương trình con hay ngắt. Đối với dòng Pic phổ thông,
Stack có độ sâu là 8 lớp, mỗi lớp có độ rộng 13 bit. Vị trí của Stack không nằm trong cả bộ
nhớ chương trình hoặc bộ nhớ dữ liệu và con trỏ ngăn xếp thì không cho phép đọc hoặc
ghi. Hoạt động của ngăn xếp giống như vùng đệm vòng . Điều này có nghĩa là sau khi
ngăn xếp đã cất vào 8 lần, lần cất vào thứ 9 sẽ được ghi chồng lên lần cất vào đầu tiên.
Lần cất vào thứ mười sẽ được ghi chồng lên lần cất vào thứ hai (và cứ như thế).
2.4.4. Sự phân trang bộ nhớ chương trình:
PIC16F877A có khả năng định vị một khối liên tục 8K từ của bộ nhớ chương
trình. Các lệnh CALL và GOTO chỉ cung cấp 11 bit địa chỉ và chỉ xác định được 2K
bộ nhớ chương trình. Khi thực hiện lệnh CALL hoặc GOTO, 2 bit cao nhất của địa chỉ
được cung cấp bởi PCLATH<4:3>. Khi thực hiện lệh CALL hoặc GOTO, người sử
dụng phải bảo đảm rằng trang chọn bit phải được lập trình để trang bộ nhớ chương
trình được định địa chỉ. Nếu lệnh CALL (hoặc ngắt) được thi hành, toàn bộ 13 bit của
PC sẽ được cất vào ngăn xếp. Vì vậy việc vận dụng các bit PCLATH<3:4> thì không
đòi hỏi lệnh Return để lấy địa chỉ từ ngăn xếp.
2.4.5. Định địa chỉ gián tiếp , các thanh ghi INDF và FSR:
Thanh ghi INDF không phải là thanh ghi vật lý. Địa chỉ của thanh ghi INDF sẽ
được định vị gián tiếp. Định vị gián tiếp có thể thực hiện được bằng cách sử dụng
thanh ghi INDF. Trên thực tế, bất kì lệnh nào sử dụng thanh ghi INDF để truy cập
thanh ghi con trỏ bằng thanh ghi FSR (File Select Register). Việc đọc chính thanh ghi
INDF, một cách gián tiếp (FSR = ‘0’) sẽ có giá trị 00h. Một địa chỉ 9 bit có hiệu quả
thu được bằng cách ghép 8 bit của thanh ghi FSR với bit IRP (STATUS<7>), như được
chỉ bên dưới. Một chương trình mẫu dùng để xoá vùng RAM từ 20h đến 2Fh sử dụng
cách định địa chỉ gián tiếp.
Hình 2.11: Sơ đồ ghi dữ liệu vào từng Bank.
2.5. Bộ nhớ dữ liệu và bộ nhớ chương trình:
2.5.1 Bộ nhớ dữ liệu EEPROM và bộ nhớ chương trình FLASH:
Bộ nhớ dữ liệu EEPROM và bộ nhớ chương trình FLASH cho phép đọc hoặc ghi trong
suốt hoạt động bình thường trong phạm vi VDD. Những thao tác này xảy ra trên một byte đơn
cho bộ nhớ dữ liệu EEPROM và trên một từ đơn cho bộ nhớ chương trình FLASH. Một thao
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
13
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
tác ghi gây ra sự xóa rồi ghi, thao tác này được thực hiện trên một byte hoặc một từ được chỉ
định. Sự truy cập vào bộ nhớ chương trình phải kể đến sự tính toán checksum. Ghi một byte
hoặc một word sẽ tự động xóa vùng nhớ và ghi lên giá trị mới (xóa trước khi ghi). Việc ghi
vào bộ nhớ dữ liệu EEPROM không ảnh hưởng đến hoạt động của thiết bị. Việc ghi vào bộ
nhớ chương trình sẽ dừng thực thi các lệnh cho đến khi quá trình ghi hoàn thành. Bộ nhớ
chương trình không thể được truy cập trong suốt quá trình ghi. Trong suốt quá trình ghi, bộ
dao động tiếp tục chạy, thiết bị ngoại vi vẫn tiếp tục hoạt động và những sự kiện về ngắt sẽ
được phát hiện và đợi cho đến khi quá trình ghi hoàn thành. Khi quá trình ghi hoàn thành, lệnh
tiếp theo trong hàng đợi lệnh sẽ được thực hiện và một rẽ nhánh đến vectơ ngắt sẽ xảy ra đến
ngắt được phép và gây ra trong suốt quá trình ghi. Việc đọc và ghi truy cập đến cả hai bộ nhớ
xảy ra gián tiếp thông qua việc đặt những thanh ghi mục đích chung (SFR). Có sáu thanh ghi
mục đích chung được sử dụng là:
 Thanh ghi EEDATA.
 Thanh ghi EEDATH.
 Thanh ghi EEADR.
 Thanh ghi EEADRH.
 Thanh ghi EECON1.
 Thanh ghi EECON2.
Bộ nhớ dữ liệu EEPROM cho phép những thao tác đọc và ghi byte không can thiệp đến
những thao tác bình thường của bộ vi điều khiển. Khi có sự trao đổi với bộ nhớ dữ liệu
EEPROM, thanh ghi EEADR giữ địa chỉ sẽ được truy cập. Phụ thuộc vào thao tác, thanh ghi
EEDATA giữ dữ liệu được ghi hoặc được đọc tại địa chỉ trong thanh ghi EEADR.
PIC16F877A có 256 byte cho bộ nhớ dữ liệu EEPROM và do đó nó sử dụng tất cả 8 bit của
EEADR. Bộ nhớ chương trình FLASH không cho phép truy cập vào quá trình đọc, nhưng quá
trình ghi sẽ dừng thực thi các lệnh cho đến khi quá trình ghi hoàn thành. Khi trao đổi với bộ
nhớ chương trình cặp thanh ghi EEADRH:EEADR sẽ tạo thành một từ hai byte, và sẽ chứa 13
bit địa chỉ của vùng nhớ được truy cập. Sự kết hợp hai thanh ghi EEDATH:EEDATA sẽ chứa
dữ liệu 14 bit cho việc ghi, hoặc phản ánh giá trị của bộ nhớ chương trình sau mỗi lần đọc.
Giống sự truy cập vào bộ nhớ dữ liệu EEPROM, giá trị của những thanh ghi
EEADRH:EEADR phải bên trong phạm vi hợp lệ của bộ nhớ chương trình, phụ thuộc vào linh
kiện (0000h đến 1FFFh đối với PIC16F873/874) từ 0000h đến 3FFFh đối với PIC16F877A.
2.5.2 Quá trình đọc bộ nhớ dữ liệu EEPROM:
Quá trình đọc bộ nhớ dữ liệu EEPROM chỉ yêu cầu địa chỉ cần truy cập phải được ghi
vào thanh ghi EEADR và xóa bit EEPGD. Sau khi bit RD được set, dữ liệu sẽ phải sẵn sàng
trong thanh ghi EEDATA trong chu kỳ lệnh kế tiếp. EEDATA sẽ giữ giá trị này cho đến khi
thao tác đọc kế tiếp được bắt đầu hoặc cho đến khi nó được ghi bởi vi chương trình.
Các bước trong quá trình đọc bộ nhớ dữ liệu EEPROM là:
1. Ghi địa chỉ cần truy cập vào thanh ghi EEADR và hãy chắc rằng địa chỉ này thì
không lớn hơn kích thước bộ nhớ của linh kiện PIC16F877A .
2. Xóa bit EEPGD để trỏ đến bộ nhớ dữ liệu EEPROM.
3. Set bit RD để bắt đầu thao tác đọc.
4. Đọc dữ liệu từ thanh ghi EEDATA.
2.5.3 Quá trình ghi vào bộ nhớ dữ liệu EEPROM:
Quá trình ghi dữ liệu vào bộ nhớ dữ liệu EEPROM được tiến hành qua vài bước. Cả địa
chỉ và giá trị dữ liệu cần phải được ghi vào những thanh ghi mục đích chung SFR. Bit EEPGD
cần phải được xóa, và bit WREN phải được set để cho phép ghi. Bit WREN phải bị xóa trong
suốt thời gian ngoại trừ trong quá trình ghi vào bộ nhớ dữ liệu EEPROM. Bit WR chỉ có thể
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
14
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
được set khi bit WREN đã được set trước đó, chúng không thể được set cùng lúc. Bit WREN
sau đó phải được xóa bằng vi chương trình sau khi ghi.
Các bước trong quá trình ghi vào bộ nhớ dữ liệu EEPROM:
1. Nếu bước thứ 10 chưa được thực hiện, hãy kiểm tra bit WR để xem việc ghi có
đang tiến hành.
2. Ghi địa chỉ cần truy cập vào thanh ghi EEADR và hãy chắc rằng địa chỉ này thì
không lớn hơn kích thước bộ nhớ của linh kiện PIC16F877A.
3. Ghi giá trị dữ liệu 8 bit được chương trình hóa vào thanh ghi EEDATA.
4. Xóa bit EEPGD để trỏ đến bộ nhớ dữ liệu EEPROM.
5. Set bit WREN để cho phép những thao tác lập trình.
6. Không cho phép những ngắt.
7. Thực hiện chuỗi 5 lệnh đặc biệt sau:
 Ghi giá trị 55h vào EECON2 qua hai bước (đầu tiên đưa vào W, sau đó mới
đưa EECON2).
 Ghi giá trị AAh vào EECON2 qua hai bước (đầu tiên đưa vào W, sau đó mới
đưa vào EECON2).
 Set bit WR.
8. Cho phép các ngắt (nếu sử dụng ngắt).
9. Xóa bit WREN để không cho phép các thao tác lập trình.
10. Tại thời điểm chu kỳ ghi hoàn thành, bit WR bị xóa và bit cờ ngắt EEIF được
set. Nếu bước 1 chưa được thực hiện, sau đó vi chương trình sẽ kiểm tra xem
EEIF được set hay chưa hoặc bit WR có bị xóa hay không để báo kết thúc chu
kỳ chương trình.
2.5.4 Quá trình đọc bộ nhớ chương trình FLASH
Quá trình đọc bộ nhớ chương trình FLASH cũng giống với quá trình đọc bộ nhớ dữ liệu
EEPROM, chỉ cần thêm vào hai lệnh NOP sau khi set bit RD. Hai chu kỳ lệnh được thực hiện
bởi lệnh NOP sẽ được bộ vi điều khiển sử dụng để đọc dữ liệu ra khỏi bộ nhớ chương trình và
chèn giá trị đó vào trong cặp thanh ghi EEDATH:EEDATA. Dữ liệu sẽ được sẵn sàng ở lệnh
thứ hai. EEDATH và EEDATA sẽ giữ giá trị này cho đến khi thao tác đọc tiếp theo được bắt
đầu, hoặc cho đến khi chúng được ghi bởi vi chương trình.
Các bước trong quá trình đọc bộ nhớ chương trình FLASH:
1. Ghi địa chỉ cần truy cập vào cặp thanh ghi EEADRH:EEADR. Hãy chắc rằng
địa chỉ đó không lớn hơn kích thước bộ nhớ của linh kiện PIC16F877A.
2. Set bit EEPGD để trỏ đến bộ nhớ chương trình FLASH.
3. Set bit RD để bắt đầu thao tác đọc.
4. Thực hiện hai lệnh NOP để cho phép bộ vi điều khiển đọc dữ liệu ra khỏi bộ
nhớ chương trình.
5. Đọc dữ liệu từ cặp thanh ghi EEDATH:EEDATA.
2.5.5 Quá trình ghi dữ liệu vào bộ nhớ chương trình FLASH
Các bước trong quá trình ghi dữ liệu vào bộ nhớ chương trình FLASH:
1. Ghi địa chỉ cần truy cập vào cặp thanh ghi EEADRH:EEADR. Chắc rằng địa
chỉ này thì không lớn hơn kích thước bộ nhớ của linh kiện PIC16F877A.
2. Ghi giá trị dữ liệu 14 bit đã được chương trình hóa vào cặp thanh ghi
EEDATH:EEDATA.
3. Set bit EEPGD để trỏ đến bộ nhớ chương trình FLASH.
4. Set bit WREN để cho phép những thao tác lập trình.
5. Không cho phép ngắt.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
15
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
6. Thực hiện chuỗi 5 lệnh đặc biệt sau:
 Ghi giá trị 55h vào EECON2 qua hai bước (đầu tiên đưa vào W, sau đó đưa vào
EECON2 ).
 Ghi giá trị AAh vào EECON2 qua hai bước ( đầu tiên đưa vào W, sau đó đưa
vào EECON2).
 Set bit WR.
7. Thực hiện hai lệnh NOP để cho phép bộ vi điều khiển thiết lập thao tác ghi.
8. Cho phép các ngắt (nếu sử dụng ngắt).
9. Xóa bit WREN để không cho phép các thao tác lập trình.
Tại thời điểm chu kỳ ghi hoàn thành, bit WR bị xóa và bit cờ ngắt EEIF được set. Khi bộ
vi điều khiển không thực hiện các lệnh trong suốt chu kỳ ghi, vi chương trình sẽ không nhất
thiết phải kiểm tra cả EEIF, hoặc WR, để xác định quá trình ghi đã hoàn thành hay chưa.
Vi điều khiển PIC16F877A có hai cơ chế bảo vệ mã, một bit dành cho bộ nhớ dữ liệu
EEPROM và hai bit dành cho bộ nhớ chương trình FLASH. Dữ liệu có thể được đọc và ghi
vào bộ nhớ dữ liệu EEPROM , bất chấp trạng thái của bit bỏa vệ mã CPD. Khi sự bảo vệ mã
được cho phép và bit CPD bị xóa thì sự truy cập ngoài thông qua bit ICSP không được cho
phép, bất chấp trạng thái của những bit bảo vệ mã bộ nhớ chương trình.
Trạng thái của những bit bảo vệ mã bộ nhớ chương trình CP0 và CP1 không ảnh hưởng
đến sự thực hiện những lệnh bên ngoài bộ nhớ chương trình. PIC16F87X có thể luôn luôn đọc
những giá trị trong bộ nhớ chương trình, bất chấp trạng thái của những bit bảo vệ mã. Tuy
nhiên, trạng thái của những bit bảo vệ mã và bit WRT sẽ có những ảnh hưởng khác nhau đến
quá trình ghi vào bộ nhớ chương trình. Bit WRT là bit dùng để bảo vệ quá trình ghi vào bộ
nhớ chương trình FLASH. Bit này chỉ có thể được truy cập khi PIC16F87X được lập trình qua
ICSP . Khi sự bảo vệ ghi được cho phép, bất kì lệnh ghi nào đến bộ nhớ chương trình FLASH
đều sẽ bị ngăn cản. Sự bảo vệ chế độ ghi không ảnh hưởng đến quá trình đọc bộ nhớ chương
trình.
Hình 2.12: Trạng thái đọc ghi của bộ nhớ chương trình FLASH nội.
2.6 Bộ Các bộ định thời:
2.6.1 Bộ định thời Timer 0:
Bộ định thời/bộ đếm Timer0 có các đặc tính sau:
 Bộ định thời / bộ đếm 8 bit.
 Cho phép đọc và ghi.
 Bộ chia 8 bit lập trình được bằng phần mềm.
 Chọn xung clock nội hoặc ngoại.
 Ngắt khi có sự tràn từ FFh đến 00h.
 Chọn cạnh cho xung clock ngoài.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
16
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
 Ngắt Timer0:
Ngắt TMR0 được phát ra khi thanh ghi TMR0 tràn từ FFh đến 00h. Sự tràn này sẽ set
bit T0IF (INTCON<2>). Ngắt này có thể được giấu đi bằng cách xóa đi bit T0IE
(INTCON<5>) . Bit T0IF cần phải được xóa trong chương trình bởi thủ tục phục vụ ngắt của
bộ định thời Timer0 trước khi ngắt này được cho phép lại.
 Sử dụng Timer0 với xung clock ngoại:
Khi bộ chia không được sử dụng, clock ngoài đặt vào thì giống như bộ chia ở ngõ ra.
Sự đồng bộ của chân T0CKI với clock ngoài được thực hiện bằng cách lấy mẫu bộ chia ở ngõ
ra trên chân Q2 và Q4. Vì vậy thưc sự cần thiết để chân T0CKI ở mức cao trong ít nhất 2 chu
kỳ máy và ở mức thấp trong ít nhất 2 chu kỳ máy.
 Bộ chia:
Thiết bị PIC16F87X chỉ có một bộ chia mà được dùng chung bởi bộ định thời 0 và bộ
định thời Watchdog. Một khi bộ chia được ấn định cho bộ đinh thời 0 thì không có bộ chia cho
bộ định thời Watchdog và ngược lại. Bộ chia không được đọc hoặc ghi.
Các bit PSA và PS2:PS0 trong thanh ghi OPTION_REG xác đinh bộ chia được ấn định
cho bộ định thời nào và tỉ số chia.
Hình 2.13: Sơ đồ khối của bộ định thời Timer0 và bộ chia dùng chung với WDT.
Các thanh ghi điều khiển liên quan đến Timer0 bao gồm:
 TMR0 (địa chỉ 01h, 101h) : chứa giá trị đếm của Timer0.
 INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE và
PEIE).
 OPTION_REG (địa chỉ 81h, 181h): điều khiển prescaler.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
17
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
2.6.2 Bộ định thời Timer 1:
Bộ định thời 1 là một bộ định thời/bộ đếm 16 bit gồm hai thanh ghi TMR1H (byte cao)
và TMR1L (byte thấp) mà có thể đọc hoặc ghi. Cặp thanh ghi này tăng số đếm từ 0000h đến
FFFFh và một tràn sẽ xuất hiện khi có sự chuyển số đếm từ FFFFh xuống 0000h. Ngắt, nếu
được phép có thể phát ra khi có số đếm tràn và được đặt ở bit cờ ngắt TMR1IF. Ngắt có thể
được phép hoặc cấm bằng cách đặt hoặc xóa bit cho phép ngắt TMR1IE.
Bộ định thời Timer1 có thể được cấu hình để hoạt động một trong hai chế độ sau:
 Định thời một khoảng thời gian (Timer)
 Đếm sự kiện (Counter).
Việc lựa chọn một trong hai chế độ được xác định bằng cách đặt hoặc xóa bit chọn clock
TMR1CS. Trong chế độ định một khoảng thời gian, bộ định thời tăng số đếm lên sau mỗi chu
kỳ lệnh. Trong chế độ đếm sự kiện, bộ định thời tăng sau mỗi cạnh lên của clock ngoài đặt
vào.
Bộ định thời 1 có thể được phép hoặc cấm bằng cách đặt hoặc xóa bit điều khiển
TMR1ON.
 Chế độ Timer:
Chế độ Timer được chọn bằng cách xóa bit TMR1CS. Trong chế độ này, nguồn clock
đặt vào Timer là mạch dao động FOSC/4. Bit điều khiển đồng bộ không bị tác động vì clock
ngoài luôn luôn đồng bộ.
Hình 2.14: Cạnh tăng Timer1.
 Chế độ counter:
Trong chế độ này, bộ định thời tăng số đếm qua nguồn clock ngoài. Việc tăng xảy ra sau
mỗi cạnh lên của xung clock ngoài. Bộ định thời phải có một cạnh lên trước khi việc đếm bắt
đầu.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
18
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Có 2 chế độ đếm trong Timer 1:
 Chế độ đếm đồng bộ:
Chế độ được lựa chọn bởi việc Set bit TMR1CS ( T1CON<1>)và Clear bit T1SYNC.
Trong chế độ này, giá trị của Timer1 sẽ tăng khi có xung cạnh lên trên chân T1OSI/RC1( nếu
bit T1OSCEN được Set) hoặc trên chân T1OSO/RC0( nếu bit T1OSCEN được Clear).
Xung Clock ngoại sẽ được đồng bộ với xung Clock nội, hoạt động đồng bộ được thực
hiện ngay sau bộ tiền định tỉ lệ xung(presaler). Trong chế độ ngủ, hoạt động đồng bộ sẽ bị tắt
và do đó ngay cả khi có xung Clock ngoài thì TMR1 cũng sẽ không tăng. Điều này có ý nghĩa
chế độ đếm đồng bộ sẽ không hoạt động được trong chế độ ngủ(Sleep).
Khi chế độ sử dụng xung Clock ngoài được lựa chọn cho Timer1 ở chế độ đếm đồng,
chúng ta phải đảm bảo điều kiện: xung Clock ngoại phải được đồng bộ với xung Clock nội.
 Chế độ đếm không đồng bộ:
Nếu bit T1SYNC(T1CON<2>) được Set, xung Clock ngoại sẽ không được đồng bộ hoá.
Bộ định thời sẽ tiếp tục đếm trong suốt quá trình ngủ của Vi điều khiển và có khả năng tạo
một ngắt khi bộ định thời tràn và làm Vi điều khiển thoát khỏi trạng thái ngủ. Tuy nhiên cần
lưu ý khi đọc và ghi và Timer:
- Việc đọc thanh ghi TMR1H hoặc thanh ghi TMR1L trong khi bộ định thời đang chạy
từ một nguồn xung Clock ngoài không đồng bộ sẽ cho một kết quả tức thời (không phải ngưng
Timer lại làm mất độ chính xác). Tuy nhiên ta phải luôn nhớ rằng việc đọc một bộ Timer 16
bit sẽ bao gồm 2 lần đọc giá trị 8 bit, do đó có một vấn đề phát sinh là Timer có thể bị tràn
giữa 2 lần đọc.
- Để ghi vào Timer chúng ta tốt nhất nên dừng Timer lại và ghi giá tri mà ta mong
muốn vào. Chúng ta cũng có thể ghi giá trị vào Timer khi nó đang chạy nhưng việc này có thể
tạo ra một giá trị không như ta mong muốn.
Hình 2.15: Sơ đồ khối bộ định thời Timer1.
 Bộ dao động riêng của Timer1:
Chúng ta có thể xây dựng một bộ dao động độc lập cho Timer1 (độc lập với bộ dao động
của Vi điều khiển) bằng thạch anh vớii tần số tối đa lên đến 200KHz. Với bộ dao động này, bộ
đếm có thể hoạt động ngay cả khi Vi điều khiển rơi vào trạng thái ngủ.
 Ngắt Timer1:
Ngằt trong Timer1 xuất hiện khi giá trị trong thanh ghi TMR1 tràn từ FFFFh xuống
0000h. khi xảy ra tràn, cờ TMR1IF bật lên. Ngắt có thể được ngăn chận bằng việc xoá bit
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
19
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
TMR1IE. Cờ TMR1IE phải được xoá bằng phần mềm trước khi thoát khỏi trình phục vụ ngắt
và trở về chương trình chính. Ngắt của Timer1 trong chế độ định thời và đếm đồng bộ không
làm cho Vi điều khiển thoát khỏi trạng thái ngủ, chỉ có chế độ đếm không đồng bộ mới làm
cho Vi điều khiển thoát khỏi trạng thái ngủ.
Các thanh ghi liên quan đến Timer1 bao gồm:
 INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE và
PEIE).
 PIR1 (địa chỉ 0Ch): chứa cờ ngắt Timer1 (TMR1IF).
 PIE1( địa chỉ 8Ch): cho phép ngắt Timer1 (TMR1IE).
 TMR1L (địa chỉ 0Eh): chứa giá trị 8 bit thấp của bộ đếm Timer1.
 TMR1H (địa chỉ 0Eh): chứa giá trị 8 bit cao của bộ đếm Timer1.
 T1CON (địa chỉ 10h): xác lập các thông số cho Timer1.
2.6.3 Bộ định thời Timer 2:
 Môdun Timer2 là 1 bộ định thời 8 bit bao gồm 1 bộ tiền định (prescaler), 1 bộ hậu định
tỉ lệ (postcaler) và một thanh ghi chu kỳ viết tắt là PR2. việc kết hợp Timer2 với 2 bộ định tỉ lệ
cho phép nó hoạt động như một bộ định thời 16 bit. Môdun Timer2 cung cấp thời gian hoạt
động cho chế độ điều biến xung PWM nếu môdun CCP được chọn.
 Nguồn xung Clock của Timer2: Timer2 chỉ có một nguồn xung Clock đó là xung
Clock của Vi điều khiển. Một bộ tiền định tỉ lệ được lựa chọn bởi các bit T2CKPS1 :
T2CKPS0.
 Thanh ghi TMR2 và PR2: là 2 thanh ghi ghi/đọc được. Timer2 sẽ tăng từ giá trị 00h
lên tới giá trị nằm trong thanh ghi PR2, sau đó nó sẽ được Reset về 00h cho chu kỳ đếm kế
tiếp.
 Tín hiệu báo trạng thái cân bằng: khi giá trị trong thanh ghi TMR2 bằng với giá trị
trong PR2, bô so sánh sẽ tạo ra một xung báo hiệu, xung này có thể được dùng cho bộ hậu
định tỉ lệ (postcaler) hoặc được dùng làm xung Clock cho môdun truyền nối tiếp (Shift Clock).
Ngoài ra nó còn được dùng làm tín hiệu Reset cho Timer2.
 Xóa các bộ tỉ lệ:
Các bộ tỉ lệ được xoá khi:
- Ghi một giá trị vào thanh ghi TMR2.
- Ghi một giá trị vào thanh ghi T2CON.
- Bất cứ một dạng Reset thiết bị nào.
 Chế độ ngủ: trong chế độ ngủ Timer2 không hoạt động. Giá trị của bộ định tỉ lệ sẽ
được lưu lại và phục hồi sau khi thoát khỏi trạng thái ngủ.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
20
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Hình 2.16: Sơ đồ khối của bộ định thời Timer 2.
Các thanh ghi liên quan đến Timer2 bao gồm:
 INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép toàn bộ các ngắt (GIE và
PEIE).
 PIR1 (địa chỉ 0Ch): chứa cờ ngắt Timer2 (TMR2IF).
 PIE1 (địa chị 8Ch): chứa bit điều khiển Timer2 (TMR2IE).
 TMR2 (địa chỉ 11h): chứa giá trị đếm của Timer2.
 T2CON (địa chỉ 12h): xác lập các thông số cho Timer2.
 PR2 (địa chỉ 92h): thanh ghi hỗ trợ cho Timer2.
2.7 Hoạt động của các bô ngoại vi:
2.7.1 Bộ Capture/Compare/PWM:
Họ PIC16F87X có hai bộ CCP, mỗi bộ là một thanh ghi 16 bit mà có thể hoạt động như
là :
 Thanh ghi Capture 16 bit.
 Thanh ghi Compare 16 bit.
 Thanh ghi chu trình làm việc chủ/tớ PWM.
Cả hai bộ CCP1 và CCP2 cơ bản hoạt động giống nhau, ngoại trừ trong khi hoạt động
với sự kiện trigger đặt biệt.
 Bộ CCP1 :
Thanh ghi CCPR1 bao gồm hai thanh ghi: CCPR1L (byte thấp) và CCPR1H (byte cao).
Thanh ghi điều khiển CCP1CON điều khiển hoạt động của bộ CCP1.
 Bộ CCP2 :
Thanh ghi CCPR2 bao gồm hai thanh ghi: CCPR2L (byte thấp) và CCPR2H (byte
cao).Thanh ghi điều khiển CCP2CON điều khiển hoạt động của bộ CCP2.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
21
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Hình 2.17: Thanh ghi CCP1CON/CCP2CON ( địa chỉ 17h/1Dh ).
Chế độ CCP – Timer Resource
Sự ảnh hưởng của hai bộ CCP
 Chế độ Capture:
Trong chế độ này, cặp thanh ghi CCPR1H : CCPR1L giữ giá trị 16 bit của thanh ghi
TMR1 khi có một sự kiện xảy ra trên chân RC2/CCP1. Sự kiện được định nghĩa như là một
trong các yếu tố sau:
 Sau mỗi cạnh lên của xung clock.
 Sau mỗi cạnh xuống của xung clock.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
22
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
 Sau mỗi canh lên thứ tư.
 Sau mỗi cạnh lên thứ 16.
Việc lựa chọn sự kiện nào được cấu hình bởi các bit điều khiển CCP1M3:CCP1M0. Nếu
một sự kiện mới xảy ra trước khi giá trị trong thanh ghi CCPR1 được đọc, giá trị mới sẽ đè lên
giá trị cũ.
 Chế độ Compare:
Trong chế độ này, hằng giá trị 16 bit trong thanh ghi CCPR1 được so sánh với giá trị
trong cặp thanh ghi TMR0. Khi hai giá trị này bằng nhau, trên chân RC2/CCP1 sẽ là :
 Mức cao.
 Mức thấp.
 Giữ nguyên không đổi.
Việc lựa chọn mức cao, mức thấp hay giữ nguyên không đổi bằng cách nạp giá trị thích
hợp vào các bit điều khiển CCP1M3:CCP1M0. Tại một thời điểm, cờ ngắt CCP1IF có thể
được bật.
 Chế độ PWM ( Điều biến độ rộng xung ) :
Trong chế độ này, một xung vuông 10 bit được tạo ra trên chân CCPx. Vì chân này đa
hợp với chân chốt của PORTC nên bit TRISC<2> phải được xóa để cấu hình cho chân CCP1
ở trạng thái xuất dữ liệu.
Các bước sau được yêu cầu để thiết lập cho bộ CCP hoạt động trong chế độ PWM:
 Thiết lập chu kỳ cho PWM bằng cách ghi lên thanh ghi PR2.
 Thiết lập chu trình họat động bằng cách ghi lên thanh ghi.
 CCPR1L và bit4 bit5 trong thanh ghi CCP1CON.
 Cấu hình cho chân CCP1 ở trạng thái xuất dữ liệu.
 Cấu hình cho bộ CCP1 hoạt động trong chế độ PWM.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
23
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Hình 2.18: .Sơ đồ khối của bộ PWM.
Hình 2.19: Các thanh ghi liên quan đến chế Capture , Compare và Timer1
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
24
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Hình 2.20: Những thanh ghi liên quan đến PWM và Timer2
2.7.2 Bộ chuyển đổi tương tự sang số A/D:
Bộ chuyển đổi tương tự - số có năm ngõ vào đối với thiết bị 28 chân và tám đối với các
thiết bị khác. Ngõ vào tương tự được lấy mẫu, ngõ ra của mẫu được đặt vào bộ biến đổi. Bộ
biến đổi phát một giá trị nhị phân tương ứng với ngõ vào tương tự.Giá trị tương tự được bộ
biến đổi cho một kết quả số tương ứng với 10 bit nhị phân.Bộ biến đổi có các thế ngưỡng cao
và thấp đặt vào mà phần mềm có thể lựa chọn trên chân RA2 ,RA3.
Bộ biến đổi A/D có đặt điểm duy nhất là hoạt động có thể hoạt động trong khi thiết bị
đang ở chế độ nghỉ.
Bộ biến đổi A/D có 4 thanh ghi , chúng là :
 Thanh ghi kết quả cao (ADRESH).
 Thanh ghi kết quả thấp (ADRESL).
 Thanh ghi điều khiển 0 (ADCON0).
 Thanh ghi điều khiển 1 (ADCON1).
Sau đây là các bước được yêu cầu trước khi làm việc với bộ biến đổi A/D:
 Cấu hình cho bộ biến đổi:
 Cấu hình cho thanh ghi ADCON 1.
 Chọn kênh tương tự đặt vào bộ biến đổi.
 Chọn clock cho bộ biến đổi.
 Khởi động bộ biến đổi.
 Cấu hình ngắt:
 Xóa cờ nhắt ADIF.
 Đặt cờ cho phép ngắt bộ biến đổi.
 Đặt cờ cho phép ngắt ngoại vi.
 Đặt cờ cho phép ngắt toàn cục.

2.7.3 Đặc điểm chính của CPU:
Tất cả các vi điều khiển thuộc họ PIC16F87X đều có một đặc điểm chung là tăng tối ưu
độ tin cậy của hệ thống, nguồn năng lượng cung cấp ít, giảm thiểu nhiễu và cho phép mã bảo
vệ bao gồm:
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
25
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
 Chọn mạch dao động thích hợp.
 Hoạt động Reset.
 Nguồn Reset.
 Nguồn định thời.
 Dao động định thời.
 Reset ngoài.
 Hoạt động ngắt.
 Wathdog timer.
 Mã bảo vệ.
Hoạt động ngắt:
 Các Vi điều khiển họ PIC có rất nhiều nguồn ngắt. Cứ mỗi môdun ngoại vi thì có một
nguồn ngắt, tuy nhiên một số môdun lại có rất nhiều nguồn ngắt. Sau đây là một số nguồn ngắt
tiêu biểu:
- Ngắt trên chân INT (ngắt ngoài).
- Ngắt tràn Timer0.
- Ngắt tràn Timer1.
- Ngắt tràn Timer2.
- Ngắt thay đổi trạng thái trên các chân PortB.
- Ngắt so sánh điện thế.
- Ngắt 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 A/D.
- Ngắt màn hình LCD.
- Ngắt hoàn tất ghi vào EEPROM.
- Ngắt môdun CCP.
- Ngắt môdun SSP.
 Các thanh ghi chức năng của ngắt:
 Thời gian ngắt được thự thi:
Là thời gian tính từ khi sự kiện ngắt xuất hiện cho đến khi lệnh tại địa chỉ 0004h được
thực thi.
Đối với ngắt đồng bộ thời gian này vào khoản: 3T (chu kỳ lệnh).
Đối với ngắt không đồng bộ (ngắt ngoài) thời gian này vào khoản: 3 – 3.75T (chu kỳ
lệnh).
 Lưu dữ liệu trong quá trình ngắt:
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
26
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Trong suốt quá trình ngắt, chỉ có giá trị nằm trong PC là được lưu vào Stack, do đó
người sử dụng phải lưu lại giá trị của thanh ghi W và Status khi vào chương trình phục vụ
ngắt.
 Hoạt động ngắt được điều khiển bởi thanh ghi INTCON (bit GIE). Bên cạnh đó mỗi
ngắt còn có một bit điều khiển và cờ ngắt riêng. Các cờ ngắt vẫn được set bình thường khi
thỏa mãn điều kiện ngắt xảy ra bất chấp trạng thái của bit GIE, tuy nhiên hoạt động ngắt vẫn
phụ thuôc vào bit GIE và các bit điều khiển khác. Bit điều khiển ngắt RB0/INT và TMR0 nằm
trong thanh ghi INTCON, thanh ghi này còn chứa bit cho phép các ngắt ngoại vi PEIE. Bit
điều khiển các ngắt nằm trong thanh ghi PIE1 và PIE2. Cờ ngắt của các ngắt nằm trong thanh
ghi PIR1 và PIR2.
Trong một thời điểm chỉ có một chương trình ngắt được thực thi, chương trình ngắt được
kết thúc bằng lệnh RETFIE. Khi chương trình ngắt được thực thi, bit GIE tự động được xóa,
địa chỉ lệnh tiếp theo của chương trình chính được cất vào trong bộ nhớ Stack và bộ đếm
chương trình sẽ chỉ đến địa chỉ 0004h. Lệnh RETFIE được dùng để thoát khỏi chương trình
ngắt và quay trở về chương trình chính, đồng thời bit GIE cũng sẽ được set để cho phép các
ngắt hoạt động trở lại. Các cờ hiệu được dùng để kiểm tra ngắt nào đang xảy ra và phải được
xóa bằng chương trình trước khi cho phép ngắt tiếp tục hoạt động trở lại để ta có thể phát hiện
được thời điểm tiếp theo mà ngắt xảy ra.
Đối với các ngắt ngoại vi như ngắt từ chân INT hay ngắt từ sự thay đổi trạng thái các pin
của PORTB (PORTB Interrupt on change), việc xác định ngắt nào xảy ra cần 3 hoặc 4 chu kì
lệnh tùy thuộc vào thời điểm xảy ra ngắt.
Cần chú ý là trong quá trình thực thi ngắt, chỉ có giá trị của bộ đếm chương trình được
cất vào trong Stack, trong khi một số thanh ghi quan trọng sẽ không được cất và có thể bị thay
đổi giá trị trong quá trình thực thi chương trình ngắt. Điều này nên được xử lí bằng chương
trình để tránh hiện tượng trên xảy ra.
Hình 2.23.: Sơ đồ của tất cả các ngắt trong vi điều khiển PIC16F877A.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
27
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
3. Tập lệnh của vi điều khiển Pic 16F877A:
3.1. Vài nét sơ lược về tập lệnh Vi điều khiển Pic 16F877A:
PIC là vi điều khiển có tập lệnh rút gọn RISC (Reduced Instruction Set Computer), bao
gồm 35 lệnh. Mỗi lệnh trong trong vi điều khiển 16F877A là một từ 14 bit bao gồm trường mã
lệnh và trường toán hạng.Các lệnh của PIC16F877A được chia thành các nhóm: lệnh thao tác
byte , lệnh thao tác bit , lệnh thao tác trên dữ liệu tức thời và các lệnh điều khiển.
Đối với các lệnh thao tác theo byte, ký hiệu ‘f’ biểu diễn cho các thanh ghi chức năng
đặc biệt và các thanh ghi đa dụng ( còn gọi là các biến ). Ký hiệu ‘d’ biểu diễn cho thanh ghi
đích. Nếu ‘d’ bằng 0, kết quả của lệnh được gán cho thanh ghi w.Nếu ‘d’ bằng 1, kết quả được
gán trở lại cho thanh ghi nguồn.
Đối với các lệnh thao tác bit, ký hiệu ‘b’ biểu diễn cho số thứ tự của một bit nào đó trong
thanh ghi đích mà bị tác động bởi phép toán, trong khi ký hiệu ‘f’ lại biểu diễn cho thanh ghi
mà bit đó được đặt đến sau khi thực hiện lệnh.
Đối với các lệnh điều khiển và các lệnh thao tác trên dữ liệu tức thời, ký hiệu ‘k’ biểu
diễn cho một hằng giá trị bảy hoặc tám bit hoặc một hằng số tức thời.
Trường Mô tả
f Địa chỉ thanh ghi file.
w Thanh ghi tích lũy.
B Địa chỉ bit trong thanh ghi file.
K Dữ liệu tức thời hoăc địa chỉ chương trình con.
D Chọn đích, nếu d=0 kết quả được gán cho thanh ghi tích lũy.
Nếu d=1, kết quả được gán cho thanh ghi file.
Mặc định d=1.
PC Bộ đếm chương trình.
TO Bit Time-out.
PD Bit Power-down.
Bảng 2.1:Bảng mô tả trường toán hạng:
3.2. Tập lệnh của Vi điều khiển Pic:
ADDLW
Cú pháp: ADDLW k (0 ≤ k≤255)
Tác dụng: cộng giá trị k vào thanh ghi W, kết quả được chứa trong thanh ghi W.
Bit trạng thái: C, DC, Z.
ADDWF
Cú pháp: ADDWF f,d (0≤f≤255, d thuộc [0,1]).
Tác dụng: cộng giá trị hai thanh ghi W và thanh ghi f. Kết quả được chứa trong thanh
ghi W nếu d = 0 hoặc thanh ghi f nếu d =1.
Bit trạng thái: C, DC, Z.
ANDLW
Cú pháp: ANDLW k (0≤k≤255)
Tác dụng: thực hiện phép toán AND giữa thanh ghi và giá trị k, kết quả được chứa
trong thanh ghi W.
Bit trạng thái: Z.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
28
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
ANDWF
Cú pháp: ANDWF f,d (0≤f≤127, d thuộc [0,1]).
Tác dụng: thực hiện phép toán AND giữa các giá trị chứa trong hai thanh ghi W và f.
Kết quả được đưa vào thanh ghi W nếu d=0 hoặc thanh ghi f nếu d = 1.
Bit trạng thái: Z.
BCF
Cú pháp: BCF f,b (0≤f≤127, 0≤b≤7)
Tác dụng: xóa bit b trong thanh ghi f về giá trị 0.
Bit trạng thái: không có.
BSF
Cú pháp: BSF f,b (0≤f≤127, 0≤b≤7)
Tác dụng: set bit b trong trnh ghi f.
Bit trạng thái: không có.
BTFSS
Cú pháp: BTFSS f,b (0≤f≤127, 0≤b≤7)
Tác dụng: kiểm tra bit b trong thanh ghi f. Nếu bit b bằng 0, lệnh tiếp theo được thực
thi. Nếu bit b bằng 1, lệnh tiếp theo được bỏ qua và thay vào đó là lệnh NOP.
Bit trạng thái: không có.
BTFSC
Cú pháp: BTFSC f,b (0≤f≤127, 0≤b≤7)
Tác dụng: kiểm tra bit b trong thanh ghi f. Nếu bit b bằng 1, lệnh tiếp theo được thực
thi. Nếu bit b bằng 0, lệnh tiếp theo được bỏ qua và thay vào đó là lệnh NOP.
Bit trạng thái: không có
CALL
Cú pháp: CALL k (0≤k≤2047)
Tác dụng: gọi một chương trình con. Trước hết địa chỉ quay trở về từ chương trình con
(PC+1) được cất vào trong Stack, giá trị địa chỉ mới được đưa vào bộ đếm gồm 11 bit
của biến k và 2 bit PCLATH<4:3>.
Bit trạng thái: không có.
CLRF
Cú pháp: CLRF f (0≤f≤127)
Tác dụng: xóa thanh ghi f và bit Z được set.
Bit trạng thái: Z
CLRW
Cú pháp: CLRW
Tác dụng: xóa thanh ghi W và bit Z được set.
Bit trạng thái: Z.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
29
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
CLRWDT
Cú pháp: CLRWDT
Tác dụng: reset Watchdog Timer, đồng thời prescaler cũng được reset, các bit PD và
TO được set lên 1.
Bit trạng thái: PD và TO
COMF
Cú pháp: COMF f,d (0≤f≤127, d thuộc [0,1]).
Tác dụng: đảo các bit trong thanh ghi f. Kết quả được đưa vào thanh ghi W nếu d=0
hoặc thanh ghi f nếu d=1.
Bit trạng thái: Z
DECF
Cú pháp: DECF f,d (0≤f≤127, d thuộc [0,1]).
Tác dụng: giá trị thanh ghi f được giảm đi 1 đơn vị. Kết quả được đưa vào thanh ghi W
nếu d = 0 hoặc thanh ghi f nếu d = 1.
Bit trạng thái: Z
DECFSZ
Cú pháp: DECFSZ f,d (0≤f≤127, d thuộc [0,1])
Tác dụng: gía trị thanh ghi f được giảm 1 đơn vị. Nếu kết quả sau khi giảm khác 0,
lệnh tiếp theo được thực thi, nếu kết quả bằng 0, lệnh tiếp theo không được thực thi và
thay vào đó là lệnh NOP. Kết quả được đưa vào thanh ghi W nếu d = 0 hoặc thanh ghi
f nếu d = 1.
Bit trạng thái: không có.
GOTO
Cú pháp: GOTO k (0≤k≤2047)
Tác dụng: nhảy tới một label được định nghĩa bởi tham số k và 2 bit PCLATH <4:3>.
Bit trạng thái: không có.
Lệnh INCF
Cú pháp: INCF f,d (0≤f≤127, d thuộc [0,1])
Tác dụng: tăng giá trị thanh ghi f lên 1 đơn vị. Kết quả được đưa vào thanh ghi W nếu
d=0 hoặc thanh ghi f nếu d = 1.
Bit trạng thái: Z.
INCFSZ
C php: INCFSZ f,d (0≤f≤127, d thuộc [0,1])
Tác dụng: tăng gi trị thanh ghi f ln 1 đơn vị. Nếu kết quả khác 0, lệnh tiếp theo được
thực thi, nếu kết quả bằng 0, lệnh tiếp theo được thay bằng lệnh NOP. Kết quả sẽ được
đưa vào thanh ghi f nếu d=1 hoặc thanh ghi W nếu d = 0.
Bit trạng thái: không có.
IORLW
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
30
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Cú pháp: IORLW k (0≤k≤255)
Tác dụng: thực hiện phép toán OR giữa thanh ghi W và giá trị k. Kết quả được chứa
trong thanh ghi W.
Bit trạng thái: Z.
IORWF
Cú pháp: IORWF f,d (0≤f≤127, d thuộc [0,1])
Tác dụng: thực hiện phép toán OR giữa hai thanh ghi W và f. Kết quả được đưa vào
thanh ghi W nếu d=0 hoặc thanh ghi f nếu d=1.
Bit trạng thái: Z.
RLF
Cú pháp: RLF f,d (0≤f≤127, d thuộc [0,1])
Tác dụng: dịch trái các bit trong thanh ghi f qua cờ carry. Kết quả được lưu trong thanh
ghi W nếu d=0 hoặc thanh ghi f nếu d=1.
Bit trạng thái: C.
RETURN
Cú pháp: RETURN
Tác dụng: quay trở về chương trình chính từ một chương trình con
Bit trạng thái: không có.
RRF
Cú pháp: RRF f,d (0≤f≤127, d thuộc [0,1])
Tác dụng: dịch phải các bit trong thanh ghi f qua cờ carry. Kết quả được lưu trong
thanh ghi W nếu d=0 hoặc thanh ghi f nếu d=1.
Bit trạng thái: C.
Sleep
Cú pháp: SLEEP
Tác dụng: đưa vi điều khiển về chế độ Sleep. Khi đó WDT bị xóa về 0, bit PD được
xóa về 0 bit TO được set lên 1 và Oscillator không được cho phép họat động.
Bit trạng thái: TO , PD .
SUBLW
Cú pháp: SUBLW k
Tác dụng: lấy giá trị k trừ giá trị trong thanh ghi W. Kết quả được chứa trong thanh
ghiW.
Bit trạng thái: C, DC, Z.
SUBWF
Cú pháp: SUBWF f,d (0≤f≤127, d thuộc [0,1])
Tác dụng: lấy giá trị trong thanh ghi f đem trừ cho thanh ghi W. Kết quả được lưu
trong thanh ghiaW nếu d=0 hoặc thanh ghi f nếu d=1.
Bit trạng thái: C, DC, Z.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
31
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
SWAP
Cú pháp: SWAP f,d (0≤f≤127, d thuộc [0,1])
Tác dụng: đảo 4 bit thấp với 4 bit cao trong thanh ghi f. Kết quả được chứa trong thanh
ghiaW nếu d=0 hoặc thanh ghi f nếu d=1.
Bit trạng thái: không có.
XORLW
Cú pháp: XORLW k (0≤k≤255)
Tác dụng: thực hiện phép toán XOR giữa giá trị k và giá trị trong thanh ghi W. Kết quả
được lưu trong thanh ghi W.
Bit trạng thái: Z.
XORWF
Cú pháp: XORWF f,d
Tác dụng: thực hiện phép toán XOR giữa hai giá trị chứa trong thanh ghi W và thanh
ghi f. Kết quả được lưu vào trong thanh ghi W nếu d=0 hoặc thanh ghi f nếu d=1.
Bit trạng thái: Z.
 Ngoài các lệnh trên còn có một số lệnh dùng trong chương trình như:
#DEFINE
Cú pháp: #DEFINE <text1> <text2>
Tác dụng: thay thế một chuỗi kí tự này bằng một chuỗi kí tự khác, có nghĩa là mỗi khi
chuỗi kí tự text1 xuất hiện trong chương trình, trình biên dịch sẽ tự động thay thế chuỗi kí
tự đó bằng chuỗi kí tự <text2>.
#INCLUDE
Cú pháp: #INCLUDE <filename> hoặc #INCLUDE “filename”
Tác dụng: đính kèm một file khác vào chương trình, tương tự như việc ta copy file đó vào
vị trí xuất hiện lệnh INCLUDE. Nếu dùng cú pháp <filename> thì file đình kèm là file hệ
thống (system file), nếu dùng cú pháp “filename” thì file đính kèm là file của người sử
dụng. Thông thường chương trình được đính kèm theo một “header file” chứa các thông
tin định nghịa các biến (thanh ghi W, thanh ghi F,..) và các địa chỉ cảu các thanh ghi chức
năng đặc biệt trong bộ nhớ dữ liệu. Nếu không có header file, chương trình sẽ khó đọc và
khó hiểu hơn.
CONSTANT
Cú pháp: CONSTANT <name>=<value>
Tác dụng: khai báo một hằng số, có nghĩa là khi phát hiện chuỗi kí tự “name” trong
chương trình, trình biên dịch sẽ tự động thay bằng chuỗi kí tự bằng giá trị “value” đã được
định nghĩa trước đó.
VARIABLE
Cú pháp: VARIABLE <name>=<value>
Tác dụng: tương tự như lệnh CONSTANT, chỉ có điểm khác biệt duy nhất là giá trị
“value” khi dùng lệnh VARIABLE có thể thay đổi được trong quá trình thưc thi chương
trình còn lệnh CONSTANT thì không.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
32
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
SET
Cú pháp: <name variable> SET <value>
Tác dụng: gán giá trị cho một tên biến. Tên của biến có thể thay đổi được trong quá trình
thực thi chương trình.
EQU
Cú pháp: <name constant> EQU <value>
Tác dụng: gán giá trị cho tên của tên của hằng số. Tên của hằng số không thay đổi trong
quá trình thực thi chương trình.
ORG
Cú pháp: ORG <value>
Tác dụng: định nghĩa một địa chỉ chứa chương trình trong bộ nhớ chương trình của vi điều
khiển.
END
Cú pháp: END
Tác dụng: đánh dấu kết thúc chương trình.
__CONFIG
Cú pháp:
Tác dụng: thiết lập các bit điều khiển các khối chức năng của vi điều khiển được chứa
trong bộ nhớ chương trình (Configuration bit).
PROCESSOR
Cú pháp: PROCESSOR <processor type>
Tác dụng: định nghĩa vi điều khiển nào sử dụng chương trình.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
33
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
4. Các linh kiện dùng trong mạch.
4.1.IC 7805:
Hình 2.24: IC7805
4.2. IC LM324:
 Sơ đồ chân và cấu trúc bên trong:
Hình 2.25: IC LM324
Chức năng: Dùng để so sánh điện áp.
4.3.Led thu phát hồng ngoại:
Chân 1 : input (ngỏ vào)
Chân 2: output (ngỏ ra)
Chân 3: mass
Chức năng: là IC ổn áp nguồn dương, tạo điện
áp chuẩn 5V.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
34
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
DETECTOR: led thu hồng ngoại
EMITTER: led phát hồng ngoại.
4.4.L298:
Hình 2.26: L298
Chức năng: Dùng để điều khiển động cơ.
4.5.Động cơ điện một chiều:
Hình 2.27: Động cơ DC
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
35
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
CHƯƠNG 3:
LẬP TRÌNH PIC DÙNG CCS
1. Tổng quan về CCS:
Sự ra đời của một loại vi điều khiển đi kèm với việc phát triển phần mềm ứng dụng
cho việc lập trình cho con vi điều khiển đó. Vi điều khiển chỉ hiểu và làm việc với hai con số 0
và 1. Ban đầu để việc lập trình cho VĐK là làm việc với dãy các con số 0 và 1.
Sau này khi kiến trúc của Vi điều khiển ngày càng phức tạp, số luợng thanh ghi lệnh
nhiều lần, việc lập trình với dãy các số 0 và 1 không còn phù hợp nữa, đòi hỏi ra đời một ngôn
ngữ mới thay thế. Và ngôn ngữ lập trình Assembly. Ở đây ta không nói nhiều đến Assmebly.
Sau này khi ngôn ngữ C ra đời, nhu cầu dụng ngôn ngữ C để thay cho ASM trong việc mô tả
các lệnh lập trình cho Vi điều khiển một cách ngắn gọn và dễ hiểu hơn đã dẫn đến sự ra đời
của nhiều chương trình soạn thảo và biên dịch C cho Vi điều khiển : Keil C, HT-PIC, MikroC,
CCS…Ở đây tôi sử dụng CCS để lập trình vì tính năng mạnh và dễ lập trình hơn so với
MBLab.
CCS là trình biên dịch lập trình ngôn ngữ C cho Vi điều khiển PIC của hãng
Microchip. Chương trình là sự tích hợp của 3 trình biên dịch riêng biệt cho 3 dòng PIC khác
nhau đó là:
 PCB cho dòng PIC 12 bit opcodes.
 PCM cho dòng PIC 14 bit opcodes.
 PCH cho dòng PIC 16 và 18 bit.
Tất cả 3 trình biên dịch này được tích hợp lại vô trong một chương trình bao gồm cả
trình soạn thảo văn biên dịch là CCS.
Giống như nhiều trình biên dịch C khác cho PIC, CCS giúp cho người sử dụng nắm bắt
nhanh được vi điều khiển PIC và sử dụng PIC trong các dự án. Các chương trình điều khiển sẽ
được thực hiện nhanh chóng và đạt hiệu quả cao thông qua việc sử dụng ngôn ngữ lập trình
cấp cao – Ngôn ngữ C.
Hình 3.1: Cửa sổ chương trình CCS.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
36
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
2. Cách sử dụng các biến và hàm, các cấu trúc lệnh, chỉ thị tiền xử lí:
2.1. Khai báo biến:
 Các loại biến được hỗ trợ:
 int1 số 1 bit = true hay false ( 0 hay 1).
 int8 số nguyên 1 byte ( 8 bit).
 int16 số nguyên 16 bit.
 int32 số nguyên 32 bit.
 char ký tự 8 bit.
 float số thực 32 bit.
 short mặc định như kiểu int1.
 byte mặc định như kiểu int8.
 int mặc định như kiểu int8.
 long mặc định như kiểu int16.
Thêm signed hoặc unsigned phía trước để chỉ đó là số có dấu hay không dấu .Khai báo
như trên mặc định là không dấu. 4 khai báo cuối không nên dùng vì dễ nhầm lẫn . Thay vào đó
nên dùng 4 khai báo đầu .
VD :
Signed int8 a ; // số a là 8 bit dấu ( bit 7 là bit dấu ).
Signed int16 b , c , d ;
Signed int32 , . . .
 Phạm vi biến :
Int8 : 0 , 255 signed int8 : -128 , 127
Int16 : 0 ,2^15-1 signed int16 : -2^15 , 2^15-1
Int32 : 0 , 2^32-1 signed int32 : -2^31 , 2^31-1
 Cách sử dụng biến:
Khi sử dụng các phép toán cần lưu ý: sự tràn số , tính toán với số âm , sự chuyển kiểu
và ép kiểu.
VD:
Int8 a=275; // a =275-256=19
Int8 const a=275 //a=19
Int8 a=40 , b=7 , c;
C=a * b ; //c=280-256=24
C=a / b ; //c=5
Có thể ép kiểu , thường là tiết kiệm ram , hay muốn tiết kiệm thời gian tính ,…
VD : Int8 a =8 , b=200;
Int16 c ;
C= ( int16) a * b ;
// c= 1600 , a chuyển sang 16 bit , 16bit*8bit -> b tự động
chuyển sang 16 bit , kết quả là 16 bit trong c , lưu ý biến a , b
vẫn là 8 bit .
 8bit * 8bit -> phép nhân là 8 bit , KQ là 8 bit
 16bit * 8 bit -> phép nhân là 16 bit , KQ là 16 bit
 32bit * 16 bit -> phép nhân là 32 bit , KQ là 32 bit
 16bit * 16 bit -> phép nhân là 16 bit , KQ là 16 bit . . . v . v . . .
Có thể ép kiểu kết quả :
VD :
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
37
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
16b*8b ->16bit , nếu gán vào biến 8 bit thì KQ sẽ cắt bỏ 8 bit cao .
 Phạm vi sử dụng biến:
Giống như C trong lập trình C cho máy tính. Biến có thể được khai báo như toàn cục
hay cục bộ .Biến khai báo trong hàm sẽ là cục bộ và sẽ chỉ dùng được trong hàm đó, kể cả
trong hàm main( ). Ngoài ra còn có thể khai báo ngay trong 1 khối lệnh, và cũng chỉ tồn tại
trong khối lệnh đó.
2.2. Các cấu trúc lệnh (Statement):
 Các vòng lặp:
Một trong những điểm mạnh lớn nhất của máy tính là khả năng thực hiện một chuỗi các
lệnh lặp đi lặp lại. Điều đó có được là do sử dụng các cấu trúc lặp trong ngôn ngữ lập trình.
Đối với những người đã từng viết chương trình cho vi điều khiển bằng ngôn ngữ
Assemler thì việc tạo ra các vòng lặp hết sức khó khăn do các vòng lặp hoàn tòan được tạo ra
bằng các lệnh nhảy, so sánh và nhãn, nhưng sẽ tiện lợi hơn khi viết chương trình cho vi điều
khiển bằng ngôn CCSC.
 Câu lệnh: Do… While…
Không giống như vòng lặp for và while, vòng lặp này kiểm tra điều kiện tại cuối vòng
lặp. Điều này có nghĩa là vòng lặp do...while sẽ được thực hiện ít nhất một lần, ngay cả khi
điều kiện là sai (false) ở lần chạy đầu tiên
Code:
do
{
câu_lệnh;
} while (điều_kiện);
Cặp dấu ngoặc "{}" là không cần thiết khi chỉ có một câu lệnh hiện diện trong vòng lặp,
nhưng việc sử dụng dấu ngoặc "{}" là một thói quen tốt. Vòng lặp do...while lặp đến khi
điều_kiện mang giá trị false. Trong vòng lặp do...while, câu_lệnh (khối các câu lệnh) sẽ được
thực thi trước, và sau đó điều_kiện được kiểm tra. Nếu điều_kiện là true, chương trình sẽ quay
lại thực hiện lệnh do. Nếu điều kiện là false, chương trình chuyển đến thực hiện lệnh nằm sau
vòng lặp.
Chương trình sẽ thực thi biểu thức rồi mới xét điều kiện sau.
 Câu lệnh: While…
Code:
while (điều kiện)
câu lệnh;
Trong đó, câu lệnh có thể là rỗng, hay một lệnh đơn, hay một khối lệnh. Nếu vòng lặp
while chứa một tập lệnh thì chúng phải được đặt trong cặp ngoặc xoắn {}. điều_kiện có thể là
biểu thức bất kỳ. Vòng lặp sẽ được thực hiện lặp đi lặp lại khi điều kiện trên là đúng (true).
Chương trình sẽ chuyển đến thực hiện lệnh tiếp theo sau vòng lặp khi điều kiện trên là sai
(false).
Chương trình sẽ xét điều kiện trước rồi thực thi biểu thức sau.
 Câu lệnh: For…
Code:
for (khởi tạo giá trị cho biến điều khiển; biểu thức điều kiện; biểu thức thay
đổi giá trị của biến điều khiển)
{
Câu lệnh (các câu lệnh);
}
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
38
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Khởi tạo giá trị cho biến điều khiển là một câu lệnh gán giá trị ban đầu cho biến điều
khiển trước khi thực hiện vòng lặp. Lênh này chỉ được thực hiện duy nhất một lần.
Biểu thức điều kiện là một biểu thức quan hệ, xác định điều kiện thoát cho vòng lặp.
Biểu thức thay đổi giá trị của biến điều khiển xác định biến điều khiển sẽ bị thoát thế
nào sau mỗi lần vòng lặp được lặp lại (thường là tăng hoặc giảm giá trị của biến điều khiển).
Ba phần trên được phân cách bởi dấu chấm phẩy. Câu lệnh trong thân vòng lặp có thể là một
lệnh duy nhất (lệnh đơn) hoặc lệnh phức (nhiều lệnh).
Vòng lặp for sẽ tiếp tục được thực hiện chừng nào mà biểu thức điều kiện còn
[b]đúng (true)[b]. Khi biểu thức điều kiện là sai (false), chương trình sẽ thoát ra khỏi vòng lặp
for.
Vòng lặp "for" lồng nhau
Một vòng lặp for được gọi là lồng nhau khi nó nằm bên trong một vòng lặp for khác
Code:
for (i = 1; i < max1; i++)
{ ...
...
for (j = 1; j < max1; j++)
{ ...
...
}
...
}
Vòng lặp for khi không có bất kỳ thành phần nào sẽ là một vòng lặp vô tận. Tùy
nhiên, lệnh break bên trong vòng lặp sẽ cho phép thoát khỏi vòng lặp.
 Cấu trúc chọn lựa IF:
 Câu lệnh: If…
Code:
if (biểu thức)
Các câu lệnh;
Cho phép đưa ra các quyết định dựa trên việc kiểm tra một điều kiện nào đó là
đúng(true) hay sai (false). Biểu thức phải luôn đặt trong dấu ngoặc ( ). Mệnh đề theo sau từ
khóa if là một điều kiện (hoặc một biểu thức điều kiện) cần được kiểm tra. Tiếp đến là một
lệnh hay một tập các lệnh sẽ được thực thi khi điều kiện (hoặc biểu thức điều kiện) có kết quả
true.
 Câu lệnh: If…Else…
Code:
if (biểu thức)
{ câu lệnh 1;}
else
{ câu lệnh 2;}
Ở trên chúng ta biết dạng đơn giải nhất của câu lệnh if, cho phép chúng ta lựa chọn để
thực hiện hay không một câu lệnh hoặc một chuỗi các lệnh. C cũng cho phép ta lựa chọn trong
hai khối lệnh để thực hiện bằng cách dùng cấu trúc if...else…
Nếu biểu thức điều kiện trên đúng, câu lệnh 1 được thực hiện. Nếu nó sai câu lệnh 2
được thực hiện. Câu lệnh sau if và else có thể là lệnh đơn hoặc lệnh phức. Các câu lệnh đó nên
được lùi vào trong dòng mặc dù không bắt buộc. Cách viết đó giúp ta nhìn thấy ngay những
lệnh nào sẽ được thực hiện tùy theo kết quả của biểu thức điều kiện.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
39
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
 Các lệnh khác:
Return;//Dùng cho hàm có trả về trị, hoặc không trả về trị, nghĩa là thoát khỏi hàm tại
đó.
Break; //Ngắt ngang (thoát khỏi) vòng lặp while.
Continue; // quay trở về đầu vòng lặp while.
Goto label;// nhảy đến label.
Label: stmt;
Statement (stmt): câu lệnh.
Expression (expr): biểu thức.
2.3. Chỉ thị tiền xử lí:
1) # INCLUDE :
Cú pháp : # include <filename>
Filename: tên file cho thiết bị *.h, *.c. Nếu chỉ định file ở đường dẫn khác thì thêm
đường dẫn vào. Luôn phải có để khai báo chương trình viết cho VĐK nào, và luôn đặt ở dòng
đầu tiên .
VD :
#include <16F877.H> // chương trình sử dụng cho VĐK 16F877
#include < C:INCLUDESCOMLIBMYRS232.C >
2) #BIT , #BYTE , #LOCATE và #DEFINE:
_#BIT id = x . y
Với id : tên biến.
x : biến C ( 8,16,32,…bit) hay hằng số địa chỉ thanh ghi.
y : vị trí bit trong x.
Tạo biến 1 bit đặt ở byte x vị trí bit y, tiện dùng kiểm tra hay gán trị cho bit thanh ghi.
Điểm khác biệt so với dùng biến 1 bit từ khai báo int1 là: int1 tốn 1 bit bộ nhớ, đặt ở thanh ghi
đa mục đích nào đó do CCS tự chọn, còn #BIT thì không tốn thêm bộ nhớ do id chỉ là danh
định đại diện cho bit chỉ định ở biến x, thay đổi giá trị id (0 / 1) sẽ thay đổi giá trị bit tương
ứng y -> thay đổi trị x.
VD:
#bit TMR1Flag = 0xb.2 //bit cờ ngắt timer1 ở địa chỉ 0xb.2 (PIC16F877A)
Khi đó TMR1Flag = 0 -> xoá cờ ngắt timer1
Int16 a=35; //a=00000000 00100011
#bit b= a.11 //b=0, nếu b=a.0 thì b chỉ vị trí LSB (bit thấp nhất, bên
trái)
Sau đó : b=1; //a=00001000 00100011 = 2083
_#BYTE id = x
x: địa chỉ.
id : tên biến C.
Gán tên biến id cho địa chỉ (thanh ghi ) x, sau đó muốn gán hay kiểm tra địa chỉ x chỉ
cần dùng id. Không tốn thêm bộ nhớ, tên id thường dùng tên gợi nhớ chức năng thanh ghi ở
địa chỉ đó. Lưu ý rằng giá trị thanh ghi có thể thay đổi bất kỳ lúc nào do hoạt động chương
trình nên giá trị id cũng tự thay đổi theo giá trị thanh ghi đó . Không nên dùng id cho thanh ghi
đa mục đích như 1 cách dùng biến int8 vì CCS có thể dùng các thanh ghi này bất kỳ lúc nào
cho chương trình, nếu muốn dùng riêng, hãy dùng #LOCATE. _
VD:
#byte port_B = 0xc6; // 16F877A :0xc6 là địa chỉ portB.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
40
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Muốn port b có giá trị 120 thì:
port_b=120;
#byte status = 0xc3;
_#LOCATE id = x _Làm việc như #byte nhưng có thêm chức năng bảo vệ không cho
CCS sử dụng địa chỉ đó vào mục đích khác .
VD:
#LOCATE temp = 0xc20 // 0xc20 :thanh ghi đa mục đích.
Cách sau tương tự:
Int8 temp ;
#locate temp = 0xc20
Sử dụng #LOCATE để gán biến cho 1 dãy địa chỉ kề nhau ( cặp thanh ghi ) sẽ tiện lợi
hơn thay vì phải dùng 2 biến với #byte.
VD: CCP1 có giá trị là cặp thanh ghi 0x15 (byte thấp) và 0x16 (byte cao). Để gán trị
cho CCP1:
Int16 CCP1;
#locate CCP1= 0x15 // byte thấp của CCP1 ở 0x15
//byte cao của CCP1 ở 0x16
Gán trị cho CCP1 sẽ tự động gán vào cả 2 thanh ghi:
CCP1 = 1133 ; // = 00000100 01101101 -> 0x15 = 00000100 , 0x16 =
01101101
_#DEFINE id text
Text : chuỗi hay số. Dùng định nghĩa giá trị.
VD : #define a 12345
3) #DEVICE :
# DEVICE chip option
chip: tên VĐK sử dụng, không dùng tham số này nếu đã khai báo tên chip ở # include.
option : toán tử tiêu chuẩn theo từng chip:
* = 5 dùng pointer 5 bit (tất cả PIC).
* = 8 dùng pointer 8 bit (PIC14 và PIC18).
* = 16 dùng pointer 16 bit (PIC14 ,PIC 18).
ADC = x sử dụng ADC x bit (8, 10, … bit tuỳ chip), khi dùng hàm read_adc( )
, sẽ trả về giá trị x bit.
ICD = true: tạo mã tương thích debug phần cứng Microchip.
HIGH_INTS = TRUE: cho phép dùng ngắt ưu tiên cao.
_Khai báo pointer 8 bit, bạn sử dụng được tối đa 256 byte RAM cho tất cả biến chương trình.
_Khai báo pointer 16 bit, bạn sử dụng được hết số RAM có của VĐK.
_Chỉ nên dùng duy nhất 1 khai báo #device cho cả pointer và ADC.
VD: #device * = 16 ADC = 10
4) #USE :
_#USE delay (clock = speed)
Speed: giá trị OSC mà bạn dùng.
VD: dùng thạch anh dao động 40Mhz thì: #use delay(clock = 40000000)
Chỉ khi có chỉ thị này thì trong chương trình bạn mới được dùng hàm delay_us ( ) và
delay_ms( ).
_#USE fast_io (port)
Port: là tên port: từ A-G ( tuỳ chip )
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
41
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Dùng cái này thì trong chương trình khi dùng các lệnh io như output_low(), … nó sẽ
set chỉ với 1 lệnh, nhanh hơn so với khi không dùng chỉ thị này.
Trong hàm main( ) bạn phải dùng hàm set_tris_x( ) để chỉ rõ chân vào ra thì chỉ thị
trên mới có hiệu lực, không thì chương trình sẽ chạy sai.
Không cần dùng nếu không có yêu cầu gì đặc biệt.
VD: #use fast_io( A )
_#USE I2C ( options )
Thiết lập giao tiếp I2C. Option bao gồm các thông số sau, cách nhau bởi dấu phẩy:
Master: chip ở chế độ master
Slave: chip ở chế độ slave
SCL = pin: chỉ định chân SCL
SDA = pin: chỉ định chân SDA
ADDRESS =x: chỉ định địa chỉ chế độ slave
FAST: chỉ định FAST I2C
SLOW: chỉ định SLOW I2C
RESTART_WDT: restart WDT trong khi chờ I2C_READ( )
FORCE_HW: sử dụng chúc năng phần cứng I2C ( nếu chip hỗ trợ )
NOFLOAT_HIGH: không cho phép tín hiệu ở float high, tín hiệu được lái từ
thấp lên cao.
SMBUS: bus dùng không phải bus I2C , nhưng là cái gì đó tương tự.
VD:
#use I2C ( master , sda=pin_B0 , scl = pin_B1 )
#use I2C (slave , sda= pin_C4 , scl= pin_C3 , address = 0xa00 , FORCE_HW )
_#USE RS232 ( options )
Thiết lập giao tiếp RS232 cho chip (có hiệu lực sau khi nạp chương trình cho chip,
không phải giao tiếp RS232 đang sử dụng để nạp chip ) .
Option bao gồm :
BAUD = x: thiết lập tốc độ baud rate : 19200 , 38400 , 9600 , . . .
PARITY = x: x= N, E hay O, với N: không dùng bit chẵn lẻ.
XMIT = pin: set chân transmit (chuyển data)
RCV = pin: set chân receive (nhận data)
Các thông số trên hay dùng nhất , các tham số khác sẽ bổ sung sau.
VD:
#use rs232(baud = 19200, parity = n, xmit = pin_C6, rcv = pin_C7)
5) Một số chỉ thị tiền xử lý khác :
#CASE: cho phép phân biệt chữ hoa / thường trong tên biến , dành cho những ai quen
lập trình C.
#OPT n: với n=0 – 9: chỉ định cấp độ tối ưu mã , không cần dùng thì mặc định là 9
(very tối ưu).
#PRIORITY ints: với ints là danh sách các ngắt theo thứ tự ưu tiên thực hiện khi có
nhiều ngắt xảy ra đồng thời, ngắt đứng đầu sẽ là ngắt ưu tiên nhất, dùng ngắt nào đưa ngắt đó
vô . Chỉ cần dùng nếu dùng hơn 1 ngắt. Xem cụ thể phần ngắt.
VD: #priority int_CCP1 , int_timer1 // ngắt CCP1 ưu tiên nhất.
6) Một số vấn đề quan trọng khác :
Trong đó : biểu thị số trong C: 123: số decimal 0x3,
0xB1: số hex,
0b100110: số binary.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
42
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
‘a’: ký tự
“abcd”: chuỗi , ký tự null được thêm phía sau
Các toán tử C :
>= , < = , = = , != ( không bằng )
&& : and
|| : or
! : not ( đảo của bit , không phải đảo của byte )
>>n : dịch trái n bit
<< n : dịch phải n bit
++ , - - , += , - = , . . .
3. Các hàm xử lí số, xử lí Bit, Delay:
3.1. Các hàm xử lý số :
Bao gồm các hàm:
Sin( ), cos( ), tan( ), Asin( ), acos( ), atan( ).
Abs( ): lấy trị tuyệt đối.
Ceil( ):làm tròn theo hướng tăng.
Floor ( ) :làm tròn theo hướng giảm.
Exp ( ): tính e^x.
Log ( ): Log10 ( ).
Pow ( ): tính luỹ thừa.
Sqrt ( ):căn thức.
Các hàm này chạy rất chậm trên các VĐK không có bộ nhân phần cứng ( PIC 14 ,12 )
vì chủ yếu tính toán với số thực và trả về cũng số thực ( 32 bit ) và bằng phần mềm .
VD hàm sin mất 3.5 ms ( thạch anh = 20Mhz )để cho KQ . Do đó nếu không đòi hỏi
tốc độ thì dùng các hàm này cho đơn giản , như là dùng hàm sin thì khỏi phải lập bảng tra.
3.2. Các hàm xử lý bit và các phép toán :
1/ Shift_right ( address , byte , value )
Shift_left ( address , byte , value )
Dịch phải (trái ) 1 bit vào 1 mảng hay 1 cấu trúc. Địa chỉ có thể là địa chỉ mảng hay địa
chỉ trỏ tới cấu trúc ( kiểu như &data). Bit 0 byte thấp nhất là LSB.
2/ Rotate_right ( )
Rotate_left ( )
3/ Bit_clear ( var , bit )
Bit_set ( var , bit )
Bit_clear ( ) dùng xóa (set = 0) bit được chỉ định bởi vị trí bit trong biến var.
Bit_set ( ) dùng set=1 bit được chỉ định bởi vị trí bit trong biến var.
var : biến 8 , 16 , 32 bit bất kỳ .
bit : vị trí clear (set): từ 0-7 ( biến 8 bit), 0-15 (biến 16 bit ), 0-31 (biến 32 bit ).
Hàm không trả về trị .
VD : Int x; X=11 ; //x=1011 Bit_clear ( x ,1 ) ; // x= 1001b = 9
4/ Bit_test ( var , bit )
var : biến 8, 16 ,32 bit.
bit : vị trí bit trong var.
Dùng kiểm tra vị trí bit trong biến var.
Hàm trả về 0 hay 1 là giá trị bit đó trong var.
Giả sử bạn có biến x 32 bit đếm từ 0 lên và muốn kiểm tra xem nó có lớn hơn 4096
không ( 4096= 2^12 =1000000000000b)
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
43
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
If ( x >= 4096) . . . // phép kiểm tra này mất ~5 us Trong 1 vòng lặp , việc kiểm tra thường
xuyên như vậy sẽ làm mất 1 thời gian đáng kể . Để tối ưu , chỉ cần dùùng : if ( bit_test ( x, 12 -
> chỉ mất ~ 0.4 us . ( 20 Mhz thạch anh ).
Kiểm tra đếm lên tới những giá trị đặc biệt ( 2^ i) thì dùng hàm này rất tiện lợi.
5/ Swap ( var )
var : biến 1 byte.
Hàm này tráo vị trí 4 bit trên với 4 bit dưới của var , tương đương var =( var>>4 ) | ( var << 4 )
Hàm không trả về trị.
VD : X= 5 ; //x=00000101b
Swap ( x) ; //x = 01010000b = 80
6/ Make8 ( var , offset )
var : biến 8,16,32 bit.
offset là vị trí của byte cần trích ( 0,1,2,3).
Hàm này trích 1 byte từ biến var.
Hàm trả về giá trị byte cần trích.
VD: Int16 x = 1453 ; // x=0x5AD
Y = Make(x, 1) ; //Y= 5 = 0x05
7/ Make16 ( varhigh , varlow )
Trả về giá trị 16 bit kết hợp từ 2 biến 8 bit varhigh và varlow. Byte cao là varhigh, thấp
là varlow.
8/ Make32 ( var1 , var2 , var3 , var4 ) :
Trả về giá trị 32 bit kết hợp từ các giá trị 8 bit hay 16 bit từ var1 tới var4 . Trong đó
var2 đến var4 có thể có hoặc không . Giá trị var1 sẽ là MSB , kế tiếp là var2,… Nếu tổng số
bit kết hợp ít hơn 32 bit thì 0 được thêm vào MSB cho đủ 32 bit.
VD: Int a=0x01 , b=0x02 , c=0x03 , d=0x04; // các giá trị hex
Int32 e ;
e = make32 ( a , b , c , d ); // e = 0x01020304
e = make32 ( a , b , c , 5 ); // e = 0x01020305
e = make32 ( a, b, 8 ); // e = 0x00010208
e = make32 ( a ,0x1237 ); // e = 0x00011237
3.3. Các hàm Delay :
Để sử dụng các hàm delay, cần có khai báo tiền xử lý ở đầu file.
VD: #use delay ( clock = 20000000 )// sử dụng OSC 20 Mhz
Hàm delay không sử dụng bất kỳ timer nào. Nếu trong trong thời gian delay lại xảy ra
ngắt thì thời gian thực thi ngắt không tính vào thời gian delay , xong ngắt nó quay về chạy tiếp
các dòng mã cho tới khi xong hàm delay.
Có 3 hàm phục vụ :
1/ delay_cycles (count )
Count : hằng số từ 0 – 255, là số chu kỳ lệnh. 1 chu kỳ lệnh bằng 4 chu kỳ máy.
Hàm không trả về trị. Hàm dùng delay 1 số chu kỳ lệnh cho trước.
VD: delay_cycles ( 25 ); // với OSC = 20 Mhz, hàm này delay 5 us.
2/ delay_us ( time )
Time : là biến số thì = 0 – 255, time là 1 hằng số thì = 0 -65535.
Hàm không trả về trị. Hàm này cho phép delay khoảng thời gian dài hơn theo đơn vị us.
3/ delay_ms (time )
Time = 0-255 nếu là biến số hay = 0-65535 nếu là hằng số.
Hàm không trả về trị. Hàm này cho phép delay dài hơn nữa.
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
44
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
VD : Int a = 215;
Delay_us ( a ); // delay 215 us
Delay_us ( 4356 ); // delay 4356 us
Delay_ms ( 2500 ); // delay 2 . 5 s
3.4. Các hàm Input/Output:
1/ Output_low ( pin ), Output_high (pin )
Dùng thiết lập mức 0 ( low, 0V) hay mức 1 ( high , 5V ) cho chân IC, pin chỉ vị trí
chân.
Hàm này sẽ đặt pin làm ngõ ra.
Hàm này dài 2-4 chu kỳ máy
VD: chương trình sau xuất xung vuông chu kỳ 500ms , duty =50% ra chân B0 ,nối B0 với 1
led sẽ làm nhấp nháy led .
#include <16F877A.h>
#use delay( clock=20000000)
Main( )
{
while(1)
{ output_high(pin_B0);
Delay_ms(250) ; // delay 250ms
Output_low (pin_B0);
Delay_ms (250 );
}
}
2/ Output_bit ( pin , value )
pin: tên chân
value: giá trị 0 hay 1
Hàm này cũng xuất giá trị 0 / 1 trên pin, tương tự 2 hàm trên. Thường dùng nó khi giá
trị ra tuỳ thuộc giá trị biến 1 bit nào đó, hay muốn xuất đảo của giá trị ngõ ra trước đó.
3/ Output_float ( pin )
Hàm này set pin như ngõ vào.
4/ Input ( pin )
Hàm này trả về giá trị 0 hay 1 là trạng thái của chân IC. Giá trị là 1 bit.
5/ Output_X ( value )
X là tên port có trên chip.
Value là giá trị 1 byte.
Hàm này xuất giá trị 1 byte ra port. Tất cả chân của port đó đếu là ngõ ra.
6/ Input_X ( )
X: là tên port ( a, b ,c ,d e ).
Hàm này trả về giá trị 8 bit là giá trị đang hiện hữu của port đó.
7/ Port_B_pullups ( value )
Hàm này thiết lập ngõ vào port B pullup ( điện trở kéo lên ). Value =1 sẽ kích hoạt tính
năng này và value = 0 sẽ ngừng.
Chỉ các chip có port B có tính năng này mới dùng hàm này.
8/ Set_tris_X ( value )
Hàm này định nghĩa chân IO cho 1 port là ngõ vào hay ngõ ra. Chỉ được dùng với
#use fast_IO. Sử dụng #byte để tạo biến chỉ đến port và thao tác trên biến này chính là thao tác
trên port .
Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận
45
SVTH: Hoàng Trung Thạch MSSV: 20662090
SVTH: Hoàng Trung Thạch MSSV: 20662090
Value là giá trị 8 bit . Mỗi bit đại diện 1 chân và bit=0 sẽ set chân đó là ngõ vào , bit=
1 set chân đó là ngõ ra .
Set_tris_B (0 ); //port B =00000000: tất cả chân portB là ngõ ra.
Set_tris_B ( 1 ); //portB = 00000001: chỉ B0 là ngõ vào , còn lại là ngõ ra.
Set_tris_B ( 255 ); //portB=11111111: tất cả chân portB là ngõ vào.
4. Điều xung PWM:
4.1. Các lệnh cài đặt:
 Cài đặt timer_2
Setup_timer_2 (mode, period, postscale)
- Với mode gồm :
T2_DISABLED
T2_DIV_BY_1
T2_DIV_BY_4
T2_DIV_BY_16
- Period là số nguyên từ 0-255, xác định giá trị xung reset
- Postscale là số nguyên 1-16, xác định reset bao nhiêu lần trước khi ngắt.
 Cài đặt PWM
Mã lệnh:
Setup_CCPx (mode)
x =1,2: tên chân CCP có trên chip.
mode là 1 trong các hằng số sau:
CCP_OFF: tắt chức năng CCP, RC sẽ là chân I/O.
CCP_PWM: bật chế độ PWM.
Mã lệnh:
Set_CCPx_duty (value)
Value: biến hay hằng, giá trị 8 bit hay 16 bit.
x =1,2: tên chân CCPx
Dùng set duty của xung trong chế độ PWM. Nó ghi giá trị 10 bit vào thanh ghi CCPx. Nếu
value chỉ là 8 bit, nó dịch thêm 2 để đủ 10 bit nạp vào CCPx.
4.2. Các công thức tính:
 Tính chu kỳ PWM:
TPWM = [(PR2) +1] * 4 * Tosc * (Giá trị của TMR2)
Tính tần số PWM:
FPWM = 1/ TPWM
 Tính % duty:
Tùy theo kiểu của value mà cách tính khác nhau.
- Nếu value là giá trị kiểu int 8bit thì CCS C sẽ dịch trái 2 bit để đủ 10bit
Công thức tính: %duty = value/(PR2 +1)*100%
- Nếu value là giá trị long int 16bit thì CCS C sẽ bỏ đi 4 bit cao
Công thức tính: %duty = (value & 1023)/(4*(PR2 +1))*100%
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC
ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC

More Related Content

What's hot

Bai giang-vhdl
Bai giang-vhdlBai giang-vhdl
Bai giang-vhdlhoangclick
 
ĐỒ ÁN: Thiết kế mạch đếm sản phẩm dùng cảm biến hồng ngoại!
ĐỒ ÁN: Thiết kế mạch đếm sản phẩm dùng cảm biến hồng ngoại!ĐỒ ÁN: Thiết kế mạch đếm sản phẩm dùng cảm biến hồng ngoại!
ĐỒ ÁN: Thiết kế mạch đếm sản phẩm dùng cảm biến hồng ngoại!
Dịch Vụ Viết Luận Văn Thuê ZALO/TELEGRAM 0934573149
 
Đề tài: Đo và điều khiển tốc độ động cơ dùng 8051, HAY
Đề tài: Đo và điều khiển tốc độ động cơ dùng 8051, HAYĐề tài: Đo và điều khiển tốc độ động cơ dùng 8051, HAY
Đề tài: Đo và điều khiển tốc độ động cơ dùng 8051, HAY
Dịch vụ viết bài trọn gói ZALO 0917193864
 
Giáo trình thiết kế mạch logic số
Giáo trình thiết kế mạch logic sốGiáo trình thiết kế mạch logic số
Giáo trình thiết kế mạch logic số
Man_Ebook
 
Cau truc phan cung pic16 f8xx
Cau truc phan cung pic16 f8xxCau truc phan cung pic16 f8xx
Cau truc phan cung pic16 f8xx
Bùi Ngọc Bảo
 
Đề tài: Mạch vòng tốc độ theo hai tiêu chuẩn module tối ưu, HOT
Đề tài: Mạch vòng tốc độ theo hai tiêu chuẩn module tối ưu, HOTĐề tài: Mạch vòng tốc độ theo hai tiêu chuẩn module tối ưu, HOT
Đề tài: Mạch vòng tốc độ theo hai tiêu chuẩn module tối ưu, HOT
Dịch vụ viết bài trọn gói ZALO 0917193864
 
Đồ án điện tử công suất: Thiết kế bộ chỉnh lưu hình tia ba pha
Đồ án điện tử công suất: Thiết kế bộ chỉnh lưu hình tia ba phaĐồ án điện tử công suất: Thiết kế bộ chỉnh lưu hình tia ba pha
Đồ án điện tử công suất: Thiết kế bộ chỉnh lưu hình tia ba pha
nataliej4
 
Thiết kế hệ thống giám sát và điều khiển thiết bị công nghiệp, HAY
Thiết kế hệ thống giám sát và điều khiển thiết bị công nghiệp, HAYThiết kế hệ thống giám sát và điều khiển thiết bị công nghiệp, HAY
Thiết kế hệ thống giám sát và điều khiển thiết bị công nghiệp, HAY
Dịch vụ viết bài trọn gói ZALO 0917193864
 
Đề tài: Xây dựng và điều khiển động cơ BLDC xe đạp điện, HAY
Đề tài: Xây dựng và điều khiển động cơ BLDC xe đạp điện, HAYĐề tài: Xây dựng và điều khiển động cơ BLDC xe đạp điện, HAY
Đề tài: Xây dựng và điều khiển động cơ BLDC xe đạp điện, HAY
Dịch vụ viết bài trọn gói ZALO 0917193864
 
Đề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOT
Đề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOTĐề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOT
Đề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOT
Dịch vụ viết bài trọn gói ZALO 0917193864
 
ĐIều khiển tốc độ động cơ không đồng bộ 3 pha dùng bộ điều khiển pid mờ lai​
ĐIều khiển tốc độ động cơ không đồng bộ 3 pha dùng bộ điều khiển pid mờ lai​ĐIều khiển tốc độ động cơ không đồng bộ 3 pha dùng bộ điều khiển pid mờ lai​
ĐIều khiển tốc độ động cơ không đồng bộ 3 pha dùng bộ điều khiển pid mờ lai​
Man_Ebook
 
Đề tài: Thiết kế điều khiển tự động hệ thống nhiều bơm lên bể chứa
Đề tài: Thiết kế điều khiển tự động hệ thống nhiều bơm lên bể chứaĐề tài: Thiết kế điều khiển tự động hệ thống nhiều bơm lên bể chứa
Đề tài: Thiết kế điều khiển tự động hệ thống nhiều bơm lên bể chứa
Dịch vụ viết bài trọn gói ZALO 0917193864
 
Chương trình điều khiển đèn giao thông cho ngã tư theo 3 chế độ dựa theo đồng...
Chương trình điều khiển đèn giao thông cho ngã tư theo 3 chế độ dựa theo đồng...Chương trình điều khiển đèn giao thông cho ngã tư theo 3 chế độ dựa theo đồng...
Chương trình điều khiển đèn giao thông cho ngã tư theo 3 chế độ dựa theo đồng...
nataliej4
 
Vi Điều Khiển Ứng Dụng AT89s52
Vi Điều Khiển Ứng Dụng AT89s52Vi Điều Khiển Ứng Dụng AT89s52
Vi Điều Khiển Ứng Dụng AT89s52
Mr Giap
 
Báo cáo hệ thống đóng táo tự động dùng plc
Báo cáo hệ thống đóng táo tự động dùng plcBáo cáo hệ thống đóng táo tự động dùng plc
Báo cáo hệ thống đóng táo tự động dùng plc
Tony Tun
 
đồ áN phân loại sản phâm dùng plc s71200
đồ áN phân loại sản phâm dùng plc s71200đồ áN phân loại sản phâm dùng plc s71200
đồ áN phân loại sản phâm dùng plc s71200
Lê Gia
 
Luận văn: Thiết kế mạch điều khiển tốc độ động cơ một chiều, HAY
Luận văn: Thiết kế mạch điều khiển tốc độ động cơ một chiều, HAYLuận văn: Thiết kế mạch điều khiển tốc độ động cơ một chiều, HAY
Luận văn: Thiết kế mạch điều khiển tốc độ động cơ một chiều, HAY
Dịch vụ viết bài trọn gói ZALO 0917193864
 
Giáo trình Điều khiển số.pdf
Giáo trình Điều khiển số.pdfGiáo trình Điều khiển số.pdf
Giáo trình Điều khiển số.pdf
Man_Ebook
 
Thiết kế hệ thống điều khiển tốc độ động cơ dc sử dụng bộ điều khiển pid và p...
Thiết kế hệ thống điều khiển tốc độ động cơ dc sử dụng bộ điều khiển pid và p...Thiết kế hệ thống điều khiển tốc độ động cơ dc sử dụng bộ điều khiển pid và p...
Thiết kế hệ thống điều khiển tốc độ động cơ dc sử dụng bộ điều khiển pid và p...
Man_Ebook
 
Đồ án Thiết kế hệ thống tưới cây tự động sử dụng Arduino
Đồ án Thiết kế hệ thống tưới cây tự động sử dụng ArduinoĐồ án Thiết kế hệ thống tưới cây tự động sử dụng Arduino
Đồ án Thiết kế hệ thống tưới cây tự động sử dụng Arduino
Verdie Carter
 

What's hot (20)

Bai giang-vhdl
Bai giang-vhdlBai giang-vhdl
Bai giang-vhdl
 
ĐỒ ÁN: Thiết kế mạch đếm sản phẩm dùng cảm biến hồng ngoại!
ĐỒ ÁN: Thiết kế mạch đếm sản phẩm dùng cảm biến hồng ngoại!ĐỒ ÁN: Thiết kế mạch đếm sản phẩm dùng cảm biến hồng ngoại!
ĐỒ ÁN: Thiết kế mạch đếm sản phẩm dùng cảm biến hồng ngoại!
 
Đề tài: Đo và điều khiển tốc độ động cơ dùng 8051, HAY
Đề tài: Đo và điều khiển tốc độ động cơ dùng 8051, HAYĐề tài: Đo và điều khiển tốc độ động cơ dùng 8051, HAY
Đề tài: Đo và điều khiển tốc độ động cơ dùng 8051, HAY
 
Giáo trình thiết kế mạch logic số
Giáo trình thiết kế mạch logic sốGiáo trình thiết kế mạch logic số
Giáo trình thiết kế mạch logic số
 
Cau truc phan cung pic16 f8xx
Cau truc phan cung pic16 f8xxCau truc phan cung pic16 f8xx
Cau truc phan cung pic16 f8xx
 
Đề tài: Mạch vòng tốc độ theo hai tiêu chuẩn module tối ưu, HOT
Đề tài: Mạch vòng tốc độ theo hai tiêu chuẩn module tối ưu, HOTĐề tài: Mạch vòng tốc độ theo hai tiêu chuẩn module tối ưu, HOT
Đề tài: Mạch vòng tốc độ theo hai tiêu chuẩn module tối ưu, HOT
 
Đồ án điện tử công suất: Thiết kế bộ chỉnh lưu hình tia ba pha
Đồ án điện tử công suất: Thiết kế bộ chỉnh lưu hình tia ba phaĐồ án điện tử công suất: Thiết kế bộ chỉnh lưu hình tia ba pha
Đồ án điện tử công suất: Thiết kế bộ chỉnh lưu hình tia ba pha
 
Thiết kế hệ thống giám sát và điều khiển thiết bị công nghiệp, HAY
Thiết kế hệ thống giám sát và điều khiển thiết bị công nghiệp, HAYThiết kế hệ thống giám sát và điều khiển thiết bị công nghiệp, HAY
Thiết kế hệ thống giám sát và điều khiển thiết bị công nghiệp, HAY
 
Đề tài: Xây dựng và điều khiển động cơ BLDC xe đạp điện, HAY
Đề tài: Xây dựng và điều khiển động cơ BLDC xe đạp điện, HAYĐề tài: Xây dựng và điều khiển động cơ BLDC xe đạp điện, HAY
Đề tài: Xây dựng và điều khiển động cơ BLDC xe đạp điện, HAY
 
Đề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOT
Đề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOTĐề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOT
Đề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOT
 
ĐIều khiển tốc độ động cơ không đồng bộ 3 pha dùng bộ điều khiển pid mờ lai​
ĐIều khiển tốc độ động cơ không đồng bộ 3 pha dùng bộ điều khiển pid mờ lai​ĐIều khiển tốc độ động cơ không đồng bộ 3 pha dùng bộ điều khiển pid mờ lai​
ĐIều khiển tốc độ động cơ không đồng bộ 3 pha dùng bộ điều khiển pid mờ lai​
 
Đề tài: Thiết kế điều khiển tự động hệ thống nhiều bơm lên bể chứa
Đề tài: Thiết kế điều khiển tự động hệ thống nhiều bơm lên bể chứaĐề tài: Thiết kế điều khiển tự động hệ thống nhiều bơm lên bể chứa
Đề tài: Thiết kế điều khiển tự động hệ thống nhiều bơm lên bể chứa
 
Chương trình điều khiển đèn giao thông cho ngã tư theo 3 chế độ dựa theo đồng...
Chương trình điều khiển đèn giao thông cho ngã tư theo 3 chế độ dựa theo đồng...Chương trình điều khiển đèn giao thông cho ngã tư theo 3 chế độ dựa theo đồng...
Chương trình điều khiển đèn giao thông cho ngã tư theo 3 chế độ dựa theo đồng...
 
Vi Điều Khiển Ứng Dụng AT89s52
Vi Điều Khiển Ứng Dụng AT89s52Vi Điều Khiển Ứng Dụng AT89s52
Vi Điều Khiển Ứng Dụng AT89s52
 
Báo cáo hệ thống đóng táo tự động dùng plc
Báo cáo hệ thống đóng táo tự động dùng plcBáo cáo hệ thống đóng táo tự động dùng plc
Báo cáo hệ thống đóng táo tự động dùng plc
 
đồ áN phân loại sản phâm dùng plc s71200
đồ áN phân loại sản phâm dùng plc s71200đồ áN phân loại sản phâm dùng plc s71200
đồ áN phân loại sản phâm dùng plc s71200
 
Luận văn: Thiết kế mạch điều khiển tốc độ động cơ một chiều, HAY
Luận văn: Thiết kế mạch điều khiển tốc độ động cơ một chiều, HAYLuận văn: Thiết kế mạch điều khiển tốc độ động cơ một chiều, HAY
Luận văn: Thiết kế mạch điều khiển tốc độ động cơ một chiều, HAY
 
Giáo trình Điều khiển số.pdf
Giáo trình Điều khiển số.pdfGiáo trình Điều khiển số.pdf
Giáo trình Điều khiển số.pdf
 
Thiết kế hệ thống điều khiển tốc độ động cơ dc sử dụng bộ điều khiển pid và p...
Thiết kế hệ thống điều khiển tốc độ động cơ dc sử dụng bộ điều khiển pid và p...Thiết kế hệ thống điều khiển tốc độ động cơ dc sử dụng bộ điều khiển pid và p...
Thiết kế hệ thống điều khiển tốc độ động cơ dc sử dụng bộ điều khiển pid và p...
 
Đồ án Thiết kế hệ thống tưới cây tự động sử dụng Arduino
Đồ án Thiết kế hệ thống tưới cây tự động sử dụng ArduinoĐồ án Thiết kế hệ thống tưới cây tự động sử dụng Arduino
Đồ án Thiết kế hệ thống tưới cây tự động sử dụng Arduino
 

Viewers also liked

pic 16f877a
pic 16f877apic 16f877a
pic 16f877a
Nthong Ktv
 
Tai lieu tra_cuu_pic 18f4520
Tai lieu tra_cuu_pic 18f4520Tai lieu tra_cuu_pic 18f4520
Tai lieu tra_cuu_pic 18f4520
Vũ Anh
 
Gioi thieu-ve-vi-dieu-khien-pic
Gioi thieu-ve-vi-dieu-khien-picGioi thieu-ve-vi-dieu-khien-pic
Gioi thieu-ve-vi-dieu-khien-picCu Bi
 
Pic 16f877a
Pic 16f877aPic 16f877a
Pic 16f877aKRNFORD
 
Bai 001 vxl_pic_cautruc
Bai 001 vxl_pic_cautrucBai 001 vxl_pic_cautruc
Bai 001 vxl_pic_cautruc
mster_dang
 
Do an vi xu ly trong do luong dieu khien
Do an vi xu ly trong do luong dieu khienDo an vi xu ly trong do luong dieu khien
Do an vi xu ly trong do luong dieu khien
kidainhan
 
cam bien sieu am
cam bien sieu amcam bien sieu am
cam bien sieu am
Nguyễn Tín
 
Vi dieukhien pic
Vi dieukhien picVi dieukhien pic
Vi dieukhien pic
misuki_taro
 
File báo cáo đồ án smarthome
File báo cáo đồ án smarthomeFile báo cáo đồ án smarthome
File báo cáo đồ án smarthome
Kim Long
 
Giới thiệu nội dung khóa học online lập trình vi điều khiển PIC16F877A
Giới thiệu nội dung khóa học online lập trình vi điều khiển PIC16F877AGiới thiệu nội dung khóa học online lập trình vi điều khiển PIC16F877A
Giới thiệu nội dung khóa học online lập trình vi điều khiển PIC16F877A
Huytraining
 
Co ban ve_pic_9104
Co ban ve_pic_9104Co ban ve_pic_9104
Co ban ve_pic_9104Vn-net Simso
 
Tailieu.vncty.com dong-ho-thoi-gian-thuc-ds1307-pic16 f87
Tailieu.vncty.com   dong-ho-thoi-gian-thuc-ds1307-pic16 f87Tailieu.vncty.com   dong-ho-thoi-gian-thuc-ds1307-pic16 f87
Tailieu.vncty.com dong-ho-thoi-gian-thuc-ds1307-pic16 f87
Trần Đức Anh
 
Set 3 18 h
Set 3   18 hSet 3   18 h
Set 3 18 h
Ttx Love
 
Dtcn doan tn_003_muc luc
Dtcn doan tn_003_muc lucDtcn doan tn_003_muc luc
Dtcn doan tn_003_muc luc
Trần Đức Anh
 
Datasheet PIC16f887
Datasheet PIC16f887Datasheet PIC16f887
Datasheet PIC16f887
whendygarcia
 
Bao cao vdk_va_pic
Bao cao vdk_va_picBao cao vdk_va_pic
Bao cao vdk_va_pic
Hải Nguyễn
 
Những thiết bị an ninh giám sát thông minh cần thiết nhất
Những thiết bị an ninh giám sát thông minh cần thiết nhấtNhững thiết bị an ninh giám sát thông minh cần thiết nhất
Những thiết bị an ninh giám sát thông minh cần thiết nhất
Hậu Phong
 
Giáo trình vi điều khiển PIC
Giáo trình vi điều khiển PICGiáo trình vi điều khiển PIC
Giáo trình vi điều khiển PIC
Trung Thanh Nguyen
 

Viewers also liked (20)

pic 16f877a
pic 16f877apic 16f877a
pic 16f877a
 
Tai lieu tra_cuu_pic 18f4520
Tai lieu tra_cuu_pic 18f4520Tai lieu tra_cuu_pic 18f4520
Tai lieu tra_cuu_pic 18f4520
 
Gioi thieu-ve-vi-dieu-khien-pic
Gioi thieu-ve-vi-dieu-khien-picGioi thieu-ve-vi-dieu-khien-pic
Gioi thieu-ve-vi-dieu-khien-pic
 
Pic 16f877a
Pic 16f877aPic 16f877a
Pic 16f877a
 
Vi dieu khien_pic
Vi dieu khien_picVi dieu khien_pic
Vi dieu khien_pic
 
Bai tap mau
Bai tap mauBai tap mau
Bai tap mau
 
Bai 001 vxl_pic_cautruc
Bai 001 vxl_pic_cautrucBai 001 vxl_pic_cautruc
Bai 001 vxl_pic_cautruc
 
Do an vi xu ly trong do luong dieu khien
Do an vi xu ly trong do luong dieu khienDo an vi xu ly trong do luong dieu khien
Do an vi xu ly trong do luong dieu khien
 
cam bien sieu am
cam bien sieu amcam bien sieu am
cam bien sieu am
 
Vi dieukhien pic
Vi dieukhien picVi dieukhien pic
Vi dieukhien pic
 
File báo cáo đồ án smarthome
File báo cáo đồ án smarthomeFile báo cáo đồ án smarthome
File báo cáo đồ án smarthome
 
Giới thiệu nội dung khóa học online lập trình vi điều khiển PIC16F877A
Giới thiệu nội dung khóa học online lập trình vi điều khiển PIC16F877AGiới thiệu nội dung khóa học online lập trình vi điều khiển PIC16F877A
Giới thiệu nội dung khóa học online lập trình vi điều khiển PIC16F877A
 
Co ban ve_pic_9104
Co ban ve_pic_9104Co ban ve_pic_9104
Co ban ve_pic_9104
 
Tailieu.vncty.com dong-ho-thoi-gian-thuc-ds1307-pic16 f87
Tailieu.vncty.com   dong-ho-thoi-gian-thuc-ds1307-pic16 f87Tailieu.vncty.com   dong-ho-thoi-gian-thuc-ds1307-pic16 f87
Tailieu.vncty.com dong-ho-thoi-gian-thuc-ds1307-pic16 f87
 
Set 3 18 h
Set 3   18 hSet 3   18 h
Set 3 18 h
 
Dtcn doan tn_003_muc luc
Dtcn doan tn_003_muc lucDtcn doan tn_003_muc luc
Dtcn doan tn_003_muc luc
 
Datasheet PIC16f887
Datasheet PIC16f887Datasheet PIC16f887
Datasheet PIC16f887
 
Bao cao vdk_va_pic
Bao cao vdk_va_picBao cao vdk_va_pic
Bao cao vdk_va_pic
 
Những thiết bị an ninh giám sát thông minh cần thiết nhất
Những thiết bị an ninh giám sát thông minh cần thiết nhấtNhững thiết bị an ninh giám sát thông minh cần thiết nhất
Những thiết bị an ninh giám sát thông minh cần thiết nhất
 
Giáo trình vi điều khiển PIC
Giáo trình vi điều khiển PICGiáo trình vi điều khiển PIC
Giáo trình vi điều khiển PIC
 

Similar to ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC

Thiết kế và chế tạo 8 mô hình thực hành môn vi điều khiển sử dụng vi điều khi...
Thiết kế và chế tạo 8 mô hình thực hành môn vi điều khiển sử dụng vi điều khi...Thiết kế và chế tạo 8 mô hình thực hành môn vi điều khiển sử dụng vi điều khi...
Thiết kế và chế tạo 8 mô hình thực hành môn vi điều khiển sử dụng vi điều khi...
Man_Ebook
 
Thiết Kế Chế Tạo Mô Hình Bãi Đỗ Xe Thông Minh
Thiết Kế Chế Tạo Mô Hình Bãi Đỗ Xe Thông Minh Thiết Kế Chế Tạo Mô Hình Bãi Đỗ Xe Thông Minh
Thiết Kế Chế Tạo Mô Hình Bãi Đỗ Xe Thông Minh
nataliej4
 
Đồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdf
Đồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdfĐồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdf
Đồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdf
NuioKila
 
Hướng dẫn lập trình cho vi điều khiển PIC_956719.pdf
Hướng dẫn lập trình cho vi điều khiển PIC_956719.pdfHướng dẫn lập trình cho vi điều khiển PIC_956719.pdf
Hướng dẫn lập trình cho vi điều khiển PIC_956719.pdf
thaihn0101
 
Hướng dẫn lập trình cho vi điều khiển PIC_956719.pdf
Hướng dẫn lập trình cho vi điều khiển PIC_956719.pdfHướng dẫn lập trình cho vi điều khiển PIC_956719.pdf
Hướng dẫn lập trình cho vi điều khiển PIC_956719.pdf
thaihn0101
 
Đồ án tốt nghiệp điện tử Điều khiển và giám sát thiết bị điện gia đình - sdt/...
Đồ án tốt nghiệp điện tử Điều khiển và giám sát thiết bị điện gia đình - sdt/...Đồ án tốt nghiệp điện tử Điều khiển và giám sát thiết bị điện gia đình - sdt/...
Đồ án tốt nghiệp điện tử Điều khiển và giám sát thiết bị điện gia đình - sdt/...
Viết thuê báo cáo thực tập giá rẻ
 
Đề tài: Dòng PLC hoạt động vô cùng hiệu quả công việc, HOT
Đề tài: Dòng PLC hoạt động vô cùng hiệu quả công việc, HOTĐề tài: Dòng PLC hoạt động vô cùng hiệu quả công việc, HOT
Đề tài: Dòng PLC hoạt động vô cùng hiệu quả công việc, HOT
Dịch vụ viết bài trọn gói ZALO 0917193864
 
Tài liệu tham khảo lập trình PLC Mitsubishi dòng IQ-R.pdf
Tài liệu tham khảo lập trình PLC Mitsubishi dòng IQ-R.pdfTài liệu tham khảo lập trình PLC Mitsubishi dòng IQ-R.pdf
Tài liệu tham khảo lập trình PLC Mitsubishi dòng IQ-R.pdf
Man_Ebook
 
BÁO cáo học tập về PLC MITSHUBISHI FX3U.pdf
BÁO cáo học tập về PLC MITSHUBISHI FX3U.pdfBÁO cáo học tập về PLC MITSHUBISHI FX3U.pdf
BÁO cáo học tập về PLC MITSHUBISHI FX3U.pdf
Man_Ebook
 
Luận văn: Chương trình WinCC kết hợp vói các PLC, HAY
Luận văn: Chương trình WinCC kết hợp vói các PLC, HAYLuận văn: Chương trình WinCC kết hợp vói các PLC, HAY
Luận văn: Chương trình WinCC kết hợp vói các PLC, HAY
Dịch Vụ Viết Bài Trọn Gói ZALO 0917193864
 
Mach vi dieu khien arduino va ung dung
Mach vi dieu khien arduino va ung dungMach vi dieu khien arduino va ung dung
Mach vi dieu khien arduino va ung dung
Hoa Le Gia
 
Thiết kế, chế tạo mạch điều khiển, hiển thị tốc độ động cơ điện 1 chiều
Thiết kế, chế tạo mạch điều khiển, hiển thị tốc độ động cơ điện 1 chiềuThiết kế, chế tạo mạch điều khiển, hiển thị tốc độ động cơ điện 1 chiều
Thiết kế, chế tạo mạch điều khiển, hiển thị tốc độ động cơ điện 1 chiều
nataliej4
 
Tìm hiểu cách dùng pic để chạy motor bước
Tìm hiểu cách dùng pic để chạy motor bướcTìm hiểu cách dùng pic để chạy motor bước
Tìm hiểu cách dùng pic để chạy motor bước
Dan Vu
 
Luận văn: Hoàn thành Bài thí nghiệm bình trộn nhiên liệu, HAY
Luận văn: Hoàn thành Bài thí nghiệm bình trộn nhiên liệu, HAYLuận văn: Hoàn thành Bài thí nghiệm bình trộn nhiên liệu, HAY
Luận văn: Hoàn thành Bài thí nghiệm bình trộn nhiên liệu, HAY
Dịch vụ viết bài trọn gói ZALO 0917193864
 
Nghiên cứu tổng quan về microsmart và sản phẩm hãng idec. Ứng dụng microsmart...
Nghiên cứu tổng quan về microsmart và sản phẩm hãng idec. Ứng dụng microsmart...Nghiên cứu tổng quan về microsmart và sản phẩm hãng idec. Ứng dụng microsmart...
Nghiên cứu tổng quan về microsmart và sản phẩm hãng idec. Ứng dụng microsmart...
Dịch vụ viết đề tài trọn gói 0934.573.149
 
Điều khiển động cơ sử dụng IC MCP4921
Điều khiển động cơ sử dụng IC MCP4921Điều khiển động cơ sử dụng IC MCP4921
Điều khiển động cơ sử dụng IC MCP4921
Pham Hoang
 
Mitsubishi
MitsubishiMitsubishi
Mitsubishiddungd4
 
PLC mitsubishi
PLC mitsubishiPLC mitsubishi
PLC mitsubishi
quanglocbp
 
Cong nghe tram_tron_be_tong_dung_plc
Cong nghe tram_tron_be_tong_dung_plcCong nghe tram_tron_be_tong_dung_plc
Cong nghe tram_tron_be_tong_dung_plctienle176
 
Thiết kế bảng led chạy chữ điều khiển.pdf
Thiết kế bảng led chạy chữ điều khiển.pdfThiết kế bảng led chạy chữ điều khiển.pdf
Thiết kế bảng led chạy chữ điều khiển.pdf
TiNguyn208405
 

Similar to ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC (20)

Thiết kế và chế tạo 8 mô hình thực hành môn vi điều khiển sử dụng vi điều khi...
Thiết kế và chế tạo 8 mô hình thực hành môn vi điều khiển sử dụng vi điều khi...Thiết kế và chế tạo 8 mô hình thực hành môn vi điều khiển sử dụng vi điều khi...
Thiết kế và chế tạo 8 mô hình thực hành môn vi điều khiển sử dụng vi điều khi...
 
Thiết Kế Chế Tạo Mô Hình Bãi Đỗ Xe Thông Minh
Thiết Kế Chế Tạo Mô Hình Bãi Đỗ Xe Thông Minh Thiết Kế Chế Tạo Mô Hình Bãi Đỗ Xe Thông Minh
Thiết Kế Chế Tạo Mô Hình Bãi Đỗ Xe Thông Minh
 
Đồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdf
Đồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdfĐồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdf
Đồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdf
 
Hướng dẫn lập trình cho vi điều khiển PIC_956719.pdf
Hướng dẫn lập trình cho vi điều khiển PIC_956719.pdfHướng dẫn lập trình cho vi điều khiển PIC_956719.pdf
Hướng dẫn lập trình cho vi điều khiển PIC_956719.pdf
 
Hướng dẫn lập trình cho vi điều khiển PIC_956719.pdf
Hướng dẫn lập trình cho vi điều khiển PIC_956719.pdfHướng dẫn lập trình cho vi điều khiển PIC_956719.pdf
Hướng dẫn lập trình cho vi điều khiển PIC_956719.pdf
 
Đồ án tốt nghiệp điện tử Điều khiển và giám sát thiết bị điện gia đình - sdt/...
Đồ án tốt nghiệp điện tử Điều khiển và giám sát thiết bị điện gia đình - sdt/...Đồ án tốt nghiệp điện tử Điều khiển và giám sát thiết bị điện gia đình - sdt/...
Đồ án tốt nghiệp điện tử Điều khiển và giám sát thiết bị điện gia đình - sdt/...
 
Đề tài: Dòng PLC hoạt động vô cùng hiệu quả công việc, HOT
Đề tài: Dòng PLC hoạt động vô cùng hiệu quả công việc, HOTĐề tài: Dòng PLC hoạt động vô cùng hiệu quả công việc, HOT
Đề tài: Dòng PLC hoạt động vô cùng hiệu quả công việc, HOT
 
Tài liệu tham khảo lập trình PLC Mitsubishi dòng IQ-R.pdf
Tài liệu tham khảo lập trình PLC Mitsubishi dòng IQ-R.pdfTài liệu tham khảo lập trình PLC Mitsubishi dòng IQ-R.pdf
Tài liệu tham khảo lập trình PLC Mitsubishi dòng IQ-R.pdf
 
BÁO cáo học tập về PLC MITSHUBISHI FX3U.pdf
BÁO cáo học tập về PLC MITSHUBISHI FX3U.pdfBÁO cáo học tập về PLC MITSHUBISHI FX3U.pdf
BÁO cáo học tập về PLC MITSHUBISHI FX3U.pdf
 
Luận văn: Chương trình WinCC kết hợp vói các PLC, HAY
Luận văn: Chương trình WinCC kết hợp vói các PLC, HAYLuận văn: Chương trình WinCC kết hợp vói các PLC, HAY
Luận văn: Chương trình WinCC kết hợp vói các PLC, HAY
 
Mach vi dieu khien arduino va ung dung
Mach vi dieu khien arduino va ung dungMach vi dieu khien arduino va ung dung
Mach vi dieu khien arduino va ung dung
 
Thiết kế, chế tạo mạch điều khiển, hiển thị tốc độ động cơ điện 1 chiều
Thiết kế, chế tạo mạch điều khiển, hiển thị tốc độ động cơ điện 1 chiềuThiết kế, chế tạo mạch điều khiển, hiển thị tốc độ động cơ điện 1 chiều
Thiết kế, chế tạo mạch điều khiển, hiển thị tốc độ động cơ điện 1 chiều
 
Tìm hiểu cách dùng pic để chạy motor bước
Tìm hiểu cách dùng pic để chạy motor bướcTìm hiểu cách dùng pic để chạy motor bước
Tìm hiểu cách dùng pic để chạy motor bước
 
Luận văn: Hoàn thành Bài thí nghiệm bình trộn nhiên liệu, HAY
Luận văn: Hoàn thành Bài thí nghiệm bình trộn nhiên liệu, HAYLuận văn: Hoàn thành Bài thí nghiệm bình trộn nhiên liệu, HAY
Luận văn: Hoàn thành Bài thí nghiệm bình trộn nhiên liệu, HAY
 
Nghiên cứu tổng quan về microsmart và sản phẩm hãng idec. Ứng dụng microsmart...
Nghiên cứu tổng quan về microsmart và sản phẩm hãng idec. Ứng dụng microsmart...Nghiên cứu tổng quan về microsmart và sản phẩm hãng idec. Ứng dụng microsmart...
Nghiên cứu tổng quan về microsmart và sản phẩm hãng idec. Ứng dụng microsmart...
 
Điều khiển động cơ sử dụng IC MCP4921
Điều khiển động cơ sử dụng IC MCP4921Điều khiển động cơ sử dụng IC MCP4921
Điều khiển động cơ sử dụng IC MCP4921
 
Mitsubishi
MitsubishiMitsubishi
Mitsubishi
 
PLC mitsubishi
PLC mitsubishiPLC mitsubishi
PLC mitsubishi
 
Cong nghe tram_tron_be_tong_dung_plc
Cong nghe tram_tron_be_tong_dung_plcCong nghe tram_tron_be_tong_dung_plc
Cong nghe tram_tron_be_tong_dung_plc
 
Thiết kế bảng led chạy chữ điều khiển.pdf
Thiết kế bảng led chạy chữ điều khiển.pdfThiết kế bảng led chạy chữ điều khiển.pdf
Thiết kế bảng led chạy chữ điều khiển.pdf
 

ĐỒ ÁN TỐT NGHIỆP LẬP TRÌNH VDK PIC

  • 1. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 1 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 CHƯƠNG 1: DẪN NHẬP 1. Đặt vấn đề: Ngày nay với sự phát triển như vũ bão của công nghiệp điện tử, kỹ thuật số các hệ thống đã và dang dần dần tự động hóa. Với kỹ thuật tiên tiến như vi xử lý, vi điều khiển, vi mạch số, … được ứng dụng vào lĩnh vực điều khiển, thì các hệ thống điều khiển cơ khí thô sơ, với tốc độ xử lý chậm chạp ít chính xác được thay thế bằng các hệ thống điều khiển tự động với các chương trình thiết lập trước. Robot có mặt hầu hết trong mọi lĩnh vực của đời sống chúng ta, từ lau nhà đến y học, quân sự, từ máy pha cafe tự động đến Asimo,…và cuộc thi Robocon là một sân chơi lý thú với những ai yêu thích, đam mê với Robot, đó chính là cơ hội tốt để khẳng định chính mình trên lĩnh vực tự động, củng cố bổ sung thêm kiến thức toàn diện về lĩnh vực này. Chính vì lẽ đó, em quyết định làm đề tài tốt nghiệp: “LẬP TRÌNH ĐIỀU KHIỂN MÔ HÌNH ROBOT DÒ ĐƯỜNG DÙNG PIC 16F877A”. 2. Giới hạn đề tài: Với thời gian mười hai tuần thực hiện đề tài cũng như trình độ chuyên môn có hạn, em đã cố gắng hết sức để hoàn thành đồ án này nhưng chỉ giải quyết được những vấn đề sau: o Manual trong lưới: Di chuyển trong lưới theo tín hiệu điều khiển từ Remote. o Học đường: Di chuyển trong lưới theo tín hiệu điều khiển từ Remote đồng thời học tất cả những vị trí đã đi qua. o Chạy tự động: Di chuyển trong lưới theo những gì đã học trong chế độ học đường. 3. 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 ra trường. Cụ thể khi nghiên cứu đề tài này là em muốn phát huy thành quả ứng dụng của vi điều khiển để tạo ra sản phẩm có ích trong môt lĩnh vực nào đó của đời sống. Không những thế nó còn là tài liệu để cho các bạn tham khảo. 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 đã được học ở trường. Đồng thời phát huy sự sáng tạo, khả năng giải quyết vấn đề theo yêu cầu đặt ra. Và đây cũng là dịp để chúng em khẳng định mình trước khi ra trường tham gia vào các hoạt động sản xuất của xã hội.
  • 2. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 2 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 CHƯƠNG 2: GIỚI THIỆU VI ĐIỀU KHIỂN PIC16F877A VÀ CÁC LINH KIỆN DÙNG TRONG MẠCH 1. Giới Thiệu Chung Về Pic: PIC bắt nguồn là chữ viết tắt của "Programmable Intelligent Computer" (Máy tính khả trình thông minh) là một sản phẩm của hãng General Instruments đặt cho dòng sản phẩm đầu tiên của họ là PIC1650. Lúc này, PIC1650 được dùng để giao tiếp với các thiết bị ngoại vi cho máy chủ 16bit CP1600, vì vậy, người ta cũng gọi PIC với cái tên "Peripheral Interface Controller" (Bộ điều khiển giao tiếp ngoại vi). CP1600 là một CPU tốt, nhưng lại kém về các hoạt động xuất nhập, và vì vậy PIC 8-bit được phát triển vào khoảng năm 1975 để hỗ trợ hoạt động xuất nhập cho CP1600. PIC sử dụng microcode đơn giản đặt trong ROM, và mặc dù, cụm từ RISC chưa được sử dụng thời bây giờ, nhưng PIC thực sự là một vi điều khiển với kiến trúc RISC, chạy một lệnh một chu kỳ máy (4 chu kỳ của bộ dao động). Năm 1985, General Instruments bán bộ phận vi điện tử của họ, và chủ sở hữu mới hủy bỏ hầu hết các dự án - lúc đó đã quá lỗi thời. Tuy nhiên PIC được bổ sung EEPROM để tạo thành 1 bộ điều khiển vào ra khả trình. Ngày nay rất nhiều dòng PIC được xuất xưởng với hàng loạt các module ngoại vi tích hợp sẵn (như USART, PWM, ADC...), với bộ nhớ chương trình từ 512 Word đến 32K Word. Họ vi điều khiển này có thể tìm mua dễ dàng tại thị trường Việt Nam. Giá thành không quá đắt. Có đầy đủ các tính năng của một vi điều khiển khi hoạt động độc lập. Là một sự bổ sung rất tốt về kiến thức cũng như về ứng dụng cho họ vi điều khiển mang tính truyền thống như họ vi điều khiển 8051. Hiện nay tại Việt Nam cũng như trên thế giới có một số lượng lớn người sử dụng họ vi điều khiển PIC, vì vậy họ vi điều khiển này được sử dụng khá rộng rãi. Điều này tạo nhiều thuận lợi trong quá trình tìm hiểu và phát triển các ứng dụng, cũng như dễ dàng trao đổi, học tập, dễ dàng tìm được sự chỉ dẫn khi gặp khó khăn,…đồng thời cũng được sự hỗ trợ của nhà sản xuất về trình biên dịch, các công cụ lập trình, nạp chương trình từ đơn giản đến phức tạp,… Do đó các tính năng đa dạng của vi điều khiển PIC không ngừng được phát triển. 1.1. Các dòng Pic và cách lựa chọn Vi điều khiển Pic: Các sản phẩm vi điều khiển PIC của Microchip có gần 100 loại sản phẩm từ họ 10Fxxx đến các họ 12Cxxx, 12Fxxx, 16Cxx, 17Cxx, 16Fxx, 16Fxxx, 16FxxxA, 16LFxxxA, 18Fxxx, 18LFxxx, 18Fxxxx, 18LFxxxx,…  Cách phân loại PIC theo chữ cái:  Các họ PIC xxCxxx được đưa vào một nhóm, gọi là OTP (One Time Programmable): chúng ta chỉ có thể lập trình và nạp chương trình cho nó được một lần duy nhất.  Nhóm thứ hai có chữ cái F hoặc LF: chúng ta gọi nhóm này là nhóm Flash, nhóm này cho phép ghi xóa nhiều lần bằng các mạch điện thông thường.  Cách phân loại theo hai con số đầu tiên của sản phẩm:  Loại thứ nhất là dòng PIC cơ bản( Base – line ), gồm các PIC 12Cxxx, có độ dài 12bit.  Loại thứ hai là các dòng PIC 10F, 12F va 16F, gọi là dòng phổ thông ( Mid – Range ), có dộ dài 14 bit.  Loại thứ ba là dòng PIC 18( High – End ), có độ dài 16 bit.
  • 3. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 3 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Ở Việt Nam phổ biến nhất là các họ vi điều khiển PIC do hãng Microchip sản xuất. Cách lựa chọn một vi điều khiển PIC phù hợp: Trước hết cần chú ý đến số chân của 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, thậm chí có vi điều khiển chỉ có 8 chân,ngoài ra còn có các vi điều khiển 18, 28, 40, 44, … chân. Cần chọn vi điều khiển PIC có bộ nhớ flash để có thể nạp xóa chương trình được nhiều lần hơn. Tiếp theo cần chú ý đến các khối chức năng được tích hợp sẵn trong vi điều khiển, các chuẩn giao tiếp bên trong. Sau cùng cần chú ý đến bộ nhớ chương trình mà vi điều khiển cho phép. 1.2. Ngôn ngữ lập trình cho Pic: Ngôn ngữ lập trình cho PIC rất đa dạng. Ngôn ngữ lập trình cấp thấp có MPLAB (được cung cấp miễn phí bởi nhà sản xuất Microchip), các ngôn ngữ lập trình cấp cao hơn bao gồm C, Basic, Pascal, … Ngoài ra còn có một số ngôn ngữ lập trình được phát triển dành riêng cho PIC như PICBasic, MikroBasic,… 1.3. Mạch nạp Pic: Đây cũng là một dòng sản phẩm rất đa dạng dành cho vi điều khiển PIC. Có thể sử dụng các mạch nạp được cung cấp bởi nhà sản xuất là hãng Microchip như: PICSTART plus, MPLAB ICD 2, MPLAB PM 3, PRO MATE II. Có thể dùng các sản phẩm này để nạp cho vi điều khiển khác thông qua chương trình MPLAB. Dòng sản phẩm chính thống này có ưu thế là nạp được cho tất cả các vi điều khiển PIC, tuy nhiên giá thành rất cao và thường gặp rất nhiều khó khăn trong quá trình mua sản phẩm. 2. Cấu trúc tổng quát Pic 16F877A: Hình 2.1: Vi điều khiển PIC16F877A các dạng sơ đồ chân. Đây là vi điều khiển thuộc họ PIC16Fxxx( 40 pin) với tập lệnh gồm 35 lệnh có độ dài 14 bit. Mỗi lệnh đều được thực thi trong một chu kì xung clock. Tần số hoạt động tối đa là 20 MHz với một chu kì lệnh là 200ns. Bộ nhớ chương trình 8K Flash ROM, bộ nhớ dữ liệu 368 bytes RAM và bộ nhớ dữ liệu EEPROM với dung lượng 256 bytes. Số Port In/Out (I/O) là 5 Port( A, B, C, D, E) với 33 pin I/O với tính hiệu điều khiển độc lập.
  • 4. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 4 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Hình 2.2: Sơ đồ khối vi điều khiển PIC16F877A.  Các khối chức năng bên trong Pic16F877A:  Timer0: bộ đếm 8 bit.  Timer1: bộ đếm 16 bit với bộ chia tần số, có thể họat động trong cả chế độ tiết kiệm năng lượng (Sleep Mode) với nguồn xung clock ngoài.  Timer2: bộ đếm 8 bit.  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ự (Compartor).  1 bộ định thời giám sát (Watchdog Timer).  15 nguồn ngắt (Interrupts)  Cổng giao tiếp song song PSP (Parallel Slave Port) với các chân điều khiển RD, WR, CS ở bên ngoài.
  • 5. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 5 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090  Các chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port), SPI và I2C.  Chuẩn giao tiếp nối tiếp USART với 9 bit địa chỉ.  Nạp được chương trình ngay trên mạch điện ICSP (In Circuit Serial Programming) thông qua 2 chân.  Một vài đặc tính khác của vi điều khiển như:  Được chế tao bằng công nghệ CMOS.  Bộ nhớ flash với khả năng ghi xóa được 100.000 lần.  Bộ nhớ EEPROM với khả năng ghi xóa được 1.000.000 lần.  Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm.  Khả năng tự nạp chương trình với sự điều khiển của phần mềm.  Chức năng 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 nhau. 2.1. Sơ lược về các chân của Pic16F877A: PIC16F877A là họ vi điều khiển có 40 chân, mỗi chân có một chức năng khác nhau. Trong đó có một số chân đa công dụng( đa hợp): mỗi chân có thể họat động như một đường xuất nhập ( I/O) 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. 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 bên ngoài. 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.1. Port A và thanh ghi TRISA: PortA gồm 6 chân từ RA0-RA5. Việc ghi các giá trị vào thanh ghi TRISA sẽ quy định các chân của PortA là Input hay Output. Nếu là 0 thì là Output, 1 là Input. Việc đọc thanh ghi PortA sẽ đọc trạng thái các chân PortA. Việc ghi giá trị vào thanh ghi PortA sẽ thay đổi trạng thái của các chân PortA. Riêng chân RA4 được tích hợp thêm chức năng là chân cung cấp xung Clock ngoài cho Timer0 (RA4/TOCKI). Những chân khác của PortA đượ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 qui địng bằng những Bit tương ứng trong thanh ghi ADCCON1 và CMCON1. Khi các chân của PortA được sử dụng là ngõ vào Analog thì các Bit của thanh ghi TRISA phải luôn bằng 1. Hình 2.3: Chức năng các chân PortA.
  • 6. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 6 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Các thanh ghi SFR liên quan đến PORTA bao gồm:  PORTA (địa chỉ 05h) : chứa giá trị các pin trong PORTA.  TRISA (địa chỉ 85h) : điều khiển xuất nhập.  CMCON (địa chỉ 9Ch) : thanh ghi điều khiển bộ so sánh.  CVRCON (địa chỉ 9Dh) : thanh ghi điều khiển bộ so sánh điện áp.  ADCON1 (địa chỉ 9Fh) : thanh ghi điều khiển bộ ADC. 2.1.2. Port B và thanh ghi TRISB: PortB gồm 8 chân từ RB0-RB7. Việc ghi các giá trị vào thanh ghi TRISB sẽ quy định các chân của PortB là Input hay Output. Nếu là 0 thì là Output, 1 là Input. Việc đọc thanh ghi PortB sẽ đọc trạng thái các chân PortB. Việc ghi giá trị vào thanh ghi PortB sẽ thay đổi trạng thái của các chân PortB. Ba chân của PortB được đa hợp với chức năng In-Circuit Debugger và Low Voltage Programming fuction: RB3/PGM, RB6/PGC và RB7/PGD. Mỗi chân của PortB có một transistor kéo lên Vdd, chức năng này hoạt động khi Bit RPBU được xóa. Chứ năng này sẽ tự động tắt khi chân Port đựơc quy địng là Input. Bốn chân của Portb từ RB7-RB4 có chức năng ngắt (Interrupt) khi trạng thái chân Port thay đổi (Khi chân Port được quy định là Ouput thì chức na7ng ngắt không họat động). Giá trị chân Port được so sánh với giá trị được lưu lại trước đó, khi có trạng thái sai lệch giữa 2 giá trị này, ngắt sẽ xảy ra với cờ ngắt RBIF INTCON<0> bật lên. Ngắt có thể làm cho Vi điều khiển thoát khỏi trạng thái “SLEEP”. Bất cứ một họat động truy xuất nào trên PortB sẽ xóa trạng thái sai lệch, kết thúc ngắt và cho phép xóa cờ RBIF. Hình 2.4: Chức năng các chân PortB.
  • 7. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 7 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Các thanh ghi SFR liên quan đến PORTB bao gồm:  PORTB (địa chỉ 06h,106h) : chứa giá trị các pin trong PORTB.  TRISB (địa chỉ 86h,186h) : điều khiển xuất nhập.  OPTION_REG (địa chỉ 81h,181h) : điều khiển ngắt ngoại vi và bộ Timer0. 2.1.3. Port C và thanh ghi TRISC: PortC gồm 8 chân từ RC0-RC7. Việc ghi các giá trị vào thanh ghi TRISC sẽ quy định các chân của PortC là Input hay Output. Nếu là 0 thì là Output, 1 là Input. Việc đọc thanh ghi PortC sẽ đọc trạng thái các chân PortC. Việc ghi giá trị vào thanh ghi PortC sẽ thay đổi trạng thái của các chân PortC. Các chân của PortC được đa gợp với các chức năng ngọai vi. Khi các hàm chức năng ngoại vi được cho phép, ta cần quan tâm chặt chẽ tới giá trị các Bit của thanh ghi TRISC và mặt định các chân này là Ouput, ngoài ra một số chức năng ngoại vi khác sẽ tự động mặt định các chân là ngõ vào. Hình 2.5: Chức năng các chân PortC. Các thanh ghi điều khiển liên quan đến PORTC:  PORTC (địa chỉ 07h) : chứa giá trị các pin trong PORTC.  TRISC (địa chỉ 87h) : điều khiển xuất nhập.
  • 8. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 8 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 2.1.4. Port D và thanh ghi TRISD: PortD gồm 8 chân từ RD0-RD7. Ngoài việc PortD được cấu trúc là một Port vừa xuất nhập nó còn có thể họat động như một cổng song song bằng cách xét Bit PSPMODE, trong chế độ này Buffer ngõ vào linh kiện TTL. Hình 2.6: Chức năng các chân PortD. Các thanh ghi liên quan đến PORTD bao gồm:  Thanh ghi PORTD(địa chỉ 08h): chứa giá trị các pin trong PORTD.  Thanh ghi TRISD(địa chỉ 88h): điều khiển xuất nhập. 2.1.5. PortE và thanh ghi TRISE: PortE có 3 chân RE0/RD/AN5, RE1/WR/AN6 VÀ RE2/CS/AN7 có thể được cấu hình là các chân xuất nhập. Các chân của PortE có thể trở thành các chân điều khiển cho các cổng của Vi điều khiển khi Bit PSPMODE được xét là 1. Trong chế độ này phải đảm bảo rằng các Bit từ 0 dến 2 cua thanh ghi TRISE phải được xét bằng 1 để các chân này được cấu hình như các chân ngõ vào. Ngoài ra các chân PortE còn được cấu hình như các ngõ vào Analog, tại chế độ này khi đọc trạng thái các chân PortE sẽ cho ta giá trị 0. Thanh ghi TRISE quy định chức năng xuất nhập của các chân PortE ngay cả khi nó được sử dụng là các ngõ vào Analog. Hình 2.7: Chức năng các chân PortE.
  • 9. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 9 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Các thanh ghi liên quan đến PORTE bao gồm:  PORTE(địa chỉ 09h) : chứa giá trị các chân trong PORTE.  TRISE(địa chỉ 89h) : điều khiển xuất nhập và xác lập các thông số cho chuẩn giao tiếp PSP.  ADCON1(địa chỉ 9Fh) : thanh ghi điều khiển khối ADC. 2.2. MCLR( MASTER CLEAR): Ngõ vào MCLR( Reset) trên chân số 1 của Vi điều khiển. Khi đưa MCLR xuống thấp, các thanh ghi bên trong Vi điều khiển sẽ được tải những giá trị thích hợp để khởi động lại hệ thống. Hình 2.8: Cách kết nối với chân MCLR. 2.3. Các chân nguồn: PIC 16F877A vận hành với nguồn đơn 5V. Chân VDD( chân nguồn dương ) được nối vào chân số 11 và 32. Chân VSS( chân mass ) được nối vào chân số 12 và 31. 2.4. Tổ chức bộ nhớ: Bộ nhớ chương trình( 8K Flash ROM), bộ nhớ dữ liệu( 368 bytes RAM) và bộ nhớ dữ liệu EEPROM( 256 bytes). 2.4.1. Tổ chức của bộ nhớ chương trình: Bộ nhớ chương trình của vi điều khiển PIC16F877A là bộ nhớ Flash, có bộ đếm chương trình( Program Counter) dài 13 bit có thể định địa chỉ cho 8K không gian bộ nhớ, 8K không gian bộ nhớ được chia làm 8 trang bộ nhớ. Mọi sự truy cập ngoài vùng không gian này sẽ không có tác dụng. Bộ nhớ chương trình còn bao gồm một ngăn xếp( Stack) 8 mức. Khi vi điều khiển được reset, bộ đếm chương trình sẽ chỉ đến địa chỉ 0000h (Reset vector). Khi có ngắt xảy ra, bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h (Interrupt vector). VCC D5 1N4148 1 C7 104 VCC R4 100 MCLR 0 SW1 RESET R3 10K
  • 10. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 10 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Hình 2.9: Ngăn xếp và bản đồ bộ nhớ chương trình. 2.4.2. Tổ chức của bộ nhớ dữ liệu: Bộ nhớ dữ liệu của PIC được chia ra làm nhiều bank. Đối với PIC16F877A bộ nhớ dữ liệu được chia ra làm 4 bank: bank 0, bank 1, bank 2 và bank 3. Mỗi bank có dung lượng 128 byte, bao gồm các thanh ghi có chức năng đặc biệt SFR (Special Function Register) nằm ở các vùng địa chỉ thấp và các thanh ghi mục đích chung GPR (General Purpose Register) nằm ở vùng địa chỉ còn lại trong bank. Các thanh ghi SFR thường xuyên được sử dụng (ví dụ như thanh ghi STATUS) sẽ được đặt ở tất cà các bank của bộ nhớ dữ liệu giúp thuận tiện trong quá trình truy xuất và làm giảm bớt lệnh của chương trình. Các bank được lựa chọn bằng bitb RP0 và bit RP1 ở thanh ghi Status. RP1:RP0 Bank 00 0 01 1 10 2 11 3  Vùng RAM đa mục đích GPR: Vùng RAM đa mục đích có chiều rộng là 8 bit và được truy xuất trực tiếp hoặc gián tiếp thông qua thanh ghi FSR. Đây là các thanh ghi dữ liệu thông thường, người sử dụng có thể tùy theo mục đích chương trình mà có thể dùng các thanh ghi này để chứa các biến số, hằng số, kết quả hoặc các tham số phục vụ cho chương trình.
  • 11. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 11 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Hình 2.10: Ngăn xếp và bản đồ bộ nhớ chương trình. Sơ đồ bộ nhớ dữ liệu PIC16F877A  Vùng thanh ghi chức năng đặc biệt SFR: Đây là các thanh ghi chức năng dặc biệt được sử dụng bởi bộ sử lý trung tâm và các hàm chức năng ngoại vi để điều khiển họat động của các thiết bị. Có thể phân thanh ghi SFR làm hai lọai: tloại thứ nhất dùng để thiết lập và điều khiển các khối chức năng bên ngoài (ví dụ như ngắt, so sánh, PWM, …) và loại thứ hai dùng cho các chức năng bên trong của Vi điều khiển( các phép tímh toán số học, truy xuất số liệu,…). 2.4.3. Thanh ghi đếm chương trình PC ( Program Counter): Thanh ghi đếm chương trình( PC ) chứa địa chỉ của lệnh được thực hiện kế tiếp. Bộ đếm chương trình (PC) có độ rộng 13 bit. Byte thấp là thanh ghi PCL, nó có thể đọc và ghi. Ba bit cao là thanh ghi PCH (PC<12:8>) không cho phép đọc nhưng nó cho phép ghi gián tiếp thông qua thanh ghi PCLATH. Khi Reset thì ba bit cao của PC sẽ bị xoá.
  • 12. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 12 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090  Ngăn xếp stack: Stack cho phép 8 lệnh gọi chương trình con và ngắt hoạt động. Stack chứa địa chỉ mà chương trình chính sẽ quay trở về thực hiện từ chương trình con hay ngắt. Đối với dòng Pic phổ thông, Stack có độ sâu là 8 lớp, mỗi lớp có độ rộng 13 bit. Vị trí của Stack không nằm trong cả bộ nhớ chương trình hoặc bộ nhớ dữ liệu và con trỏ ngăn xếp thì không cho phép đọc hoặc ghi. Hoạt động của ngăn xếp giống như vùng đệm vòng . Điều này có nghĩa là sau khi ngăn xếp đã cất vào 8 lần, lần cất vào thứ 9 sẽ được ghi chồng lên lần cất vào đầu tiên. Lần cất vào thứ mười sẽ được ghi chồng lên lần cất vào thứ hai (và cứ như thế). 2.4.4. Sự phân trang bộ nhớ chương trình: PIC16F877A có khả năng định vị một khối liên tục 8K từ của bộ nhớ chương trình. Các lệnh CALL và GOTO chỉ cung cấp 11 bit địa chỉ và chỉ xác định được 2K bộ nhớ chương trình. Khi thực hiện lệnh CALL hoặc GOTO, 2 bit cao nhất của địa chỉ được cung cấp bởi PCLATH<4:3>. Khi thực hiện lệh CALL hoặc GOTO, người sử dụng phải bảo đảm rằng trang chọn bit phải được lập trình để trang bộ nhớ chương trình được định địa chỉ. Nếu lệnh CALL (hoặc ngắt) được thi hành, toàn bộ 13 bit của PC sẽ được cất vào ngăn xếp. Vì vậy việc vận dụng các bit PCLATH<3:4> thì không đòi hỏi lệnh Return để lấy địa chỉ từ ngăn xếp. 2.4.5. Định địa chỉ gián tiếp , các thanh ghi INDF và FSR: Thanh ghi INDF không phải là thanh ghi vật lý. Địa chỉ của thanh ghi INDF sẽ được định vị gián tiếp. Định vị gián tiếp có thể thực hiện được bằng cách sử dụng thanh ghi INDF. Trên thực tế, bất kì lệnh nào sử dụng thanh ghi INDF để truy cập thanh ghi con trỏ bằng thanh ghi FSR (File Select Register). Việc đọc chính thanh ghi INDF, một cách gián tiếp (FSR = ‘0’) sẽ có giá trị 00h. Một địa chỉ 9 bit có hiệu quả thu được bằng cách ghép 8 bit của thanh ghi FSR với bit IRP (STATUS<7>), như được chỉ bên dưới. Một chương trình mẫu dùng để xoá vùng RAM từ 20h đến 2Fh sử dụng cách định địa chỉ gián tiếp. Hình 2.11: Sơ đồ ghi dữ liệu vào từng Bank. 2.5. Bộ nhớ dữ liệu và bộ nhớ chương trình: 2.5.1 Bộ nhớ dữ liệu EEPROM và bộ nhớ chương trình FLASH: Bộ nhớ dữ liệu EEPROM và bộ nhớ chương trình FLASH cho phép đọc hoặc ghi trong suốt hoạt động bình thường trong phạm vi VDD. Những thao tác này xảy ra trên một byte đơn cho bộ nhớ dữ liệu EEPROM và trên một từ đơn cho bộ nhớ chương trình FLASH. Một thao
  • 13. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 13 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 tác ghi gây ra sự xóa rồi ghi, thao tác này được thực hiện trên một byte hoặc một từ được chỉ định. Sự truy cập vào bộ nhớ chương trình phải kể đến sự tính toán checksum. Ghi một byte hoặc một word sẽ tự động xóa vùng nhớ và ghi lên giá trị mới (xóa trước khi ghi). Việc ghi vào bộ nhớ dữ liệu EEPROM không ảnh hưởng đến hoạt động của thiết bị. Việc ghi vào bộ nhớ chương trình sẽ dừng thực thi các lệnh cho đến khi quá trình ghi hoàn thành. Bộ nhớ chương trình không thể được truy cập trong suốt quá trình ghi. Trong suốt quá trình ghi, bộ dao động tiếp tục chạy, thiết bị ngoại vi vẫn tiếp tục hoạt động và những sự kiện về ngắt sẽ được phát hiện và đợi cho đến khi quá trình ghi hoàn thành. Khi quá trình ghi hoàn thành, lệnh tiếp theo trong hàng đợi lệnh sẽ được thực hiện và một rẽ nhánh đến vectơ ngắt sẽ xảy ra đến ngắt được phép và gây ra trong suốt quá trình ghi. Việc đọc và ghi truy cập đến cả hai bộ nhớ xảy ra gián tiếp thông qua việc đặt những thanh ghi mục đích chung (SFR). Có sáu thanh ghi mục đích chung được sử dụng là:  Thanh ghi EEDATA.  Thanh ghi EEDATH.  Thanh ghi EEADR.  Thanh ghi EEADRH.  Thanh ghi EECON1.  Thanh ghi EECON2. Bộ nhớ dữ liệu EEPROM cho phép những thao tác đọc và ghi byte không can thiệp đến những thao tác bình thường của bộ vi điều khiển. Khi có sự trao đổi với bộ nhớ dữ liệu EEPROM, thanh ghi EEADR giữ địa chỉ sẽ được truy cập. Phụ thuộc vào thao tác, thanh ghi EEDATA giữ dữ liệu được ghi hoặc được đọc tại địa chỉ trong thanh ghi EEADR. PIC16F877A có 256 byte cho bộ nhớ dữ liệu EEPROM và do đó nó sử dụng tất cả 8 bit của EEADR. Bộ nhớ chương trình FLASH không cho phép truy cập vào quá trình đọc, nhưng quá trình ghi sẽ dừng thực thi các lệnh cho đến khi quá trình ghi hoàn thành. Khi trao đổi với bộ nhớ chương trình cặp thanh ghi EEADRH:EEADR sẽ tạo thành một từ hai byte, và sẽ chứa 13 bit địa chỉ của vùng nhớ được truy cập. Sự kết hợp hai thanh ghi EEDATH:EEDATA sẽ chứa dữ liệu 14 bit cho việc ghi, hoặc phản ánh giá trị của bộ nhớ chương trình sau mỗi lần đọc. Giống sự truy cập vào bộ nhớ dữ liệu EEPROM, giá trị của những thanh ghi EEADRH:EEADR phải bên trong phạm vi hợp lệ của bộ nhớ chương trình, phụ thuộc vào linh kiện (0000h đến 1FFFh đối với PIC16F873/874) từ 0000h đến 3FFFh đối với PIC16F877A. 2.5.2 Quá trình đọc bộ nhớ dữ liệu EEPROM: Quá trình đọc bộ nhớ dữ liệu EEPROM chỉ yêu cầu địa chỉ cần truy cập phải được ghi vào thanh ghi EEADR và xóa bit EEPGD. Sau khi bit RD được set, dữ liệu sẽ phải sẵn sàng trong thanh ghi EEDATA trong chu kỳ lệnh kế tiếp. EEDATA sẽ giữ giá trị này cho đến khi thao tác đọc kế tiếp được bắt đầu hoặc cho đến khi nó được ghi bởi vi chương trình. Các bước trong quá trình đọc bộ nhớ dữ liệu EEPROM là: 1. Ghi địa chỉ cần truy cập vào thanh ghi EEADR và hãy chắc rằng địa chỉ này thì không lớn hơn kích thước bộ nhớ của linh kiện PIC16F877A . 2. Xóa bit EEPGD để trỏ đến bộ nhớ dữ liệu EEPROM. 3. Set bit RD để bắt đầu thao tác đọc. 4. Đọc dữ liệu từ thanh ghi EEDATA. 2.5.3 Quá trình ghi vào bộ nhớ dữ liệu EEPROM: Quá trình ghi dữ liệu vào bộ nhớ dữ liệu EEPROM được tiến hành qua vài bước. Cả địa chỉ và giá trị dữ liệu cần phải được ghi vào những thanh ghi mục đích chung SFR. Bit EEPGD cần phải được xóa, và bit WREN phải được set để cho phép ghi. Bit WREN phải bị xóa trong suốt thời gian ngoại trừ trong quá trình ghi vào bộ nhớ dữ liệu EEPROM. Bit WR chỉ có thể
  • 14. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 14 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 được set khi bit WREN đã được set trước đó, chúng không thể được set cùng lúc. Bit WREN sau đó phải được xóa bằng vi chương trình sau khi ghi. Các bước trong quá trình ghi vào bộ nhớ dữ liệu EEPROM: 1. Nếu bước thứ 10 chưa được thực hiện, hãy kiểm tra bit WR để xem việc ghi có đang tiến hành. 2. Ghi địa chỉ cần truy cập vào thanh ghi EEADR và hãy chắc rằng địa chỉ này thì không lớn hơn kích thước bộ nhớ của linh kiện PIC16F877A. 3. Ghi giá trị dữ liệu 8 bit được chương trình hóa vào thanh ghi EEDATA. 4. Xóa bit EEPGD để trỏ đến bộ nhớ dữ liệu EEPROM. 5. Set bit WREN để cho phép những thao tác lập trình. 6. Không cho phép những ngắt. 7. Thực hiện chuỗi 5 lệnh đặc biệt sau:  Ghi giá trị 55h vào EECON2 qua hai bước (đầu tiên đưa vào W, sau đó mới đưa EECON2).  Ghi giá trị AAh vào EECON2 qua hai bước (đầu tiên đưa vào W, sau đó mới đưa vào EECON2).  Set bit WR. 8. Cho phép các ngắt (nếu sử dụng ngắt). 9. Xóa bit WREN để không cho phép các thao tác lập trình. 10. Tại thời điểm chu kỳ ghi hoàn thành, bit WR bị xóa và bit cờ ngắt EEIF được set. Nếu bước 1 chưa được thực hiện, sau đó vi chương trình sẽ kiểm tra xem EEIF được set hay chưa hoặc bit WR có bị xóa hay không để báo kết thúc chu kỳ chương trình. 2.5.4 Quá trình đọc bộ nhớ chương trình FLASH Quá trình đọc bộ nhớ chương trình FLASH cũng giống với quá trình đọc bộ nhớ dữ liệu EEPROM, chỉ cần thêm vào hai lệnh NOP sau khi set bit RD. Hai chu kỳ lệnh được thực hiện bởi lệnh NOP sẽ được bộ vi điều khiển sử dụng để đọc dữ liệu ra khỏi bộ nhớ chương trình và chèn giá trị đó vào trong cặp thanh ghi EEDATH:EEDATA. Dữ liệu sẽ được sẵn sàng ở lệnh thứ hai. EEDATH và EEDATA sẽ giữ giá trị này cho đến khi thao tác đọc tiếp theo được bắt đầu, hoặc cho đến khi chúng được ghi bởi vi chương trình. Các bước trong quá trình đọc bộ nhớ chương trình FLASH: 1. Ghi địa chỉ cần truy cập vào cặp thanh ghi EEADRH:EEADR. Hãy chắc rằng địa chỉ đó không lớn hơn kích thước bộ nhớ của linh kiện PIC16F877A. 2. Set bit EEPGD để trỏ đến bộ nhớ chương trình FLASH. 3. Set bit RD để bắt đầu thao tác đọc. 4. Thực hiện hai lệnh NOP để cho phép bộ vi điều khiển đọc dữ liệu ra khỏi bộ nhớ chương trình. 5. Đọc dữ liệu từ cặp thanh ghi EEDATH:EEDATA. 2.5.5 Quá trình ghi dữ liệu vào bộ nhớ chương trình FLASH Các bước trong quá trình ghi dữ liệu vào bộ nhớ chương trình FLASH: 1. Ghi địa chỉ cần truy cập vào cặp thanh ghi EEADRH:EEADR. Chắc rằng địa chỉ này thì không lớn hơn kích thước bộ nhớ của linh kiện PIC16F877A. 2. Ghi giá trị dữ liệu 14 bit đã được chương trình hóa vào cặp thanh ghi EEDATH:EEDATA. 3. Set bit EEPGD để trỏ đến bộ nhớ chương trình FLASH. 4. Set bit WREN để cho phép những thao tác lập trình. 5. Không cho phép ngắt.
  • 15. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 15 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 6. Thực hiện chuỗi 5 lệnh đặc biệt sau:  Ghi giá trị 55h vào EECON2 qua hai bước (đầu tiên đưa vào W, sau đó đưa vào EECON2 ).  Ghi giá trị AAh vào EECON2 qua hai bước ( đầu tiên đưa vào W, sau đó đưa vào EECON2).  Set bit WR. 7. Thực hiện hai lệnh NOP để cho phép bộ vi điều khiển thiết lập thao tác ghi. 8. Cho phép các ngắt (nếu sử dụng ngắt). 9. Xóa bit WREN để không cho phép các thao tác lập trình. Tại thời điểm chu kỳ ghi hoàn thành, bit WR bị xóa và bit cờ ngắt EEIF được set. Khi bộ vi điều khiển không thực hiện các lệnh trong suốt chu kỳ ghi, vi chương trình sẽ không nhất thiết phải kiểm tra cả EEIF, hoặc WR, để xác định quá trình ghi đã hoàn thành hay chưa. Vi điều khiển PIC16F877A có hai cơ chế bảo vệ mã, một bit dành cho bộ nhớ dữ liệu EEPROM và hai bit dành cho bộ nhớ chương trình FLASH. Dữ liệu có thể được đọc và ghi vào bộ nhớ dữ liệu EEPROM , bất chấp trạng thái của bit bỏa vệ mã CPD. Khi sự bảo vệ mã được cho phép và bit CPD bị xóa thì sự truy cập ngoài thông qua bit ICSP không được cho phép, bất chấp trạng thái của những bit bảo vệ mã bộ nhớ chương trình. Trạng thái của những bit bảo vệ mã bộ nhớ chương trình CP0 và CP1 không ảnh hưởng đến sự thực hiện những lệnh bên ngoài bộ nhớ chương trình. PIC16F87X có thể luôn luôn đọc những giá trị trong bộ nhớ chương trình, bất chấp trạng thái của những bit bảo vệ mã. Tuy nhiên, trạng thái của những bit bảo vệ mã và bit WRT sẽ có những ảnh hưởng khác nhau đến quá trình ghi vào bộ nhớ chương trình. Bit WRT là bit dùng để bảo vệ quá trình ghi vào bộ nhớ chương trình FLASH. Bit này chỉ có thể được truy cập khi PIC16F87X được lập trình qua ICSP . Khi sự bảo vệ ghi được cho phép, bất kì lệnh ghi nào đến bộ nhớ chương trình FLASH đều sẽ bị ngăn cản. Sự bảo vệ chế độ ghi không ảnh hưởng đến quá trình đọc bộ nhớ chương trình. Hình 2.12: Trạng thái đọc ghi của bộ nhớ chương trình FLASH nội. 2.6 Bộ Các bộ định thời: 2.6.1 Bộ định thời Timer 0: Bộ định thời/bộ đếm Timer0 có các đặc tính sau:  Bộ định thời / bộ đếm 8 bit.  Cho phép đọc và ghi.  Bộ chia 8 bit lập trình được bằng phần mềm.  Chọn xung clock nội hoặc ngoại.  Ngắt khi có sự tràn từ FFh đến 00h.  Chọn cạnh cho xung clock ngoài.
  • 16. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 16 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090  Ngắt Timer0: Ngắt TMR0 được phát ra khi thanh ghi TMR0 tràn từ FFh đến 00h. Sự tràn này sẽ set bit T0IF (INTCON<2>). Ngắt này có thể được giấu đi bằng cách xóa đi bit T0IE (INTCON<5>) . Bit T0IF cần phải được xóa trong chương trình bởi thủ tục phục vụ ngắt của bộ định thời Timer0 trước khi ngắt này được cho phép lại.  Sử dụng Timer0 với xung clock ngoại: Khi bộ chia không được sử dụng, clock ngoài đặt vào thì giống như bộ chia ở ngõ ra. Sự đồng bộ của chân T0CKI với clock ngoài được thực hiện bằng cách lấy mẫu bộ chia ở ngõ ra trên chân Q2 và Q4. Vì vậy thưc sự cần thiết để chân T0CKI ở mức cao trong ít nhất 2 chu kỳ máy và ở mức thấp trong ít nhất 2 chu kỳ máy.  Bộ chia: Thiết bị PIC16F87X chỉ có một bộ chia mà được dùng chung bởi bộ định thời 0 và bộ định thời Watchdog. Một khi bộ chia được ấn định cho bộ đinh thời 0 thì không có bộ chia cho bộ định thời Watchdog và ngược lại. Bộ chia không được đọc hoặc ghi. Các bit PSA và PS2:PS0 trong thanh ghi OPTION_REG xác đinh bộ chia được ấn định cho bộ định thời nào và tỉ số chia. Hình 2.13: Sơ đồ khối của bộ định thời Timer0 và bộ chia dùng chung với WDT. Các thanh ghi điều khiển liên quan đến Timer0 bao gồm:  TMR0 (địa chỉ 01h, 101h) : chứa giá trị đếm của Timer0.  INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE và PEIE).  OPTION_REG (địa chỉ 81h, 181h): điều khiển prescaler.
  • 17. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 17 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 2.6.2 Bộ định thời Timer 1: Bộ định thời 1 là một bộ định thời/bộ đếm 16 bit gồm hai thanh ghi TMR1H (byte cao) và TMR1L (byte thấp) mà có thể đọc hoặc ghi. Cặp thanh ghi này tăng số đếm từ 0000h đến FFFFh và một tràn sẽ xuất hiện khi có sự chuyển số đếm từ FFFFh xuống 0000h. Ngắt, nếu được phép có thể phát ra khi có số đếm tràn và được đặt ở bit cờ ngắt TMR1IF. Ngắt có thể được phép hoặc cấm bằng cách đặt hoặc xóa bit cho phép ngắt TMR1IE. Bộ định thời Timer1 có thể được cấu hình để hoạt động một trong hai chế độ sau:  Định thời một khoảng thời gian (Timer)  Đếm sự kiện (Counter). Việc lựa chọn một trong hai chế độ được xác định bằng cách đặt hoặc xóa bit chọn clock TMR1CS. Trong chế độ định một khoảng thời gian, bộ định thời tăng số đếm lên sau mỗi chu kỳ lệnh. Trong chế độ đếm sự kiện, bộ định thời tăng sau mỗi cạnh lên của clock ngoài đặt vào. Bộ định thời 1 có thể được phép hoặc cấm bằng cách đặt hoặc xóa bit điều khiển TMR1ON.  Chế độ Timer: Chế độ Timer được chọn bằng cách xóa bit TMR1CS. Trong chế độ này, nguồn clock đặt vào Timer là mạch dao động FOSC/4. Bit điều khiển đồng bộ không bị tác động vì clock ngoài luôn luôn đồng bộ. Hình 2.14: Cạnh tăng Timer1.  Chế độ counter: Trong chế độ này, bộ định thời tăng số đếm qua nguồn clock ngoài. Việc tăng xảy ra sau mỗi cạnh lên của xung clock ngoài. Bộ định thời phải có một cạnh lên trước khi việc đếm bắt đầu.
  • 18. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 18 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Có 2 chế độ đếm trong Timer 1:  Chế độ đếm đồng bộ: Chế độ được lựa chọn bởi việc Set bit TMR1CS ( T1CON<1>)và Clear bit T1SYNC. Trong chế độ này, giá trị của Timer1 sẽ tăng khi có xung cạnh lên trên chân T1OSI/RC1( nếu bit T1OSCEN được Set) hoặc trên chân T1OSO/RC0( nếu bit T1OSCEN được Clear). Xung Clock ngoại sẽ được đồng bộ với xung Clock nội, hoạt động đồng bộ được thực hiện ngay sau bộ tiền định tỉ lệ xung(presaler). Trong chế độ ngủ, hoạt động đồng bộ sẽ bị tắt và do đó ngay cả khi có xung Clock ngoài thì TMR1 cũng sẽ không tăng. Điều này có ý nghĩa chế độ đếm đồng bộ sẽ không hoạt động được trong chế độ ngủ(Sleep). Khi chế độ sử dụng xung Clock ngoài được lựa chọn cho Timer1 ở chế độ đếm đồng, chúng ta phải đảm bảo điều kiện: xung Clock ngoại phải được đồng bộ với xung Clock nội.  Chế độ đếm không đồng bộ: Nếu bit T1SYNC(T1CON<2>) được Set, xung Clock ngoại sẽ không được đồng bộ hoá. Bộ định thời sẽ tiếp tục đếm trong suốt quá trình ngủ của Vi điều khiển và có khả năng tạo một ngắt khi bộ định thời tràn và làm Vi điều khiển thoát khỏi trạng thái ngủ. Tuy nhiên cần lưu ý khi đọc và ghi và Timer: - Việc đọc thanh ghi TMR1H hoặc thanh ghi TMR1L trong khi bộ định thời đang chạy từ một nguồn xung Clock ngoài không đồng bộ sẽ cho một kết quả tức thời (không phải ngưng Timer lại làm mất độ chính xác). Tuy nhiên ta phải luôn nhớ rằng việc đọc một bộ Timer 16 bit sẽ bao gồm 2 lần đọc giá trị 8 bit, do đó có một vấn đề phát sinh là Timer có thể bị tràn giữa 2 lần đọc. - Để ghi vào Timer chúng ta tốt nhất nên dừng Timer lại và ghi giá tri mà ta mong muốn vào. Chúng ta cũng có thể ghi giá trị vào Timer khi nó đang chạy nhưng việc này có thể tạo ra một giá trị không như ta mong muốn. Hình 2.15: Sơ đồ khối bộ định thời Timer1.  Bộ dao động riêng của Timer1: Chúng ta có thể xây dựng một bộ dao động độc lập cho Timer1 (độc lập với bộ dao động của Vi điều khiển) bằng thạch anh vớii tần số tối đa lên đến 200KHz. Với bộ dao động này, bộ đếm có thể hoạt động ngay cả khi Vi điều khiển rơi vào trạng thái ngủ.  Ngắt Timer1: Ngằt trong Timer1 xuất hiện khi giá trị trong thanh ghi TMR1 tràn từ FFFFh xuống 0000h. khi xảy ra tràn, cờ TMR1IF bật lên. Ngắt có thể được ngăn chận bằng việc xoá bit
  • 19. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 19 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 TMR1IE. Cờ TMR1IE phải được xoá bằng phần mềm trước khi thoát khỏi trình phục vụ ngắt và trở về chương trình chính. Ngắt của Timer1 trong chế độ định thời và đếm đồng bộ không làm cho Vi điều khiển thoát khỏi trạng thái ngủ, chỉ có chế độ đếm không đồng bộ mới làm cho Vi điều khiển thoát khỏi trạng thái ngủ. Các thanh ghi liên quan đến Timer1 bao gồm:  INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép ngắt hoạt động (GIE và PEIE).  PIR1 (địa chỉ 0Ch): chứa cờ ngắt Timer1 (TMR1IF).  PIE1( địa chỉ 8Ch): cho phép ngắt Timer1 (TMR1IE).  TMR1L (địa chỉ 0Eh): chứa giá trị 8 bit thấp của bộ đếm Timer1.  TMR1H (địa chỉ 0Eh): chứa giá trị 8 bit cao của bộ đếm Timer1.  T1CON (địa chỉ 10h): xác lập các thông số cho Timer1. 2.6.3 Bộ định thời Timer 2:  Môdun Timer2 là 1 bộ định thời 8 bit bao gồm 1 bộ tiền định (prescaler), 1 bộ hậu định tỉ lệ (postcaler) và một thanh ghi chu kỳ viết tắt là PR2. việc kết hợp Timer2 với 2 bộ định tỉ lệ cho phép nó hoạt động như một bộ định thời 16 bit. Môdun Timer2 cung cấp thời gian hoạt động cho chế độ điều biến xung PWM nếu môdun CCP được chọn.  Nguồn xung Clock của Timer2: Timer2 chỉ có một nguồn xung Clock đó là xung Clock của Vi điều khiển. Một bộ tiền định tỉ lệ được lựa chọn bởi các bit T2CKPS1 : T2CKPS0.  Thanh ghi TMR2 và PR2: là 2 thanh ghi ghi/đọc được. Timer2 sẽ tăng từ giá trị 00h lên tới giá trị nằm trong thanh ghi PR2, sau đó nó sẽ được Reset về 00h cho chu kỳ đếm kế tiếp.  Tín hiệu báo trạng thái cân bằng: khi giá trị trong thanh ghi TMR2 bằng với giá trị trong PR2, bô so sánh sẽ tạo ra một xung báo hiệu, xung này có thể được dùng cho bộ hậu định tỉ lệ (postcaler) hoặc được dùng làm xung Clock cho môdun truyền nối tiếp (Shift Clock). Ngoài ra nó còn được dùng làm tín hiệu Reset cho Timer2.  Xóa các bộ tỉ lệ: Các bộ tỉ lệ được xoá khi: - Ghi một giá trị vào thanh ghi TMR2. - Ghi một giá trị vào thanh ghi T2CON. - Bất cứ một dạng Reset thiết bị nào.  Chế độ ngủ: trong chế độ ngủ Timer2 không hoạt động. Giá trị của bộ định tỉ lệ sẽ được lưu lại và phục hồi sau khi thoát khỏi trạng thái ngủ.
  • 20. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 20 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Hình 2.16: Sơ đồ khối của bộ định thời Timer 2. Các thanh ghi liên quan đến Timer2 bao gồm:  INTCON (địa chỉ 0Bh, 8Bh, 10Bh, 18Bh): cho phép toàn bộ các ngắt (GIE và PEIE).  PIR1 (địa chỉ 0Ch): chứa cờ ngắt Timer2 (TMR2IF).  PIE1 (địa chị 8Ch): chứa bit điều khiển Timer2 (TMR2IE).  TMR2 (địa chỉ 11h): chứa giá trị đếm của Timer2.  T2CON (địa chỉ 12h): xác lập các thông số cho Timer2.  PR2 (địa chỉ 92h): thanh ghi hỗ trợ cho Timer2. 2.7 Hoạt động của các bô ngoại vi: 2.7.1 Bộ Capture/Compare/PWM: Họ PIC16F87X có hai bộ CCP, mỗi bộ là một thanh ghi 16 bit mà có thể hoạt động như là :  Thanh ghi Capture 16 bit.  Thanh ghi Compare 16 bit.  Thanh ghi chu trình làm việc chủ/tớ PWM. Cả hai bộ CCP1 và CCP2 cơ bản hoạt động giống nhau, ngoại trừ trong khi hoạt động với sự kiện trigger đặt biệt.  Bộ CCP1 : Thanh ghi CCPR1 bao gồm hai thanh ghi: CCPR1L (byte thấp) và CCPR1H (byte cao). Thanh ghi điều khiển CCP1CON điều khiển hoạt động của bộ CCP1.  Bộ CCP2 : Thanh ghi CCPR2 bao gồm hai thanh ghi: CCPR2L (byte thấp) và CCPR2H (byte cao).Thanh ghi điều khiển CCP2CON điều khiển hoạt động của bộ CCP2.
  • 21. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 21 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Hình 2.17: Thanh ghi CCP1CON/CCP2CON ( địa chỉ 17h/1Dh ). Chế độ CCP – Timer Resource Sự ảnh hưởng của hai bộ CCP  Chế độ Capture: Trong chế độ này, cặp thanh ghi CCPR1H : CCPR1L giữ giá trị 16 bit của thanh ghi TMR1 khi có một sự kiện xảy ra trên chân RC2/CCP1. Sự kiện được định nghĩa như là một trong các yếu tố sau:  Sau mỗi cạnh lên của xung clock.  Sau mỗi cạnh xuống của xung clock.
  • 22. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 22 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090  Sau mỗi canh lên thứ tư.  Sau mỗi cạnh lên thứ 16. Việc lựa chọn sự kiện nào được cấu hình bởi các bit điều khiển CCP1M3:CCP1M0. Nếu một sự kiện mới xảy ra trước khi giá trị trong thanh ghi CCPR1 được đọc, giá trị mới sẽ đè lên giá trị cũ.  Chế độ Compare: Trong chế độ này, hằng giá trị 16 bit trong thanh ghi CCPR1 được so sánh với giá trị trong cặp thanh ghi TMR0. Khi hai giá trị này bằng nhau, trên chân RC2/CCP1 sẽ là :  Mức cao.  Mức thấp.  Giữ nguyên không đổi. Việc lựa chọn mức cao, mức thấp hay giữ nguyên không đổi bằng cách nạp giá trị thích hợp vào các bit điều khiển CCP1M3:CCP1M0. Tại một thời điểm, cờ ngắt CCP1IF có thể được bật.  Chế độ PWM ( Điều biến độ rộng xung ) : Trong chế độ này, một xung vuông 10 bit được tạo ra trên chân CCPx. Vì chân này đa hợp với chân chốt của PORTC nên bit TRISC<2> phải được xóa để cấu hình cho chân CCP1 ở trạng thái xuất dữ liệu. Các bước sau được yêu cầu để thiết lập cho bộ CCP hoạt động trong chế độ PWM:  Thiết lập chu kỳ cho PWM bằng cách ghi lên thanh ghi PR2.  Thiết lập chu trình họat động bằng cách ghi lên thanh ghi.  CCPR1L và bit4 bit5 trong thanh ghi CCP1CON.  Cấu hình cho chân CCP1 ở trạng thái xuất dữ liệu.  Cấu hình cho bộ CCP1 hoạt động trong chế độ PWM.
  • 23. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 23 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Hình 2.18: .Sơ đồ khối của bộ PWM. Hình 2.19: Các thanh ghi liên quan đến chế Capture , Compare và Timer1
  • 24. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 24 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Hình 2.20: Những thanh ghi liên quan đến PWM và Timer2 2.7.2 Bộ chuyển đổi tương tự sang số A/D: Bộ chuyển đổi tương tự - số có năm ngõ vào đối với thiết bị 28 chân và tám đối với các thiết bị khác. Ngõ vào tương tự được lấy mẫu, ngõ ra của mẫu được đặt vào bộ biến đổi. Bộ biến đổi phát một giá trị nhị phân tương ứng với ngõ vào tương tự.Giá trị tương tự được bộ biến đổi cho một kết quả số tương ứng với 10 bit nhị phân.Bộ biến đổi có các thế ngưỡng cao và thấp đặt vào mà phần mềm có thể lựa chọn trên chân RA2 ,RA3. Bộ biến đổi A/D có đặt điểm duy nhất là hoạt động có thể hoạt động trong khi thiết bị đang ở chế độ nghỉ. Bộ biến đổi A/D có 4 thanh ghi , chúng là :  Thanh ghi kết quả cao (ADRESH).  Thanh ghi kết quả thấp (ADRESL).  Thanh ghi điều khiển 0 (ADCON0).  Thanh ghi điều khiển 1 (ADCON1). Sau đây là các bước được yêu cầu trước khi làm việc với bộ biến đổi A/D:  Cấu hình cho bộ biến đổi:  Cấu hình cho thanh ghi ADCON 1.  Chọn kênh tương tự đặt vào bộ biến đổi.  Chọn clock cho bộ biến đổi.  Khởi động bộ biến đổi.  Cấu hình ngắt:  Xóa cờ nhắt ADIF.  Đặt cờ cho phép ngắt bộ biến đổi.  Đặt cờ cho phép ngắt ngoại vi.  Đặt cờ cho phép ngắt toàn cục.  2.7.3 Đặc điểm chính của CPU: Tất cả các vi điều khiển thuộc họ PIC16F87X đều có một đặc điểm chung là tăng tối ưu độ tin cậy của hệ thống, nguồn năng lượng cung cấp ít, giảm thiểu nhiễu và cho phép mã bảo vệ bao gồm:
  • 25. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 25 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090  Chọn mạch dao động thích hợp.  Hoạt động Reset.  Nguồn Reset.  Nguồn định thời.  Dao động định thời.  Reset ngoài.  Hoạt động ngắt.  Wathdog timer.  Mã bảo vệ. Hoạt động ngắt:  Các Vi điều khiển họ PIC có rất nhiều nguồn ngắt. Cứ mỗi môdun ngoại vi thì có một nguồn ngắt, tuy nhiên một số môdun lại có rất nhiều nguồn ngắt. Sau đây là một số nguồn ngắt tiêu biểu: - Ngắt trên chân INT (ngắt ngoài). - Ngắt tràn Timer0. - Ngắt tràn Timer1. - Ngắt tràn Timer2. - Ngắt thay đổi trạng thái trên các chân PortB. - Ngắt so sánh điện thế. - Ngắt 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 A/D. - Ngắt màn hình LCD. - Ngắt hoàn tất ghi vào EEPROM. - Ngắt môdun CCP. - Ngắt môdun SSP.  Các thanh ghi chức năng của ngắt:  Thời gian ngắt được thự thi: Là thời gian tính từ khi sự kiện ngắt xuất hiện cho đến khi lệnh tại địa chỉ 0004h được thực thi. Đối với ngắt đồng bộ thời gian này vào khoản: 3T (chu kỳ lệnh). Đối với ngắt không đồng bộ (ngắt ngoài) thời gian này vào khoản: 3 – 3.75T (chu kỳ lệnh).  Lưu dữ liệu trong quá trình ngắt:
  • 26. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 26 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Trong suốt quá trình ngắt, chỉ có giá trị nằm trong PC là được lưu vào Stack, do đó người sử dụng phải lưu lại giá trị của thanh ghi W và Status khi vào chương trình phục vụ ngắt.  Hoạt động ngắt được điều khiển bởi thanh ghi INTCON (bit GIE). Bên cạnh đó mỗi ngắt còn có một bit điều khiển và cờ ngắt riêng. Các cờ ngắt vẫn được set bình thường khi thỏa mãn điều kiện ngắt xảy ra bất chấp trạng thái của bit GIE, tuy nhiên hoạt động ngắt vẫn phụ thuôc vào bit GIE và các bit điều khiển khác. Bit điều khiển ngắt RB0/INT và TMR0 nằm trong thanh ghi INTCON, thanh ghi này còn chứa bit cho phép các ngắt ngoại vi PEIE. Bit điều khiển các ngắt nằm trong thanh ghi PIE1 và PIE2. Cờ ngắt của các ngắt nằm trong thanh ghi PIR1 và PIR2. Trong một thời điểm chỉ có một chương trình ngắt được thực thi, chương trình ngắt được kết thúc bằng lệnh RETFIE. Khi chương trình ngắt được thực thi, bit GIE tự động được xóa, địa chỉ lệnh tiếp theo của chương trình chính được cất vào trong bộ nhớ Stack và bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h. Lệnh RETFIE được dùng để thoát khỏi chương trình ngắt và quay trở về chương trình chính, đồng thời bit GIE cũng sẽ được set để cho phép các ngắt hoạt động trở lại. Các cờ hiệu được dùng để kiểm tra ngắt nào đang xảy ra và phải được xóa bằng chương trình trước khi cho phép ngắt tiếp tục hoạt động trở lại để ta có thể phát hiện được thời điểm tiếp theo mà ngắt xảy ra. Đối với các ngắt ngoại vi như ngắt từ chân INT hay ngắt từ sự thay đổi trạng thái các pin của PORTB (PORTB Interrupt on change), việc xác định ngắt nào xảy ra cần 3 hoặc 4 chu kì lệnh tùy thuộc vào thời điểm xảy ra ngắt. Cần chú ý là trong quá trình thực thi ngắt, chỉ có giá trị của bộ đếm chương trình được cất vào trong Stack, trong khi một số thanh ghi quan trọng sẽ không được cất và có thể bị thay đổi giá trị trong quá trình thực thi chương trình ngắt. Điều này nên được xử lí bằng chương trình để tránh hiện tượng trên xảy ra. Hình 2.23.: Sơ đồ của tất cả các ngắt trong vi điều khiển PIC16F877A.
  • 27. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 27 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 3. Tập lệnh của vi điều khiển Pic 16F877A: 3.1. Vài nét sơ lược về tập lệnh Vi điều khiển Pic 16F877A: PIC là vi điều khiển có tập lệnh rút gọn RISC (Reduced Instruction Set Computer), bao gồm 35 lệnh. Mỗi lệnh trong trong vi điều khiển 16F877A là một từ 14 bit bao gồm trường mã lệnh và trường toán hạng.Các lệnh của PIC16F877A được chia thành các nhóm: lệnh thao tác byte , lệnh thao tác bit , lệnh thao tác trên dữ liệu tức thời và các lệnh điều khiển. Đối với các lệnh thao tác theo byte, ký hiệu ‘f’ biểu diễn cho các thanh ghi chức năng đặc biệt và các thanh ghi đa dụng ( còn gọi là các biến ). Ký hiệu ‘d’ biểu diễn cho thanh ghi đích. Nếu ‘d’ bằng 0, kết quả của lệnh được gán cho thanh ghi w.Nếu ‘d’ bằng 1, kết quả được gán trở lại cho thanh ghi nguồn. Đối với các lệnh thao tác bit, ký hiệu ‘b’ biểu diễn cho số thứ tự của một bit nào đó trong thanh ghi đích mà bị tác động bởi phép toán, trong khi ký hiệu ‘f’ lại biểu diễn cho thanh ghi mà bit đó được đặt đến sau khi thực hiện lệnh. Đối với các lệnh điều khiển và các lệnh thao tác trên dữ liệu tức thời, ký hiệu ‘k’ biểu diễn cho một hằng giá trị bảy hoặc tám bit hoặc một hằng số tức thời. Trường Mô tả f Địa chỉ thanh ghi file. w Thanh ghi tích lũy. B Địa chỉ bit trong thanh ghi file. K Dữ liệu tức thời hoăc địa chỉ chương trình con. D Chọn đích, nếu d=0 kết quả được gán cho thanh ghi tích lũy. Nếu d=1, kết quả được gán cho thanh ghi file. Mặc định d=1. PC Bộ đếm chương trình. TO Bit Time-out. PD Bit Power-down. Bảng 2.1:Bảng mô tả trường toán hạng: 3.2. Tập lệnh của Vi điều khiển Pic: ADDLW Cú pháp: ADDLW k (0 ≤ k≤255) Tác dụng: cộng giá trị k vào thanh ghi W, kết quả được chứa trong thanh ghi W. Bit trạng thái: C, DC, Z. ADDWF Cú pháp: ADDWF f,d (0≤f≤255, d thuộc [0,1]). Tác dụng: cộng giá trị hai thanh ghi W và thanh ghi f. Kết quả được chứa trong thanh ghi W nếu d = 0 hoặc thanh ghi f nếu d =1. Bit trạng thái: C, DC, Z. ANDLW Cú pháp: ANDLW k (0≤k≤255) Tác dụng: thực hiện phép toán AND giữa thanh ghi và giá trị k, kết quả được chứa trong thanh ghi W. Bit trạng thái: Z.
  • 28. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 28 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 ANDWF Cú pháp: ANDWF f,d (0≤f≤127, d thuộc [0,1]). Tác dụng: thực hiện phép toán AND giữa các giá trị chứa trong hai thanh ghi W và f. Kết quả được đưa vào thanh ghi W nếu d=0 hoặc thanh ghi f nếu d = 1. Bit trạng thái: Z. BCF Cú pháp: BCF f,b (0≤f≤127, 0≤b≤7) Tác dụng: xóa bit b trong thanh ghi f về giá trị 0. Bit trạng thái: không có. BSF Cú pháp: BSF f,b (0≤f≤127, 0≤b≤7) Tác dụng: set bit b trong trnh ghi f. Bit trạng thái: không có. BTFSS Cú pháp: BTFSS f,b (0≤f≤127, 0≤b≤7) Tác dụng: kiểm tra bit b trong thanh ghi f. Nếu bit b bằng 0, lệnh tiếp theo được thực thi. Nếu bit b bằng 1, lệnh tiếp theo được bỏ qua và thay vào đó là lệnh NOP. Bit trạng thái: không có. BTFSC Cú pháp: BTFSC f,b (0≤f≤127, 0≤b≤7) Tác dụng: kiểm tra bit b trong thanh ghi f. Nếu bit b bằng 1, lệnh tiếp theo được thực thi. Nếu bit b bằng 0, lệnh tiếp theo được bỏ qua và thay vào đó là lệnh NOP. Bit trạng thái: không có CALL Cú pháp: CALL k (0≤k≤2047) Tác dụng: gọi một chương trình con. Trước hết địa chỉ quay trở về từ chương trình con (PC+1) được cất vào trong Stack, giá trị địa chỉ mới được đưa vào bộ đếm gồm 11 bit của biến k và 2 bit PCLATH<4:3>. Bit trạng thái: không có. CLRF Cú pháp: CLRF f (0≤f≤127) Tác dụng: xóa thanh ghi f và bit Z được set. Bit trạng thái: Z CLRW Cú pháp: CLRW Tác dụng: xóa thanh ghi W và bit Z được set. Bit trạng thái: Z.
  • 29. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 29 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 CLRWDT Cú pháp: CLRWDT Tác dụng: reset Watchdog Timer, đồng thời prescaler cũng được reset, các bit PD và TO được set lên 1. Bit trạng thái: PD và TO COMF Cú pháp: COMF f,d (0≤f≤127, d thuộc [0,1]). Tác dụng: đảo các bit trong thanh ghi f. Kết quả được đưa vào thanh ghi W nếu d=0 hoặc thanh ghi f nếu d=1. Bit trạng thái: Z DECF Cú pháp: DECF f,d (0≤f≤127, d thuộc [0,1]). Tác dụng: giá trị thanh ghi f được giảm đi 1 đơn vị. Kết quả được đưa vào thanh ghi W nếu d = 0 hoặc thanh ghi f nếu d = 1. Bit trạng thái: Z DECFSZ Cú pháp: DECFSZ f,d (0≤f≤127, d thuộc [0,1]) Tác dụng: gía trị thanh ghi f được giảm 1 đơn vị. Nếu kết quả sau khi giảm khác 0, lệnh tiếp theo được thực thi, nếu kết quả bằng 0, lệnh tiếp theo không được thực thi và thay vào đó là lệnh NOP. Kết quả được đưa vào thanh ghi W nếu d = 0 hoặc thanh ghi f nếu d = 1. Bit trạng thái: không có. GOTO Cú pháp: GOTO k (0≤k≤2047) Tác dụng: nhảy tới một label được định nghĩa bởi tham số k và 2 bit PCLATH <4:3>. Bit trạng thái: không có. Lệnh INCF Cú pháp: INCF f,d (0≤f≤127, d thuộc [0,1]) Tác dụng: tăng giá trị thanh ghi f lên 1 đơn vị. Kết quả được đưa vào thanh ghi W nếu d=0 hoặc thanh ghi f nếu d = 1. Bit trạng thái: Z. INCFSZ C php: INCFSZ f,d (0≤f≤127, d thuộc [0,1]) Tác dụng: tăng gi trị thanh ghi f ln 1 đơn vị. Nếu kết quả khác 0, lệnh tiếp theo được thực thi, nếu kết quả bằng 0, lệnh tiếp theo được thay bằng lệnh NOP. Kết quả sẽ được đưa vào thanh ghi f nếu d=1 hoặc thanh ghi W nếu d = 0. Bit trạng thái: không có. IORLW
  • 30. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 30 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Cú pháp: IORLW k (0≤k≤255) Tác dụng: thực hiện phép toán OR giữa thanh ghi W và giá trị k. Kết quả được chứa trong thanh ghi W. Bit trạng thái: Z. IORWF Cú pháp: IORWF f,d (0≤f≤127, d thuộc [0,1]) Tác dụng: thực hiện phép toán OR giữa hai thanh ghi W và f. Kết quả được đưa vào thanh ghi W nếu d=0 hoặc thanh ghi f nếu d=1. Bit trạng thái: Z. RLF Cú pháp: RLF f,d (0≤f≤127, d thuộc [0,1]) Tác dụng: dịch trái các bit trong thanh ghi f qua cờ carry. Kết quả được lưu trong thanh ghi W nếu d=0 hoặc thanh ghi f nếu d=1. Bit trạng thái: C. RETURN Cú pháp: RETURN Tác dụng: quay trở về chương trình chính từ một chương trình con Bit trạng thái: không có. RRF Cú pháp: RRF f,d (0≤f≤127, d thuộc [0,1]) Tác dụng: dịch phải các bit trong thanh ghi f qua cờ carry. Kết quả được lưu trong thanh ghi W nếu d=0 hoặc thanh ghi f nếu d=1. Bit trạng thái: C. Sleep Cú pháp: SLEEP Tác dụng: đưa vi điều khiển về chế độ Sleep. Khi đó WDT bị xóa về 0, bit PD được xóa về 0 bit TO được set lên 1 và Oscillator không được cho phép họat động. Bit trạng thái: TO , PD . SUBLW Cú pháp: SUBLW k Tác dụng: lấy giá trị k trừ giá trị trong thanh ghi W. Kết quả được chứa trong thanh ghiW. Bit trạng thái: C, DC, Z. SUBWF Cú pháp: SUBWF f,d (0≤f≤127, d thuộc [0,1]) Tác dụng: lấy giá trị trong thanh ghi f đem trừ cho thanh ghi W. Kết quả được lưu trong thanh ghiaW nếu d=0 hoặc thanh ghi f nếu d=1. Bit trạng thái: C, DC, Z.
  • 31. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 31 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 SWAP Cú pháp: SWAP f,d (0≤f≤127, d thuộc [0,1]) Tác dụng: đảo 4 bit thấp với 4 bit cao trong thanh ghi f. Kết quả được chứa trong thanh ghiaW nếu d=0 hoặc thanh ghi f nếu d=1. Bit trạng thái: không có. XORLW Cú pháp: XORLW k (0≤k≤255) Tác dụng: thực hiện phép toán XOR giữa giá trị k và giá trị trong thanh ghi W. Kết quả được lưu trong thanh ghi W. Bit trạng thái: Z. XORWF Cú pháp: XORWF f,d Tác dụng: thực hiện phép toán XOR giữa hai giá trị chứa trong thanh ghi W và thanh ghi f. Kết quả được lưu vào trong thanh ghi W nếu d=0 hoặc thanh ghi f nếu d=1. Bit trạng thái: Z.  Ngoài các lệnh trên còn có một số lệnh dùng trong chương trình như: #DEFINE Cú pháp: #DEFINE <text1> <text2> Tác dụng: thay thế một chuỗi kí tự này bằng một chuỗi kí tự khác, có nghĩa là mỗi khi chuỗi kí tự text1 xuất hiện trong chương trình, trình biên dịch sẽ tự động thay thế chuỗi kí tự đó bằng chuỗi kí tự <text2>. #INCLUDE Cú pháp: #INCLUDE <filename> hoặc #INCLUDE “filename” Tác dụng: đính kèm một file khác vào chương trình, tương tự như việc ta copy file đó vào vị trí xuất hiện lệnh INCLUDE. Nếu dùng cú pháp <filename> thì file đình kèm là file hệ thống (system file), nếu dùng cú pháp “filename” thì file đính kèm là file của người sử dụng. Thông thường chương trình được đính kèm theo một “header file” chứa các thông tin định nghịa các biến (thanh ghi W, thanh ghi F,..) và các địa chỉ cảu các thanh ghi chức năng đặc biệt trong bộ nhớ dữ liệu. Nếu không có header file, chương trình sẽ khó đọc và khó hiểu hơn. CONSTANT Cú pháp: CONSTANT <name>=<value> Tác dụng: khai báo một hằng số, có nghĩa là khi phát hiện chuỗi kí tự “name” trong chương trình, trình biên dịch sẽ tự động thay bằng chuỗi kí tự bằng giá trị “value” đã được định nghĩa trước đó. VARIABLE Cú pháp: VARIABLE <name>=<value> Tác dụng: tương tự như lệnh CONSTANT, chỉ có điểm khác biệt duy nhất là giá trị “value” khi dùng lệnh VARIABLE có thể thay đổi được trong quá trình thưc thi chương trình còn lệnh CONSTANT thì không.
  • 32. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 32 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 SET Cú pháp: <name variable> SET <value> Tác dụng: gán giá trị cho một tên biến. Tên của biến có thể thay đổi được trong quá trình thực thi chương trình. EQU Cú pháp: <name constant> EQU <value> Tác dụng: gán giá trị cho tên của tên của hằng số. Tên của hằng số không thay đổi trong quá trình thực thi chương trình. ORG Cú pháp: ORG <value> Tác dụng: định nghĩa một địa chỉ chứa chương trình trong bộ nhớ chương trình của vi điều khiển. END Cú pháp: END Tác dụng: đánh dấu kết thúc chương trình. __CONFIG Cú pháp: Tác dụng: thiết lập các bit điều khiển các khối chức năng của vi điều khiển được chứa trong bộ nhớ chương trình (Configuration bit). PROCESSOR Cú pháp: PROCESSOR <processor type> Tác dụng: định nghĩa vi điều khiển nào sử dụng chương trình.
  • 33. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 33 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 4. Các linh kiện dùng trong mạch. 4.1.IC 7805: Hình 2.24: IC7805 4.2. IC LM324:  Sơ đồ chân và cấu trúc bên trong: Hình 2.25: IC LM324 Chức năng: Dùng để so sánh điện áp. 4.3.Led thu phát hồng ngoại: Chân 1 : input (ngỏ vào) Chân 2: output (ngỏ ra) Chân 3: mass Chức năng: là IC ổn áp nguồn dương, tạo điện áp chuẩn 5V.
  • 34. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 34 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 DETECTOR: led thu hồng ngoại EMITTER: led phát hồng ngoại. 4.4.L298: Hình 2.26: L298 Chức năng: Dùng để điều khiển động cơ. 4.5.Động cơ điện một chiều: Hình 2.27: Động cơ DC
  • 35. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 35 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 CHƯƠNG 3: LẬP TRÌNH PIC DÙNG CCS 1. Tổng quan về CCS: Sự ra đời của một loại vi điều khiển đi kèm với việc phát triển phần mềm ứng dụng cho việc lập trình cho con vi điều khiển đó. Vi điều khiển chỉ hiểu và làm việc với hai con số 0 và 1. Ban đầu để việc lập trình cho VĐK là làm việc với dãy các con số 0 và 1. Sau này khi kiến trúc của Vi điều khiển ngày càng phức tạp, số luợng thanh ghi lệnh nhiều lần, việc lập trình với dãy các số 0 và 1 không còn phù hợp nữa, đòi hỏi ra đời một ngôn ngữ mới thay thế. Và ngôn ngữ lập trình Assembly. Ở đây ta không nói nhiều đến Assmebly. Sau này khi ngôn ngữ C ra đời, nhu cầu dụng ngôn ngữ C để thay cho ASM trong việc mô tả các lệnh lập trình cho Vi điều khiển một cách ngắn gọn và dễ hiểu hơn đã dẫn đến sự ra đời của nhiều chương trình soạn thảo và biên dịch C cho Vi điều khiển : Keil C, HT-PIC, MikroC, CCS…Ở đây tôi sử dụng CCS để lập trình vì tính năng mạnh và dễ lập trình hơn so với MBLab. CCS là trình biên dịch lập trình ngôn ngữ C cho Vi điều khiển PIC của hãng Microchip. Chương trình là sự tích hợp của 3 trình biên dịch riêng biệt cho 3 dòng PIC khác nhau đó là:  PCB cho dòng PIC 12 bit opcodes.  PCM cho dòng PIC 14 bit opcodes.  PCH cho dòng PIC 16 và 18 bit. Tất cả 3 trình biên dịch này được tích hợp lại vô trong một chương trình bao gồm cả trình soạn thảo văn biên dịch là CCS. Giống như nhiều trình biên dịch C khác cho PIC, CCS giúp cho người sử dụng nắm bắt nhanh được vi điều khiển PIC và sử dụng PIC trong các dự án. Các chương trình điều khiển sẽ được thực hiện nhanh chóng và đạt hiệu quả cao thông qua việc sử dụng ngôn ngữ lập trình cấp cao – Ngôn ngữ C. Hình 3.1: Cửa sổ chương trình CCS.
  • 36. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 36 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 2. Cách sử dụng các biến và hàm, các cấu trúc lệnh, chỉ thị tiền xử lí: 2.1. Khai báo biến:  Các loại biến được hỗ trợ:  int1 số 1 bit = true hay false ( 0 hay 1).  int8 số nguyên 1 byte ( 8 bit).  int16 số nguyên 16 bit.  int32 số nguyên 32 bit.  char ký tự 8 bit.  float số thực 32 bit.  short mặc định như kiểu int1.  byte mặc định như kiểu int8.  int mặc định như kiểu int8.  long mặc định như kiểu int16. Thêm signed hoặc unsigned phía trước để chỉ đó là số có dấu hay không dấu .Khai báo như trên mặc định là không dấu. 4 khai báo cuối không nên dùng vì dễ nhầm lẫn . Thay vào đó nên dùng 4 khai báo đầu . VD : Signed int8 a ; // số a là 8 bit dấu ( bit 7 là bit dấu ). Signed int16 b , c , d ; Signed int32 , . . .  Phạm vi biến : Int8 : 0 , 255 signed int8 : -128 , 127 Int16 : 0 ,2^15-1 signed int16 : -2^15 , 2^15-1 Int32 : 0 , 2^32-1 signed int32 : -2^31 , 2^31-1  Cách sử dụng biến: Khi sử dụng các phép toán cần lưu ý: sự tràn số , tính toán với số âm , sự chuyển kiểu và ép kiểu. VD: Int8 a=275; // a =275-256=19 Int8 const a=275 //a=19 Int8 a=40 , b=7 , c; C=a * b ; //c=280-256=24 C=a / b ; //c=5 Có thể ép kiểu , thường là tiết kiệm ram , hay muốn tiết kiệm thời gian tính ,… VD : Int8 a =8 , b=200; Int16 c ; C= ( int16) a * b ; // c= 1600 , a chuyển sang 16 bit , 16bit*8bit -> b tự động chuyển sang 16 bit , kết quả là 16 bit trong c , lưu ý biến a , b vẫn là 8 bit .  8bit * 8bit -> phép nhân là 8 bit , KQ là 8 bit  16bit * 8 bit -> phép nhân là 16 bit , KQ là 16 bit  32bit * 16 bit -> phép nhân là 32 bit , KQ là 32 bit  16bit * 16 bit -> phép nhân là 16 bit , KQ là 16 bit . . . v . v . . . Có thể ép kiểu kết quả : VD :
  • 37. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 37 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 16b*8b ->16bit , nếu gán vào biến 8 bit thì KQ sẽ cắt bỏ 8 bit cao .  Phạm vi sử dụng biến: Giống như C trong lập trình C cho máy tính. Biến có thể được khai báo như toàn cục hay cục bộ .Biến khai báo trong hàm sẽ là cục bộ và sẽ chỉ dùng được trong hàm đó, kể cả trong hàm main( ). Ngoài ra còn có thể khai báo ngay trong 1 khối lệnh, và cũng chỉ tồn tại trong khối lệnh đó. 2.2. Các cấu trúc lệnh (Statement):  Các vòng lặp: Một trong những điểm mạnh lớn nhất của máy tính là khả năng thực hiện một chuỗi các lệnh lặp đi lặp lại. Điều đó có được là do sử dụng các cấu trúc lặp trong ngôn ngữ lập trình. Đối với những người đã từng viết chương trình cho vi điều khiển bằng ngôn ngữ Assemler thì việc tạo ra các vòng lặp hết sức khó khăn do các vòng lặp hoàn tòan được tạo ra bằng các lệnh nhảy, so sánh và nhãn, nhưng sẽ tiện lợi hơn khi viết chương trình cho vi điều khiển bằng ngôn CCSC.  Câu lệnh: Do… While… Không giống như vòng lặp for và while, vòng lặp này kiểm tra điều kiện tại cuối vòng lặp. Điều này có nghĩa là vòng lặp do...while sẽ được thực hiện ít nhất một lần, ngay cả khi điều kiện là sai (false) ở lần chạy đầu tiên Code: do { câu_lệnh; } while (điều_kiện); Cặp dấu ngoặc "{}" là không cần thiết khi chỉ có một câu lệnh hiện diện trong vòng lặp, nhưng việc sử dụng dấu ngoặc "{}" là một thói quen tốt. Vòng lặp do...while lặp đến khi điều_kiện mang giá trị false. Trong vòng lặp do...while, câu_lệnh (khối các câu lệnh) sẽ được thực thi trước, và sau đó điều_kiện được kiểm tra. Nếu điều_kiện là true, chương trình sẽ quay lại thực hiện lệnh do. Nếu điều kiện là false, chương trình chuyển đến thực hiện lệnh nằm sau vòng lặp. Chương trình sẽ thực thi biểu thức rồi mới xét điều kiện sau.  Câu lệnh: While… Code: while (điều kiện) câu lệnh; Trong đó, câu lệnh có thể là rỗng, hay một lệnh đơn, hay một khối lệnh. Nếu vòng lặp while chứa một tập lệnh thì chúng phải được đặt trong cặp ngoặc xoắn {}. điều_kiện có thể là biểu thức bất kỳ. Vòng lặp sẽ được thực hiện lặp đi lặp lại khi điều kiện trên là đúng (true). Chương trình sẽ chuyển đến thực hiện lệnh tiếp theo sau vòng lặp khi điều kiện trên là sai (false). Chương trình sẽ xét điều kiện trước rồi thực thi biểu thức sau.  Câu lệnh: For… Code: for (khởi tạo giá trị cho biến điều khiển; biểu thức điều kiện; biểu thức thay đổi giá trị của biến điều khiển) { Câu lệnh (các câu lệnh); }
  • 38. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 38 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Khởi tạo giá trị cho biến điều khiển là một câu lệnh gán giá trị ban đầu cho biến điều khiển trước khi thực hiện vòng lặp. Lênh này chỉ được thực hiện duy nhất một lần. Biểu thức điều kiện là một biểu thức quan hệ, xác định điều kiện thoát cho vòng lặp. Biểu thức thay đổi giá trị của biến điều khiển xác định biến điều khiển sẽ bị thoát thế nào sau mỗi lần vòng lặp được lặp lại (thường là tăng hoặc giảm giá trị của biến điều khiển). Ba phần trên được phân cách bởi dấu chấm phẩy. Câu lệnh trong thân vòng lặp có thể là một lệnh duy nhất (lệnh đơn) hoặc lệnh phức (nhiều lệnh). Vòng lặp for sẽ tiếp tục được thực hiện chừng nào mà biểu thức điều kiện còn [b]đúng (true)[b]. Khi biểu thức điều kiện là sai (false), chương trình sẽ thoát ra khỏi vòng lặp for. Vòng lặp "for" lồng nhau Một vòng lặp for được gọi là lồng nhau khi nó nằm bên trong một vòng lặp for khác Code: for (i = 1; i < max1; i++) { ... ... for (j = 1; j < max1; j++) { ... ... } ... } Vòng lặp for khi không có bất kỳ thành phần nào sẽ là một vòng lặp vô tận. Tùy nhiên, lệnh break bên trong vòng lặp sẽ cho phép thoát khỏi vòng lặp.  Cấu trúc chọn lựa IF:  Câu lệnh: If… Code: if (biểu thức) Các câu lệnh; Cho phép đưa ra các quyết định dựa trên việc kiểm tra một điều kiện nào đó là đúng(true) hay sai (false). Biểu thức phải luôn đặt trong dấu ngoặc ( ). Mệnh đề theo sau từ khóa if là một điều kiện (hoặc một biểu thức điều kiện) cần được kiểm tra. Tiếp đến là một lệnh hay một tập các lệnh sẽ được thực thi khi điều kiện (hoặc biểu thức điều kiện) có kết quả true.  Câu lệnh: If…Else… Code: if (biểu thức) { câu lệnh 1;} else { câu lệnh 2;} Ở trên chúng ta biết dạng đơn giải nhất của câu lệnh if, cho phép chúng ta lựa chọn để thực hiện hay không một câu lệnh hoặc một chuỗi các lệnh. C cũng cho phép ta lựa chọn trong hai khối lệnh để thực hiện bằng cách dùng cấu trúc if...else… Nếu biểu thức điều kiện trên đúng, câu lệnh 1 được thực hiện. Nếu nó sai câu lệnh 2 được thực hiện. Câu lệnh sau if và else có thể là lệnh đơn hoặc lệnh phức. Các câu lệnh đó nên được lùi vào trong dòng mặc dù không bắt buộc. Cách viết đó giúp ta nhìn thấy ngay những lệnh nào sẽ được thực hiện tùy theo kết quả của biểu thức điều kiện.
  • 39. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 39 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090  Các lệnh khác: Return;//Dùng cho hàm có trả về trị, hoặc không trả về trị, nghĩa là thoát khỏi hàm tại đó. Break; //Ngắt ngang (thoát khỏi) vòng lặp while. Continue; // quay trở về đầu vòng lặp while. Goto label;// nhảy đến label. Label: stmt; Statement (stmt): câu lệnh. Expression (expr): biểu thức. 2.3. Chỉ thị tiền xử lí: 1) # INCLUDE : Cú pháp : # include <filename> Filename: tên file cho thiết bị *.h, *.c. Nếu chỉ định file ở đường dẫn khác thì thêm đường dẫn vào. Luôn phải có để khai báo chương trình viết cho VĐK nào, và luôn đặt ở dòng đầu tiên . VD : #include <16F877.H> // chương trình sử dụng cho VĐK 16F877 #include < C:INCLUDESCOMLIBMYRS232.C > 2) #BIT , #BYTE , #LOCATE và #DEFINE: _#BIT id = x . y Với id : tên biến. x : biến C ( 8,16,32,…bit) hay hằng số địa chỉ thanh ghi. y : vị trí bit trong x. Tạo biến 1 bit đặt ở byte x vị trí bit y, tiện dùng kiểm tra hay gán trị cho bit thanh ghi. Điểm khác biệt so với dùng biến 1 bit từ khai báo int1 là: int1 tốn 1 bit bộ nhớ, đặt ở thanh ghi đa mục đích nào đó do CCS tự chọn, còn #BIT thì không tốn thêm bộ nhớ do id chỉ là danh định đại diện cho bit chỉ định ở biến x, thay đổi giá trị id (0 / 1) sẽ thay đổi giá trị bit tương ứng y -> thay đổi trị x. VD: #bit TMR1Flag = 0xb.2 //bit cờ ngắt timer1 ở địa chỉ 0xb.2 (PIC16F877A) Khi đó TMR1Flag = 0 -> xoá cờ ngắt timer1 Int16 a=35; //a=00000000 00100011 #bit b= a.11 //b=0, nếu b=a.0 thì b chỉ vị trí LSB (bit thấp nhất, bên trái) Sau đó : b=1; //a=00001000 00100011 = 2083 _#BYTE id = x x: địa chỉ. id : tên biến C. Gán tên biến id cho địa chỉ (thanh ghi ) x, sau đó muốn gán hay kiểm tra địa chỉ x chỉ cần dùng id. Không tốn thêm bộ nhớ, tên id thường dùng tên gợi nhớ chức năng thanh ghi ở địa chỉ đó. Lưu ý rằng giá trị thanh ghi có thể thay đổi bất kỳ lúc nào do hoạt động chương trình nên giá trị id cũng tự thay đổi theo giá trị thanh ghi đó . Không nên dùng id cho thanh ghi đa mục đích như 1 cách dùng biến int8 vì CCS có thể dùng các thanh ghi này bất kỳ lúc nào cho chương trình, nếu muốn dùng riêng, hãy dùng #LOCATE. _ VD: #byte port_B = 0xc6; // 16F877A :0xc6 là địa chỉ portB.
  • 40. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 40 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Muốn port b có giá trị 120 thì: port_b=120; #byte status = 0xc3; _#LOCATE id = x _Làm việc như #byte nhưng có thêm chức năng bảo vệ không cho CCS sử dụng địa chỉ đó vào mục đích khác . VD: #LOCATE temp = 0xc20 // 0xc20 :thanh ghi đa mục đích. Cách sau tương tự: Int8 temp ; #locate temp = 0xc20 Sử dụng #LOCATE để gán biến cho 1 dãy địa chỉ kề nhau ( cặp thanh ghi ) sẽ tiện lợi hơn thay vì phải dùng 2 biến với #byte. VD: CCP1 có giá trị là cặp thanh ghi 0x15 (byte thấp) và 0x16 (byte cao). Để gán trị cho CCP1: Int16 CCP1; #locate CCP1= 0x15 // byte thấp của CCP1 ở 0x15 //byte cao của CCP1 ở 0x16 Gán trị cho CCP1 sẽ tự động gán vào cả 2 thanh ghi: CCP1 = 1133 ; // = 00000100 01101101 -> 0x15 = 00000100 , 0x16 = 01101101 _#DEFINE id text Text : chuỗi hay số. Dùng định nghĩa giá trị. VD : #define a 12345 3) #DEVICE : # DEVICE chip option chip: tên VĐK sử dụng, không dùng tham số này nếu đã khai báo tên chip ở # include. option : toán tử tiêu chuẩn theo từng chip: * = 5 dùng pointer 5 bit (tất cả PIC). * = 8 dùng pointer 8 bit (PIC14 và PIC18). * = 16 dùng pointer 16 bit (PIC14 ,PIC 18). ADC = x sử dụng ADC x bit (8, 10, … bit tuỳ chip), khi dùng hàm read_adc( ) , sẽ trả về giá trị x bit. ICD = true: tạo mã tương thích debug phần cứng Microchip. HIGH_INTS = TRUE: cho phép dùng ngắt ưu tiên cao. _Khai báo pointer 8 bit, bạn sử dụng được tối đa 256 byte RAM cho tất cả biến chương trình. _Khai báo pointer 16 bit, bạn sử dụng được hết số RAM có của VĐK. _Chỉ nên dùng duy nhất 1 khai báo #device cho cả pointer và ADC. VD: #device * = 16 ADC = 10 4) #USE : _#USE delay (clock = speed) Speed: giá trị OSC mà bạn dùng. VD: dùng thạch anh dao động 40Mhz thì: #use delay(clock = 40000000) Chỉ khi có chỉ thị này thì trong chương trình bạn mới được dùng hàm delay_us ( ) và delay_ms( ). _#USE fast_io (port) Port: là tên port: từ A-G ( tuỳ chip )
  • 41. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 41 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Dùng cái này thì trong chương trình khi dùng các lệnh io như output_low(), … nó sẽ set chỉ với 1 lệnh, nhanh hơn so với khi không dùng chỉ thị này. Trong hàm main( ) bạn phải dùng hàm set_tris_x( ) để chỉ rõ chân vào ra thì chỉ thị trên mới có hiệu lực, không thì chương trình sẽ chạy sai. Không cần dùng nếu không có yêu cầu gì đặc biệt. VD: #use fast_io( A ) _#USE I2C ( options ) Thiết lập giao tiếp I2C. Option bao gồm các thông số sau, cách nhau bởi dấu phẩy: Master: chip ở chế độ master Slave: chip ở chế độ slave SCL = pin: chỉ định chân SCL SDA = pin: chỉ định chân SDA ADDRESS =x: chỉ định địa chỉ chế độ slave FAST: chỉ định FAST I2C SLOW: chỉ định SLOW I2C RESTART_WDT: restart WDT trong khi chờ I2C_READ( ) FORCE_HW: sử dụng chúc năng phần cứng I2C ( nếu chip hỗ trợ ) NOFLOAT_HIGH: không cho phép tín hiệu ở float high, tín hiệu được lái từ thấp lên cao. SMBUS: bus dùng không phải bus I2C , nhưng là cái gì đó tương tự. VD: #use I2C ( master , sda=pin_B0 , scl = pin_B1 ) #use I2C (slave , sda= pin_C4 , scl= pin_C3 , address = 0xa00 , FORCE_HW ) _#USE RS232 ( options ) Thiết lập giao tiếp RS232 cho chip (có hiệu lực sau khi nạp chương trình cho chip, không phải giao tiếp RS232 đang sử dụng để nạp chip ) . Option bao gồm : BAUD = x: thiết lập tốc độ baud rate : 19200 , 38400 , 9600 , . . . PARITY = x: x= N, E hay O, với N: không dùng bit chẵn lẻ. XMIT = pin: set chân transmit (chuyển data) RCV = pin: set chân receive (nhận data) Các thông số trên hay dùng nhất , các tham số khác sẽ bổ sung sau. VD: #use rs232(baud = 19200, parity = n, xmit = pin_C6, rcv = pin_C7) 5) Một số chỉ thị tiền xử lý khác : #CASE: cho phép phân biệt chữ hoa / thường trong tên biến , dành cho những ai quen lập trình C. #OPT n: với n=0 – 9: chỉ định cấp độ tối ưu mã , không cần dùng thì mặc định là 9 (very tối ưu). #PRIORITY ints: với ints là danh sách các ngắt theo thứ tự ưu tiên thực hiện khi có nhiều ngắt xảy ra đồng thời, ngắt đứng đầu sẽ là ngắt ưu tiên nhất, dùng ngắt nào đưa ngắt đó vô . Chỉ cần dùng nếu dùng hơn 1 ngắt. Xem cụ thể phần ngắt. VD: #priority int_CCP1 , int_timer1 // ngắt CCP1 ưu tiên nhất. 6) Một số vấn đề quan trọng khác : Trong đó : biểu thị số trong C: 123: số decimal 0x3, 0xB1: số hex, 0b100110: số binary.
  • 42. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 42 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 ‘a’: ký tự “abcd”: chuỗi , ký tự null được thêm phía sau Các toán tử C : >= , < = , = = , != ( không bằng ) && : and || : or ! : not ( đảo của bit , không phải đảo của byte ) >>n : dịch trái n bit << n : dịch phải n bit ++ , - - , += , - = , . . . 3. Các hàm xử lí số, xử lí Bit, Delay: 3.1. Các hàm xử lý số : Bao gồm các hàm: Sin( ), cos( ), tan( ), Asin( ), acos( ), atan( ). Abs( ): lấy trị tuyệt đối. Ceil( ):làm tròn theo hướng tăng. Floor ( ) :làm tròn theo hướng giảm. Exp ( ): tính e^x. Log ( ): Log10 ( ). Pow ( ): tính luỹ thừa. Sqrt ( ):căn thức. Các hàm này chạy rất chậm trên các VĐK không có bộ nhân phần cứng ( PIC 14 ,12 ) vì chủ yếu tính toán với số thực và trả về cũng số thực ( 32 bit ) và bằng phần mềm . VD hàm sin mất 3.5 ms ( thạch anh = 20Mhz )để cho KQ . Do đó nếu không đòi hỏi tốc độ thì dùng các hàm này cho đơn giản , như là dùng hàm sin thì khỏi phải lập bảng tra. 3.2. Các hàm xử lý bit và các phép toán : 1/ Shift_right ( address , byte , value ) Shift_left ( address , byte , value ) Dịch phải (trái ) 1 bit vào 1 mảng hay 1 cấu trúc. Địa chỉ có thể là địa chỉ mảng hay địa chỉ trỏ tới cấu trúc ( kiểu như &data). Bit 0 byte thấp nhất là LSB. 2/ Rotate_right ( ) Rotate_left ( ) 3/ Bit_clear ( var , bit ) Bit_set ( var , bit ) Bit_clear ( ) dùng xóa (set = 0) bit được chỉ định bởi vị trí bit trong biến var. Bit_set ( ) dùng set=1 bit được chỉ định bởi vị trí bit trong biến var. var : biến 8 , 16 , 32 bit bất kỳ . bit : vị trí clear (set): từ 0-7 ( biến 8 bit), 0-15 (biến 16 bit ), 0-31 (biến 32 bit ). Hàm không trả về trị . VD : Int x; X=11 ; //x=1011 Bit_clear ( x ,1 ) ; // x= 1001b = 9 4/ Bit_test ( var , bit ) var : biến 8, 16 ,32 bit. bit : vị trí bit trong var. Dùng kiểm tra vị trí bit trong biến var. Hàm trả về 0 hay 1 là giá trị bit đó trong var. Giả sử bạn có biến x 32 bit đếm từ 0 lên và muốn kiểm tra xem nó có lớn hơn 4096 không ( 4096= 2^12 =1000000000000b)
  • 43. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 43 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 If ( x >= 4096) . . . // phép kiểm tra này mất ~5 us Trong 1 vòng lặp , việc kiểm tra thường xuyên như vậy sẽ làm mất 1 thời gian đáng kể . Để tối ưu , chỉ cần dùùng : if ( bit_test ( x, 12 - > chỉ mất ~ 0.4 us . ( 20 Mhz thạch anh ). Kiểm tra đếm lên tới những giá trị đặc biệt ( 2^ i) thì dùng hàm này rất tiện lợi. 5/ Swap ( var ) var : biến 1 byte. Hàm này tráo vị trí 4 bit trên với 4 bit dưới của var , tương đương var =( var>>4 ) | ( var << 4 ) Hàm không trả về trị. VD : X= 5 ; //x=00000101b Swap ( x) ; //x = 01010000b = 80 6/ Make8 ( var , offset ) var : biến 8,16,32 bit. offset là vị trí của byte cần trích ( 0,1,2,3). Hàm này trích 1 byte từ biến var. Hàm trả về giá trị byte cần trích. VD: Int16 x = 1453 ; // x=0x5AD Y = Make(x, 1) ; //Y= 5 = 0x05 7/ Make16 ( varhigh , varlow ) Trả về giá trị 16 bit kết hợp từ 2 biến 8 bit varhigh và varlow. Byte cao là varhigh, thấp là varlow. 8/ Make32 ( var1 , var2 , var3 , var4 ) : Trả về giá trị 32 bit kết hợp từ các giá trị 8 bit hay 16 bit từ var1 tới var4 . Trong đó var2 đến var4 có thể có hoặc không . Giá trị var1 sẽ là MSB , kế tiếp là var2,… Nếu tổng số bit kết hợp ít hơn 32 bit thì 0 được thêm vào MSB cho đủ 32 bit. VD: Int a=0x01 , b=0x02 , c=0x03 , d=0x04; // các giá trị hex Int32 e ; e = make32 ( a , b , c , d ); // e = 0x01020304 e = make32 ( a , b , c , 5 ); // e = 0x01020305 e = make32 ( a, b, 8 ); // e = 0x00010208 e = make32 ( a ,0x1237 ); // e = 0x00011237 3.3. Các hàm Delay : Để sử dụng các hàm delay, cần có khai báo tiền xử lý ở đầu file. VD: #use delay ( clock = 20000000 )// sử dụng OSC 20 Mhz Hàm delay không sử dụng bất kỳ timer nào. Nếu trong trong thời gian delay lại xảy ra ngắt thì thời gian thực thi ngắt không tính vào thời gian delay , xong ngắt nó quay về chạy tiếp các dòng mã cho tới khi xong hàm delay. Có 3 hàm phục vụ : 1/ delay_cycles (count ) Count : hằng số từ 0 – 255, là số chu kỳ lệnh. 1 chu kỳ lệnh bằng 4 chu kỳ máy. Hàm không trả về trị. Hàm dùng delay 1 số chu kỳ lệnh cho trước. VD: delay_cycles ( 25 ); // với OSC = 20 Mhz, hàm này delay 5 us. 2/ delay_us ( time ) Time : là biến số thì = 0 – 255, time là 1 hằng số thì = 0 -65535. Hàm không trả về trị. Hàm này cho phép delay khoảng thời gian dài hơn theo đơn vị us. 3/ delay_ms (time ) Time = 0-255 nếu là biến số hay = 0-65535 nếu là hằng số. Hàm không trả về trị. Hàm này cho phép delay dài hơn nữa.
  • 44. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 44 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 VD : Int a = 215; Delay_us ( a ); // delay 215 us Delay_us ( 4356 ); // delay 4356 us Delay_ms ( 2500 ); // delay 2 . 5 s 3.4. Các hàm Input/Output: 1/ Output_low ( pin ), Output_high (pin ) Dùng thiết lập mức 0 ( low, 0V) hay mức 1 ( high , 5V ) cho chân IC, pin chỉ vị trí chân. Hàm này sẽ đặt pin làm ngõ ra. Hàm này dài 2-4 chu kỳ máy VD: chương trình sau xuất xung vuông chu kỳ 500ms , duty =50% ra chân B0 ,nối B0 với 1 led sẽ làm nhấp nháy led . #include <16F877A.h> #use delay( clock=20000000) Main( ) { while(1) { output_high(pin_B0); Delay_ms(250) ; // delay 250ms Output_low (pin_B0); Delay_ms (250 ); } } 2/ Output_bit ( pin , value ) pin: tên chân value: giá trị 0 hay 1 Hàm này cũng xuất giá trị 0 / 1 trên pin, tương tự 2 hàm trên. Thường dùng nó khi giá trị ra tuỳ thuộc giá trị biến 1 bit nào đó, hay muốn xuất đảo của giá trị ngõ ra trước đó. 3/ Output_float ( pin ) Hàm này set pin như ngõ vào. 4/ Input ( pin ) Hàm này trả về giá trị 0 hay 1 là trạng thái của chân IC. Giá trị là 1 bit. 5/ Output_X ( value ) X là tên port có trên chip. Value là giá trị 1 byte. Hàm này xuất giá trị 1 byte ra port. Tất cả chân của port đó đếu là ngõ ra. 6/ Input_X ( ) X: là tên port ( a, b ,c ,d e ). Hàm này trả về giá trị 8 bit là giá trị đang hiện hữu của port đó. 7/ Port_B_pullups ( value ) Hàm này thiết lập ngõ vào port B pullup ( điện trở kéo lên ). Value =1 sẽ kích hoạt tính năng này và value = 0 sẽ ngừng. Chỉ các chip có port B có tính năng này mới dùng hàm này. 8/ Set_tris_X ( value ) Hàm này định nghĩa chân IO cho 1 port là ngõ vào hay ngõ ra. Chỉ được dùng với #use fast_IO. Sử dụng #byte để tạo biến chỉ đến port và thao tác trên biến này chính là thao tác trên port .
  • 45. Đồ án tốt nghiệp kỹ sư công nghiệp GVHD: ThS. Trần Quang Thuận 45 SVTH: Hoàng Trung Thạch MSSV: 20662090 SVTH: Hoàng Trung Thạch MSSV: 20662090 Value là giá trị 8 bit . Mỗi bit đại diện 1 chân và bit=0 sẽ set chân đó là ngõ vào , bit= 1 set chân đó là ngõ ra . Set_tris_B (0 ); //port B =00000000: tất cả chân portB là ngõ ra. Set_tris_B ( 1 ); //portB = 00000001: chỉ B0 là ngõ vào , còn lại là ngõ ra. Set_tris_B ( 255 ); //portB=11111111: tất cả chân portB là ngõ vào. 4. Điều xung PWM: 4.1. Các lệnh cài đặt:  Cài đặt timer_2 Setup_timer_2 (mode, period, postscale) - Với mode gồm : T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16 - Period là số nguyên từ 0-255, xác định giá trị xung reset - Postscale là số nguyên 1-16, xác định reset bao nhiêu lần trước khi ngắt.  Cài đặt PWM Mã lệnh: Setup_CCPx (mode) x =1,2: tên chân CCP có trên chip. mode là 1 trong các hằng số sau: CCP_OFF: tắt chức năng CCP, RC sẽ là chân I/O. CCP_PWM: bật chế độ PWM. Mã lệnh: Set_CCPx_duty (value) Value: biến hay hằng, giá trị 8 bit hay 16 bit. x =1,2: tên chân CCPx Dùng set duty của xung trong chế độ PWM. Nó ghi giá trị 10 bit vào thanh ghi CCPx. Nếu value chỉ là 8 bit, nó dịch thêm 2 để đủ 10 bit nạp vào CCPx. 4.2. Các công thức tính:  Tính chu kỳ PWM: TPWM = [(PR2) +1] * 4 * Tosc * (Giá trị của TMR2) Tính tần số PWM: FPWM = 1/ TPWM  Tính % duty: Tùy theo kiểu của value mà cách tính khác nhau. - Nếu value là giá trị kiểu int 8bit thì CCS C sẽ dịch trái 2 bit để đủ 10bit Công thức tính: %duty = value/(PR2 +1)*100% - Nếu value là giá trị long int 16bit thì CCS C sẽ bỏ đi 4 bit cao Công thức tính: %duty = (value & 1023)/(4*(PR2 +1))*100%