Tải bản đầy đủ (.pdf) (20 trang)

Luận văn - NGHIÊN CỨU VI ĐIỀU KHIỂN PIC16F84 - Phần 3 ppsx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.38 MB, 20 trang )

Phần IV: ứng dụng
32

Phần IV: ỨNG DỤNG
Bảng ứng dụng chip vi điều khiển PIC16F84 gồm 3 modul: điều khiển LED;
điều khiển LCD và điều khiển động cơ Servol.
IV.1. Điều khiển LED
IV.1.1. Hoạt động

Modul điều khiển LED là modul đơn giản nhất trong bảng điều khiển. Việc
điều khiển chỉ đơn giản là xuất bit tín hiệu ra các pin tương ứng nối với LED. Tín
hiệu được xuất qua LED ngay khi ngắt ngoài được kích (Start button) trên chip.
Chương trình điều khiển LED nhấp nháy được viết dưới dạng vòng lặp vô tận nên
LED sẽ nhấp nháy theo một chu trình được thiết kế trong chương trình và lập lại mãi
đến khi nào người điều khiển ấn phím Stop hoặc chip được Reset.
IV.1.2. Mạch điều khiển
Trong mạch điều khiển, các Led được nối với chip qua các chân RB1, RB2,
RB4, RB5, RB6. Buttom SW1 nối chân ngắt ngoài RB0/INT với mass, làm chức
năng như nút Start. Khi ngắt ngoài được kích, chương trình sẽ rẽ nhánh đến chương
trình con điều khiển Led để điều khiển Led nhấp nháy. Button SW2 nối chân kiểm
tra điều kiện RA0 với mass, làm chức năng như nút Stop. Khi nút Stop được nhấn,
làm cho chân RA0 xuống mức điện áp thấp, khi đó chương trình sẽ được thoát khỏi
chương trình con điều khiển Led, trở về chương trình chính.
Phần IV: ứng dụng
33

R4
470R
C4
1n
R3


470R
X2
4MHz
D5
C5
1n
SW1
1 2
D1
R2
470R
D2
U1
PIC16F84
1
2
3
4
6
17
10
11
12
13
15
16
7
8
5
14

9
18
RA2
RA3
RA4/TOCKI
MCLR
RB0/INT
RA0
RB4
RB5
RB6
RB7
OSC1/CLKIN
OSC2/CLKOUT
RB1
RB2
GROUND
VDD
RB3
RA1
R6
10k
D4
VCC
R1
470R
D3
R5
470R
SW2

1 2

IV.2. Điều khiển động cơ Servo
IV.2.1. Hoạt động
IV.2.1.1 Động cơ servo
Động cơ Servol chính là một động cơ DC thông thường được lấp thêm bộ giải
mã (Encoder) để nhận tín hiệu phản hồi về góc quay của động cơ. Encoder thường
được cấu tạo từ 1 Led phát quang, 1 đến 2 diode quang đặt đối diện với Led phát
quang qua 1 khe hở và bộ khuếch đại.

Phần IV: ứng dụng
34

Tín hiệu ra sẽ ở mức cao (hoặc thấp) khi diode quang nhận được tín hiệu
quang học từ Led phát. Vì thế, khi lắp đóa phân giải vào khe giữa Led phát và diode
quang và đóa được động cơ quay thì tín hiệu ra là dạng xung. Số xung phát ra trên
ngõ ra của Encoder chính là số răng trên đóa phân giải đã lướt qua khe hở giữa Led
phát và diode quang. Công thức tính góc quay của động cơ như sau:


nC360



Trong đó: n- số xung nhận được
C- độ phân giải của đóa

m
C
1



M- số răng trên vòng

Trên hình vẽ, encoder dùng 2 kênh, 2 diode quang đặt ở vò trí ngược nhau về
tín hiệu (khi diode 1 thấy thì diode 2 không thấy và ngược lại). Dùng 2 tín hiệu này
trong hệ vi sai để chống nhiễu. Ứng dụng trong đồ án này dùng encoder 1 kênh ngõ
ra.
Người điều khiển dùng tín hiệu xung này để điều khiển chính xác góc quay
của động cơ.


