TỔNG QUAN VỀ VI ĐIỀU KHIỂN VÀ HIỂN THỊ TRÊN LED 7 ĐOẠN
VI ĐIỀU KHIỂN
Hiện nay, bộ vi điều khiển 8 bits họ 8051 được cung cấp bởi nhiều nhà sản xuất như Intel, Atmel, và Philips Tuy nhiên, về mặt tính năng và công năng, bộ vi điều khiển PIC vượt trội hơn hẳn so với 89, nhờ vào việc tích hợp nhiều module như ADC 10 bits, PWM 10 bits, PROM 256 Bytes, COMPARATER và VERF.
Vi điều khiển PIC, với chuẩn PI công nghiệp, nổi bật hơn so với chuẩn PC dân dụng Nhiều nhà sản xuất phần mềm đã phát triển các ngôn ngữ lập trình hỗ trợ cho PIC, bao gồm CCSC cho ngôn ngữ C, MirkoBasic cho ngôn ngữ Basic, bên cạnh ngôn ngữ Assembly truyền thống Trong đề tài này, chúng tôi chọn vi điều khiển PIC16F877A làm bộ điều khiển chính để thực hiện đo lường điện và thiết bị đo điện-điện tử 100%.
1.1.1 Sơ đồ khối và bảng mô tả chức năng các chân của PIC16F877A:
Hình 1.2 Sơ đồ khối của PIC 16F877A
1.1.2 Bảng mô tả chức năng các chân của PIC16F877A:
OSC1/CLKIN 13 Đầu vào của xung dao động thạch anh/ngõ vào xung clock ngoại
OSC2/CLKOUT là đầu ra của xung dao động thạch anh, kết nối với thạch anh hoặc cộng hưởng trong chế độ dao động Trong chế độ RC, ngõ ra của chân OSC2 cũng được sử dụng.
1 Ngõ vào của Master Clear (Reset) hoặc ngõ vào điện thế được lập trình Chân này cho phép tín hiệu Reset thiết bị tác động ở mức thấp
RA0/AN0 2 PORTA là port vào ra hai chiều RA0 có thể làm ngõ vào tuơng tự thứ 0.
RA1/AN1 3 RA1 có thể làm ngõ vào tuơng tự thứ 1
4 RA2 có thể làm ngõ vào tuơng tự 2 hoặc điện áp chuẩn tương tự âm
5 RA3 có thể làm ngõ vào tuơng tự 3 hoặc điện áp chuẩn tương tự dương
RA4/T0CKI 6 RA4 có thể làm ngõ vào xung clock cho bộ định thời Timer0
RA5/SS /AN4 7 RA5 có thể làm ngõ vào tương tự thứ 4 RB0/INT
PORTB là port hai chiều
RB0 có thể làm chân ngắt ngoài
RB3/PGM 36 RB3 có thể làm ngõ vào của điện thế được lập trình ở mức thấp
RB4 37 Interrupt-on-change pin
Interrupt-on-change pin hoặc In-Crcuit Debugger pin Serial programming clock
Interrupt-on-change pin hoặc In-Crcuit Debugger pin Serial programming Data
RC0/T1OSO/T1 CKI 15 PORTC là port vào ra hai chiều
RC0 có thể là ngõ vào của bộ dao động Timer1 hoặc ngõ xung clock cho Timer1
RC1/T1OSI/CC P2 16 RC1 có thể là ngõ vào của bộ dao động
Timer1 hoặc ngõ vào Capture2/ngõ ra compare2/ngõ vào PWM2.
RC2/CCP1 17 RC2 có thể ngõ vào capture1/ngõ ra compare1/ngõ vào PWM1.
RC3/SCK/SCL 18 RC3 có thể là ngõ vào xung
RC4/SDI/SDA 23 Clock đồng bộ nội tiếp/ngõ ra trong cả hai chế độ
RC4 có thể là dữ liệu bên trong SPI(chế độ SPI) hoặc dữ liệu I/O(chế độ I C) 2
RC5/SDO 24 RC5 có thể là dữ liệu ngoài SPI(chế độ
RC6/TX/CK 25 RC6 có thể là chân truyền không đồng bộ
USART hoặc đồng bộ với xung đồng hồ
RC7/RX/DT 26 RC7 có thể là chân nhận không đồng bộ USART hoặc đồng bộ với dữ liệu
PORTD là port vào ra hai chiều hoặc là parallel slave port khi giao tiếp với bus của bộ vi xử lý
RE0/ RD/AN5 8 PORTE là port vào ra hai chiều
RE0 có thể điều khiển việc đọc parrallel slave port hoặc là ngoc vào tương tự thứ 5
RE1/ WR /AN6 9 RE1 có thể điều khiển việc ghi parallel slave port hoặc là ngõ vào tương tự thứ 6
RE2/ CS /AN7 10 RE2 có thể điều khiển việc chọn parallel slave port hoặc là ngõ vào tương tự thứ 7
Cung cấp nguồn dương cho các mức logicvà những chân I/O
NC Những chân này không được nối bên trong và nó được để trống
Có 2 khối bộ nhớ trong các vi điều khiển họ PIC16F87X, bộ nhớ chương trình và bộ nhớ dữ liệu, với những bus riêng biệt để có thể truy cập đồng thời
Hình 1.3 Ngăn xếp và bản đồ bộ nhớ chương trình PIC16F877A 1.1.3.1 Tổ chức của bộ nhớ chương trình:
Vi điều khiển PIC16F877A sở hữu bộ đếm chương trình 13 bits, cho phép định vị không gian bộ nhớ chương trình lên đến 8Kb Trong khi đó, các IC PIC16F873/874 chỉ có 4Kb bộ nhớ chương trình FLASH Vectơ RESET được đặt tại địa chỉ 0000h, trong khi vectơ ngắt nằm ở địa chỉ 0004h.
1.1.3.2 Tổ chức bộ nhớ dữ liệu:
Bộ nhớ dữ liệu được phân chia thành nhiều dãy, bao gồm các thanh ghi mục đích chung và các thanh ghi chức năng đặc biệt Các bit RP1 (STATUS ) và RP0 (STATUS ) được sử dụng để lựa chọn các dãy thanh ghi.
Mỗi dãy có chiều dài 7Fh (128 bytes), với phần thấp dùng để lưu trữ các thanh ghi chức năng đặc biệt Các thanh ghi này nằm trên các thanh ghi mục đích chung, hoạt động như RAM tĩnh Thông thường, các thanh ghi đặc biệt được sử dụng từ một dãy và có khả năng ánh xạ vào những dãy khác, giúp giảm thiểu đoạn mã và tăng tốc độ truy cập.
1.1.3.3 Các thanh ghi mục đích chung:
Các thanh ghi này có thể truy cập trực tiếp hoặc gián tiếp thông qua thanh ghi FSG (File Select Register)
Hình 1.4 Các thanh ghi của PIC 16F877A 1.1.3.4 Các thanh ghi chức năng đặc biệt:
Các thanh ghi chức năng đặc biệt (Special Function Register) được sử dụng bởi CPU và các bộ nhớ ngoại vi để điều khiển các hoạt động của thiết bị Những thanh ghi này hoạt động giống như RAM tĩnh và được phân loại thành hai loại: phần trung tâm (CPU) và phần ngoại vi Danh sách các thanh ghi này được trình bày trong bảng dưới đây.
1.1.3.5 Các thanh ghi trạng thái:
Hình 1.5 Thanh ghi trạng thái (địa chỉ 03h, 83h, 103h, 183h)
Thanh ghi trạng thái lưu trữ các trạng thái số học của bộ ALU, trạng thái RESET và các bits chọn dãy thanh ghi cho bộ nhớ dữ liệu Nó có thể là đích cho bất kỳ lệnh nào, tương tự như các thanh ghi khác Nếu thanh ghi trạng thái là đích cho một lệnh ảnh hưởng đến các cờ Z, DC hoặc C, thì những bit này sẽ bị vô hiệu hóa Các bit này có thể được đặt hoặc xóa tùy thuộc vào trạng thái logic của thiết bị Ngoài ra, hai bit TO và PD không cho phép ghi, do đó kết quả của một lệnh với thanh ghi trạng thái là đích có thể khác với dự định Ví dụ, lệnh CLRF STATUS sẽ xóa 3 bit cao nhất và đặt bit Z.
Hiện tại, các bits của thanh ghi trạng thái là 000u u1uu (u = không thay đổi) Chỉ có các lệnh BCF, BSF, SWAPF và MOVWF được phép thay đổi thanh ghi trạng thái, vì chúng không ảnh hưởng đến các bit Z, DC hoặc C trong thanh ghi trạng thái Các lệnh khác không tác động đến các bits trạng thái này.
1.1.4 Hoạt động của định thời:
Bộ định thời/bộ đếm Timer0 có các đặc tính sau:
Bộ định thời/bộ đếm 8 bits
Cho phép đọc và ghi
Bộ chia 8 bits 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 sườn cho xung clock ngoài
Sơ đồ khối của bộ định thời Timer0 và bộ chia dùng chung với WDT được đưa ra trong hình 1.14
Hình 1.6 Sơ đồ bộ định thời Timer0 và bộ chia dùng chung với WDT
Chế độ định thời (Timer) được chọn bằng cách xoá bít T0CS
Trong chế độ định thời, Timer0 sẽ tăng giá trị sau mỗi chu kỳ lệnh mà không sử dụng bộ chia Tuy nhiên, nếu thanh ghi TmR0 được ghi, quá trình tăng giá trị sẽ bị dừng lại sau hai chu kỳ lệnh.
Chế độ đếm (Counter) đuợc chọn bằng cách xoá bit T0CS (OPTION_REG). Trong chế độ đếm, Timer0 sẽ tăng dần ở mỗi cạnh lên xuống của chân RA4/T0CKI
Sự tăng suờn đuợc xác định bởi bit Timer0 Source Edge Select, T0SE
(OPTION_RE) Bộ chia chỉ đ ợc dùng chung qua lại giữa bộ định thời Timer0 ƣ và bộ định thời Watchdog Bộ chia không cho phép đọc hoặc ghi
Ngắt TMR0 xảy ra khi thanh ghi TMR0 tràn từ FFh về 00h, dẫn đến việc đặt bít T0IF (INTCON) Ngắt này có thể được vô hiệu hóa bằng cách xóa bít T0IE (INTCON) Để cho phép lại ngắt này, bít T0IF cần phải được xóa trong chương trình thông qua thủ tục phục vụ ngắt của bộ định thời Timer0.
Sử dụng Timer0 với xung clock ngoại:
Khi bộ chia không hoạt động, tín hiệu clock bên ngoài sẽ tương tự như tín hiệu đầu ra của bộ chia Để đảm bảo sự đồng bộ giữa chân T0CKI và clock bên ngoài, cần lấy mẫu từ đầu ra trên chân Q2 và Q4 Do đó, chân T0CKI phải duy trì mức cao ít nhất trong 2 chu kỳ máy và mức thấp trong ít nhất 2 chu kỳ máy.
Thiết bị PIC16F87X sở hữu một bộ chia dùng chung cho TIMER0 và bộ định thời Watchdog (WDT) Bộ chia này có các hệ số chia dành riêng cho Timer0 hoặc WDT, nhưng không hỗ trợ khả năng đọc và viết Để chọn hệ số chia cho xung vào Timer0 hoặc WDT, cần thực hiện thao tác xoá hoặc đặt bit PSA trong thanh ghi OPTION_REG.
Những bit PS2, PS1, PS0 của thanh ghi OPTION_REG dùng để xác lập các hệ số chia
Bộ định thời TIMER1 là một bộ định thời/bộ đếm 16 bit, bao gồm hai thanh ghi TMR1H (byte cao) và TMR1L (byte thấp) có khả năng đọc và ghi Cặp thanh ghi này có thể đếm từ 0000h đến FFFFh, và khi số đếm chuyển từ FFFFh về 0000h, sẽ xảy ra tình trạng tràn Nếu được phép, ngắt sẽ phát ra khi có số đếm tràn và được báo qua bit cờ ngắt TMR1IF Việc cho phép hoặc cấm ngắt có thể thực hiện 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)
Việc lựa chọn một trong hai chế độ đ ợc xác định bằng cách đặt hoặc xóa bít ƣ điều khiển TMR1ON
T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON Bit7 Bit0 Bit 7, 6: Không được định nghĩa
Bit 5, 4: Bit chọn bộ chia clock cho timer1
Bit 3: Bit điều khiển cho phép bộ dao động Timer1
Bit 2: Bit điều khiển clock ngoài Timer
Bit 1: Bit chọn nguồn clock cho Timer1
Bit 0: Bit điều khiển hoạt động của Timer1
Hiển thị ra Led 7 đoạn
Led 7 đoạn là 7 đèn led được sắp xếp thành hình chữ nhật Mỗi led là một đoạn Khi mỗi đoạn chiếu sáng thì một phần của chữ số (hệ thập phân hoặc thập lục phân) sẽ được hiển thị Đôi khi có thêm led thứ 8 để biểu thị dấu thập phân khi có nhiều led 7 đoạn nối với nhau để hiển thị các số lớn hơn 10.
Led 7 đoạn là thiết bị hiển thị điện tử để hiển thị số Khi mỗi đoạn chiếu sáng thì một phần của chữ số sẽ được hiển thị Led 7 đoạn được sủ dụng rộng rãi tỏng đồng hồ số, máy tính.
LED 7 đoạn bao gồm 8 LED được kết nối song song để có thể thắp sáng hiển thị số “0, 1, 2, 3, 4, 5, 7, 8, 9, A, b, C, d, E, F, …”.
Mỗi đoạn Led được đánh dấu từ A tới G.
Đoạn thứ tám gọi là “chấm thập phân” (Decimal Point) ký hiệu DP được sử dụng khi hiển thị số không phải là số nguyên.
Dựa vào các cực được nối, có thể phân loại LED 7 đoạn như sau:
Loại dương chung (Common Anode): nếu cực dương (anode) của tất cả 8 LED được nối với nhau và các cực âm (cathode) đứng riêng lẻ.
Loại âm chung (Common Cathode): nếu cực âm (cathode) của tất cả 8 LED được nối với nhau và các cực dương (anode) đứng riêng lẻ.
Để LED sáng, cần phân cực thuận cho LED đó Để hiển thị các chữ số, chỉ cần bật sáng các LED ở vị trí tương ứng Dưới đây là bảng mô tả cách tạo ra các chữ số trên LED 7 đoạn.
Bảng mã hiển thị led 7 đoạn dành cho led 7 đoạn có Anode chung (các led đơn sáng ở mức 0):
Số hiển thị trên led
Mã hiển thị led 7 đoạn dạng nhị phân
Mã hiển thị led 7 đoạn dạng thập lục phân h g f e d c b a
Bảng mã hiển thị led 7 đoạn dành cho led 7 đoạn có Cathode chung (các led đơn sáng ở mức 1):
Số hiển thị trên led
7 đoạn Mã hiển thị led 7 đoạn dạng nhị phân
Mã hiển thị led 7 đoạn dạng thập lục phân
THIẾT KẾ BỘ ĐẾM TẦN SỐ
Mô phỏng trên proteus
Hình 2.1 Mô phỏng trên proteus.
PHẦN MỀM ĐIỀU KHIỂN
// Tên chương trình : Thiết kế bộ đếm tần số
// Mô tả phần cứng : Sử dụng PIC 16F877A – Thạch anh 20Mhz // Chân RB0 là ngõ vào.
// Tần số đuợc hiển thị lên Led 7 đoạn (4 Led)
#Fuses HS,NOWDT,NOPROTECT,NOLVP
#bit TMR1IF=0x0c.0 unsigned int8 ma7doan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; signed int32 bdn,F,xung;
#int_timer1 void ngat_timer()
{ bdn++; set_timer1(3036); if(bdn>)
#int_ext void ngat_ngoai()
The code snippet demonstrates how to display a four-digit number using a seven-segment display It extracts each digit from the variable F: the unit digit (dv) is obtained using F%10, the tens digit (chuc) is calculated with (F%100)/10, the hundreds digit (tram) is derived from (F/100)%10, and the thousands digit (ngan) is simply F/1000 Each digit is then output to the corresponding pin (pin_c0 to pin_c3) with a brief delay to ensure proper display timing This method effectively manages the output of each digit sequentially, allowing for clear visualization of the number on the display.
{ set_tris_b(0x01); set_tris_c(0x00); set_tris_d(0x00);
26 setup_timer_1(T1_internal|T1_div_by_8); set_timer1(3036); enable_interrupts(global); enable_interrupts(int_ext); enable_interrupts(int_timer1); ext_int_edge(INT_EXT_L2H); xung=0;