PDA

View Full Version : [Project 05] Đếm sản phẩm hiển thị bằng Led 7 Thanh


Nomad204
06-15-2009, 10:28 AM
Sau một hồi kiếm cơm nhờ đồ án vi điều khiển, giờ " hoàn lương " về ẩn cư nơi "rừng núi", quyết định "phơi bày" lên cho giang hồ thêm rôm rả.


Đề tài 05 : Đếm sản phẩm hiển thị bằng LED 7 đoạn
Bộ môn : Vi điều khiển
Khoa : Điện tử
Trường: Đại học Công Nghiệp Hà Nội
Thiết kế phần cứng : Quangcanelt
Phần mềm : Dungmax_1987 vs Nomad204

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ý :
http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/MainSCH.png

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 :
http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/Khoinguon.png

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 :

http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/CPU.png

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 )

http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/trotreo.png

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 :

http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/Khoidauvao.png

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ị :

http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/Hienthi.png

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:

http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/Khoikichdong.png

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ế :

http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/Trohanche.png

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 :

http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/PCB.pnghttp://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/Linhkien.png

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.

Về phần mềm, ngày mai sẽ được "phơi bày" và phân tích tiếp. Giờ phải làm việc thôi, ăn cắp giờ công ty thế là đủ rồi :D
Bạn có thể Download tại đây (http://www.mediafire.com/?zjdbrgizmz4)
hoặc :

dungmax1987
06-15-2009, 10:37 AM
Đính chính là 7805CV ngày trước thì là hàng tốt so với hang 7805KA, nhưng dạo này do hàng CV bị làm giả nhiều quá nên chất lượng còn kém hơn hàng KA.Dòng qua KA tầm 200mA là nóng còn hàng CV thì chỉ tầm 100mA.Khuyến cáo nên tìm hàng CV xịn có chữ khắc chìm hoặc hàng KA.Tuyệt đối tránh xa những loại IC công xuất mà có tên được in bằng mực vì đó là hàng fake, chịu dòng kém.

Nomad204
06-15-2009, 10:44 AM
Chết quên.
Thằng diode D2 trong mạch nguyên lý thay bằng trở công suất R_CS để bảo vệ Transistor
Anh em chú ý nhé.

Nomad204
06-16-2009, 09:36 AM
Hôm nay như đã hứa với anh em, tui sẽ post nốt thằng phần mềm lên nữ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ị

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ễ:

// 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 :

unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0}; // 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 :

// 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):

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 :

