Thông báo

Collapse
No announcement yet.

[TUT] Project đếm sản phẩm

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • [TUT] Project đếm sản phẩm

    Project này em đã từng Post lên diễn đàn www.hauionline.com.
    Nay Post lại sang đây, mong chia sẻ được gì đó với anh em.

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


    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.
    Attached Files

  • #2
    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	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 để tải về
    Còn đây là phần mềm của Project :
    Attached Files

    Comment


    • #3
      Anh ơi, cho em hỏi? Anh biên dịch bằng C rồi nạp vào VDK bằng mạch nạp nào vậy? Cách thức nạp như thế nào? Thank a lot! Có gì anh reply cho em duc_huy_2507@yahoo.com nha! Thank

      Comment


      • #4
        Nguyên văn bởi Pamkin Xem bài viết
        Anh ơi, cho em hỏi? Anh biên dịch bằng C rồi nạp vào VDK bằng mạch nạp nào vậy? Cách thức nạp như thế nào? Thank a lot! Có gì anh reply cho em duc_huy_2507@yahoo.com nha! Thank
        Em có thể tìm trên mạng, có rất nhiều hướng dẫn làm mạch nạp với từ khóa "8051 USB Programmer" . Và theo anh bây giờ thì em nên làm những mạch kết nối bằng USB là tiện nhất.
        Lâu rồi anh cũng không làm về 89 nữa, chỉ thi thoảng làm giúp mấy cậu sinh viên trong trường nên những thứ này cũng mù mờ lắm.
        Mạch nạp của anh mua của www.pnlabvn.com, chạy cũng được.
        Nếu máy của em có cổng LPT thì làm theo mạch này, nhanh, gọn, ít tốn kém, mà nạp cũng ngon lắm :
        Attached Files

        Comment


        • #5
          Nguyên văn bởi Pamkin Xem bài viết
          Anh ơi, cho em hỏi? Anh biên dịch bằng C rồi nạp vào VDK bằng mạch nạp nào vậy? Cách thức nạp như thế nào? Thank a lot! Có gì anh reply cho em duc_huy_2507@yahoo.com nha! Thank
          Sau khi bạn viết chương trình xong thì bạn nhấn vào Deburg đẻ cho nó dịch thành file hex. rồi bạn dùng mạch nạp để nạp file hex đó vào vi diều khiển thôi, mà trong diên đàn này mọi người cũng đã hướng dẫn hết rồi, bạn cô gắng tham khảo nha. chuc bạn thành công

          Comment


          • #6
            Nguyên văn bởi Mr_se7en Xem bài viết
            Sau khi bạn viết chương trình xong thì bạn nhấn vào Deburg đẻ cho nó dịch thành file hex. rồi bạn dùng mạch nạp để nạp file hex đó vào vi diều khiển thôi, mà trong diên đàn này mọi người cũng đã hướng dẫn hết rồi, bạn cô gắng tham khảo nha. chuc bạn thành công
            Không phải là nhấn vào Debug, mà nhấn F7 để biên dịch.

            Comment


            • #7
              Bạn ơi. Bạn làm ơn giúp mình thiết kế mạch đếm sản phẩm trên phần mềm proteus được không . Mình đã kiểm tra phần thiết kế của bạn trên phần mềm altium . Nhưng không thể kiểm tra được mạch có hoạt động không. Bạn có thể cho mình xin file thiết kế trên proteus, để mình test thử . Xin chân thành cảm ơn bạn rất nhiều.

              Comment


              • #8
                Ông này tính ăn sẵn quá đấy, người ta đã thiết kế thế rồi, nếu muốn chuyển qua cái khác thi tự ngồi mày mò và vẽ theo!

                NHững người đưa ra được TUT thế này lại kèm cả SCH và CODE hiếm lắm đấy!
                Trần Đức Sơn

                tel:0934691385

                Comment


                • #9
                  Cần anh em giúp đỡ gấp. Em đang vẽ lại sơ đồ thiết kế bằng chương trinh proteus. Nhưng không thể tìm được khối CHU U


                  Mong anh em giúp đỡ.
                  Em có gửi file đính kèm viết bằng proteus. Các bác thêm giúp em cái.
                  Em xin chân thành cảm ơn.

                  Comment


                  • #10
                    file proteus đính kèm :
                    http://www.mediafire.com/download.php?1mjm2djzwdn
                    Các bác sử giúp em

                    Comment


                    • #11
                      khối CHU U vào phần có led matrix và led 7 đoạn mà tìm có đấy

                      Comment


                      • #12
                        bạn ơi. Bạn có thể cho mình biết tên con đấy là gì được không ? thanks

                        Comment


                        • #13
                          Nếu ở Ha Nội, bạn ra Chợ Giời, hoặc lên Hàn Thuyên hỏi Encoder chữ U là ai cũng biết.
                          Thực ra mình cũng không nhớ tên của nó là gì.

                          Comment


                          • #14
                            Nguyên văn bởi theblack20 Xem bài viết
                            Bạn ơi. Bạn làm ơn giúp mình thiết kế mạch đếm sản phẩm trên phần mềm proteus được không . Mình đã kiểm tra phần thiết kế của bạn trên phần mềm altium . Nhưng không thể kiểm tra được mạch có hoạt động không. Bạn có thể cho mình xin file thiết kế trên proteus, để mình test thử . Xin chân thành cảm ơn bạn rất nhiều.
                            Mạch và code đảm bảo chạy, vì mình không hề chỉnh sửa chúng.
                            Còn vẽ Proteus thì bạn tự nghiên cứu nhé. Nhưng chú ý là chỉnh lại thời gian delay để quét led nhé. Trong Proteus quyét led 7 thanh và quyét led ma trận hơi kém.
                            Chú ý :
                            Các bạn thay con Diode trước khối transistor trong nguyên lý bằng một con trở công suất (như trong phần kích dòng mình đã nói). Xin lỗi vì lúc đó chưa Fix lại thiết kế mà cứ thế chụp hình.

                            Comment


                            • #15
                              Nguyên văn bởi theblack20 Xem bài viết
                              file proteus đính kèm :
                              http://www.mediafire.com/download.php?1mjm2djzwdn
                              Các bác sử giúp em
                              sao của mình không chạy được nhĩ,ko biết Proteus ver..mấy ha bạn
                              |

                              Comment

                              Về tác giả

                              Collapse

                              Nomad204 Tìm hiểu thêm về Nomad204

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X