Chat
Danh mục
Mạch đếm sản phẩm hiển thị led 7 thanh

Mạch đếm sản phẩm hiển thị led 7 thanh

Số lượng:
Thêm vào giỏ
Mạch đếm sản phẩm hiển thị led 7 thanh đã được thêm vào giỏ hàng

Phần I : Thiết kế phần cứng 
Phần cứng được thiết kế trên phần mềm Altium Designer Winter 09 ( Có thể mở bằng DXP2004 trở lên với bản có đuôi là Bin5 )

Sơ đồ nguyên lý :



Còn đây là những phân tích chi tiết về các khối và sự hoạt động của nó :

1. Khối nguồn :

Nguồn đầu vào là điện lưới 220V – 50Hz, đi qua biến áp hạ xuống 12VAC, qua cầu chỉnh lưu ra điện áp 1 chiều : 12 VDC.
Từ đây đưa vào IC ổn áp LM7805 cho ra đầu ra 5VDC ổn định ( thực tế khoảng điện áp ra dao động từ 4.8V – 5.4 V ).
Lưu ý : 
Hiện tại trên thị trường có 2 loại LM7085CV và LM7085KA Nên mua loại LM7805CV là tốt nhất, có thể chịu dòng và áp lớn. 
Tụ điện ở đây đóng vai trò lọc nguồn và san phẳng điện áp.
Lưu ý : 
Để lọc được tần số càng cao thì điện dung của tụ điện càng nhỏ.

2.Khối Vi điều khiển : 


Sử dụng vi điều khiển AT89S52
Lưu ý :
Port 0 của AT89S52 là một PORT với cực máng hở, do vậy nếu muốn dùng PORT0 như một cổng vào ra ( I/O port ) thì cần có điện trở treo lên dương nguồn Vcc ( Pull-up )


AT89S52 sử dụng RESET bằng mức dương, vì vậy mạch RESET được thiết kế như trên. Khi có nguồn vào, tụ C1 nạp, cho dòng chạy qua, tạo cho chân RST một mức dương, khi tụ được nạp đầy, không cho dòng đi qua, chân RST lại trở về mức 0V, quá trình Reset được hoàn tất
Reset có thể thực hiện bằng phần cứng như mạch reset, có thể thực hiện bằng phần mềm thông qua Watchdog ( Sẽ nói rõ hơn ở những bài sau ). Reset là quá trình đưa con trỏ lệnh ( IP )về vị trí lệnh đầu tiên, nói nôm na là khiến cho chíp thực hiện chương trình lại từ đầu.

3.Khối đầu vào đếm :


Nguyên tắc hoạt động của Encoder chữ U :
Cấu tạo bên trong của Encoder chữ U gồm 1 led quang phát sang, 1 transistor quang. Khi Led sáng, chiếu vào cực B của transistor quang, làm transistor này dẫn, đưa mức 0V lên chân 3 ( U+ ) của bộ khuếch đại thuật toán, => đầu ra bằng 0. (mức logic 0 )
Khi có vật đi qua, cực B của Transistor quang không nhận được ánh sáng, transistor đóng, U+ được nhận mức điện áp dương, => đầu ra có điện áp 2/3 Vcc (mức logic 1)
Lưu ý :
Biến trở VR1 có tác dụng tạo điện áp so sánh, tùy chỉnh biến trở này ta sẽ điều chỉnh được mức độ nhạy của cảm biến.
Sự chuyển từ mức logic 1 xuống mức logic 0 (sườn âm), khi đưa vào đầu vào ngắt của vi điều khiển sẽ tạo một ngắt. Khi đó, trong chương trình, ta cho một biến đếm, biến đó sẽ tăng lên dựa theo số lần ngắt.
Lưu ý : 
đầu vào ngắt trong bài này là ngắt 1 ( INT1 )

4. Khối hiển thị :


Sử dụng một led quét 4 . Nó thực chất là 4 con led 7 thanh đơn ghép nhau, sử dụng chung chân Data ( từ a – dot )
4 chân điều khiển bằng mức dương.
Để dễ dàng trong điều khiển 4 chân điều khiển của led này ta sử dụng transistor kích dòng:


Khối kích dòng này vừa tạo cho ta sự dễ dàng trong điều khiển, vừa là khối hút dòng, cấp dòng cho led sáng rõ và ổn định hơn.
Lưu ý : 
Trở công suất 270 ôm là trở hạn dòng bảo vệ transistor.
Để bảo vệ cực B của tran, ta sử dụng trở hạn chế :


Lưu ý :
Transistor trong mạch không nhất thiết phải là S9015 mà có thể là loại tran thuận bất kì (ví dụ A564)

Còn đây là thằng PCB :



Phù, coi như xong phần thiết kế phần cứng.
Đây là bản thiết kế nguyên lý kèm và mạch in kèm theo, ai chăm thì tự thiết kế lại theo những điều đã phân tích ở trên, ai lười thì cứ lấy mà dùng. Mọi giá trị linh kiện đều giữ nguyên bản, không chỉnh sửa.