///////////////////////////////////////////////////////////////////////////////////////
/// 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,0x9 0}; // 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 2
{
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á.

Đây là trình dich C cho 8051. Anh em nhấn vào đây (http://www.mediafire.com/file/jcmzdm5kznz/Ckeil.rar) để tải về
Còn đây là phần mềm của Project :
Mediafire : Program (http://www.mediafire.com/?ejy2zmdjlm4)
Hoặc :

dungmax1987
06-16-2009, 01:16 PM
đề nghị đồng chí nomad không cho tên tôi vào code nhá.Tôi chỉ gợi ý cho đồng chí chứ tôi không viết cái code này.Đề nghị đồng chí bỏ ngay tên tôi ra khoi project này ngay không thì mọi người lại chửi cả tôi đấy nhá :))

Thanh_CEO_intel
09-13-2009, 05:27 PM
anh Dungmax_1987 ơi cho em hỏi tại sao khi chương trinh quét led đếm sản phẩm của anh, em mô phỏng trên proteus thì khi đếm đến hàng chục thì ko sao nhưng khi đếm đến hàng trăm thì xảy ra tình trạng 3 led nháy với chu kỳ khác nhau rất khó quan sát được con số hiển thị.Em có sửa hàm trễ nhưng không được,xin anh chỉ giáo.Em xin cảm ơn! đây là địa chỉ mail của em rất mong anh chỉ giáo: hathanhdt05.intel@gmail.com
(đây là mạch mô phỏng em vẽ anh test hộ em sai ở đâu ko ạ?)

dungmax1987
09-14-2009, 08:20 AM
quét led chạy bằng mô phỏng hầu như luôn hiển thị sai.Bạn cứ yên tâm là chuơng trình quét led ấy ko có vấn đề gì đâu.
Hàm trễ là do mình quy định nên hoàn toàn có thể sửa được.
Có vấn đề gì nữa thì cứ lên đây hỏi nhé, mình sẽ giúp bạn.

Thanh_CEO_intel
09-21-2009, 04:28 PM
anh dungmax và anh Nomad cho em hỏi là trong chương trình của bọn anh khi để nút start trong vòng while như thế hình như không có tác dụng thì phải.:
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
num = 0; // Gia tri khoi tao cua bien ban dau.
while(1)
{
}

anh cho hỏi khi em muốn khi số sản phẩm đếm đến 9999 thì xuất ra cảnh báo bằng Led hoặc loa thì có phải là xuất 1 hoặc 0 ra chân P3.6 của con AT hay ko?xin anh chỉ giáo!!

Nomad204
09-21-2009, 06:19 PM
anh dungmax và anh Nomad cho em hỏi là trong chương trình của bọn anh khi để nút start trong vòng while như thế hình như không có tác dụng thì phải.:
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
num = 0; // Gia tri khoi tao cua bien ban dau.
while(1)
{
}

anh cho hỏi khi em muốn khi số sản phẩm đếm đến 9999 thì xuất ra cảnh báo bằng Led hoặc loa thì có phải là xuất 1 hoặc 0 ra chân P3.6 của con AT hay ko?xin anh chỉ giáo!!

Em hãy nhìn lại bản thiết kế phần cứng nhé.
Khi Start chưa được nhấn, từ VCC đi qua một con trở khoảng 10k, khi đó chân Start có mức logic là 1, khi nhấn phím, mức 0 được đưa lên, chân Start có mức logic là 0.
Câu lệnh while(start); : Khi chưa nhấn nút Start, start = 1, chương trình bị dừng tại vòng lặp while(start);
Khi Start được nhấn, start = 0, điều kiện trong vòng lặp while(start); không còn đúng nữa, lúc này chương trình lại chạy tiếp những lệnh sau vòng lặp đó.

Nếu để xuất ra LED hoặc loa thì chỉ cần xuất mức 0 sau đó là 1 (số lần thì tùy) ra đúng chân (cũng do em định nghĩa luôn) là được.
Riêng với loa CHIP, cần một con transistor kích dòng thì loa mới kêu rõ được
Câu lệnh tham khảo :

sbit LED P3^6
....
void blink_led(void)
{
LED = 0;
delay_ms(500) // tre 0.5 giay
LED = 1;
delay_ms(500) // tre 0.5 giay
}

void main (void)
{
......
blink_led();
}

Thanh_CEO_intel
09-23-2009, 02:49 PM
Anh ơi cho em hỏi em muốn cho mạch nó đếm đến 9999 thì nới xuất ra cảnh báo ra ngoài.Em thử viết chương trình rồi nhưng lại ko chạy.xin anh chỉ giáo.Em dùng câu lênh if như sau nhưng lại ko chạy được chương trình đếm nhờ ngắt Timer:

....................
sbit Led = P3^6;
....................
void note_Led ( void)
{
Led = 0;
delay_ms(500);
Led = 1;
delay(500);
}


.............

void main()
{
.....................
if (num>=9999)
{
note_Led();
...........

Nhưng chương trình vấn ko chạy.xin các anh chỉ giúp!ah anh cho em hỏi về hàm delay_ms của bọn anh được không?cảm ơn các anh nha!

dungmax1987
09-23-2009, 04:39 PM
Anh ơi cho em hỏi em muốn cho mạch nó đếm đến 9999 thì nới xuất ra cảnh báo ra ngoài.Em thử viết chương trình rồi nhưng lại ko chạy.xin anh chỉ giáo.Em dùng câu lênh if như sau nhưng lại ko chạy được chương trình đếm nhờ ngắt Timer:

....................
sbit Led = P3^6;
....................
void note_Led ( void)
{
Led = 0;
delay_ms(500);
Led = 1;
delay(500);//sai rồi này, chỉnh lại xem có chạy không nhé.
}


.............

void main()
{
.....................
if (num>=9999)
{
note_Led();
...........

Nhưng chương trình vấn ko chạy.xin các anh chỉ giúp!ah anh cho em hỏi về hàm delay_ms của bọn anh được không?cảm ơn các anh nha!
hàm delay_ms

void delay_ms(unsigned int ms)
{
unsigned int i;
unsigned char j;
for(i=0;i<ms;i++)
{
for(j=0;j<300;j++);
}
}

Hàm delay_ms() đấy thực chất chỉ là 2 vòng for thôi, vòng for bên trong không thực hiện lệnh nào.Bạn để ý vòng for bên trong có thời gian gần bằng 1ms vì mỗi lần vòng for được gọi ( trong vòng for ko có lệnh nào nhé ) tương ứng với 8 chu kì lệnh (cái này chỉ tương đối thôi,nếu làm bằng asm thì tính sẽ chuẩn hơn ) .Ở đây dùng thạch anh 12M mà 89 lại có bộ chia tần là 1/12 nên tần số thực mà 89 hoạt động là 1Mhz .Như thế một chu kì lệnh sẽ ứng với 1us => 8 chu kì sẽ thực hiện trong 8 us => vòng for lặp 125 lần sẽ ứng với 8*125= 1000us = 1ms.Như thế vòng for bên ngoài lặp bao nhiêu lần ( cái này quyết định bởi biến ms ) thì sẽ có thời gian trễ bấy nhiêu ms tương ứng .Trong TUT này Nomad vẽ thì cho thạch anh 12M nhưng đến lúc lập trình lại tính sai :)) , bạn sử lại cái vòng for bên trong nhé, thay giá trị 300 thành 125 nhé.Tính toán thì như vậy nhưng hàm delay_ms này không hoàn toàn chính xác do dùng C ta không thể quản lý được chuẩn xác thời gian thực hiện một câu lệnh ( chưa kể bị ảnh hưởng bởi ngắt timer ), nó chỉ được sử dụng để tạo trễ khi không yêu cầu khắt khe về sự chính xác

@Thanh_CEO_intel: bạn post toàn bộ code lên đây để mọi người có thể chỉnh sửa giúp bạn nhanh hơn

Thanh_CEO_intel
09-24-2009, 08:21 PM
Các anh hiểu nhầm ý em rồi,em xin mail của anh là để tiện trao đổi với anh.Vì em có rất nhiều thắc mắc cần anh giải đáp thôi mà.Em mới làm quên với VĐK nên còn nhiều bỡ ngỡ lắm:D:DÝ của em là giờ cái Code của bọn anh đã làm đó em thử rồi chạy ngon lắm nhưng giờ muốn phát triển lên đó là:"Có một nút nhấn khi nhấn lần 1 thì tất cả 4 LED đều sáng con số 9999,khi ấn lần 2 thì mới bắt đầu thực hiện đếm sự kiện và đếm đến 9999 thì xuất cảnh báo ra LED hoặc ra Loa CHIP".Em thử làm rồi nhưng không được anh ạ.Nên em mới nhờ các anh các anh gợi ý và giúp đỡ:D:D:D:
Ah các anh cho em hỏi Tranzitor PNP ngoài việc làm khóa điện tử đóng ngắt cho các LED còn có tác dụng gì không?vì em thay bằng Tran ngược NPN thì lại không chạy được mô phỏng??ko bít tại sao nữa?HIX!

dungmax1987
09-25-2009, 08:41 AM
có gì bạn cứ liên hệ trên diễn đàn,hầu như ngày nào mình cũng đảo qua diễn đàn vài lần (trừ thứ 7 và CN ) nên bạn yên tâm là sẽ có trả lời sớm thôi.
Còn yêu cầu bài toán mở rộng của bạn thì cũng đơn giản thôi.Mình thử viết thế này bạn xem cso chay được không nhé

void note_Led ( void)
{
EA=0;
Led = 0;
delay_ms(500);
Led = 1;
delay_ms(500);
EA=1;
}
// Chuong trinh chinh
void main(void)
{
EA = 0; // Cam ngat ngoai, cho chuong trinh khoi tao xong
init();
delay_ms(100);
while(start);// doi nhan nut
delay_ms(10);//thoi gian tre de loai bo hien tuong rung phim
while(!start) result=9999; //neu nut da duoc nha ra thi hien thi so 9999
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)
{
if(result==9999) note_led();
}
}

Thanh_CEO_intel
09-28-2009, 03:34 PM
có gì bạn cứ liên hệ trên diễn đàn,hầu như ngày nào mình cũng đảo qua diễn đàn vài lần (trừ thứ 7 và CN ) nên bạn yên tâm là sẽ có trả lời sớm thôi.
Còn yêu cầu bài toán mở rộng của bạn thì cũng đơn giản thôi.Mình thử viết thế này bạn xem cso chay được không nhé

void note_Led ( void)
{
EA=0;
Led = 0;
delay_ms(500);
Led = 1;
delay_ms(500);
EA=1;
}
// Chuong trinh chinh
void main(void)
{
EA = 0; // Cam ngat ngoai, cho chuong trinh khoi tao xong
init();
delay_ms(100);
while(start);// doi nhan nut
delay_ms(10);//thoi gian tre de loai bo hien tuong rung phim
while(!start) result=9999; //neu nut da duoc nha ra thi hien thi so 9999
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)
{
if(result==9999) note_led();
}
}

Cảm ơn anh, nhưng anh cho hỏi while (start) ở hai vị trí dó có khác gì nhau không ạ?và nút nhấn này là chung với nút nhấn start của mạch luôn phải ko ạ?

dungmax1987
09-28-2009, 03:57 PM
uh 2 cái đó giống nhau mà.Sử dụng luôn nút start của mạch.Nếu bạn muốn dùng nút khác thì chỉ việc khai báo nút bấm ( như khai báo nút start ấy ) rồi thay vào câu lệnh đó thôi.

VanDungEvn
10-09-2009, 10:42 AM
Những mạch như vậy em dùng nguồn 5V, dùng mạch sạc của Nokia chân to hoặc nguồn nào có dòng khoảng 500mA điện áp ~5V là ok. thay vì dùng ổn áp và máy biến áp. Nếu ko thì dùng nguồn 5V của máy tính là đơn giản.

Thanh_CEO_intel
10-15-2009, 11:51 AM
mạch cảm biến dùng photo thu phat của em có vấn đề.lắp đúng mạch của anh mà sao tạo được xung ngắt ngoài anh nhỉ?con chữ U mad các anh nói có phải con này không ạ?<em gửi file đính kèm>con này anh thử cho em sơ đò chân với ạ?cảm ơn anh nhiều!

Redwind_dt3
10-15-2009, 12:05 PM
Đây là sơ đồ chân của chữ U nè :

Nomad204
10-15-2009, 01:46 PM
mạch cảm biến dùng photo thu phat của em có vấn đề.lắp đúng mạch của anh mà sao tạo được xung ngắt ngoài anh nhỉ?con chữ U mad các anh nói có phải con này không ạ?<em gửi file đính kèm>con này anh thử cho em sơ đò chân với ạ?cảm ơn anh nhiều!
Con cảm biến mà em đưa lên đúng là con cảm biến chữ U rồi đó.
Nếu không chạy,em kiểm tra lại đầu nối, có thể em nhầm giữa chân hai con Diode phát quang, hoặc nhầm giữa chân con diode phát quang với con Transistor quang.

Chúc vui !

Thanh_CEO_intel
10-15-2009, 10:23 PM
Cảm ơn Anh nha,hôm nay em test lại rồi là do con Chữ U của em bị chết.Thay con khác chạy ngon:D:d. Một lần nữa Cảm ơn anh nha.

Miss_u88
10-15-2009, 10:27 PM
Cảm ơn Anh nha,hôm nay em test lại rồi là do con Chữ U của em bị chết.Thay con khác chạy ngon:D:d. Một lần nữa Cảm ơn anh nha.

test con chữ U như nào vậy bác ,giới thiệu cho anh em biết cái :(

Thanh_CEO_intel
10-15-2009, 11:29 PM
Thì nó hay chết ở bên phát khi ta cấp nguồn không đúng.Mà bên đó chẳng qua chỉ là con photodiode nên kiểm tra giống như kiểm tra diode ý mà.chúc vui!

Miss_u88
10-17-2009, 01:04 AM
Quay lại vấn đề phần cứng chút nhé :D
ở khối đầu vào đếm :
http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/Khoidauvao.png

không nhất thiết là phải dùng con LM358 ,mà chúng ta có thể áp dụng kỹ thuật mạch khuếch đại,điều chế điện,điều chế quang v.v... vào miễn sao sẽ nâng đc độ nhạy của cảm biến là được điển hình như là :
http://img70.imageshack.us/img70/4131/16714052.png (http://img70.imageshack.us/i/16714052.png/)

hình vẽ tớ vẽ thiếu cái mass nhé ^^!
giá trị linh kiện các bạn tự tính lấy nhé :) mình kô đưa lên đâu

hoặc chân số 1 ta cũng có thể áp dụng cho xung vào ( mức cao - mức thấp ) thì nó sẽ tự động nhảy.

p/s: Bác Duân thấy con chữ U của em giống con của bác không :)) ;)) ;;)

ngoc xinh
10-18-2009, 09:15 AM
Anh Nomad ah, cho em thắc mắc chút nha. ở cái mạch so sánh (khối ngắt tạo đếm) của anh. Khi không có sản phẩm đi qua. con Tran ở trong cảm biến chữ U dẫn. làm cho điện áp chân V+ của thuật toán ở mức thấp. Kéo theo chân INT của VDK cũng ở trạng thái thấp (mức 0). Khi có sản phẩm đi qua, trạng thái chân INT chuyển từ 0 lên 1. Mà hình như con 89 chỉ sảy ra ngắt khi có sự thay đổi trạng thái từ 1-->0 thì phải. Em nói thế không biết có đúng ko, mong anh chỉ giáo

Miss_u88
10-18-2009, 05:35 PM
Anh Nomad ah, cho em thắc mắc chút nha. ở cái mạch so sánh (khối ngắt tạo đếm) của anh. Khi không có sản phẩm đi qua. con Tran ở trong cảm biến chữ U dẫn. làm cho điện áp chân V+ của thuật toán ở mức thấp. Kéo theo chân INT của VDK cũng ở trạng thái thấp (mức 0). Khi có sản phẩm đi qua, trạng thái chân INT chuyển từ 0 lên 1. Mà hình như con 89 chỉ sảy ra ngắt khi có sự thay đổi trạng thái từ 1-->0 thì phải. Em nói thế không biết có đúng ko, mong anh chỉ giáo

