• Bộ đếm tần số dựa trên vi điều khiển 8051

QC

Bộ đếm tần số dựa trên vi điều khiển 8051

 Bộ đếm tần số dựa trên vi điều khiển 8051

Circuit Diagram:





Using TIMER of 8051 for Measuring Frequency:

Vi điều khiển 8051 là 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.

GATEC / TM1M0GATEC / TM1M2
TIMER 1TIMER 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ó đóng vai trò là Bộ đếm.

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 Timer as Frequency Source:

Nguồn tần số nên tạo ra sóng vuông và biên độ tối đa được 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. Tần số tối đa mà nó có thể đo được là 655,35 KHz vì giới hạn bộ nhớ của thanh ghi TH1 và TL1 (8bit mỗi thanh). 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ộ hẹn giờ 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 ở 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. Các 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.

Pulses = 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 nó thành tần số, công thức dưới đây được sử dụng.

Pulses = Pulses * 10

Working and Code Explanation:

Chương trình C hoàn chỉnh cho Máy đo tần số này được đưa ra ở phần 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. chức năng datawrt được sử dụng để gửi dữ liệu đến màn hình LCD 16 * 2.


void delay(unsigned int)  ;              
void cmdwrt(unsigned char);              
void datawrt(unsigned 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 được gửi lần lượt đế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[i]);
     delay (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 thành 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 thời gian trễ. 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 cách sử dụ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;
delay(100);
TR1=0;
Trong phần này của mã, 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.

Pulses = TH1*(0x100) + TL1;       
Pulses = pulses*10;

Trong phần này của mã, giá trị tần số được chuyển đổi thành từng byte để giúp hiển thị dễ dàng trên màn hình LCD 16 * 2.


d1 = pulses % 10;                             
s1 = pulses % 100;                                           
s2 = pulses % 1000;                                         
s3 = pulses % 10000;      
s4 = pulses % 100000;
d2 = (s1-d1) / 10;                             
d3 = (s2-s1) / 100;                                           
d4 = (s3-s2) / 1000;
d5 = (s4-s3) / 10000;
d6 = (pulses-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 (pulses>=100000)
      datawrt ( 0x30 + d6);
if(pulses>=10000)
      datawrt( 0x30 + d5);                                
if(pulses>=1000)
      datawrt( 0x30 + d4);
if(pulses>=100)
      datawrt( 0x30 + d3);
if(pulses>=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 bật (E) để bắt đầu thao tác ghi lệnh.

void cmdwrt (unsigned char x)
{
   P0=x; 
   rs=0; 
   rw=0; 
   en=1; 
   delay(1);
   en=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 từ cao xuống 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;
   en=1;
   delay(1);
   en=0;
}









Nap Code vào PY32F003 dùng Stlink

 Nap Code vào PY32F003 dùng Stlink Bước 1: Cài đặt  KeilC v5.39 theo link sau ( chú ý 5.39 keil c mới nạp ok). https://edge07.111.ir.cdn.ir/...