Lập trình tạo trễ, hiển thị led đơn, giao tiếp led 7 đoạn, phím bấm, LCD

Một phần của tài liệu giáo trình học vi điều khiển (Trang 40 - 79)

CHƯƠNG 3. LẬP TRÌNH HỢP NGỮ VỚI VI ĐIỀU KHIỂN PIC

3.5 Lập trình tạo trễ, hiển thị led đơn, giao tiếp led 7 đoạn, phím bấm, LCD

Trong thực tế viết chương trình điều khiển cho một số thiết bị ta hay tạo một khoảng thời gian trễ.

41

Ví dụ: sự kiện 1

Chờ một khoảng thời gian sự kiện 2

Vì vậy đòi hỏi ta phải có một chương trình con để tạo thời gian trễ này.

Ý tưởng để có một chương trình con tạo thời gian trễ là:

Muốn tạo ra một khoảng thời gian trễ n (micro giây) ta tạo một chương trình mà thời gian để thực hiện xong nó là n (micro giây)

Ta đã biết: một lệnh thực hiện trong 1 chu kì lệnh (trừ một số lệnh đặc biệt), một chu kì lệnh tính theo đơn vị micro giây.

Ví dụ: nếu dùng bộ dao động ngoài sử dụng thạch anh có tần số fosc=4Mhz Suy ra, chu kì lệnh= 4*chu kì xung= 4/tần số xung= 4/4Mhz=1 mico giây

Như vậy để tạo ra khoảng thời gian n micro giây đơn giản ta tạo ra một chương trình mà thời gian thực hiện nó là n chu kì lệnh

Ví dụ: để tạo thời gian trễ 20 mico giây Ta dùng 20 lệnh NOP:

NOP NOP ---

NOP

Tuy nhiên cách làm đó thì hơi thủ công, và ta cũng không có thời gian để mà đánh n dòng NOP nhƣ vậy (ví dụ: n=200.000!!!!)

Ta phải dùng các lệnh khác với thuật toán phức tạp hơn. Ta đi vào từng bước khảo sát phương pháp này.

3.5.1.1 Vòng 1 Ta có các câu lệnh sau:

decfsz vong1,F goto $-1

Trong đó vong1 là biến đã được tạo ra trước đó

42

Ta tính thử thời gian thực hiện 2 lệnh trên:

Hình 3.2: Thuật toán

Như đã bàn ở các mục trước lệnh goto mất 2 chu kì lệnh, lệnh DECFSZ f,z mất 1 chu kì lệnh khi f #0 và mất 2 chu kì lệnh khi f=0

Giả sử ban đầu:

Vong1=2.

Lần 1: decfsz vong1,f -> vong1=1 -> vong1#0 (mất 1 chu kì lệnh) Goto $-1 (mất 2 chu kì lệnh)

Lần 2: dectsz vong1, f -> vong1=0 chương trình bỏ qua lệnh goto -> thoát (mất 2 chu kì lệnh)

Nhƣ vậy mất tổng cộng: (1+2)+2= 5 chu kì lệnh Giả sử ban đầu:

Vòng 1=3:

Lần 1: decfsz vong1,f -> vong1=2 -> vong1#0 (mất 1 chu kì lệnh) Goto $-1 (mất 2 chu kì lệnh)

Số chu kì lệnh mất= 3 chu kì lệnh

Lần 2: decfsz vong1,f -> vong1=1 -> vong1#0 (mất 1 chu kì lệnh) Goto $-1 (mất 2 chu kì lệnh)

Số chu kì lệnh mất = 3 chu kì lệnh

Lần 2: dectsz vong1, f -> vong1=0 chương trình bỏ qua lệnh goto -> thoát Vong1=vong1-1

Vong1=0?

Thoát YES

NO

43

Số chu kì lệnh mất = 2 chu kì lệnh Tổng số chu kì lệnh mất = 3*2 +2

Cứ nhƣ vậy thì có thể qui nạp lệnh

Số chu kì lệnh mất tổng cộng với một giá trị của biến vong1 là:

3* (vong1-1) +2 =3*vong1-1 (1)

(3 chu kì lệnh cho (vong1-1) lần đầu và 2 chu kì lệnh cho lần cuối) Số chu kì lệnh tối thiểu và tối đa tạo trễ đƣợc.

- Khi vong1=1: số chu kì lệnh= 2

- Khi vong1=0: số chu kì lệnh= 3*256-1= 767 3.5.1.2 Vòng 2

Ta có đoạn lệnh sau:

decfsz vong1,F goto $-1

decfsz vong2,F goto $-3

Thuật toán:

Giả sử ban đầu:

Vong1=3, vong2=3

Vong1=vong1-1

Vong1=0?

Thoát YES

NO Vong1=0?

Vong2=0?

Vong2=vong2-1

NO YES

44

Như đã phân tích trong mục 3.10.1, số chu kì lệnh mất cho đến khi chương trình bắt đầu xử lý vong2 (tương đương với số chu kì lệnh mất cho đến khi nhảy đến thoát trong mục 3.10.1) là: 3*vong1 -1 chu kì lệnh

Đến đây vong1=0, xử lý tiếp vong2

Lần 1: decfsz vong2,f : vong2=vong2-1=3-1=2, vong2#0 nhảy đến goto $-3 (mất 1 chu kì lệnh)

Goto $-3 nhảy đến lệnh decfsz vong1,f (mất 2 chu kì lệnh) Tổng chu kì lệnh mất = 3 chu kì lệnh

Tới lệnh: decfsz vong1,f (vong1 bây giờ đang =0) Xem nhƣ đây là chu trình giống mục 3.10.1 với vong1=0

Suy ra cho đến khi gặp lại decfsz vong2,f mất: 3*256-1=767 chu kì lệnh Nhƣ vậy tổng số chu kì lệnh cho lần 1 là 767+3= 770 chu kì lệnh

Lần 2: decfsz vong2,f : vong2=vong2-1=2-1=1, vong2#0 nhảy đến goto $-3 Tương tự như trên:

tổng số chu kì lệnh cho lần 2 là 767+3= 770 chu kì lệnh

Lần 3: decfsz vong2,f : vong2=vong2-1=1-1=0, vong2=0 nhảy đến thoát (mất 2 chu kì lệnh)

Nhƣ vậy tổng chu kì lệnh mất đi là:

3*vong1-1 + 770*2 +2 Qui nạp lên:

3*vong1-1 + 770*(vong2-1) +2= 3*vong1 +770*vong2 -769 Vậy số chu kì lệnh = 3*vong1 +770*vong2 -769 (2)

3.5.2 Vòng 3:

Ta có đoạn lệnh sau:

decfsz vong1,F goto $-1

decfsz vong2,F goto $-3

decfsz vong3,F

45

goto $-5

Thuật toán:

Hình 3.3: Thuật toán delay 3 vòng Tính toán tương tự như trên, ta có công thức:

Số chu kì lệnh= 3*vong1+ 770*vong2 + 197122*vong3 - 197889 (3) Vong1=vong1-1

Vong1=0?

Thoát YES Vong1=0? NO

Vong2=0?

Vong2=vong2-1

NO YES

Vong3=vong3-1

Vong3=0?

YES

NO

46

Ta cũng cần chú ý ở đây nữa là để nạp giá trị đầu cho biến vong1 ta mất 2 chu kì lệnh cho 2 lệnh sau:

Movlw d‟ giá trị đầu (ví dụ: movlw d‟100) Movwf vong1

Tương tự như vậy nếu dùng vòng 2 ta sẽ mất thêm 2 lệnh cho việc khởi tạo giá trị đầu biến vong2 nhƣ vậy mất 4 chu kì lệnh

Tương tự như vậy nếu dùng vòng 3 ta sẽ mất thêm 2 lệnh cho việc khởi tạo giá trị đầu biến vong3 nhƣ vậy mất 6 chu kì lệnh

Ta phải gọi chương trình con tạo thời gian trễ: call delay mất thêm 2 chu kì lệnh Trong chương trình con delay có lệnh trở về return mất thêm 2 chu kì lệnh.

Nhƣ vậy công thức tổng quát cuối cùng là:

- Nếu chỉ sử dụng vòng 1:

Số chu kì lệnh = 3*vong1-1+2 (cho khởi tạo biến vong1) +2 (cho lệnh call delay) +2 (cho lệnh return)

Số chu kì lệnh= 3*vong1+5 (4) - Nếu sử dụng vòng 1 và vòng 2:

Số chu kì lệnh = 3*vong1 +770*vong2 -769 +4 (cho khởi tạo biến vong1, vong2) +2 (cho lệnh call delay) +2 (cho lệnh return)

Số chu kì lệnh= 3*vong1+770*vong2-761 (5) - Nếu sử dụng cả 3 vòng 1, vòng 2 và vòng 3:

Số chu kì lệnh = 3*vong1+ 770*vong2 + 197122*vong3 - 197889 +6 (cho khởi tạo biến vong1, vong2, vong3) +2 (cho lệnh call delay) +2 (cho lệnh return)

Số chu kì lệnh= 3*vong1+ 770*vong2 + 197122*vong3 -197879 (6)

Tính toán:

Giả sử ta dùng bộ dao động thạch anh f=4Mhz, cho chân rb0 lên mức 1, tạo thời gian trễ 200ms, cho chân rb0 xuống mức 0.

Thời gian trễ ở đây là 200ms.

Giả sử ta áp dụng thuật toán 3 vòng.

47

200ms= 200.000 micro giây= 200.000 chu kì lệnh Áp dụng công thức (6) ta có:

3*vong1+ 770*vong2 + 197122*vong3 -197879 = 200.000 Suy ra:

3*vong1+ 770*vong2 + 197122*vong3 = 397897 Vong3= 397897/197122= 2

3*vong1+770*vong2= 397897-197122*vong3= 397897-197122*2=3653 Suy ra:

Vong2= 3653/770=4

3*vong1=3643-770*vong2=563 Suy ra: vong1=563/3=187 Số dƣ= 563-3*187=2 Nhƣ vậy:

200.000= 3*187 +770*4+197122*2 +2 Số 2 dƣ ra ta dùng 2 lệnh NOP

Chương trình chính và chương trình con delay sẽ như sau:

; DUA FILE LIET KE VAO

#include p16f877a.inc

; KHAI BAO CAU HINH

__CONFIG _HS_OSC & _WDT_OFF &_LVP_OFF

; KHAI BAO BIEN O DAY

; DIA CHI BIEN O VUNG NHO BIEN BANK0 cblock 0x21

vong1, vong2, vong3 endc

variable giatricong=0x25

;CHUONG TRINH VI DIEU KHIEN CHAY TAI DAY org 0x000; CHI DAN BIEN DICH

48

; NHAY TOI CHUONG TRINH CHINH goto main

; chi dan bien dich

; CHUONG TRINH CHINH BAT DAU TU DAY org 0x005

main

banksel trisb clrf trisb

banksel PORTB START:

BSF PORTB,0 CALL DELAY BCF PORTB,0 CALL DELAY GOTO START DELAY:

nop nop

movlw d'187 movwf vong1 movlw d'4

movwf vong2 movlw d'2

movwf vong3 decfsz vong1,f goto $-1 decfsz vong2,f goto $-3 decfsz vong3,f

49

goto $-5

; THOAT KHOI CHUONG TRINH CON return

; KET THUC MOI CHUONG TRINH end

3.5.2 Hiển thị bằng led đơn

Thông thường cách hiển thị này dùng để báo một trạng thái nào đấy của thiết bị như trạng thái làm việc của nguồn (lỗi hoặc không lỗi), cũng nhƣ các khối chức năng khác.

Có rất nhiều loại led đơn dùng để hiển thị. Phương pháp đơn giản như sau:

Hình 3.4: Hiển thị led đơn Các led này sáng khi đƣợc cấp áp cỡ 2 V, dòng 10-20mA.

Nếu dùng một chân ra từ vi điều khiển để bật tắt led, phải dùng thêm điện trở hạn dòng,hạn áp.

Tính toán như sau:

Muốn bật đèn, ta cho chân ra vi điều khiển lên mức cao nối với đầu vào của mạch trên.

Nhƣ ta biết, chân ra vi điều khiển ở mức logic cao có điện áp 5V.

Cho điện áp rơi trên led là 2V, dòng qua là 15mA.

Suy ra, điện áp rơi trên trở là 3V. Dòng qua led chính là dòng qua điện trở và bằng 15mA.

Suy ra, điện trở dùng: R=3/15mA=200 ohm.

50

Chọn điện trở tiêu chuẩn 220 ohm

(Điện trở tiêu chuẩn: 10, 11, 12, 13, 15, 16, 18, 20, 22, 24, 27, 30, 33, 36, 39, 43, 47, 51, 56, 62, 68, 72, 82, 91 và các bội số)

3.5.2 Hiển thị bằng led bảy đoạn 3.5.2.1 Cấu tạo của led 7 đoạn

Hình 3.5: Led 7 đoạn

Một led 7 đoạn thực ra là gồm 7 led đơn nối với nhau (8 led đơn nêu có thêm dấu chấm- dp).

Có 2 loại:

- Chung catod: các đầu catod (cực âm) đƣợc nối chung với nhau và nối với đất, các đầu anod a,b,c,d,e,f,g,h đƣợc đƣa ra ngoài (các chân) nhận tín hiệu điều khiển. Khi cấp điện áp 5v cho mỗi đầu anod, led tương ứng với đầu đó sẽ sáng

- Chung anod: các đầu anod (cực âm) đƣợc nối chung với nhau và nối với nguồn, các đầu catod a,b,c,d,e,f,g,h đƣợc đƣa ra ngoài (các chân) nhận tín hiệu điều khiển.

Muốn led đơn nào sáng chỉ việc đưa chân catod của led tương ứng xuống mức 0V.

51

Hình 3.6: Cấu tạo của 2 loại led 7 đoạn 3.5.2.2 Hiển thị 1 led 7 đoạn dùng vi điều khiển

Hình 3.7: Mạch kết nối vi điều khiển 1 led 7 đoạn

Nhƣ đã giới thiệu ở phần trên, thực chất led 7 đoạn gồm 8 hoặc 7 led đơn nối với nhau.

Vì vậy để điều khiển thanh led đơn sáng, cách thực hiện phần cứng nhƣ hình 2.1.

Cụ thể hơn, nhƣ dùng led chung anod nhƣ hình vẽ trên. Mỗi đầu vào a,b,c,d,e,f,g,h đƣợc nối với một chân của vi điều khiển, tương ứng là RB0, RB1, ..RB7, thông qua các điện trở phân áp 200 ohm, đầu anod chung đƣợc nối với nguồn. Để led đơn sáng đơn giản ta đƣa chân vi điều khiển nối với led đó xuống mức thấp.

52

Nhƣ trên hình 2.4 trên, để led 7 đoạn hiển thị số 2 thì các led a,b,d,e,g sáng; các led c, f tắt. Giá trị sáng tương ứng chân vi điều khiển nối vào ở mức 0, giá trị tắt tương ứng với chân vi điều khiển nối với ở mức 1.

Do đó nội dung của thanh ghi PORTB là:

0 0 1 0 0 1 0 0

Đây là mã led 7 đoạn của số 2

Như vậy, chúng ta lưu ý một điều rằng, dữ liệu xuất ra led 7 đoạn là mã led tương ứng với số cần xuất

Mã led tương ứng với các số từ 0 đến 9 là:

0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 Cách điều khiển led 7 đoạn chung catod thì ngƣợc lại.

3.5.2.3 Hiển thị nhiều led 7 đoạn dùng vi điều khiển Trong thực tế, ta phải dùng nhiều led 7 đoạn để hiển thị.

Vậy giải quyết việc hiển thị nhiều led nhƣ thế nào?

Ví dụ: để hiển thị số 35 bằng 2 led 7 đoạn.

Đối chiếu với cách hiển thị 1 led 7 đoạn, ta nghĩ đơn giản chỉ là dùng 1 cổng hiển thị số 3, 1 cổng khác hiển thị số 5.

Nhƣ vậy ta mất 2 cổng. Hiển thị 4 led thì mất 4 cổng => toàn bộ chân trên vi điều khiển dùng cho việc hiển thị led…Không còn chân để giao tiếp với các thiết bị khác nhƣ bàn phím, đầu vào số khác v.v Không khả thi!

Ta có phương pháp tiết kiệm chân hơn để giải quyết:

53

Hình 3.8: Hiển thị 2 led 7 đoạn

Các chân dữ liệu (chân sẽ nhận mã led từ vi điều khiển) được nối tương ứng với nhau và nối vào 1 cổng của vi điều khiển, chẳng hạn nhƣ cổng B

Chân nguồn của 2 led đƣợc điều khiển bởi 2 chân trên vi điều khiển, chằng hạn chân RA4 và RA5 nhƣ trên hình, thông qua cực B của 2 transistor pnp.

Quá trình hiển thị con số 35 trên 2 led sẽ nhƣ sau:

- Cho chân RA4 (chân nối với led hàng chục) xuống mức thấp, transistor thứ nhất mở do tiếp giáp BE thuận, chân RA5 lên mức cao (chân nối với led hàng đơn vị), transistor thứ hai không mở. Vậy chỉ có led hàng chục đƣợc cấp nguồn.

- Cho cổng B xuất dữ liệu mã led của số 3. Chỉ có led hàng chục đƣợc cấp nguồn nên chỉ có led này sáng

- Tạo thời gian trễ 10-20ms

- Điều khiển tương tự cho led hàng đơn vị được cấp nguồn, led hàng chục không cấp nguồn, xuất dữ liệu mã led số 5 ra cổng B. Led đơn vị hiển thị số 5.