để mình giải thích vậy.
khi chưa có sản phẩm thì trạng thái chân INT ở mức 0
khi có sản phẩmthì trạng thái chân INT ở mức 1 như bạn nói
khi sản phẩm đi qua rồi thì trạng thái chân INT ở mức 0 . vậy thì sẽ có sự thay đổi trạng thái từ 1->0 .Lúc này mới có ngắt
IT1=1;// ngat bang suon am//

Thì nó hay chết ở bên phát khi ta cấp nguồn không đúng.Mà bên đó chẳng qua chỉ là con photodiode nên kiểm tra giống như kiểm tra diode ý mà.chúc vui!
thế nó chết bên thu thì làm cách nào kiểm tra được hả bác ???

Nomad204
10-18-2009, 08:16 PM
Thế nó chết bên thu thì làm cách nào kiểm tra được hả bác ???
Bên thu là transistor quang, rất hiếm khi chết. Nếu thấy cảm biến không chạy thì phải nghĩ ngay đến bên phát bị chết.
Để kiểm tra đầy đủ, nếu thấy cảm biến không chạy, ta cho đồng hồ số ở thang đo dòng điện, rồi mắc nối tiếp với bên phát. Nếu thấy vẫn có dòng chạy qua thì kết luận là bên thu bị "tèo" :D
Theo anh, nên kiểm tra bằng cách chạm nhẹ chân "đầu vào cộng" của "Ôm-ấp" xuống mass, khi thấy sản phẩm tăng lên thì kết luận em cảm biến bị tèo.
Như vậy thì chỉ còn nước thay cảm biến thôi. Kiểm tra cảm biến làm gì cho mất công.

ngoc xinh
10-19-2009, 09:36 AM
để mình giải thích vậy.
khi chưa có sản phẩm thì trạng thái chân INT ở mức 0
khi có sản phẩmthì trạng thái chân INT ở mức 1 như bạn nói
khi sản phẩm đi qua rồi thì trạng thái chân INT ở mức 0 . vậy thì sẽ có sự thay đổi trạng thái từ 1->0 .Lúc này mới có ngắt
IT1=1;// ngat bang suon am//
thế tại sao ta không măc lại con thuật toán, để khi chưa có sản phẩm đi qua thì chân INT luôn ở mức cao, khi có sản phẩm đi qua thì chuyển trạng thái. Như thế có phải ổn định hơn ko, mà khi giải thích với thầy giáo lại nhanh gọn hơn. :-?:-?:-?:-?

Nomad204
10-20-2009, 11:01 AM
thế tại sao ta không măc lại con thuật toán, để khi chưa có sản phẩm đi qua thì chân INT luôn ở mức cao, khi có sản phẩm đi qua thì chuyển trạng thái. Như thế có phải ổn định hơn ko, mà khi giải thích với thầy giáo lại nhanh gọn hơn. :-?:-?:-?:-?
Ý tưởng của em cũng hay đó :-bd !
Em về làm thử, nếu chạy thành công thì post lên cho anh em thêm rôm rả :D

Theo quan điểm thiết kế ban đầu của anh, thì khi sản phẩm đi qua hết cảm biến thì mới tăng số đếm lên. Còn như ý tưởng của em, thì sản phẩm mới thò đầu vào cảm biến đã tăng biến đếm lên rồi, nhỡ có thằng nào rút trở lại thì sao :-w ( Bài toán đếm xe trong nhà để xe )

ngoc xinh
10-20-2009, 10:27 PM
Ý tưởng của em cũng hay đó :-bd !
Em về làm thử, nếu chạy thành công thì post lên cho anh em thêm rôm rả :D

Theo quan điểm thiết kế ban đầu của anh, thì khi sản phẩm đi qua hết cảm biến thì mới tăng số đếm lên. Còn như ý tưởng của em, thì sản phẩm mới thò đầu vào cảm biến đã tăng biến đếm lên rồi, nhỡ có thằng nào rút trở lại thì sao :-w ( Bài toán đếm xe trong nhà để xe )
Anh trả lời hay quá, em phục luôn đó. Em không hề nghĩ tới tình huống đó. Cảm ơn anh nhé. Còn vấn đề
Em về làm thử, nếu chạy thành công thì post lên cho anh em thêm rôm rả :Dthì Anh và mọi người biết thừa là nó chạy mà. chỉ có cái áp dụng vào thực tế thì có nhược điểm thôi...hi.hi:D

Thanh_CEO_intel
10-24-2009, 02:44 PM
// 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 2
{
EA=0; // cam ngat ngoai
result++;
if(result >= 9999)
result=0;
delay_ms(10);
EA=1;// cho phep ngat ngoai tro lai
}

Anh giải thích hộ em đoạn code đó được ko?đó có phải là phương pháp quét LED dùng timer ko anh?Anh giải thích hộ em nha,vì em thấy phương pháp quét LED này giảm hiệu ứng chớp và nháy LED.Cảm ơn các anh nhiều nhiều!!

Nomad204
10-24-2009, 10:10 PM
// 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 2
{
EA=0; // cam ngat ngoai
result++;
if(result >= 9999)
result=0;
delay_ms(10);
EA=1;// cho phep ngat ngoai tro lai
}

Anh giải thích hộ em đoạn code đó được ko?đó có phải là phương pháp quét LED dùng timer ko anh?Anh giải thích hộ em nha,vì em thấy phương pháp quét LED này giảm hiệu ứng chớp và nháy LED.Cảm ơn các anh nhiều nhiều!!
Các giải thích anh đã đính kèm rồi đó thôi !
Về phần hiển thị bằng ngắt timer

// cứ 1 giây gây ngắt một lần, mỗi lần ngắt thì hiển thị
void Outdata(void) interrupt 1
{
TR0=0; // Dừng timer
Display(); // Thực hiện hàm hiển thị
TH0=-5000/256; // Nạp lại giá trị cho timer
TL0=-5000%256;
TR0=1; // Chạy timer, bắt đầu một chu trình đếm mới
}

Redwind_dt3
10-27-2009, 07:55 AM
Đề này không khác gì đề đo tốc độ động cơ hiển thị led 7 đoạn cả, chỉ khác ở phần mềm thôi. Cũng mời bác dungmax1987 bổ xung code cho cả 2 đề luôn.
Nguyên lý hoạt động: SP dc phát hiện khi quét qua chữ U (bộ thu phát hồng ngoại) qua bộ khuếch đại thuật toán đi vào chân ngắt ngoài 1 của 89. Vấn đề còn lại là quét led :D

cdcn4tphcm
11-25-2009, 10:02 AM
Có ai có phần giao tiếp với máy tính của mạch này không. Có ai biết làm không chỉ em với

cdcn4tphcm
11-26-2009, 10:44 AM
thầy có yêu cầu là hiển thị số đếm lên máy tính. làm sao đây

Mãi Yêu Em88
12-03-2009, 01:10 AM
anh Nomad ơi,theo em được biết thì sau khi cấp nguồn cho con VĐK thì tất cả các Port đều ở mức 1 theo mặc định. chân số 13 ngắt ngoài 1 cũng sẽ là ở mức 1 phải không.
mà theo bạn Ngoc Xinh phân tích ở trên theo sơ đồ chân con LM358 chân V+ anh mắc nối tiếp với con Encoder thì có phải chân Out của LM358 sẽ là mức 0 lúc không có vật (!)

vậy thì sau khi anh bấm START thì có phải sẽ có ngắt ngoài luôn không ??? sản phẩm tự tăng lên 1 khi mà vật chưa đi qua ??

Nomad204
12-03-2009, 08:52 AM
theo em được biết thì sau khi cấp nguồn cho con VĐK thì tất cả các Port đều ở mức 1 theo mặc định. chân số 13 ngắt ngoài 1 cũng sẽ là ở mức 1 phải không.
Giá trị mặc định của các post đầu ra là 0 chứ không phải là 1. Trừ khi có trở treo ngoài mắc vào các Post này.
Theo bạn Ngoc Xinh phân tích ở trên theo sơ đồ chân con LM358 chân V+ anh mắc nối tiếp với con Encoder thì có phải chân Out của LM358 sẽ là mức 0 lúc không có vật (!)
Đúng vậy.
vậy thì sau khi anh bấm START thì có phải sẽ có ngắt ngoài luôn không ??? sản phẩm tự tăng lên 1 khi mà vật chưa đi qua ??
Start không được gắn vào ngắt, nên khi nhấn start không xảy ra ngắt.
Với lại, sau khi nhấn START thì các đoạn trương trình sau while(!START); mới được thực hiện, bao gồm cả chương trình cho phép ngắt.

Thanh_CEO_intel
12-05-2009, 01:35 PM
Start không được gắn vào ngắt, nên khi nhấn start không xảy ra ngắt.
Với lại, sau khi nhấn START thì các đoạn trương trình sau while(!START); mới được thực hiện, bao gồm cả chương trình cho phép ngắt.

Khi chưa ấn Start theo như chương trình của anh Nomad thì khi đó chương trình vẫn thực hiện đếm.nhưng sẽ bắt đầu đếm từ 9,10,11....khi có vật đi qua
Nhưng khi ấn Start thì led sẽ hiện ra số 0,và khi đó thực hiện đếm mới chính xác.0,1,2...khi có vật đi qua
Vì sao vậy???các bạn ai quan tâm thì thử nghiên cứu chương trình của anh Nomad xem thử thế nào nha.

