Thông báo

Collapse
No announcement yet.

Lập trình & mô phỏng trên Proteus cho 8051

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

  • Lập trình & mô phỏng trên Proteus cho 8051

    Xin có đôi lời cùng anh chị trên diễn đàn
    Tôi xin mở mục này là nhằm làm khổ bản thân mình một chút nhằm chia xẻ những gì mà mình được hiểu biết về 8051.
    Đây là chuyên mục trình bày mạch cách rõ ràng các chương trình được lập trình & mô phỏng trên Proteus, ngõ hầu giúp anh chị thuận tiện trong quá trình học hỏi hay tham khảo, vào đây có thể xem hoặc download tải về đầy đủ các ứng dụng về 8051.
    Tuy nhiên, trên tinh thần là làm khổ thân mình rồi, nên cũng không mong muốn gì nhận thêm sự chỉ trích, công kích của anh chị nữa. Do đó nếu có cám ơn tôi thì nhấn nút THANK không thì thôi cũng tốt
    Niềm vui là tôi gởi lên được anh chị ghé xem là hạnh phúc lắm rồi.
    Xin anh chị để ý giùm và đón xem, tôi sẽ post dần lên, 1 tuần 1 ứng dụng ạh


  • #2
    1/ Mô phỏng LED matrix

    Đây là chương trình điều khiển LED matrix 8x8
    Dùng 8051 điều khiển 1 led matran hiển thị từ 0 đến 9
    Sử dụng ngắt để hiển thị led, đây là một trong những phương pháp xuất led hiệu quả, có thời gian tôi sẽ post code dùng phương pháp quyets led bằng ngắt chạy trên ARM lpc2103, rất đẹp
    Nội dung:
    1- Code C cho 8051
    2- Sơ đồ mạch
    3- Code mô phỏng trên Proteus

    #include <reg52.h>
    #include <intrins.h>
    #define uchar unsigned char
    #define uint unsigned int
    uchar code Table_OF_Digits[]=
    {
    0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00,
    0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00,
    0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00,
    0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00,
    0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00,
    0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00,
    0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00,
    0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00,
    0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00,
    0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00,
    };
    uchar i=0,t=0,Num_Index = 0;

    void main()
    {
    P3 = 0x80;
    Num_Index = 0;
    TMOD = 0x00;
    TH0 = (8192-2000)/32;
    TL0 = (8192-2000)%32;
    TR0 = 1;
    IE = 0x82;
    while(1);
    }

    void LED_Screen_Display() interrupt 1
    {
    TH0 = (8192-2000)/32;
    TL0 = (8192-2000)%32;
    P3 = _crol_(P3,1);
    P0 = ~Table_OF_Digits[Num_Index * 8 +i];
    if(++i == 8) i = 0;
    if(++t == 250)
    {
    t = 0x00;
    if(++Num_Index == 10) Num_Index = 0;
    }
    }



    Attached Files
    Last edited by MoHanDien; 21-01-2011, 17:19.

    Comment


    • #3
      Anh chị nào xem code không hiểu chỗ nào và cần phân tích chỗ nào thì liên hệ, tôi sẽ trình bày code trên đây cho anh chị để có thể hiểu và nắm bắt sau hơn

      Comment


      • #4
        Đây là code chương trình.
        Anh chị lưu ý: Do diễn đàn ko hỗ trợ file RAR hay sao đó tôi ko rõ mà gởi lên file RAR là báo lỗi, do đó tôi đã sữa lại cái đuôi thành ZIP nếu anh chị giải nén không được, giả sử vậy, thì đổi lại ZIP sang RAR rồi giải nén.
        Nôi dung trong đó gồm:
        1- 2 files để xem sơ đồ và mô phỏng mạch
        2- 1 thư mục chữa hex files sau khi đã biên dịch thành công
        3- 1 thư mục chứa đầy đủ các thứ của chương trình, đem về nhấn vào files Project là biên dịch hoặc chỉnh sửa lại nội dung hiển thị ra led, hoặc thay số 0--9 thành 1 chuỗi dài ví dụ như: HAPPY NEW YEAR
        Attached Files

        Comment


        • #5
          2/ hiển thị đồ họa trên led matrix

          CHƯƠNG TRÌNH THỨ 2 NÀY LÀ:
          HIỂN THỊ ĐỒ HỌA TRÊN LED MATRIX

          Cũng là sơ đồ trên, tuy nhiên lập trình phức tạp và khó khăn hơn 1 chút, tuy nhiên đổi lại là đẹp mắt hơn.
          Khó ở chỗ: CHươn trình dùng thêm 1 Buttom- phím nhấn, mỗi lần nhấn là 1 hình sẽ thay đổi.
          Với ứng này: Anh chị có thể thay đổi tha hồ hình ảnh, trái tim, ngôi sao,....mà mình thích, số lượng hình là không hạn chế.


          Code:
          #include <reg52.h>
          #include <intrins.h>
          #define uchar unsigned char 
          #define uint unsigned int
          
          uchar code M[3][8]=
          {
           	{0x00,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x00},
          	{0x00,0x38,0x44,0x54,0x44,0x38,0x00,0x00},
          	{0x00,0x20,0x30,0x38,0x3c,0x3e,0x00,0x00}
          };
          
          uchar i,j;
          void main()
          {
           	P0 = 0xff;
          	P1 = 0xff;
          	TMOD = 0x01;
          	TH0  = (65535-2000)/256;
          	TL0  = (65535-2000)%256;
          	IT0 = 1;
          	IE  = 0x83;
          	i   = 0xff;
          	while(1);
          }
          
          void Key_Down() interrupt 0
          {
           	P0 = 0xff;
          	P1 = 0x80;
          	j = 0;
          	i = (i+1)%3;
          	TR0 = 1;
          }
          
          void Show_Dot_Matrix() interrupt 1
          {
          	TH0  = (65535-2000)/256;
          	TL0  = (65535-2000)%256;
          	P1 = _crol_(P1,1);
          	P0 = ~M[i][j];
          	j=(j+1)%8;	
          }
          Attached Files
          Last edited by MoHanDien; 21-01-2011, 15:49.

          Comment


          • #6
            Anh chị xin lưu ý: Đây là code chương trình đảm bảo là code xịn 99,99% đã được chạy test ok. Nên anh chị hãy yên tâm thao khảo hoặc làm theo. Nếu gặp sự cố thì:
            1- Kiểm tra lại sơ đồ mạch mình đã kiểm tra OK chưa?
            2- Dao động thạch anh
            3- Chân Reset
            4- Cuối cùng là cứ liên hệ với tôi, nếu giúp được thì tôi sẽ giúp.

            Comment


            • #7
              3/ Vòng lặp hiển thị LED từ 0-9

              3/ ĐỀ TÀI TIẾP THEO HÔM NAY LÀ: VÒNG LẶP ĐIỀU KHIỂN LED HIỂN THỊ TỪ 0 ĐẾN 9

              Giới thiệu:
              Đây là chương trình đơn giản, nó đơn thuần là một vòng lặp hiển thị 1 led 7 đoạn, hiển thị lần lượt từ 0 đến 9.
              Mục đích:
              Giúp anh chị biết cách giao tiếp được led 7 đoạn với vi điều khiển và làm quen với khái niệm vòng lặp.

              Ở đây có sẵn code và project files của Keil C và 2 phương mô phỏng sơ đồ mạch trên Proteus. Anh chị download- tải về rồi tiến hành chạy thử, với code sẵn có anh chị có thể chỉnh sửa lại theo ý của mình để phát triển tiếp.
              chúc thành công!

              Code:
              #include <reg52.h>
              #include <intrins.h>
              #define uchar unsigned char
              #define uint unsigned int
              uchar code DSY_CODE[]=
              {
               	0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x82,0xf8,0x80,0x90,0xff	
              };
              
              void DelayMS(uint x)
              {
               	uchar t;
              	while(x--)
              	for(t=120;t>0;t--);
              }
              
              void main()
              {
               	uchar i=0;
              	P0=0x00;
              	while(1)
              	{
              	 	P0=~DSY_CODE[i];
              		i=(i+1)%10;
              		DelayMS(200);
              	}
              }

              Comment


              • #8
                Code chương trình- như đã nói ở trên, anh chị cứ yên tâm- đây là code đảm bảo 99,99% là đã được kiểm tra, lập trình và cho chạy rất tốt. Nếu có sự cố- anh chị kiểm tra trước các bước như đã nói ở trên, sau đó mà vẫn không được thì liên hệ, tôi giải thích cho anh chị.
                Attached Files

                Comment


                • #9
                  4/ Hiển thị LCD1602

                  4- ĐỀ TÀI NÀY LÀ:
                  GIAO TIẾP VÀ HIỂN THỊ LCD 16X02- GIẢ LẬP QUAN BÁO ĐIỆN TỬ


                  Mục tiêu của đề tài này là tôi giả lập LCD chạy 1 đoạn text qua lại lên xuống như các quang báo dùng led.
                  Đề tài này nói chung là khó, do đó anh chị cần có thời gian để đọc và nghiên cứu thật kỷ trước khi đưa lên những câu hỏi liên qua, vì đây là đoạn code hơi dài và ứng dụng 1 số kỷ thuật lập trình hơi phức tạp. Nếu anh chị thấy khó hiểu thì tôi post lại những ứng dụng đơn giản hơn 1 chút để anh chị tham khảo.


                  Code:
                  /***************   Mohandien  ******************/
                  #include <reg52.h>
                  #include <string.h>
                  #define uchar unsigned char
                  #define uint unsigned int
                  void Initialize_LCD();
                  void ShowString(uchar,uchar,uchar *);
                  sbit K1 = P3^0;
                  sbit K2 = P3^1;
                  sbit K3 = P3^2;
                  
                  uchar code Prompt[]="PRESS K1--K4 TO START DEMO PROG";
                  uchar const Line_Count = 6;
                  uchar code Msg[][80]=
                  {
                   	"Many CAD users dismiss",
                  	"process of creating PCB",
                  	"of view.with PCB layout",
                  	"placement and track routing,",
                  	"can often be the most time",
                  	"And if you use circuit simulation",
                  	"you are going to spend even more"
                  };
                  uchar Disp_Buffer[32];
                  void Delayxms(uint ms)
                  {
                   	uchar i;
                  	while(ms--)
                  	{
                  	 	for(i=0;i<120;i++);
                  	}
                  }
                  
                  void V_Scroll_Display()
                  {
                   	uchar i,j,k = 0;
                  	uchar *p = Msg[0];
                  	uchar *q = Msg[Line_Count] + strlen(Msg[Line_Count]);
                  	while(p<q)
                  	{
                  	 	for(i=0;(i<16)&&(p<q);i++)
                  		{
                  		 	if(((i==0)||(i==15))&& *p == ' ')
                  				p++;
                  			if(*p != '\0')
                  			{
                  			 	Disp_Buffer[i] = *p++;
                  			}
                  			else
                  			{
                  			 	if(++k>Line_Count)
                  					break;
                  				p = Msg[k];
                  				Disp_Buffer[i] = *p++;
                  			}
                  		}
                  		for(j=i;j<16;j++)
                  			Disp_Buffer[j]=' ';
                  		while(F0)
                  			Delayxms(5);
                  		ShowString(0,0,"      ");
                  		Delayxms(150);
                  		while(F0)
                  			Delayxms(5);
                  		ShowString(0,1,Disp_Buffer);
                  		Delayxms(150);
                  		while(F0)
                  			Delayxms(5);
                  		ShowString(0,0,Disp_Buffer);
                  		ShowString(0,1,"      ");
                  		Delayxms(150);	
                  	}
                  	ShowString(0,0,"         ");
                  	ShowString(0,1,"         ");
                  }
                  
                  void H_Scroll_Display()
                  {
                  	uchar m,n,t = 0,L=0;
                  	uchar *p = Msg[0];
                  	uchar *q = Msg[Line_Count] + strlen(Msg[Line_Count]);
                  	for(m=0;m<16;m++)
                  			Disp_Buffer[m]=' ';	
                  	while(p<q)
                  	{
                  	 	if((m=16||m==31)&& *p == ' ')
                  			p++;
                  		for(m=16;m<32&&p<q;m++)
                  		{
                  		 	if(*p != '\0')
                  			{
                  				Disp_Buffer[m] = *p++; 	
                  			}
                  			else
                  			{
                  			 	if(++t>Line_Count)
                  					break;
                  				p = Msg[t];
                  				Disp_Buffer[m] = *p++;
                  			}
                  		}
                  		for(n=m;n<32;n++)
                  			Disp_Buffer[n]=' ';
                  		for(m=0;m<=16;m++)
                  		{
                  		 	while(F0)
                  		 		Delayxms(5);
                  		   	ShowString(0,L,Disp_Buffer+1);
                  		   	while(F0)
                  		 		Delayxms(5);
                  			Delayxms(20);
                  		}
                  		L = (L==0)? 1:0;
                  		Delayxms(200);
                  	}
                  	if(L==1)
                  		ShowString(0,1,"      ");	
                  }
                  
                  void EX_INT0() interrupt 0
                  {
                   	F0 = !F0;
                  }
                  
                  void main()
                  {
                   	uint Count = 0;
                  	IE = 0x81;
                  	IT0 = 1;
                  	F0  = 0;
                  	Initialize_LCD();
                  	ShowString(0,0,Prompt);
                  	ShowString(0,1,Prompt+16);
                  	while(1)
                  	{
                  	 	if(K1 == 0)
                  		{
                  		 	V_Scroll_Display();
                  			Delayxms(200);
                  		}
                  		else if(K2 == 0)
                  		{
                  		 	H_Scroll_Display();
                  			Delayxms(200);	
                  		}
                  	}
                  }
                  Attached Files
                  Last edited by MoHanDien; 21-01-2011, 16:23.

                  Comment


                  • #10
                    Anh chị cần giao tiếp những gì liên quan, thì xin cứ tự nhiên đưa lên yêu cầu, trong phạm vi chủ đề này, tôi xin giúp cho anh chị. Ngoài chủ đề này, tôi không dám đảm nhiệm mong anh chị thông cảm. Vì diễn đàn không thiện cảm với mấy mục- xin cho. Tuy nhiên trong chuyên đề này do tôi mở tôi xin chịu trách nhiệm đó, nếu đề tài nào anh chị gởi lên tôi thấy khó khăn quá, hay mất thời gian nhiều thì tôi nói nhiều, còn nếu không thì tôi sẽ cố gắng giúp đở các vị nếu ko được trong lúc này thì sẽ vào lúc khác rảnh rổi.
                    Tôi xin giúp trên tinh thần học hỏi, ngoài ra anh chị nào do đang gấp rút công việc mà có liên quan, tôi ko dám hứa là sẽ giúp kịp hay không vì thời gian lúc rảnh rổi tôi mới đóng góp được cho diễn đàn năm ba bài viết thô thiển của tôi mà thôi.
                    Anh chị có ghé qua xem ở đây thì thông cảm.

                    Comment


                    • #11
                      E mới học về lập trình C, nên nhìn chương trình c bác cũng k hiểu lắm. Nhưng e thấy n bài viết mà bác post đều rất hay và thiết thực, sẽ giúp ích rất nhiều cho n ng mới học về C như e.
                      Chúc bác cùng gia đình mạnh khoẻ và bác có n bài viết hay hơn nữa cho dđ.

                      Comment


                      • #12
                        mô phỏng như thế là chạy rùi, nhưng khi cắm mạch thật mà mắc kiểu đó thì led có sáng bằng niềm tin, họa chăng có sáng thì cũng mờ tịt , cần phải có khổi kđ công suất cho led nữa chứ nhỉ !

                        Comment


                        • #13
                          Da. Xin cam on anh ah
                          Khong biet anh da thu tren mach that cho ung dung nay roi hay chua ah?>
                          Neu anh that su da thu tren mach that thi em rat vui long gop y cho anh them mot so y kinh nghiem trong ung dung nay.
                          Chan thanh su gop y cua anh

                          Comment


                          • #14
                            Anh MoHanDien và chumanh ơi em cũng học về ĐTVT nhưng không thực hành nên kiến thức mai một quá,nếu không ngại 2 anh có thể cho em địa chỉ liên lạc để em có thể học hỏi được không?

                            Comment


                            • #15
                              Nguyên văn bởi tuanhvt Xem bài viết
                              Anh MoHanDien và chumanh ơi em cũng học về ĐTVT nhưng không thực hành nên kiến thức mai một quá,nếu không ngại 2 anh có thể cho em địa chỉ liên lạc để em có thể học hỏi được không?
                              cậu ở đâu ý nhỉ !

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X