- Tạo thời gian trễ 10-20ms - Quay lại bước thứ nhất

54

Nhƣ vậy, số 3 hiển thị 10ms, số 5 hiển thị 10ms và quay vòng nhƣ vậy. Thời gian này rất nhanh, do hiệu ứng của mắt, ta cảm giác nhƣ số 35 hiển thị cùng lúc. Bài toán đƣợc giải quyết, ta chỉ mất có 10 chân để điều khiển 2 led.

Cách hiển thị nhiều led cũng tương tự như vậy.

Cũng giải thích thêm lí do dùng transistor nối vào RA4, RA5. Do chân vi điều khiển có dòng khoảng vài chục mA, đây là chân cấp nguồn cho led 7 đoạn, mỗi led đơn trong Led 7 đoạn mất 20mA vây cả led 7 đoạn mất trên 100mA. Vì vậy ta phải dùng transistor để khuếch đại dòng.

3.5.3 Hiển thị dùng LCD

Hình 3.9: Các chân LCD 3.5.3.1 Các chân cơ bản của LCD 2 dòng 16 kí tự

• VSS: Chân đất

• VCC: Chân nguồn

• VEE: Chân hiệu chỉnh độ sáng của LCD

• RS:

– =0: LCD sẽ nhận lệnh từ vi điều khiển

D 7 1 4 D 6 1 3 D 5 1 2 D 4 1 1 D 3 1 0 D 2 9 D 1 8 D 0 7

E 6 R W 5 R S 4

V S S 1 V D D 2 V E E 3

LCD1

LM016L

55

– =1: LCD sẽ nhận kí tự từ vi điều khiển để hiển thị

• R/W:

– =1: Vi điều khiển đọc dữ liệu từ LCD – =0: Vi điều khiển ghi dữ liệu lên LCD

Thông thường Vi điều khiển chủ yếu ghi dữ liệu lên LCD nên chân này thường nối đất

• E: Chân cho phép (Enable). Sau khi lệnh hoặc dữ liệu đã đƣợc chuẩn bị trên đường dữ liệu, tạo xung mức cao-mức thấp sẽ bắt đầu quá trình LCD nhận dữ liệu hoặc lệnh từ vi điều khiển.

• D0-D7: các chân dữ liệu, nơi vi điều khiển truyền lệnh hoặc dữ liệu lên LCD.

3.5.3.2 Khởi tạo LCD

LCD có nhiều độ làm việc, có thể kể ra nhƣ sau:

- Chế độ 1 dòng hay 2 dòng - Chế độ giao tiếp 4 bit hay 8 bit - Chế độ font 5*8 hoặc 5*10

- Ngoài ra còn có thể thay đổi vị trí hiển thị kí tự v.v

Vì vậy, trước khi bắt đầu quá trình hiển thị một chuỗi kí tự nào đó, ta cần quá trình khởi tạo để

cài đặt các chế độ này. Vi điều khiển thực hiện quá trình khởi tạo này bắt cách ghi đến LCD một chuỗi các lệnh.

Căn cứ vào chức năng của các chân vi điều khiển đƣợc giới thiệu ở trên, ta đƣa ra qui trình của việc gửi một lệnh từ Vi điều khiển đến LCD:

- Cho chân R/W=0 để xác định đây là ghi xuống LCD (thông thường chân này được nối đất, nên mặc định chân này ở mức 0, ta không cần quan tâm đến nữa)

- Cho chân RS=0 để xác định đây là lệnh mà vi điều khiển gửi xuống LCD (phân biệt với RS=1, gửi kí tự hiển thị)

56

- Gửi mã lệnh xuống LCD theo các đường dữ liệu (RD0-RD7 nếu dùng chế độ 8 bit, R4-R7 nếu dùng chế độ 4 bit)

- Đƣa chân E (chân cho phép- Enable) lên mức cao, mức 1 - Tạo trễ vài chu kì lệnh

- Đƣa chân E xuống mức thấp, mức 0

Mã lệnh nhƣ đã giới thiệu trong phần trên tùy thuộc vào từng lệnh, ở đấy giới thiệu một số lệnh cơ bản nhƣ sau:

. Lệnh cài đặt chế độ làm việc:

0 0 1 DL N F - -

• DL:

– = 1: 8 bit – = 0: 4 bit

• N:

– = 1: 2 dòng – = 0 1 dòng

• F:

– = 1: font 5x10 dot – = 0: font 5x8 dot