lhmanh
12-29-2009, 06:38 PM
quét led chạy bằng mô phỏng hầu như luôn hiển thị sai.Bạn cứ yên tâm là chuơng trình quét led ấy ko có vấn đề gì đâu.
Hàm trễ là do mình quy định nên hoàn toàn có thể sửa được.
Có vấn đề gì nữa thì cứ lên đây hỏi nhé, mình sẽ giúp bạn.

Đơn giản thôi, nếu led Catot chung thì cho nó một con điện trở lên dương nguồn, Anot chung thì ngược lại, hết ngay tình trạng đó. OK?

khicon2006
01-01-2010, 09:58 AM
Mình cũng mới tiềm hiểu về timer nên muốn hỏi bạn vài vấn đề này!!!Mình có làm 1 cái đô án nhỏ tương tự như bạn thui,nhưng mình đang bị không hiểu 1 chỗ này!!!Ông thầy yêu cầu mình dùng timer hoặc là hàm delay để tạo ra tín hiệu xung để truyền qua hồng ngoại, còn bên thu là 1 con hồng ngoại khác!!Hiện giờ mình vẫn không biết cách nào để tạo được vì bên phát sẽ phát liên tục, khi nào có người đi qua thì bên thu sẽ không nhận được tín hiệu hoặc tín hiệu yếu thì khi đó sẽ đưa mức logic về 0, khi đó thì đèn led 7 đoạn sẽ nhảy lên 1 lần!! Ý tưởng là như vậy!!Mong bác nào chỉ mình với!!Hiện nay mình đang bị rối phần này!!

Mãi Yêu Em88
01-01-2010, 11:53 AM
Ông thầy yêu cầu mình dùng timer hoặc là hàm delay để tạo ra tín hiệu xung để truyền qua hồng ngoại, còn bên thu là 1 con hồng ngoại khác!!Hiện giờ mình vẫn không biết cách nào để tạo được vì bên phát sẽ phát liên tục, khi nào có người đi qua thì bên thu sẽ không nhận được tín hiệu hoặc tín hiệu yếu thì khi đó sẽ đưa mức logic về 0, khi đó thì đèn led 7 đoạn sẽ nhảy lên 1 lần!! Ý tưởng là như vậy!!Mong bác nào chỉ mình với!!Hiện nay mình đang bị rối phần này!!

xung là gì chắc bạn biết phải không :) mức cao và mức thấp. vậy khi dùng delay hoặc timer bạn chỉ cần sau 1 khoảng thời gian nào đó bạn đảo xung thôi. Dùng lệnh gì trong C để đảo ?
xung=~xung;
còn phần đếm khi có người đi qua mới bắt đầu đếm , hay người mới vào đã đếm luôn bạn tham khảo ở các bài #24 - #28 ở topic này . Giải thích rất rõ ràng :)

leemanhj916
01-01-2010, 08:16 PM
// Khoi tao chuong trinh
// Ham dem su dung ngat ngoai
void Count(void) interrupt 2
{
EA=0; // cam ngat ngoai
result++;
if(result >= 9999)
result=0;
delay_ms(10);
EA=1;// cho phep ngat ngoai tro lai
}



Có nhất thiết phải cấm ngắt ngoài rồi lại cho phép ngắt ngoài hay không? mà cũng đâu cần phải delay() làm gì chứ.
Nếu đang trong hàm ngắt ngoài này , mà lại xảy ra ngắt ngoài ngay thì sẽ bị đếm thiếu sản phẩm rồi còn gì nữa


thầy có yêu cầu là hiển thị số đếm lên máy tính. làm sao đây

Thì mạch có thể truyền giá trị biến đếm lên màn hình máy tính (Nếu dùng HiperTeminal) , Nhưng M nghĩ nên truyền một ký tự lên

VD:

void ngatngoai interrupt 0
{
putchar('@');
}