Phần IV: ứng dụng
35

IV.2.1.2 Mạch cầu H
Mạch cầu H được thiết kế để điều khiển hoạt động của động cơ DC. Nó cho
phép tín hiệu công suất thấp từ các chip vi điều khiển có thể điều khiển động cơ
DC. Ngăn dòng ngược từ động cơ phát ra có thể làm hỏng chip. Cung cấp công suất
cho động cơ bằng 1 nguồn tách biệt khỏi nguồn nuôi chip. Có khả năng đảo chiều
và dừng động cơ đột ngột (thắng).


 Sơ đồ mạch cầu H

R3
10k
C1 470uF Q5
PN2222
Q3

PN2222
TO MOTOR
R2
474R
E
B
C
TIP120
1
23
J2-2
R1
47R
J3-2
J2-1
E
B
C
TIP120
1
23
R7
3k3
POWER IN
R4
10k
E
B
C
TIP120

1
23
J3-1
E
B
C
TIP120
1
23
Q4
PN2222
Q6
PN2222
IN A
IN B
GROUMD
JP1
4 HEADER
1
2
3
R6
470R
R8
10k
R3
10k
Phần IV: ứng dụng
36


IV.2.2. Mạch điều khiển
C4
1n
0
R6
10k
R7
92R
C3
22P
R5
4.7k
TO MOTOR
JP3
4 HEADER
1
2
3
C5
1n
VCC
VSS
GROUND
OUT
JP2
ENCODER
1
2
3
4

VCC
VCC
X2
4MHz
U2
PIC16F84
1
2
3
4
6
17
10
11
12
13
15
16
7
8
5
14
9
18
RA2
RA3
RA4/TOCKI
MCLR
RB0/INT
RA0

RB4
RB5
RB6
RB7
OSC1/CLKIN
OSC2/CLKOUT
RB1
RB2
GROUND
VDD
RB3
RA1


IV.3. Điều khiển LCD
IV.3.1. Giới thiệu về LCD
LCD (liquid Crystal Display)_màn hình tinh thể lỏng, đây là phương pháp hiển
thò tiết kiệm năng lượng. Có nhiều loại LCD, trong đó thông dụng là hiển thò 16x2
và 20x2 (hiển thò 2 hàng với 16 ký tự trên mỗi hàng và 2 hàng 20 ký tự).
LCD được thiết lập chuẩn để cho phép ta có thể giao tiếp với các LCD bất
chấp hãng sản xuất với điều kiện là các LCD dùng cùng IC điều khiển HD44780.
 Hình dáng và kích thước LCD
Các LCD được chế tạo từ các hãng như Densitron, Epson, Hewlett Packard,
Optrex, Shasp… với các cấu hình thông dụng là 16, 20,24, 32, hay 40 ký tự trên 1
hàng với màn hình hiển thò 1, 2, hay 4 hàng.

Hình IV-1: Mô hình màn hình LCD
LCD dùng trong ứng dụng này là loại 16x2, dùng chip HD44780.
Màn hình nền của LCD được chiếu sáng bằng đèn chiếu sáng đặt phía sau bộ
hiển thò thay vì dùng phương pháp phản xạ.

 Các chân ra của LCD
Modul LCD tuân theo qui cách giao tiếp chuẩn. Gồm 14 chân, có 8 đường dữ
liệu, 3 đường điều khiển và 3 đường cấp nguồn bố trí trên 1 hàng.
Chức năng của các chân được liệt kê trong bảng sau:
Phần IV: ứng dụng
37