Phần mềm thực chất rất đơn giản, thuật toán chỉ là đọc số lần sảy ra ngắt tại ngắt ngoài INT1, cho vào một biến đếm, sau đó đem hiển thị giá trị biến đếm lên led 7 thanh.

Có những chú ý sau :

1. Khởi tạo ngắt :
Ta sẽ sử dụng ngắt ngoài INT1 để đếm, ngắt timer0 để hiển thị
Code:
void init(void)
{
TMOD=0x01; // Cho phep Timer0 hoat dong o che do timer 16 bit
IE=0x86; // Cho phep ngat ngoai tu chan INT1, ngat trong boi Timer0
IP=0x04;   // Cho phep ngat ngoai uu tien hon ngat trong
TH0=-5000/256; // Tre 1s
TL0=-5000%256;
result = 0; // Gia tri khoi tao ban dau bang 0
clear_led(); // Xoa LED
IT1=1; // Timer1 Overfllow Flag (Don't care)
TF0=1; // Timer0 Overfllow Flag
TR0=1; // Start Timer0
}
2. Hiển thị :
Thuật toán quyét led :
Do led được ghép từ 4 con led 7 thanh đơn, sử dụng chung các chân DATA, nên muốn hiển thị giá trị , thì nhất thiết phải sử dụng phương pháp quyét led.
Quyét led thực chất là trong một thời gian nhất định, cho dữ liệu ra các chân DATA, và tuỳ trọng số của giá trị ( hàng nghin, hàng trăm, hàng chục, hàng đơn vị ) mà ta cho chân điều khiển (chân led1, led2, led3. led 4 ) được cấp nguồn. Nói chung là trong một khoảng thời gian nhất định ( trong một thời điểm), chỉ 1 con led được sáng.
Chúng ta nhìn thấy cả 4 led cùng sáng là do hiệu ứng lưu ảnh của mắt.
Tần số quyét led phụ thuộc vào quá trình tính toán số liệu (thường rất nhỏ, không tính đến), và thời gian trễ 

Hàm tạo trễ:
Code:
// Ham tao tre de quyet led, ham nay chi mang tinh chat tao tre, chu thoi gian thuc trong ham khong dung voi thoi gian tre thuc su trong VDK
void delay_ms(unsigned int time)
{
unsigned int i;
unsigned int j;
for(i = time;i>0;i--)
for(j=0;j<300;j++);
}
Tần số quyét led thấp quá hay cao quá đều tạo cho ta cảm giác led bị chớp, do vậy phải tùy chỉnh thời gian trễ này để khắc phục.

Nói chung quét led là trong một thời điểm chỉ có đúng 1 led sáng

Đoạn code để mã hóa DATA của led :
Code:
unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};         //  mã DATA của led 7 thanh trong bài này.
Còn đây là đoạn code quyét led của Project này :
Code:
// Hàm xóa led để hạn chế hiệu ứng nhòe, chớp của led
void clear_led(void)
{
P0=0xff;
P2=0xff;
}
//   Ham quet LED
void Display(void)
{
clear_led();
thousand = result/1000;
if (thousand == 0) // Neu gia tri trong hang nghin = 0 thi led hang nghin khong sang
clear_led();
else
{ Led4 = 0; Led3 = 1; Led2=1; Led1 = 1;
P0=M[thousand];
delay_ms(m);
clear_led();
}

hundred =(result%1000)/100;

if ((thousand == 0)&&(hundred == 0)) // Neu gia tri trong hang nghin, va hang tram deu  = 0 thi led hang nghin, hang tram  khong sang
clear_led();
else 
{ Led4 = 1; Led3 = 0; Led2=1; Led1 = 1;
P0=M[hundred];
delay_ms(m);
clear_led();
}

tens = ((result%1000)%100)/10;

if ((thousand == 0)&&(hundred == 0)&&(tens == 0)) // Neu gia tri trong hang nghin, va hang tram, hang chuc deu  = 0 thi led hang nghin, hang tram, hang chuc  khong sang.
clear_led();
else
{ Led4 = 1; Led3 = 1; Led2=0; Led1 = 1;
P0=M[tens];
delay_ms(m);
clear_led();
}

unit =((result%1000)%100)%10;
Led4 = 1; Led3 = 1; Led2=1; Led1 = 0;
P0=M[unit];  
delay_ms(m);
clear_led();
}
Giá trị sẽ được hiển thị sau mỗi lần timer0 ngắt ( trong bài là 0.5 s hiển thị 1 lần):
Code:
void Outdata(void) interrupt 1
{
TR0=0;
Display();
TH0=-5000/256;
TL0=-5000%256;
TR0=1;
}
Đây là đoạn code hoàn chỉnh của Project :
Code:
///////////////////////////////////////////////////////////////////////////////////////
///      Project : Produce Counter            
///     Start    : 01/24/2009                                                                                                       ///
///     End    : 02/01/2009                                                                                         ///
///    Author  : Nomad204 - Dungmax_1987           
///    Forum   : http://www.hauionline.com                                                                                                   ///
////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Do an so 05 bo mon VDK khoa Dien tu truong DH Cong Nghiep Ha Noi 
// De 05 : Dem san pham, hien thi tren Led 7 doan
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// khai bao Header 
#include<reg52.h>
#include<stdio.h>