Còn chương trình trên máy tính thì nhận ký tự truyền từ mạch, Nếu ký tự đó là '@' thì
sẽ tăng giá trị biến đếm lên 1 và hiển thị ( có thể có 1 timer chạy và luôn cập nhật giá trị biến đếm ấy. Cách này mình sẽ cần phải viết chương trình hiển thị cho mạch.

gaden007
02-27-2010, 11:16 AM
Mạch này có nhớ đựoc dữ liệu không hả bạn? Khi tắt đi bật lên nó có hiển thị tiếp không hay là hiển thị lại từ đầu

Chim xanh
03-04-2010, 06:58 PM
Mạch này có nhớ đựoc dữ liệu không hả bạn? Khi tắt đi bật lên nó có hiển thị tiếp không hay là hiển thị lại từ đầu
Một câu hỏi ngây ngô >:/
Đọc lại đề số 5
Xem lại cái sơ đồ nguyên lý đó mà còn hỏi là có nhớ hay không có nhớ à ?

anhhungxalo201289
04-06-2010, 02:24 PM
anh oi ! mạch đêm sản phẩm của anh có thể giao tiếp máy tính qua cổng com được không ạ ! anh có thể giúp em với được không. Em đang làm bài tập vđk đếm sp ra vào dùng vđk 8951 hiển thị lên led 7 đoạn và hiển thị câu thông báo lên led ma trận giao tiếp cổng com. Anh nào làm rồi giúp em với !

tungdcn
04-06-2010, 02:40 PM
Nguyên văn bởi gaden007 [/URL][URL="http://hauionline.com/fcvn1/buttons/viewpost.gif"]http://hauionline.com/fcvn1/buttons/viewpost.gif (http://hauionline.com/showthread.php?p=354211#post354211)
Mạch này có nhớ đựoc dữ liệu không hả bạn? Khi tắt đi bật lên nó có hiển thị tiếp không hay là hiển thị lại từ đầu
Có nhớ đc hay ko là tùy mình lập trình chứ. Bình thường chắc thầy cô không bắt nhớ sản phẩm khi tắt bật nguồn nhưng nếu bạn muốn nhớ cũng đc thôi. mỗi khi nhận được sản phẩm vdk truyền lên máy tính. Khi đó phần mềm trên máy tính sẽ lưu giá trị vào 1 file text trên ổ cứng. Khi reset vdk hoặc máy tính ta bắt đầu đọc dữ liệu từ file text đó. thế là nhớ được số sản phẩm thôi:D

xuanquan90
08-10-2010, 07:46 PM
cho hỏi con led này là Anot chung hay là Katot chung hả cả nhà?
http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/Hienthi.png

xuanquan90
08-10-2010, 11:06 PM
đấy em lấy cái sơ đồ mạch đếm sản phẩm. theo em, ko nhầm thì đây là anot chung.
em chưa giám khẳng định nên muốn hỏi mọi người cho chắc.

Nomad204
08-14-2010, 05:53 PM
cho hỏi con led này là Anot chung hay là Katot chung hả cả nhà?
http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/Hienthi.png (http://img.photobucket.com/albums/v678/tomorrow204/Dem%20SP/Hienthi.png)
Đây là LED Anode (cực dương) chung.

xuanquan90
08-24-2010, 10:16 PM
tình hình là em vừa làm xong mạch đếm sản phẩm như hướng dẫn (em làm như hướng dẫn. down nguyên code của bác Nomad 204 ) nhưng nó lại không chạy theo ý muốn.
1. em thấy nút start ko có tác dụng hay sao ý. không cần bấm mà đếm sản phẩm vẫn chạy
2. khi nhấn nút reset thì nó hiện số số 9 rồi khoảng 0.5s thì mới về số 0.
3. khi đếm lớn hơn 10 thì có 1 điều rất lạ là bình thường 1 sản phẩm đi qua thì led 7 thanh tăng lên 1 nhưng bầy giờ thì nó tăng lên 2. kiểu như là nó kick cả sườn dương lẫn sườn âm.

các bác xem em bị lỗi ji.
em thank các bác trước!

xuanquan90
08-26-2010, 09:05 PM
tin vui tin vui.
sau một thời gian ngâm cứu và chỉnh sửa. E đã cắm được cái mạch Đếm SP như yêu cầu.
e xin chỉ ra cách sửa cái lỗi của mình, nếu bạn nào đã làm mà mắc phải thì có thể tham khảo:
1. Nút start ko có tác dụng là do chúng ta không cấm ngắt ngoài 1 trong khi khởi động lên hàm đếm vẫn hoạt động và kết quả là vẫn đếm trong khi ta chưa bấm nút start.
2. lỗi này thì tôi ko bít. nhưng khi chỉnh lại code thi lại ngon.
3.lỗi này là do ta chỉnh mức nhậy cao quá lên bị. chúng ta chỉ cần chỉnh lại biến trở là ok.

xuanquan90
09-04-2010, 11:31 AM
ah. Nhân tiện đây cho em hỏi về cách khai báo trong C cái:
sao chúng ta không dùng là
#define led1 P1_0;
#define led2 P1_1;
#define led3 P1_2;
#define led4 P1_3;

thay cho:
sbit LED1 = P1_0 ;
sbit LED2 = P1_1;
sbit LED3 = P1_2;
sbit LED4 = P1_3;

em thấy 2 cách vẫn chạy mà.
Mong các cao thủ giải thích cho em hiểu rõ hơn về phần này với ạ.
Em xin cảm ơn mọi người nhiều!

chubin
09-12-2010, 02:18 PM
các anh cho em hỏi chút.em đang làm đề đo tốc độ động cơ sử dụng encoder.khi đếm đủ 1000 vòng thì xuất tín hiệu ra 1 post đóng cắt rơle.theo em tìm hiểu thì phần đo tốc độ động cơ tương tự như phần đếm sp ở trên.nhưng em còn mắc phần khi đếm đủ số vòng thì xuất ra rơle nữa.a nào giúp em phần đó với ah!

Chim xanh
09-12-2010, 08:44 PM
các anh cho em hỏi chút.em đang làm đề đo tốc độ động cơ sử dụng encoder.khi đếm đủ 1000 vòng thì xuất tín hiệu ra 1 post đóng cắt rơle.theo em tìm hiểu thì phần đo tốc độ động cơ tương tự như phần đếm sp ở trên.nhưng em còn mắc phần khi đếm đủ số vòng thì xuất ra rơle nữa.a nào giúp em phần đó với ah!
Đơn giản thôi

sbit ROLE = P2^3;
unsigned int dem;
void ROLE (void)
{
if (dem == 1000)
{
dem = 0;
ROLE = 0; // bat ro le
}
}

chubin
09-12-2010, 09:42 PM
cho em hỏi thêm nữa là thầy giáo em yêu cầu thêm là mình phải đặt và khống chế được tốc độ đó.và ý tưởng của e muốn nữa là mình sẽ dùng 2 cặp led chứ không phải 1 led nữa.khi đó 1 led dùng để hiển thị tốc độ.1 led thì dùng để hiển thị số vòng mà động cơ đã quay được.2 led này cùng xuất ra từ 1 post[/URL][URL="http://img694.imageshack.us/img694/9524/47718726.png"]http://img694.imageshack.us/img694/9524/47718726.png (http://img694.imageshack.us/img694/9524/47718726.png)


em trên đây là hình mô phỏng của e ý tưởng của e các anh cho e ý kiến.các phím up dow của em có tác dụng thay đổi giá trị đặt,khống chế tốc độ

Miss_u88
09-12-2010, 10:21 PM
cho em hỏi thêm nữa là thầy giáo em yêu cầu thêm là mình phải đặt và khống chế được tốc độ đó.và ý tưởng của e muốn nữa là mình sẽ dùng 2 cặp led chứ không phải 1 led nữa.khi đó 1 led dùng để hiển thị tốc độ.1 led thì dùng để hiển thị số vòng mà động cơ đã quay được.2 led này cùng xuất ra từ 1 post[/URL][URL="http://img694.imageshack.us/img694/9524/47718726.png"]http://img694.imageshack.us/img694/9524/47718726.png (http://img694.imageshack.us/img694/9524/47718726.png)


em trên đây là hình mô phỏng của e ý tưởng của e các anh cho e ý kiến.các phím up dow của em có tác dụng thay đổi giá trị đặt,khống chế tốc độ

đọc mãi chẳng thây câu hỏi của bạn nằm ở chỗ nào ??? dấu chấm hỏi đặt ở đâu vậy ?
theo mình , đầu tiên là phải đặt tốc độ cần khống chế là bao nhiêu đã rồi mới cho động cơ chạy . khi bằng tốc độ đó thì nó dừng

code thì ở trên có rồi đó .Dùng thêm 1 biến trung gian nữa

chubin
09-13-2010, 01:11 PM
ý của câu hỏi của mình là thế này.đề bài là đo tốc độ động cơ với 3 điều kiện:ĐO TỐC ĐỘ,KHỐNG CHẾ TỐC ĐỘ VÀ ĐẶT TỐC ĐỘ.khi đó đo tốc độ thì như đếm sp ở trên,bây giờ còn đặt và khống chế tốc độ nữa,phần đặt tốc độ thì thầy yêu cầu đếm 1000 vòng đủ 1000 vòng thì xuất ra rơle,tiếp là phần khống chế tốc độ nữa.thì thầy giáo bảo thế này trong quá trình đếm số vòng thầy không thích đếm đến 1000 vòng mà chỉ cần đếm đến 100 vòng hay 110 vòng....thì nó cũng dừng lại và cũng xuất nó ra rơle bằng cái nút nhấn mà không làm thay đổi giá trị 1000 vòng mình đặt trước đó.tếp nữa là thầy yêu cầu dùng 2 LED 7 thanh để hiển thị giá trị.thì như ở trên mình dùng mấy cái nút nhấn UP DOW để thay đổi.như kiểu đề đo và khống chế nhiệt độ phòng ý.bạn biết chỉ giáo cho mình chỗ mà mình muốn thay đổi giá trị số vòng đóhttp://img819.imageshack.us/img819/3330/35257502.png (http://img819.imageshack.us/img819/3330/35257502.png)

đây là hinh mình minh họa ý tưởng của mình
http://img36.imageshack.us/img36/4011/imgcbtocdoquay.jpg (http://img36.imageshack.us/img36/4011/imgcbtocdoquay.jpg)

còn đây là mô hình ở trên trường về bài của mình thầy yêu cầu làm

chubin
09-13-2010, 11:40 PM
đây là chương trình code mình làm thử cho bài đo tốc độ của mình ở trên xin các anh chỉ giáo cho em em thử chạy nhưng không đúng lắm


#include <REGX52.H>

#include<stdio.h>

#include<math.h>
sbit OK=P0^0;
sbit up=P0^1;
sbit down=P0^2;
unsigned char M[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
unsigned char donvi, chuc, tram, nghin;
long int n, j, k, i, num,dat=100,dem,c,t,ng,dv;
void delay(unsigned long int t)

{

unsigned long int i;

for(i=1;i<=t;++i);

}

void hienthi(int num)

{

nghin=num/1000;

tram=(num%1000)/100;

chuc=((num%1000)%100)/10;

donvi= ((num%1000)%100)%10;

for(j=0;j<=100;j++)

{

P1=0x08; //P1.3=1,led hang don vi duoc cap nguon

P2=M[donvi];

delay(200);

P1=0x04; //P1.2=1,led hang chuc duoc cap nguon

P2=M[chuc];

delay(200);

P1=0x02; //P1.1=1,led hang tram duoc cap nguon

P2=M[tram];

delay(200);

P1=0x01; //P1.0=1,led hang nghin duoc cap nguon

P2=M[nghin];;

delay(200); }




}
void hien (int n)

{

ng=n/1000;

t=(n%1000)/100;

c=((n%1000)%100)/10;

dv= ((n%1000)%100)%10;

for(j=0;j<=100;j++)

{

P1=0x80; //P1.3=1,led hang don vi duoc cap nguon

P2=M[dv];

delay(200);

P1=0x40; //P1.2=1,led hang chuc duoc cap nguon

P2=M[c];

delay(200);

P1=0x20; //P1.1=1,led hang tram duoc cap nguon

P2=M[t];

delay(200);

P1=0x10; //P1.0=1,led hang nghin duoc cap nguon

P2=M[ng];;

delay(200);
}





}


void key(void)
{
if(OK==0)
{
while(OK==0);
dem++;
if(dem==2) dem=0;
}
}
void main(void)
{
TMOD=0x25; //timer 1 che do 2, timer 0 che do 1 lay xung ngoai


TH1=TL1=-100; //nap gia tri dau cho timer 1

while(1)

{

TH0=TL0=0; //xoa timer 0

TR1=TR0=1; //cho phep timer hoat dong

for(i=1;i<=10000;i++) //tao khoang thoi gian 1s

{

while(!TF1);

TF1=0;

}


n=TH0*256+TL0; //gia tri cua n doc duoc

num=(int)(n*60/100); //khoet 10 khe




hienthi(num);
key();
{
while (dem==1)
{
key();
if ( up==0)
dat=dat+10;
if ( down==0)
dat=dat-10;
hien( dat);
}
TH0=TL0=0;

TR0=1;
if ((TH0*256+TL0)==(dat*100) )
P0^4==1;
hien(dat);

} }


}

bienkiem2
09-16-2010, 10:01 AM
anh ơi em hỏi nhé em mới tìm hiểu led 7 đoạn mạch đếm sp? của anh sao ko dùng 1 ngắt iint1 thui tại sao lại dùng timer0 để tạo thời gian trễ hả a? nếu thế chỉ cần cho delay() vào là dc

Chim xanh
09-18-2010, 11:45 AM
anh ơi em hỏi nhé em mới tìm hiểu led 7 đoạn mạch đếm sp? của anh sao ko dùng 1 ngắt iint1 thui tại sao lại dùng timer0 để tạo thời gian trễ hả a? nếu thế chỉ cần cho delay() vào là dc
Đơn giản trễ bằng câu lệnh for(i=0;i<time,i++) không chính xác nên phải dùng timer cho chính xác.
Cái quan trọng là dùng ngắt timer để hiển thị, giá trị hiển thị sẽ mượt và được update liên tục

chubin
09-18-2010, 08:30 PM
bạn chim xanh chỉ giáo cho mình về bài đo tốc độ động cơ của mình ở trên với.mình viết code rùi nhưng không hiểu nó sai ở đâu nữa.bạn xem sửa dùm mình với

leemanhj916
10-28-2010, 04:08 PM
bạn chim xanh chỉ giáo cho mình về bài đo tốc độ động cơ của mình ở trên với.mình viết code rùi nhưng không hiểu nó sai ở đâu nữa.bạn xem sửa dùm mình với

Sao cái này bạn không post cả project lên nhỉ? nhìn cái code kia cũng chẳng muốn xem rồi. nếu chương trình chạy không đúng thì ta nên dò ngược lại từ kết quả ấy. sẽ dễ hơn nhiều bạn ah. Giả sử kết quả của bạn là LED 7 thanh hiển thị sai thì ta cần xem lại phần quét LED .... chứ. bạn ném cho một cái code hỏi 1 người xem nó có sai chỗ nào thì khó lắm.
Chẳng nhẽ giờ lại ngồi tạo 1 project cho bạn, rồi hì hục vẽ một cái mạch mô phỏng để test sao?

quanghuyenhaui
11-24-2010, 05:50 PM
các anh cho e hỏi mạch đếm sản phẩm hiển thị bàng 4 led 7 thanh va 6 led 7 thanh có gì khác nhau không ah.
nếu khác thì khác ở chỗ nào hả anh.a có code hướng dẫn e với nha.e cảm ơn các anh chị nhiều
e mới học vi điều khiển nhưng không hiểu gì cả
mong nhận dược câu trả lời sớm nhất của các anh.

Mãi Yêu Em88
11-24-2010, 06:54 PM
các anh cho e hỏi mạch đếm sản phẩm hiển thị bàng 4 led 7 thanh va 6 led 7 thanh có gì khác nhau không ah.
nếu khác thì khác ở chỗ nào hả anh.a có code hướng dẫn e với nha.e cảm ơn các anh chị nhiều
e mới học vi điều khiển nhưng không hiểu gì cả
mong nhận dược câu trả lời sớm nhất của các anh.

câu hỏi này để cho giảng viên hỏi lúc vấn đáp thì hay thật :)) không có gì khác nhau đâu em ạ , chỉ khác mỗi LED 7 thanh thôi

code ở trang 1 topic của Thầy Nomad đó

quanghuyenhaui
11-25-2010, 08:29 AM
anh ơi cho e hỏi khi em mô phỏng trên protues 6 led 7 thanh nhưng led hàng dơn vị không lên 1,2.3 khi e đếm sản phẩm mà lại lên led hàng chục
đáng lẽ phải lên hàng đơn vị mới đúng nhưng đây lại lên hang chục

Mãi Yêu Em88
11-25-2010, 08:59 AM
anh ơi cho e hỏi khi em mô phỏng trên protues 6 led 7 thanh nhưng led hàng dơn vị không lên 1,2.3 khi e đếm sản phẩm mà lại lên led hàng chục

em post code hoặc mô phỏng lên thì mấy anh kia mới xem được cho chứ ??? chứ ngồi không như này ,anh đoán mò giỏi lắm :"> nó có thể có nhiều nguyên nhân như :
- xung vào ( sản phẩm ) nhanh quá , Led đơn vị hiển thị không kịp em chỉnh độ nhạy của con LM35 chưa chuẩn
- code em sai

atmel
11-25-2010, 09:03 AM
Đó là do việc bạn xuất mã hexa ra port để chọn led sáng bị sai, chỉnh lại giá trị này là ok.

VanDungEvn
11-25-2010, 04:06 PM
Bạn làm lại mã code led 7seg nhé, ví dụ dùng Led A chung
xem lại PORT nào được nối, sau đó viết thứ tự ra từ byte 7-0, lập và chuyển về 0x là ok, khi đó post ra không sợ bị lỗi nữa: ví dụ sau đây cho cả Led A chung và K chung, thứ tự mã như sau P7-0 = hgfedcba
unsigned char ma_bcd[14] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 ,0xff,0xBF}; // Common Anode
unsigned char ma_bcd[10] = {0x0A,0xFA,0x4C,0x68,0xB8,0x29,0x09,0x7A,0x08,0x28 }; // Common Anode