Bảng IV-1: chức năng của các chân LCD
Chân số Tên Chức năng
1 Vss Đất
2 VDD Cực+ của nguồn
3 VEE Tương phản (constrast)
4 RE Chọn thanh ghi (Register Select)
5 R/W Read/write
6 E Cho phép (Enable)
7 D0 Bít dữ liệu 0
8 D1 Bít dữ liệu 1
9 D2 Bít dữ liệu 2
10 D3 Bít dữ liệu 3
11 D4 Bít dữ liệu 4
12 D5 Bít dữ liệu 5
13 D6 Bít dữ liệu 6
14 D7 Bít dữ liệu 7

Nguồn cấp cho LCD là 5VDC, tuy nhiên LCD vẫn hoạt động tốt với nguồn
6VDC hay 4.5VDC. LCD tiêu thụ điện năng rất ít. Tuy nhiên đèn dùng để chiếu
sáng cho LCD lại tiêu thụ điện năng khá lớn. Vì vậy mỗi khi có hiện tượng sụt áp
trên nguồn thì ta thấy đèn nền LCD tối ngay.
Chân 3 (VEE) dùng để thay đổi độ tương phản của màn hiển thò. Lý tưởng thì
chân này nên nối với nguồn áp thay đổi được, người ta thực hiện bằng cách lắp

mạch chia áp dùng biến trở có đầu ra thay đổi đưa vào chân này. Đơn giản nhất ta
có thể nối chân này xuống mass để đạt được độ tương phản tốt nhất.
Chân 4 (RS_Register Select) đây là 1 trong 3 ngõ vào điều khiển lệnh. Khi
chân này được nối mass thì các dữ liệu truyền đến LCD được xử lý như các mệnh
lệnh và các dữ liệu đọc ra chỉ trạng thái của nó. Bằng cách đưa chân này lên mức
cao thì dữ liệu ký tự có thể xuất nhập trên modul này.
Chân 5 (R/W_Read/Write), chân này cho phép lệnh hay dữ liệu ký tự được ghi
vào modul khi nó được kéo xuống mức thấp. Khi được đưa lên cao, nó cho phép dữ
liệu ký tự hay thông tin trạng thái được đọc từ các thanh ghi của modul.
Chân 6 (E_ Enable), ngõ vào này dùng để khởi động việc chuyển các dữ liệu
ký tự hay các lệnh giữa modul và các đường dữ liệu. Khi ghi ra màn hình LCD, dữ
Phần IV: ứng dụng
38

liệu chỉ được chuyển khi có cạnh xuống của tín hiệu E này. Tuy nhiên khi đọc ra từ
LCD, thì dữ liệu khả dụng sau khi có chuyển tiếp từ thấp lên cao và duy trì dữ liệu
khả dụng đến khi tín hiệu E này xuống thấp 1 lần nữa.
Các chân từ 7 đến 14 là 8 đường dữ liệu (D0  D7). Dữ liệu có thể được
chuyển đến và lấy ra khỏi bộ hiển thò LCD theo dạng một byte hay dạng nửa byte 4
bit (nibble). Trong trường dùng trong ứng dụng này là dùng 4 bit vì chế độ này cần ít
đường tín hiệu hơn.
Sơ đồ kết nối được thể hiện như hình dưới đây:
Hình IV-2: Sơ đồ kết nối LCD 8 bit
Hình IV-3: Sơ đồ kết nối LCD 4 bit
Phần IV: ứng dụng
39

IV.3.2. Hoạt động của LCD trong ứng dụng
Trong ứng dụng này, LCD hoạt động ở 3 tình huống khác nhau. Mỗi tình huống
LCD làm nhiệm vụ hiển thò lời giới thiệu hay trạng thái hoạt động của mô hình. Các

trạng thái hoạt động của LCD được liệt kê trong bảng sau:
 Tình huống 1: vừa khởi động hệ thống, các dòng text sẽ hiển thò lần lượt trên
màn hình và lập lại liên tục
Bảng IV-2: Các màn hình hiển thò trong tình huống 1



















 Tình huống 2: Mô hình đang hoạt động ở chế độ Led nhấp nháy, màn hình chỉ
