- Các thành phần bắt buộc:
- Sơ đồ mạch:
- Sử dụng TIMER của 8051 để đo tần số:
- 555 Bộ hẹn giờ làm nguồn tần số:
- Làm việc và Giải thích mã:
Tần số được định nghĩa là số chu kỳ trên giây. Nó cũng có thể được định nghĩa là nghịch đảo của tổng thời gian 'T'. Trong dự án này, chúng ta sẽ đếm số lượng xung đi vào Cổng 3.5 của vi điều khiển 8051 và hiển thị nó trên màn hình LCD 16 * 2. Vì vậy, về cơ bản chúng ta đã đo tần số của tín hiệu tại Cổng 3.5 của 8051. Ở đây chúng ta đã sử dụng chip AT89S52 8051, và một IC 555 được sử dụng ở chế độ Astable để tạo xung mẫu để trình diễn. Trước đây chúng tôi đã xây dựng bộ đếm Tần số bằng Arduino.
Các thành phần bắt buộc:
- Bộ vi điều khiển 8051 (AT89S52)
- Màn hình LCD 16 * 2
- Nguồn tần số (Bộ hẹn giờ 555)
- Chiết áp
- Kết nối dây
Sơ đồ mạch:
Sử dụng TIMER của 8051 để đo tần số:
Vi điều khiển 8051 là một vi điều khiển 8 bit có 128 byte RAM trên chip, 4K byte ROM trên chip, hai bộ định thời, một cổng nối tiếp và bốn cổng 8 bit. Vi điều khiển 8052 là một phần mở rộng của vi điều khiển. Để cấu hình cổng 3.5 làm bộ đếm, các giá trị thanh ghi TMOD được đặt thành 0x51. Hình dưới đây cho thấy thanh ghi TMOD.
CÁNH CỔNG | C / T | M1 | M0 | CÁNH CỔNG | C / T | M1 | M2 |
HẸN GIỜ 1 | HẸN GIỜ 0 |
GATE - khi GATE được đặt, bộ đếm thời gian hoặc bộ đếm chỉ được bật khi chân INTx ở mức CAO và chân điều khiển TRx được đặt. Khi GATE bị xóa, bộ đếm thời gian được bật bất cứ khi nào bit điều khiển TRx được ĐẶT.
C / T - khi C / T = 0, nó hoạt động như Timer. Khi C / T = 1, nó hoạt động như Counter.
M1 và M0 cho biết chế độ hoạt động.
Đối với TMOD = 0x51, timer1 hoạt động như một bộ đếm và nó hoạt động ở mode1 (16bit).
Màn hình LCD 16 * 2 được sử dụng để hiển thị Tần số của tín hiệu bằng Hertz (Hz). Nếu bạn chưa quen với LCD 16x2, hãy kiểm tra thêm về các chân của LCD 16x2 và các lệnh của nó tại đây. Đồng thời kiểm tra cách giao diện LCD với 8051.
555 Bộ hẹn giờ làm nguồn tần số:
Nguồn tần số nên tạo ra sóng vuông và biên độ tối đa bị giới hạn ở 5V, vì các cổng của vi điều khiển 8051 không thể xử lý điện áp lớn hơn 5V. Các tần số tối đa nó có thể đo là 655.35 KHz vì giới hạn bộ nhớ của TH1 và TL1 đăng ký (8 bit mỗi). Trong 100 mili giây, TH1 và TL1 có thể chứa tới 65535 số đếm. Do đó tần số tối đa có thể đo được là 65535 * 10 = 655,35 KHz.
Trong dự án Máy đo tần số 8051 này, tôi đang sử dụng bộ đếm thời gian 555 ở chế độ ổn định để tạo ra sóng vuông tần số thay đổi. Tần số của tín hiệu do IC 555 tạo ra, có thể thay đổi bằng cách điều chỉnh chiết áp như được minh họa trong Video được đưa ra ở cuối Dự án này.
Trong dự án này, Timer1 (T1) đếm số lượng xung đi vào cổng 3.5 của bộ vi điều khiển 8051 trong 100 mili giây. Giá trị đếm sẽ được lưu trong thanh ghi TH1 và TL1 tương ứng. Để kết hợp các giá trị của thanh ghi TH1 và TL1, công thức dưới đây được sử dụng.
Xung = TH1 * (0x100) + TL1
Bây giờ 'xung' sẽ có số chu kỳ trong 100 mili giây. Nhưng tần số của tín hiệu được định nghĩa là số chu kỳ trên giây. Để chuyển đổi nó thành tần số, công thức dưới đây được sử dụng.
Pulses = Xung * 10
Làm việc và Giải thích mã:
Các chương trình C hoàn chỉnh cho tần số này Meter được đưa ra vào cuối của dự án này. Mã được chia thành các đoạn nhỏ có ý nghĩa và được giải thích bên dưới.
Đối với giao tiếp LCD 16 * 2 với vi điều khiển 8051, chúng ta phải xác định các chân mà trên đó LCD 16 * 2 được kết nối với vi điều khiển 8051. Chân RS của LCD 16 * 2 được kết nối với P2.7, chân RW của LCD 16 * 2 được kết nối với P2.6 và chân E của LCD 16 * 2 được kết nối với P2.5. Các chân dữ liệu được kết nối với cổng 0 của vi điều khiển 8051.
sbit rs = P2 ^ 7; sbit rw = P2 ^ 6; sbit en = P2 ^ 5;
Tiếp theo chúng ta phải xác định một số hàm được sử dụng trong chương trình. Hàm Delay được sử dụng để tạo thời gian trễ được chỉ định. Chức năng cmdwrt được sử dụng để gửi lệnh đến màn hình LCD 16 * 2. Hàm datawrt được sử dụng để gửi dữ liệu đến màn hình LCD 16 * 2.
void delay (unsigned int); void cmdwrt (char không dấu); void datawrt (không dấu char);
Trong phần này của mã, chúng tôi đang gửi các lệnh tới màn hình LCD 16 * 2. Các lệnh như hiển thị rõ ràng, con trỏ tăng dần, buộc con trỏ đến đầu dòng thứ nhất sẽ lần lượt được gửi đến màn hình LCD 16 * 2 sau một số thời gian trễ được chỉ định.
for (i = 0; i <5; i ++) {cmdwrt (cmd); trì hoãn (1); }
Trong phần này của mã, timer1 được cấu hình làm bộ đếm và chế độ hoạt động được đặt ở chế độ 1.
Timer0 được cấu hình làm bộ định thời và chế độ hoạt động được đặt ở chế độ 1. Bộ định thời 1 được sử dụng để đếm số lượng xung và bộ định thời 0 được sử dụng để tạo độ trễ thời gian. Giá trị TH1 và TL1 được đặt thành 0, để đảm bảo rằng việc đếm bắt đầu từ 0.
TMOD = 0x51; TL1 = 0; TH1 = 0;
Trong phần này của mã, bộ đếm thời gian được tạo để chạy trong 100 mili giây. Độ trễ 100 mili giây được tạo bằng hàm trễ. TR1 = 1 là để khởi động bộ đếm thời gian và TR1 = 0 là để dừng bộ đếm thời gian sau 100 mili giây.
TR1 = 1; chậm trễ (100); TR1 = 0;
Trong phần mã này, các giá trị đếm có trong thanh ghi TH1 và TL1 được kết hợp và sau đó nó được nhân với 10 để có tổng số chu kỳ trong 1 giây.
Xung = TH1 * (0x100) + TL1; Xung = xung * 10;
Trong phần này của mã, giá trị tần số được chuyển đổi thành từng byte để dễ hiển thị trên màn hình LCD 16 * 2.
d1 = xung% 10; s1 = xung% 100; s2 = xung% 1000; s3 = xung% 10000; s4 = xung% 100000; d2 = (s1-d1) / 10; d3 = (s2-s1) / 100; d4 = (s3-s2) / 1000; d5 = (s4-s3) / 10000; d6 = (xung-s4) / 100000;
Trong phần này của mã, các chữ số riêng lẻ của giá trị tần số được chuyển đổi sang định dạng ASCII và nó được hiển thị trên màn hình LCD 16 * 2.
If (xung> = 100000) datawrt (0x30 + d6); if (xung> = 10000) datawrt (0x30 + d5); if (xung> = 1000) datawrt (0x30 + d4); if (xung> = 100) datawrt (0x30 + d3); if (xung> = 10) datawrt (0x30 + d2); datawrt (0x30 + d1);
Trong phần này của mã, chúng tôi đang gửi các lệnh đến màn hình LCD 16 * 2. Lệnh được sao chép vào cổng 0 của vi điều khiển 8051. RS được đặt ở mức thấp để ghi lệnh. RW được đặt ở mức thấp cho hoạt động ghi. Xung từ cao xuống thấp được áp dụng trên chân cho phép (E) để bắt đầu thao tác ghi lệnh.
void cmdwrt (unsigned char x) {P0 = x; rs = 0; rw = 0; vi = 1; trì hoãn (1); vi = 0; }
Trong phần này của mã, chúng tôi đang gửi dữ liệu đến màn hình LCD 16 * 2. Dữ liệu được sao chép vào cổng 0 của vi điều khiển 8051. RS được tạo ra ở mức cao để ghi lệnh. RW được đặt ở mức thấp cho hoạt động ghi. Xung cao đến thấp được áp dụng trên chân bật (E) để bắt đầu hoạt động ghi dữ liệu.
void datawrt (unsigned char y) {P0 = y; rs = 1; rw = 0; vi = 1; trì hoãn (1); vi = 0; }
Đây là cách chúng ta có thể đo tần số của bất kỳ tín hiệu nào bằng Vi điều khiển 8051. Kiểm tra mã đầy đủ và Video Demo bên dưới.