hoangtien_dt5
11-28-2010, 10:29 PM
hjx.nếu đề tài đồng hồ hiển thị led 7 thanh mà được như thế này thì hay biết mấy

trankien15190
11-29-2010, 12:12 PM
bai cua em la dem san pham dung led 7 thanh mo phong ngon rui the ma ra mach in chi co 3 con led sang the la the nao vay cac cao thu?

em post code hoặc mô phỏng lên thì mấy anh kia mới xem được cho chứ ??? chứ ngồi không như này ,anh đoán mò giỏi lắm :"> nó có thể có nhiều nguyên nhân như :
- xung vào ( sản phẩm ) nhanh quá , Led đơn vị hiển thị không kịp em chỉnh độ nhạy của con LM35 chưa chuẩn
- code em sai

trankien15190
11-29-2010, 01:51 PM
chuong trinh cua anh la hien thi tren 4 con led 7.vay em dung 6 led 7 thi lieu co xay ra tran ko nhi?ma anh oi cho em hoi cai nay.em dung code khac ma mach nguyen ly giong nhu cua anh thi mach co chay dc ko?em mo phong mach chay tot nhung ma khi cam vao bo mach thi mach chay bi loi.em gui code voi mo phong len cho anh nha.mong anh giup do

trankien15190
11-29-2010, 03:43 PM
#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 d1 = P2^0; // Cac dau ra quyet led
sbit d2 = P2^1;
sbit d3 = P2^2;
sbit d4 = P2^3;
sbit d5 = P2^4;
sbit d6 = P2^5;
sbit led = P2^6;

unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0}; // Ma data cua led 7 thanh
unsigned long int dem;
unsigned char tramnghin,chucnghin,nghin,tram,chuc,dv;

// 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 xoa_led(void)
{
P0=0xff;
P2=0xff;
}
// Ham quet LED
void Display(void)
{
xoa_led();
tramnghin=dem/100000;
if(tramnghin==0)
xoa_led();
else
{ d6=0;d5=1;d4 = 1; d3 = 1; d2=1; d1 = 1;
P0=M[tramnghin];
delay_ms(m);
xoa_led();
}
xoa_led();
chucnghin = (dem%100000)/10000;

if ((tramnghin == 0)&&(chucnghin==0)) // Neu gia tri trong hang nghin = 0 thi led hang nghin khong sang
xoa_led();
else
{ d6=1;d5=0;d4 = 1; d3 = 1; d2=1; d1 = 1;
P0=M[chucnghin];
delay_ms(m);
xoa_led();
}

xoa_led();
nghin = ((dem%100000)%10000)/1000;

if ((tramnghin == 0)&&(chucnghin==0)&&(nghin==0)) // Neu gia tri trong hang nghin = 0 thi led hang nghin khong sang
xoa_led();
else
{ d6=1;d5=1;d4 = 0; d3 = 1; d2=1; d1 = 1;
P0=M[nghin];
delay_ms(m);
xoa_led();
}

tram =(((dem%100000)%10000)%1000)/100;

if ((tramnghin==0)&&(chucnghin==0)&&(nghin == 0)&&(tram == 0)) // Neu gia tri trong hang nghin, va hang tram deu = 0 thi led hang nghin, hang tram khong sang
xoa_led();
else
{ d6=1;d5=1;d4 = 1; d3 = 0; d2=1; d1 = 1;
P0=M[tram];
delay_ms(m);
xoa_led();
}

chuc = ((((dem%100000)%10000)%1000)%100)/10;

if ((tramnghin==0)&&(chucnghin==0)&&(nghin == 0)&&(tram == 0)&&(chuc == 0)) // Neu gia tri trong hang nghin, va hang tram, hang chuc deu = 0 thi led hang nghin, hang tram, hang chuc khong sang.
xoa_led();
else
{ d6=1;d5=1;d4 = 1; d3 = 1; d2=0; d1 = 1;
P0=M[chuc];
delay_ms(m);
xoa_led();
}

dv =((((dem%100000)%10000)%1000)%100)%10;
d6=1;d5=1;d4 = 1; d3 = 1; d2=1; d1 = 0;
P0=M[dv];
delay_ms(m);
xoa_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;
dem = 0; // Gia tri khoi tao ban dau bang 0
xoa_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 2
{
EA=0; // cam ngat ngoai
dem++;
led=0;
if(dem >= 99)
led=1;
dem=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
dem = 0; // Gia tri khoi tao cua bien ban dau.
while(1)
{
}
}

trankien15190
12-03-2010, 09:23 AM
anh giúp em với.anh cho em hỏi vẽ mạch nguyên lý ở port 1 và 2 có khác gì port 0 không ạ.em cảm ơn rất nhìu...............chuong trinh cua anh la hien thi tren 4 con led 7.vay em dung 6 led 7 thi lieu co xay ra tran ko nhi?ma anh oi cho em hoi cai nay.em dung code khac ma mach nguyen ly giong nhu cua anh thi mach co chay dc ko?em mo phong mach chay tot nhung ma khi cam vao bo mach thi mach chay bi loi.em gui code voi mo phong len cho anh nha.mong anh giup do

leemanhj916
12-03-2010, 05:26 PM
#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 d1 = P2^0; // Cac dau ra quyet led
sbit d2 = P2^1;
sbit d3 = P2^2;
sbit d4 = P2^3;
sbit d5 = P2^4;
sbit d6 = P2^5;
sbit led = P2^6;

unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0}; // Ma data cua led 7 thanh
unsigned long int dem;
unsigned char tramnghin,chucnghin,nghin,tram,chuc,dv;