gồm 2 dòng hiển thò cố đònh.
Bảng IV-3: Các màn hình hiển thò ở chế độ 2
Màn hình Line Text hiển thò
1
1
Che do hoat dong

2
Led nhap nhay

 Tình huống 3: Mô hình đang hoạt động ở chế độ điều khiển động cơ, màn hình
chỉ gồm 2 dòng hiển thò cố đònh.
Màn hình Line Text hiển thò
1
1 DO AN DKHT
2 DE TAI: pIC16F84
2
1 Gvhd
2 Ks. Vo tuong quan
3
1 Nhom thuc hien
2 (None)
4
1 Dinh Phuong Tan
2 Mssv: 20102326
5
1 Nguyen chinh phuc
2 Mssv: 2010
6
1 VUONG QUOC VIET
2 MSSV: 2010
7
1 TIEU BAO TRAN
2 MSSV: 2010
Phần IV: ứng dụng
40


Bảng IV-4: : Các màn hình hiển thò ở chế độ 3
Màn hình Line Text hiển thò
1
1
Che do hoat dong
2
Dong co servo

Hình IV-4: Màn hình LCD trong ứng dụng
IV.3.3. Sơ đồ mạch điều khiển LCD
Hình IV-5: Sơ đồ mạch điều khiển LCD
Trong sơ đồ trên, SW1 có vai trò như nút Start, SW2 có vai trò như nút Stop,
SW1 là nút gạt chọn chế độ điều khiển Led hay điều khiển động cơ.
IV.4. Mô hình tích hợp:
Các modul trên được kết hợp với nhau trên 1 mạch tích hợp. Ở đây vì các ngõ
điều khiển nhiều hơn khả năng của 1 chip vi điều khiển PIC16F84, do đó chip vi
điều khiển thứ 2 được dùng đến. Hai chip này được phân nhiệm vụ điều khiển các
0
X1
4MHz
0
SW1
1 2
TO LCD
JP1
HEADER 6
1
2
3
4

5
6
D4
D5
D6
D7
RS
E
SW3
2
1
3
C2
22P
C1
22P
R2
10k
U1
PIC16F84
1
2
3
4
6
17 10
11
12
13
15

16
7
8
5
14
9
RA2
RA3
RA4/TOCKI
MCLR
RB0/INT
RA0 RB4
RB5
RB6
RB7
OSC1/CLKIN
OSC2/CLKOUT
RB1
RB2
GROUND
VDD
RB3
VCC
R2
4.7k
R2
4.7k
SW2
1 2
Phần IV: ứng dụng

41

modul khác nhau. Tuy nhiên, để đồng bộ các modul với nhau thì các ngắt ngoài và
các chân kiểm tra điều kiện của 2 chip được nối với nhau.
Sơ đồ mạch được trình bày trong hình sau:

Hình IV-6: Sơ đồ mạch tích hợp
Trong mạch trên, IC1 (U1) điều khiển LCD; IC2 (U2) điều khiển LED và động
cơ.
Mạch điện thực tế được mô tả trong hình sau:

TO LCD
JP1
HEADER 6
1
2
3
4
5
6
U2
PIC16F84
1
2
3
4
6
17
10
11

12
13
15
16
7
8
5
14
9
18
RA2
RA3
RA4/TOCKI
MCLR
RB0/INT
RA0
RB4
RB5
RB6
RB7
OSC1/CLKIN
OSC2/CLKOUT
RB1
RB2
GROUND
VDD
RB3
RA1
R3
4.7k

U1
PIC16F84
1
2
3
4
6
9
17
10
11
12
13
15
16
7
8
5
14
9
RA2
RA3
RA4/TOCKI
MCLR
RB0/INT
RB3
RA0
RB4
RB5
RB6

RB7
OSC1/CLKIN
OSC2/CLKOUT
RB1
RB2
GROUND
VDD
RB3
SW1
1 2
R5
4.7k
R1
R9
4.7k
D1
Left LED
C1
22P
R4
D2
right LED
R12
470R
D3
LED
X2
4MHz
C3
22P