#define m 2   // dinh nghia m de sau nay tien cho viec chinh sua thoi gian quyet led
// Khai bao Bit can dung
sbit start = P1^0;         // nut nhan bat dau    
sbit Led1 = P2^4;         // Cac dau ra quyet led
sbit Led2 = P2^5;
sbit Led3 = P2^6;
sbit Led4 = P2^7;

unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};         // Ma data cua led 7 thanh
unsigned long int result;
unsigned char thousand,hundred,tens,unit;

// Ham tao tre de quyet led, ham nay chi mang tinh chat tao tre, chu thoi gian thuc trong ham khong dung voi thoi gian tre thuc su trong VDK
void delay_ms(unsigned int time)
{
unsigned int i;
unsigned int j;
for(i = time;i>0;i--)
for(j=0;j<300;j++);
}
//  Ham xoa Led de giam hieu ung chop cua LED ( Do lech so voi tan so nhin thay cua mat )
void clear_led(void)
{
P0=0xff;
P2=0xff;
}
//   Ham quet LED
void Display(void)
{
clear_led();
thousand = result/1000;
if (thousand == 0) // Neu gia tri trong hang nghin = 0 thi led hang nghin khong sang
clear_led();
else
{ Led4 = 0; Led3 = 1; Led2=1; Led1 = 1;
P0=M[thousand];
delay_ms(m);
clear_led();
}

hundred =(result%1000)/100;

if ((thousand == 0)&&(hundred == 0)) // Neu gia tri trong hang nghin, va hang tram deu  = 0 thi led hang nghin, hang tram  khong sang
clear_led();
else 
{ Led4 = 1; Led3 = 0; Led2=1; Led1 = 1;
P0=M[hundred];
delay_ms(m);
clear_led();
}

tens = ((result%1000)%100)/10;

if ((thousand == 0)&&(hundred == 0)&&(tens == 0)) // Neu gia tri trong hang nghin, va hang tram, hang chuc deu  = 0 thi led hang nghin, hang tram, hang chuc  khong sang.
clear_led();
else
{ Led4 = 1; Led3 = 1; Led2=0; Led1 = 1;
P0=M[tens];
delay_ms(m);
clear_led();
}

unit =((result%1000)%100)%10;
Led4 = 1; Led3 = 1; Led2=1; Led1 = 0;
P0=M[unit];  
delay_ms(m);
clear_led();
}

// Khoi tao chuong trinh
void init(void)
{
TMOD=0x01; // Cho phep Timer0 hoat dong o che do timer 16 bit
IE=0x86; // Cho phep ngat ngoai tu chan INT1, ngat trong boi Timer0
IP=0x04;   // Cho phep ngat ngoai uu tien hon ngat trong
TH0=-5000/256; // Tre 1s
TL0=-5000%256;
result = 0; // Gia tri khoi tao ban dau bang 0
clear_led(); // Xoa LED
IT1=1; // Timer1 Overfllow Flag (Don't care)
TF0=1; // Timer0 Overfllow Flag
TR0=1; // Start Timer0
}
// Ham xuat gia tri ra hien thi su dung ngat Timer
void Outdata(void) interrupt 1
{
TR0=0;
Display();
TH0=-5000/256;
TL0=-5000%256;
TR0=1;
}
// Ham dem su dung ngat ngoai
void Count(void) interrupt
{
EA=0; // cam  ngat ngoai
result++;
if(result >= 9999)
result=0;
delay_ms(10);
EA=1;// cho phep ngat ngoai tro lai
}
// Chuong trinh chinh
void main(void)
{
EA = 0;   // Cam ngat ngoai, cho chuong trinh khoi tao xong
init();
delay_ms(100);
while(start); // Khi nhan nut start, moi cho phep ngat ngoai, khi do chuong trinh moi bat dau chay
EA = 1;   // Cho phep ngat ngoai tro lai
result = 0;   // Gia tri khoi tao cua bien ban dau.
while(1)
{
}
}
Phù phù, thế là xong phần lập trình rồi nhá.
Anh em nào có ngẫu hứng thì về làm mạch, lập trình thử, rồi lên đây bàn luận nhá.

( File Nguyên lý Altium + Code C + Hex full)
Khi nhấn nút "Tải Về Máy", bạn sẽ vào trang quảng cáo, vui lòng chờ 5 giây. Nút  hiện ra ở góc phải phía trên, nhấn vào để đến trang download

Theo DTVN