// 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 xoa_led(void)
{
P0=0xff;
P2=0xff;
}
// Ham quet LED
void Display(void)
{
xoa_led();
tramnghin=dem/100000;
if(tramnghin==0)
xoa_led();
else
{ d6=0;d5=1;d4 = 1; d3 = 1; d2=1; d1 = 1;
P0=M[tramnghin];
delay_ms(m);
xoa_led();
}
xoa_led();
chucnghin = (dem%100000)/10000;

if ((tramnghin == 0)&&(chucnghin==0)) // Neu gia tri trong hang nghin = 0 thi led hang nghin khong sang
xoa_led();
else
{ d6=1;d5=0;d4 = 1; d3 = 1; d2=1; d1 = 1;
P0=M[chucnghin];
delay_ms(m);
xoa_led();
}

xoa_led();
nghin = ((dem%100000)%10000)/1000;

if ((tramnghin == 0)&&(chucnghin==0)&&(nghin==0)) // Neu gia tri trong hang nghin = 0 thi led hang nghin khong sang
xoa_led();
else
{ d6=1;d5=1;d4 = 0; d3 = 1; d2=1; d1 = 1;
P0=M[nghin];
delay_ms(m);
xoa_led();
}

tram =(((dem%100000)%10000)%1000)/100;

if ((tramnghin==0)&&(chucnghin==0)&&(nghin == 0)&&(tram == 0)) // Neu gia tri trong hang nghin, va hang tram deu = 0 thi led hang nghin, hang tram khong sang
xoa_led();
else
{ d6=1;d5=1;d4 = 1; d3 = 0; d2=1; d1 = 1;
P0=M[tram];
delay_ms(m);
xoa_led();
}

chuc = ((((dem%100000)%10000)%1000)%100)/10;

if ((tramnghin==0)&&(chucnghin==0)&&(nghin == 0)&&(tram == 0)&&(chuc == 0)) // Neu gia tri trong hang nghin, va hang tram, hang chuc deu = 0 thi led hang nghin, hang tram, hang chuc khong sang.
xoa_led();
else
{ d6=1;d5=1;d4 = 1; d3 = 1; d2=0; d1 = 1;
P0=M[chuc];
delay_ms(m);
xoa_led();
}

dv =((((dem%100000)%10000)%1000)%100)%10;
d6=1;d5=1;d4 = 1; d3 = 1; d2=1; d1 = 0;
P0=M[dv];
delay_ms(m);
xoa_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;
dem = 0; // Gia tri khoi tao ban dau bang 0
xoa_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 2
{
EA=0; // cam ngat ngoai
dem++;
led=0;
if(dem >= 99)
led=1;
dem=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
dem = 0; // Gia tri khoi tao cua bien ban dau.
while(1)
{
}
}



Giúp gì chứ nhỉ. thế kết quả của nó thế nào rồi. nó có hiện tượng gì. lỗi gì vậy bạn.
Ném cái code lên đấy rồi bảo mọi người sửa ah. Giờ có phải ai cũng ngồi nhà chơi và đọc & trả lời trên diễn đàn đâu chứ.

trankien15190
12-05-2010, 02:26 PM
mình xin port cái sơ đồ lên nha.hiện tượng chỉ sáng đựoc số 0 ở hàng đơn vị.mong mọi người sửa giúp
Giúp gì chứ nhỉ. thế kết quả của nó thế nào rồi. nó có hiện tượng gì. lỗi gì vậy bạn.
Ném cái code lên đấy rồi bảo mọi người sửa ah. Giờ có phải ai cũng ngồi nhà chơi và đọc & trả lời trên diễn đàn đâu chứ.

MrCong
01-06-2011, 09:29 AM
em thấy cái bác nói về cho chương trình quét led vào trong ngắt timer để sau mỗi lần ngắt timer thì giá trị được hiển thị .mà em thì còn bỡ ngỡ với cái môn VĐK này lắm
các bác có thể giải thích rõ hơn được không.có 1 đoạn code minh họa thì càng tốt

oxapxano1
04-19-2011, 10:06 AM
gửi anh nomad204
Em mới học môn vi điều khiển
và em có đề tài giống như anh
em đọc các bài test của anh rồi nhưng mà không hiểu gì cả
chán quá anh ơi
anh có thể cho em yahooo của anh để em hỏi bìa anh với đc không ạ
:L

phantumay
05-09-2011, 04:23 PM
các bác có ai có đề tài đếm sản phẩm hiển thi lên màn hình máy tính không
cho em xin voi
mail cua em la: maytuphan@gmail.com

Tym_Buon
05-12-2011, 08:56 AM
quét led có cần phải phức tạp như vậy đâu.chỉ cần đơn giản như sau,giả sử mình cho led thứ nhất sáng.
LED1=0;
P2=M[du_lieu];
delay(100);
LED1=1;
P2=0xff;
chỉ cần vậy thui là có thể xóa tiệt hiệu ứng bóng ma khi mà các bạn quét led gặp phải.
Đề tài đếm SP là đề tài dễ nhất trong các đề tài của môn VDK.Nếu muốn gửi lên máy tính thì đọc phần lập trình cho cổng nối tiếp là OK

tiennamdt3k4
05-18-2011, 03:56 AM
anh phantumay nói chính xác lắm. em thấy vấn đề vệt sáng mờ của led 7 thanh cũng như led ma trận đều do 1 nguyên nhân là chúng ta bỏ qua 1 lỗi nhỏ khi lập trình. mà em thấy mấy anh lập trình hiển thị cho 0 ->9999 dài quá.
em sẽ là đơn giản thôi Vd: cái mảng hiển thị 0->9 a[]={};
P1_0=led hiển thị số đơn vị 1000. cứ nhơ thế với P1_1,P1_2,P1_3.P0 là cổng hiển thị. hàm hiển thị như sau :
void hienthi(unsgned int i) // i là số đếm được.
{
P0=a[i/1000];P1_0=1;delay(1);P1_0=0; P0=0xff;//tắt bỏ tín hiệu trước khi sang led tiếp theo.
P0=a[(i%1000)/100];P1_1=1;delay(1);P1_1=0; P0=0xff;// số hàng trăm.
P0=a[(i%100)/10];P1_2=1;delay(1);P1_2=0; P0=0xff;
P0=a[i%10];P1_3=1;delay(1);P1_3=0; P0=0xff;
}
nguyên tắc : giả sử em có số 1234
1234/1000=1; vậy ta hiển thị led 1 là số 1. >> P0=a[1];
(1234%1000)/100. 1234%1000=1 dư 234 ; 234/100 =2; >>P0=a[2]
(1234%100)/10. 1234%100= 12 dư 34 ; 34/10 = 3;>>P0=a[3]
1234%10= 123 dư 4. >>P0=a[4]

boydt3k3
05-18-2011, 07:38 AM
anh phantumay nói chính xác lắm. em thấy vấn đề vệt sáng mờ của led 7 thanh cũng như led ma trận đều do 1 nguyên nhân là chúng ta bỏ qua 1 lỗi nhỏ khi lập trình. mà em thấy mấy anh lập trình hiển thị cho 0 ->9999 dài quá.
em sẽ là đơn giản thôi Vd: cái mảng hiển thị 0->9 a[]={};
P1_0=led hiển thị số đơn vị 1000. cứ nhơ thế với P1_1,P1_2,P1_3.P0 là cổng hiển thị. hàm hiển thị như sau :
void hienthi(unsgned int i) // i là số đếm được.
{
P0=a[i/1000];P1_0=1;delay(1);P1_0=0; P0=0xff;//tắt bỏ tín hiệu trước khi sang led tiếp theo.
P0=a[(i%1000)/100];P1_1=1;delay(1);P1_1=0; P0=0xff;// số hàng trăm.
P0=a[(i%100)/10];P1_2=1;delay(1);P1_2=0; P0=0xff;
P0=a[i%10];P1_3=1;delay(1);P1_3=0; P0=0xff;
}
nguyên tắc : giả sử em có số 1234
1234/1000=1; vậy ta hiển thị led 1 là số 1. >> P0=a[1];
(1234%1000)/100. 1234%1000=1 dư 234 ; 234/100 =2; >>P0=a[2]
(1234%100)/10. 1234%100= 12 dư 34 ; 34/10 = 3;>>P0=a[3]
1234%10= 123 dư 4. >>P0=a[4]

Thuật toán của bạn đúng rồi nhưng chỉ sử dụng với biến đếm dùng ngắt timer, với biến đếm dùng for thông thường với led sử dụng phương pháp quét cần có một vòng for lặp lại quá trình quét tần số tầm 10ms trở lên. Các bạn khi lập trình tốt nhất nên tạo cho mình một thư viện code chuẩn , khi cần dùng lại sẽ rất nhàn . Với bài toán quét led 7 tốt nhất nên dùng ngắt timer , rất đơn giản k bị phụ thuộc vào thời gian biến đếm :-c

tiendt343
06-13-2011, 07:07 AM
anh ơi anh cho e hỏi .E Mô phỏng như với các led đơn lẻ với transistor kích như các anh đã mô tả và code của các anh nhưng sao khi chạy nó vẫn nhấp nháy rất nhiều.Đc led này mất led kia.Các anh có bản mô phỏng nào mà ổn ko?cho em nhé!em cảm ơn ạ.
Các anh cho e hỏi thời gian quet là để led sáng trể hay là để làm gì ạ

Nomad204
06-13-2011, 08:56 AM
anh ơi anh cho e hỏi .E Mô phỏng như với các led đơn lẻ với transistor kích như các anh đã mô tả và code của các anh nhưng sao khi chạy nó vẫn nhấp nháy rất nhiều.Đc led này mất led kia.Các anh có bản mô phỏng nào mà ổn ko?cho em nhé!em cảm ơn ạ.
Các anh cho e hỏi thời gian quet là để led sáng trể hay là để làm gì ạ

Không mô phỏng quyét LED em nhé ! Vì nó còn phụ thuộc vào cấu hình máy tính của em. Nên chạy bằng mạch thật
Thời gian quét led phải điều chỉnh sao cho phù hợp để LED không bị nháy

mast0904
06-13-2011, 11:59 AM
thường các bạn mô phỏng bằng protues, protues bị lỗi mô phỏng led 7 thanh đơn, để tránh việc này ví dụ bài của bạn có 6 con 7 thanh thì bạn hay gọi con led 7 thanh kép 6 để quét mô phỏng, còn thực tế thì dùng thế nào cũng được, con kép chỉ là nó gộp chân lại so với con led đơn cho gọn thôi

tiendt343
06-14-2011, 08:05 PM
Có nghĩa là Led 7 thanh đơn bị lỗi phải khi mô phỏng phải không ạ ?
Em thấy nó cứ nhấp nháy chẳng ổn định gì cả .
Anh chị cho e hỏi thời gian quét tính toán thế nào để led không bị nháy

vietthanh123
06-14-2011, 08:57 PM
Để ko bị nháy thì tối thiểu bạn phải cho mỗi led hiện thị 24 lần/1 giây(hiện tượng ảnh lưu trên võng mạc gì đó). Tức nghĩa là: nếu bạn quét 4 con led thì trong 1 giây, thời gian sáng của mỗi led tối đa là chỉ là bằng 1000ms/24=41ms rồi chuyển sang con led khác.

tiendt343
06-15-2011, 05:32 AM
nhưng anh ơi! con số 1000ms là mặc định phải ko ạ > giả sử em muốn quét n con led thì thời gian sáng mỗi con là bao nhiêu ạ?
em vẫn thắc mắc quá

AVR_smart
09-01-2011, 11:27 AM
nhưng anh ơi! con số 1000ms là mặc định phải ko ạ > giả sử em muốn quét n con led thì thời gian sáng mỗi con là bao nhiêu ạ?
em vẫn thắc mắc quá
bạn cứ làm thế nào cho mỗi con led phải sáng tối thiểu 24 lần/1s thì được. ví dụ 1s=1000ms mà quyét 4 con thì mỗi lần quét sẽ là 41ms và mỗi con sẽ là 41/4ms. chú ý khi quét LED nên delay bằng timer hạn chế dùng hàm delay. chịu khó viết code dài 1 chút nhưng chuơng trình sẽ tối ưu hơn.

nmnvv
10-02-2011, 09:30 AM
hay quá. cám ơn thầy nhiều de em rap thử

traihatinh
11-23-2011, 10:48 PM
chào anh. e đang làm bài tập lớn về đếm sản phẩm dùng 8051 hiển thị led 7 thanh. anh có thể gửi cho e xin hinh ảnh và giải thích nguyên lí bộ thu phát hồng ngoại và encoder chữ u giúp em được không ạ.trong diễn àn anh có post lên nhưng e ko đọc được. địa chỉ email:anhduc1090@gmail.com. cảm ơn anh nhiều

thiennvbk
03-02-2012, 01:15 PM
bạn ơi mình đang làm đồ án mạch này.bạn cho mình xin cái mạch in va sơ đồ bố trí linh kiện vs code nha.
cảm ơn bạn rất nhiều.Mong bạn giúp đỡ mình.
bạn gửi Gmail giúp mình nhé : thiennvbk@gmail.com

hcthuan007
04-26-2012, 09:19 PM
..............................

Nomad204
04-28-2012, 02:10 PM
mấy a cho e hỏi tý. Khối nguồn có biến áp, cầu chỉnh lưu, IC, led, tụ, trở. Như vậy đã đủ chưa ? Nếu biến áp lắp vào CN2 thì CN1 lắp cái gì ? E chưa làm mạch thật nào nên còn bỡ ngỡ lắm. Các a sớm reply giúp e. Thanks

CN1 là cái đầu nối với phích cắm 220V, sau đó là cắm vào ổ điện để cung cấp điện cho biến áp, từ biến áp cung cấp điện cho mạch.

// Các bạn ở các bài trên có muốn xin mạch với code thì không có riêng cho các bạn đâu.
Đây là một bài hướng dẫn, thành công là ở chỗ các bạn tự làm được!

hcthuan007
04-29-2012, 07:53 AM
A nomad204 ơi a cho e xin lưu đồ thuật toán chương trình này đc ko? E chưa hiểu về chuơng trình này lắm !
Thanks

leeshun
04-29-2012, 10:49 PM
Em hãy nhìn lại bản thiết kế phần cứng nhé.
Khi Start chưa được nhấn, từ VCC đi qua một con trở khoảng 10k, khi đó chân Start có mức logic là 1, khi nhấn phím, mức 0 được đưa lên, chân Start có mức logic là 0.
Câu lệnh while(start); : Khi chưa nhấn nút Start, start = 1, chương trình bị dừng tại vòng lặp while(start);
Khi Start được nhấn, start = 0, điều kiện trong vòng lặp while(start); không còn đúng nữa, lúc này chương trình lại chạy tiếp những lệnh sau vòng lặp đó.

Nếu để xuất ra LED hoặc loa thì chỉ cần xuất mức 0 sau đó là 1 (số lần thì tùy) ra đúng chân (cũng do em định nghĩa luôn) là được.
Riêng với loa CHIP, cần một con transistor kích dòng thì loa mới kêu rõ được
Câu lệnh tham khảo :

sbit LED P3^6
....
void blink_led(void)
{
LED = 0;
delay_ms(500) // tre 0.5 giay
LED = 1;
delay_ms(500) // tre 0.5 giay
}

void main (void)
{
......
blink_led();
}

anh ơi gửi em cái thư viện linh kiện của a..em cảm ơn nhiều nhiều

nguyenngocphuc64
05-07-2012, 05:22 PM
anh oi cho em hoi encoder chu u la gi?
minh di mua thi bao nhu the nao?

anh oi cho em hoi encoder chu u la gi?
khi minh di mua thi phai bao nhu the nao?

NguyenThiMaiTrang
05-12-2012, 04:28 PM
anh Nomad204 oi, cho em hỏi,
Mạch đếm sản phẩm của anh em đã làm mạch thật nhưng hình như code có vấn đề nên nó không chạy được, Hic bây giờ không biết chỉnh sửa thế nào.
Anh có thể cho em bản code chính xác được không ạ!
Rất cảm ơn anh!
Anh có thể gửi bài giúp em qua địa chỉ tnmaitrang75@gmail.com
Chúc anh ngày vui vẻ, hạnh phúc!

à, cho em hỏi, con led các anh dung ở đây là anot, hay catot chung ạ.cảm ơn anh nhiều

hcthuan007
05-13-2012, 06:48 PM
nnnnnnnnnnnnnnnnnnnn

thiennvbk
05-30-2012, 09:49 AM
Phù phù. sau 1 thời gian đã sửa xong, mà nói đúng là làm mạch mới thêm còi báo khi sản phẩm đủ. Vừa rồi đặt mạch in còn thừa 5 tấm. Bạn nào muốn làm mạch này thì lh mình mình để lại cho với giá rẻ, chỉ cần hàn linh kiện và nạp chương trình nữa thôi
Email của mình hcthuan007@gmail.com
đã gửi mail cho bạn rùi nhé.hì
pm sớm mình với nhé, sắp nộp đồ án rùi.
thank!

anhhunghepho_tokyo
10-24-2012, 11:16 PM
làm gi mà cầu kì thế này.

bài đếm 9999 này mà bạn làm kieu nay thi dài quá.... biết bao giờ mới gõ xong. ví dụ như đi bảo vệ mà thầy giáo hỏi viết đếm đên 5 hoặc 6 số 9 thi bạn ngồi gõ cả ngày à.. @@

leemanhj916
10-25-2012, 09:20 AM
làm gi mà cầu kì thế này.

bài đếm 9999 này mà bạn làm kieu nay thi dài quá.... biết bao giờ mới gõ xong. ví dụ như đi bảo vệ mà thầy giáo hỏi viết đếm đên 5 hoặc 6 số 9 thi bạn ngồi gõ cả ngày à.. @@

Đối với newbie thì cần phải vậy để có thể hiểu rõ về vấn đề cần giải quyết !

boy_kute_tdh1k5
12-08-2012, 09:31 AM
e xl khi tự nhiên nhày vào đây nhưng e đang làm btap lớn gấp wa!các anh cho em hỏi làm sao chuyển mã nhị phân 8 bit ở đầy ra của ADC0804 xang mã BCD để hiển thi ra led 7 thanh phải ltn nhi các anh chỉ em voi!em cảm ơn nhiu ạ!