C5
1n
VCC
VSS
GROUND
OUT
JP2
ENCODER
1
2
3
4
C2
22P
R6
10k
D3
LED
R11
470R
TO MOTOR
JP3
4 HEADER
1
2
3
R7
92R
R13
1k

D3
LED
SW2
1 2
SW6
2
1
3
R8
4.7k
+
J1
POWER
1 2
R2
10k
C4
1n
R14
1k
D3
LED
X1
4MHz
R10
1k
D3
LED
Phần IV: ứng dụng
42



Hình IV-7: Mạch điện thực tế

IV.5. Mã chương trình:
Phần IV: ứng dụng
43

 Chương trình cho IC1

i4list P = 16F84
Include "P16f84.Inc"
Simulating = 1
;
; Đònh nghóa biến
;

CBLOCK 0x20
DelayL
DelayM
DelayH
StrPtr
MessAddH
MessAddL
MessNum
Temp
PBtemp
Flag1
ENDC


LcdRS equ 1h
LcdE equ 2h

LCDmd equ 0h

;
; Khởi tạo chương trình chính
;


Org 0000h ; start
address = 0000h
Goto main
org 0x04
Goto ISR
Main
bcf OPTION_REG,INTEDG
Bsf OPTION_REG,NOT_RBPU
Bsf INTCON,INTE; interupt BB0
enabled
bsf INTCON,GIE
Banksel PORTA
Movlw 0x00; PORTA = all low
movwf PORTA
Movlw 0x00 ; PORTB = all low
movwf PORTB
Bsf STATUS,RP0 ; RAM Page 1
Movlw 0x01 ; RA1 = input
movwf TRISA
Movlw b'00001001';RB3 & RB0 = input

Movwf TRISB
Bcf STATUS,RP0 ; RAM Page 0
Movlw 20h; 25mS powerup delay @
4MHz
Movwf DelayH; LCD data sheet says
15mS
Clrf DelayL
PUPD decfsz DelayL,F
Goto PUPD
Decfsz DelayH,F
Goto PUPD
;
;
; Truyền dữ liệu khởi tạo đến LCD
;
;
Clrf Flag1; send instruction as 8 bit mode

movlw b'00110000' ; function set 8 bits
call LCDins
Movlw b'00110000' ; function set 8 bits
call LCDins
Movlw b'00110000' ; function set 8 bits
call LCDins
Movlw b'00100000' ; function set 4 bits
call LCDins
Bsf Flag1,LCDmd ;chế độ 4 bit
Movlw b'00101000'
Call LCDins
Movlw b'00001000' ; display = off

call LCDins
Movlw b'00000001' ; clear the display
call LCDins
Movlw b'00000110' ; increment - no
display shift
call LCDins
Movlw b'00001100' ; display on, cursor
off, blink off
Phần IV: ứng dụng
44

call LCDins
;
;
; Chương trình chính
;
;
Loop
Movlw 0h hiển thò mess ra
màn hình
Number 0
Call MessLine1 ; line 1
Movlw 1h
Number 1
Call MessLine2 ; line 2
Call BigDel ; chờ 1/2 s
movlw 1h ; xoá màn hình
Call LCDins
Call BigDel ; wait 1/2 second
movlw 2h

Call MessLine1
Movlw 3h
Call MessLine2
Call BigDel
Movlw 1h
Call LCDins
Call BigDel
Movlw 4h
Call MessLine1
Call BigDel
Movlw 1h
Call LCDins
Call BigDel
Movlw 5h
Call MessLine1
Call BigDel
Movlw 1h
Call LCDins
Call BigDel
Movlw 6h
Call MessLine1
Call BigDel
Movlw 1h
Call LCDins
Call BigDel
Movlw 7h
Call MessLine1
Call BigDel
Movlw 1h
Call LCDins