. Lệnh đặt chế độ tăng giảm địa chỉ:

0 0 0 0 0 1 I/D S

• I/D:

– = 1 tăng địa chỉ – = 0 giảm địa chỉ

57

• S:

– =1: Cài đặt di chuyển cùng địa chỉ . Lệnh đặt chế độ hiển thị:

0 0 0 0 1 D C B

• D: Cho phép hiển thị

• C: cài đặt hiển thị con trỏ

• B: nhấp nháy vị trí kí tự . Lệnh đặt vị trí hiển thị của kí tự:

1 ĐC ĐC ĐC ĐC ĐC ĐC ĐC

• Địa chỉ dòng 1: 00- 0F

• Địa chỉ dòng 2: 40-4F

Vì vậy, muốn hiển thị đầu dòng thứ nhất, mã lệnh sẽ là 0x80 muốn hiển thị đầu dòng thứ hai, mã lệnh sẽ là 0xC0 . Lệnh xóa màn hình: mã lệnh 0x01

. Lệnh trở về đầu dòng thứ nhất: mã lệnh 0x02 Chi tiết có thề xem datasheet đi kèm

3.5.3.3 Ghi kí tự lên LCD để hiển thị

Sau khi thực hiện quá trình khởi tạo để gửi các lệnh cài đặt chế độ làm việc cùa LCD, kí tự sẽ đƣợc hiển thị lên LCD bất kì khi nào vi điều khiển muốn gửi.

Quá trình gửi kí tự gồm các bước sau:

- Cho chân R/W=0 để xác định đây là ghi xuống LCD (thông thường chân này được nối đất, nên mặc định chân này ở mức 0, ta không cần quan tâm đến nữa)

- Cho chân RS=1 để xác định đây là kí tự mà vi điều khiển gửi xuống LCD (phân biệt với RS=0, gửi lệnh)

58

- Gửi mã ascii của kí tự cần hiển thị xuống LCD theo các đường dữ liệu (RD0- RD7 nếu dùng chế độ 8 bit, R4-R7 nếu dùng chế độ 4 bit)

- Đƣa chân E (chân cho phép- Enable) lên mức cao, mức 1 - Tạo trễ vài chu kì lệnh

- Đƣa chân E xuống mức thấp, mức 0

Câu hỏi 1: Lý do vì sao chúng ta lại dùng transistor trong cách nối vi điều khiển với 2 led 7 đoạn và cách tính toán mạch nhƣ thế nào?:

Nếu chúng ta không dùng transistor. Sơ đồ nhƣ sau:

Hình 3.10: Mạch kết nối vi điều khiển 2 led 7 đoạn

Trong đó các chân a,b,c,d,e,f,g,h của cả 2 led 7 đoạn sẽ nối tương ứng với nhau cùng nối vào rb0,rb1..rb7 thông qua điện trở 220 ohm

Nhƣ ta đã biết, 1 led 7 đoạn gồm 8 led đơn bên trong. Với loại led chung anod nhƣ trên ta vẽ lại sơ đồ điện của từng led 7 đoạn nhƣ sau:

59

Hình 3.11: Mô hình hóa 8 led đơn của led 7 đoạn

Nhƣ vậy dòng đi từ chân RA0 lớn nhất khi tấc cả các led đơn a,b,...g,h của led 7 đoạn đều sáng.

Khi đó các chân a,b,c...g,h nối đất

60

Hình 3.12: Tính toán giá trị điện trở kết nối Ta tính dòng chảy ra từ RA0:

Giả sử điện áp đổ trên mỗi led là 1.5 V. RA0 mức 1 tương ứng 5 V Suy ra áp đổ trên R1 là : U(R1)=5-1.5=3.5V

Suy ra dòng chảy qua R1 và led là: I (led)= U(R1)/R1=3.5/220=15.9mA Dòng chảy ra từ chân RA0:

I(RA0)= 8 I(led)=8*15.9= 127mA

Điều này không thể đƣợc vì mỗi chân của vi điều khiển pic16f877a cho dòng ra tối đa cho phép là vài chục mA.

Để giải quyết vấn đề này, ta phải dùng transistor để khuếch đại, khi đó tín hiệu ra từ RA0 chỉ là tín hiệu điều khiển. Dòng đổ đến led sẽ do nguồn trực tiếp cấp

Sơ đồ nhƣ sau:

Một phần của tài liệu giáo trình học vi điều khiển (Trang 40 - 79)

Tải bản đầy đủ (PDF)

(155 trang)