Call BigDel
Movlw 8h
Call MessLine1
Call BigDel
Movlw 1h
Call LCDins
Call BigDel
Goto Loop
ISR bcf INTCON,INTF
Btfss PORTB,3
Call LED
Btfsc PORTB,3
Call SERVO
Retfie
LED
Movlw 9h
Call MessLine1
Movlw 0ah
Call MessLine2
Btfss PORTA,0
Goto main
call BigDel
Loop1
btfss PORTA,0
Goto main
goto loop1
SERVO
Movlw 9h
Call MessLine1
Movlw 0bh

Call MessLine2
Btfss PORTA,0
Goto main
call BigDel
Loop2
btfss PORTA,0
Goto main
goto loop2


;
Phần IV: ứng dụng
45

; Truyền dữ liệu đến LCD
;
;
MessLine1
Movwf MessNummovlw 0x80
Goto InMess
MessLine2
Movwf MessNummovlw 0xC0
InMess call LCDins
Movf MessNum,W
Message number
addwf PCL,F
Goto Mess0 ; message 0
Goto Mess1 ; message 1
Goto Mess2
Goto Mess3

Goto Mess4
Goto Mess5
Goto Mess6
Goto Mess7
Goto Mess8
Goto Mess9
Goto Mess10
Goto Mess11
;
; MESSAGE 0
;
;
Mess0 movlw High(Message0) ; get
ROM page

if Simulating == 1
Addlw 8h
Endif

movwf MessAddH ; temp store
it
movlw Low(Message0) ; get
page offset
goto ContMess
;
;
; MESSAGE 1
;
;
Mess1 movlw High(Message1) ; get

ROM page

if Simulating == 1
addlw 8h
endif

movwf MessAddH ; temp store it
movlw Low(Message1) ; get page offset
goto ContMess
Mess2 movlw High(Message2) ; get
ROM page
if Simulating == 1
addlw 8h
endif

movwf MessAddH ; temp store it
movlw Low(Message2) ; get page offset
goto ContMess
;
;
; MESSAGE 1
;
;
Mess3 movlw High(Message3) ; get
ROM page
if Simulating == 1
addlw 8h
endif
movwf MessAddH ; temp store it
movlw Low(Message3)

Mess4 movlw High(Message4)
if Simulating == 1
addlw 8h
endif
movwf MessAddH
movlw Low(Message4)
goto ContMess
;
;
; MESSAGE 1
;
;
Mess5 movlw High(Message5)
if Simulating == 1
Phần IV: ứng dụng
46

addlw 8h
endif
movwf MessAddH
movlw Low(Message5)
goto ContMess
Mess6 movlw High(Message6)

if Simulating == 1
addlw 8h
endif
movwf MessAddH
movlw Low(Message6)
offset

goto ContMess
;
;
; MESSAGE 1
;
;
Mess7 movlw High(Message7)
if Simulating == 1
addlw 8h
endif

movwf MessAddH
movlw Low(Message7)
goto ContMess
Mess8 movlw High(Message8)
if Simulating == 1
addlw 8h
endif

movwf MessAddH ; temp store
it
movlw Low(Message8) ; get
page offset
goto ContMess
;
;
; MESSAGE 1
;
;
Mess9 movlw High(Message9) ; get

ROM page

if Simulating == 1
addlw 8h
endif

movwf MessAddH ; temp store
it
movlw Low(Message9) ; get page offset
goto ContMess
Mess10 movlw High(Message10) ;
get ROM page
if Simulating == 1
addlw 8h
endif
movwf MessAddH ; temp store it
movlw Low(Message10) ; get page
offset
goto ContMess
;
;
; MESSAGE 1
;
;
Mess11 movlw High(Message11) ;
get ROM page
if Simulating == 1
addlw 8h
endif
movwf MessAddH ; temp store it

movlw Low(Message11) ; get page offset
ContMess movwf MessAddL ;
temp store it
;
;
; Nhận dữ liệu và hiển thò trên LCD
;
;
clrf StrPtr ; zero the character offset
MessLoop call Messages ; get the
character
movwf temp ; temp store the character
movlw High($) ; restore PCLATH
for this ROM page
if Simulating == 1
addlw 8h
endif
Phan IV: ửựng duùng
47

movwf PCLATH
movf temp,W
xorlw 0h ; test if zero byte
btfsc STATUS,Z
return ; yes, all done

call LCDdata ; send character to display
incf StrPtr,F ; set ready for next
character
goto MessLoop ; get next character

;
;
; CHARACTER ADDRESS
CALCULATOR
;
;
Messages movf MessAddH,W ; high
address byte to PCLATH
movwf PCLATH
movf MessAddL,W ; get low
address byte
addwf StrPtr,W ; add
character offset
btfsc STATUS,C ; test carry
incf PCLATH,F ; overflow -
increment PCLATH
movwf PCL ; low byte to
PCL
;
;
; OUTPUT 1 INSTRUCTION BYTE TO
DISPLAY - 4 BIT MODE
;
;
LCDins movwf temp ; temp save
instruction
andlw 0xF0 ; send high nibble
first
movwf PORTB ; send it
call Clock

bsf PORTB,lcdE ; (1) clock it in
call Clock
bcf PORTB,lcdE ; (1)
call Clock

btfss Flag1,LCDmd ; test if
sending byte or 2 nibbles
goto bits8 ; 1 nibble

swapf temp,W ; now send lower
nibble
andlw 0xF0
movwf PORTB ; send it
call Clock
bsf PORTB,lcdE ; (5) enable
instruction
call Clock
bcf PORTB,lcdE ; (5)
bits8 clrf DelayL
movlw 8h
movwf DelayH
ctlp1 decfsz DelayL,F
goto ctlp1
decfsz DelayH,F
goto ctlp1
return
;
;
; Xuaỏt 2 byte ra maứn hỡnh
;

;
LCDdata
movwf temp ; temp save data
andlw 0xF0 ; send high nibble first
movwf PORTB
call Clock
bsf PORTB,lcdRS ; (0) Write "data"
call Clock
bsf PORTB,lcdE ; (1) clock it in
call Clock
bcf PORTB,lcdE ; (1)
call Clock
swapf temp,W ; now send lower nibble
andlw 0xF0
movwf PORTB
call Clock
bsf PORTB,lcdRS ; (0) Write "data"
call Clock
bsf PORTB,lcdE ; (5) enable
instruction
Phần IV: ứng dụng
48

call Clock
bcf PORTB,lcdE ; (5)
return
;
;
; Đònh nghóa tần số dao động
;

;
Clock movlw 40h
movwf DelayL
kdloop decfsz DelayL,F
goto kdloop
return
;
;
; khởi tạo thời gian nhấp nháy ~ 0.5s
;
;
BigDel clrf DelayL
clrf DelayM
movlw 5h
movwf DelayH
BDloop decfsz DelayL,F
goto BDloop
decfsz DelayM,F
goto BDloop
decfsz DelayH,F
goto BDloop
return
;
;
; chuỗi
;
;
Message0 DT " DO AN DKHT ",
0h
Message1 DT "DE TAI: PIC16F84",

0h
Message2 DT " GVHD ",0h
Message3 DT "KS VO TUONG
QUAN" ,0h
Message4 DT " NHOM THUC HIEN
",0H
Message5 DT " DINH PHUONG
TAN",0H
Message6 DT " NG. CHINH PHUC
",0H
Message7 DT " VUONG QUOC
VIET",0H
Message8 DT " TIEU BAO TRAN
",0H
Message9 DT " DIEU KHIEN ",0H
Message10 DT " LED NHAP NHAY
",0H
Message11 DT " DONG CO SERVO
",0H
End
Phaàn IV: öùng duïng
49


 Chöông trình cho IC2
list p=16F84A ; list directive to
define processor
#include <p16F84A.inc> ;
processor specific variable definitions
__CONFIG _CP_OFF &

_WDT_OFF & _PWRTE_ON &
_XT_OSC
cblock 0x0c
TMP0
TMP1
TMP2
CNT
endc

org 0x00
goto main
org 0x04
goto ISR
main
banksel TRISA
movlw b'00010001' ; RA0,RA4 is input
movwf TRISA
movlw b'00001001'; RB0,RB3 = INPUT
movwf TRISB
banksel PORTA
clrf PORTA
clrf PORTB
movlw b'10110010'
movwf OPTION_REG
bsf INTCON,INTE
bsf INTCON,GIE
goto main
ISR
bcf INTCON,INTF
btfss PORTB,3

goto LED
btfsc PORTB,3
goto SERVO
LED
banksel PORTB
movlw b'00000010'
call blink
btfss PORTA,0
goto main
movlw b'00000100'
call blink
btfss PORTA,0
goto main
movlw b'00010000'
call blink
btfss PORTA,0
goto main
movlw b'00100000'
call blink
btfss PORTA,0
goto main
movlw b'01000000'
call blink
btfss PORTA,0
goto main
movlw b'00100000'
call blink
btfss PORTA,0
goto main
movlw b'00010000'

call blink
btfss PORTA,0
goto main
movlw b'00000100'
call blink
btfss PORTA,0
goto main
movlw b'00000010'
call blink
btfss PORTA,0
goto main
movlw b'00000110'
call blink
btfss PORTA,0
goto main
movlw b'00010110'
call blink
btfss PORTA,0
goto main
movlw b'00110110'
call blink
btfss PORTA,0
goto main
Phaàn IV: öùng duïng
50

movlw b'01110110'
call blink
btfss PORTA,0
goto main

movlw b'00110110'
call blink
btfss PORTA,0
goto main
movlw b'00010110'
call blink
btfss PORTA,0
goto main
movlw b'00000110'
call blink
btfss PORTA,0
goto main
movlw b'00000010'
call blink
btfss PORTA,0
goto main
movlw b'01010010'
call blink
btfss PORTA,0
goto main
movlw b'00100100'
call blink
btfss PORTA,0
goto main
movlw b'01010010'
call blink
btfss PORTA,0
goto main
movlw b'00100100'
call blink

btfss PORTA,0
goto main
movlw b'01010010'
call blink
btfss PORTA,0
goto main
movlw b'00100100'
call blink
btfss PORTA,0
goto main
goto LED
SERVO
nop
PHAI
movlw .2
movwf CNT
movlw b'00001100'
movwf PORTA
call DEL
btfss PORTA,0
goto main
call DEL
clrf PORTA
PH1
movlw .12
movwf TMR0
loop1
btfsc TMR0,7
goto Cont1
lp1

bsf PORTA,2
bsf PORTB,7
btfss PORTA,0
goto main
goto loop1
Cont1
btfss TMR0,6
goto lp1
goto Ctr
Ctr
decfsz CNT,1
goto PH1
goto TRAI
TRAI
bcf PORTB,7
movlw b'00001100'
movwf PORTA
call DEL
btfss PORTA,0
goto main
call DEL
clrf PORTA
movlw .2
movwf CNT
TR1
movlw .12
Phaàn IV: öùng duïng
51

movwf TMR0

loop2
btfsc TMR0,7
goto Cont2
lp2
bsf PORTA,3
bsf PORTA,1
btfss PORTA,0
goto main
goto loop2
Cont2
btfss TMR0,6
goto lp2
goto Ctr2
Ctr2
decfsz CNT,1
goto TR1
goto PHAI
blink
movwf PORTB
call DEL
return
DEL
MOVLW 0x02 ;2 DEC
MOVWF TMP2
MOVLW 0x0E5 ;229 DEC
MOVWF TMP1
MOVLW 0x0D9 ;217 DEC
MOVWF TMP0
DECFSZ TMP0,F
GOTO $-1

DECFSZ TMP1,F
GOTO $-5
DECFSZ TMP2,F
GOTO $-9
return

end

×