Thông báo

Collapse
No announcement yet.

Lập trình C cho 8051 New!!!

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

  • Lập trình C cho 8051 New!!!

    Chào các bạn. Mình có một đoạn Code viết bằng C đơn giản là nhận một kí tự từ bàn phím và sau đó phát lại cho PC (thông qua cổng Com). Chương trình của mình chạy tốt, nhưng khi mình thử nhúng một đoạn Code Assembler vào thì chương trình lại không chạy được. Mong các bạn chỉ giáo. Thanks nhiều nhé. Chương trình của mình như sau:


    #include <at89x52.h>

    void serial_int (void) interrupt 4 using 1
    {
    static char chr = '\0'; /* character buffer */

    if (RI == 1) /* it was a receive interrupt */
    {
    chr = SBUF; /* read the character into our local buffer */
    RI = 0; /* clear the received interrupt flag */
    TI = 1; /* signal that there's a new character to send */
    }
    else if (TI == 1) /* otherwise, assume it was a transmit interrupt */
    {
    TI = 0; /* clear the transmit interrupt flag */
    if (chr != '\0') /* if there's something in the local buffer... */
    {
    if (chr == '\r') chr = '\n'; /* convert to */

    SBUF = chr; /* put the character into the transmit buffer */
    chr = '\0';
    }
    }
    }

    main()
    {

    SCON = 0x50; /* mode 1, 8-bit uart, enable receiver */
    TMOD = 0x20; /* timer 1, mode 2, 8-bit reload */
    TH1 = 0xFD; /* reload value for 9600 baud */
    ET0 = 0; /* we don't want this timer to make interrupts */
    TR1 = 1; /* start the timer */
    TI = 1; /* clear the buffer */

    ES = 1; /* allow serial interrupts */
    EA = 1; /* enable interrupts */
    /* initialize Port 0 to 0 */
    P0 = 0;

    while (1==1)
    {
    unsigned int i;
    for (i = 0; i < 60000; i++) {;} /* delay */
    //P0 = P0 + 1; /* increment Port 0 */
    #pragma asm
    inc P0
    #pragma endasm
    }
    }


    Khi mình nhúng vào 3 dòng:
    #pragma asm
    inc P0
    #pragma endasm

    thì chương trình không thể chạy được. Mình không hiểu tại sao???
    (Mình đã đánh dấu check vào "Generate Assembler SRC File" và "Assemble SRC File" rồi). Các bạn có thể giúp mình được không? Thanks!

  • #2
    bác xem lại lệnh INC có thực hiện được với P0 không vậy. Lâu rồi không sài ASM -> không nhớ nữa.
    CUNG CẤP PSOC, MẠCH NẠP
    CHUYỂN ĐỔI USB <-> RS485 AutoBaud
    RS232 <-> RS485 MultiBaud
    MẠCH NẠP USBPPI S7-200
    Mobile: 0906076116
    Email:

    Comment


    • #3
      Nguyên văn bởi lahodu Xem bài viết
      Khi mình nhúng vào 3 dòng:
      #pragma asm
      inc P0
      #pragma endasm
      Lệnh inc để cộng thêm, ở đây P0 chính là địa chỉ P0, bạn cộng thêm thì địa chỉ cái cổng đó đi đâu mất roài

      Bạn có thể dùng thêm một biến trung gian nữa, trước khi gán vào P0.


      unsigned char a;

      thay đoạn asm:
      if (++a==255) a=0;
      P0=a;

      Comment


      • #4
        Thanks các bạn! Nhưng cái chính ở đây là mình muốn nhúng thử một đoạn ASM bất kì vào chương trình C. Lệnh Inc P0 trên thì không có gì sai. Mình thử dùng một lệnh khác cũng cực kì đơn giản là: Mov P0,#0ffh thì Keil cũng không báo lỗi, nhưng chương trình chính là truyền nhận nối tiếp lại không hoạt động được! (Trong khi nếu không nhúng đoạn ASM nào thì chương trình C lại hoạt động bình thường). Thế mới đau đầu chứ.

        Comment


        • #5
          bác encoder cho em hỏi về chương trình của em lập trình mạch đếm sản phẩm có nhập số lượng từ bàn phím em chọn P0 xuất ra led 7 thanh P1 quét led P2 nhận dữ liệu từ bàn phím hex(12phim) P3 đèn báo và cảm biến đếm sp. chương trình em viết xong rồi nhưng nó không chạy.em chua biết lỗi do đâu.hi vọng không phải lỗi thuật toán
          Code:
          #include <AT89x52.h>
          #include <string.h>
          unsigned int couter_scand=100;	   //so lan quet ma
          
          // Keypad Config.
          sbit h0 = P2^0;
          sbit h1 = P2^1;
          sbit h2 = P2^2;
          //sbit h3 = P2^3;
          sbit c0 = P2^4;
          sbit c1 = P2^5;
          sbit c2 = P2^6;
          sbit c3 = P2^7;
          sbit led_bao=P3^7;
          sbit dem=P3^0;
          unsigned long int gt_nhap=100,gt_dich=0,hien_thi=0;
          int key=0;
          void delay (unsigned int ms)
          	{
          		while(ms--) //ms nhap 1000 de co dc 1S
          			{
          					TMOD=0x01;
          					TH0=0xFC;
          					TL0=0x18;
          					TR0=1;
          					while(!TF0);
          					TR0=0;
          					TF0=0;
          			}
          	}
          //khai bao ma quet
          unsigned char scan_key[4]={0x7F,0xbF,0xdF,0xEF};	  //mang quet phim
          
          //Khai bao ma phim
          unsigned int key_code[13]= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; //mang du lieu phim
          //mang chu loi chao
          //unsigned int ma_chao[4]={0x37,0x76,0x77,0x73};//ma nhap so
          //Chuong trinh 
          /***************************************/
          /* Quet phim bam */
          /* tra ve 0 neu khong bam phim */
          /* hoac ky tu phim bam */
          /***************************************/
          void scan_keypad(void)								  //chuong trinh quet phim
          		{
          			unsigned int i,x;
          			unsigned int idx=0;
          
          			for (i=0; i < 4; i++)
          				{
          					P2= scan_key[i];
          					for (x=0; x<couter_scand; x++)
          						{
          							if (h0==0) idx = (i*3) + 1;	break;
          							if (h1==0) idx = (i*3) + 2;	break;
          							if (h2==0) idx = (i*3) + 3;	break;
          							//if (h3==0) idx = (i*4) + 4; break;
          						}
          				}
          key = key_code[idx];
          									//xac dinh gia tri phim vua bam
          //return key;
          		}
          void ma_key  (unsigned long int m_key  )
          	{
          		switch(m_key) 
          			{
                    		case 0 : gt_nhap = gt_nhap*10  ; break; //0
                   		case 1 : gt_nhap = gt_nhap*10+1; break; //1
          				case 2 : gt_nhap = gt_nhap*10+2; break; //2
                			case 3 : gt_nhap = gt_nhap*10+3; break; //3
                     		case 4 : gt_nhap = gt_nhap*10+4; break; //4
                    		case 5 : gt_nhap = gt_nhap*10+5; break; //5
                    		case 6 : gt_nhap = gt_nhap*10+6; break; //6
                    		case 7 : gt_nhap = gt_nhap*10+7; break; //7
                    		case 8 : gt_nhap = gt_nhap*10+8; break; //8
                    		case 9 : gt_nhap = gt_nhap*10+9; break; //9
                    		case 10 : gt_dich = gt_nhap     ; break; // enter
                    		case 11 : gt_nhap = 0; gt_dich = 0; hien_thi = 0; break; // DELETE
                		} 
          	  }
          void chuyen_ma(unsigned int ma)
              {
                 switch(ma)
                 	{
                    case 0 : P0 = 0x3f; break;
                    case 1 : P0 = 0x06; break;
                    case 2 : P0 = 0x5b; break;
                    case 3 : P0 = 0x4f; break;
                    case 4 : P0 = 0x66; break;
                    case 5 : P0 = 0x6d; break;
                    case 6 : P0 = 0x7d; break;
                    case 7 : P0 = 0x07; break;
                    case 8 : P0 = 0x7f; break;
                    case 9 : P0 = 0x6f; break;
                 }
              }
          /*void chao (void)
          	{ 
          		int w;
          		for (w=0;w<4;++w)
          		{
          		P1   = scan_key[w] ;
          		P0   = ma_chao[w]  ;
          		}
          	}*/
          void main (void)
          	{  							  
                 unsigned int c_tam,c_ht;
               //  unsigned long int bien_ht;	   
                 P2 = 0xFF; led_bao = 0; 
          while(1)
          	   {
          	   //chao();
          	   scan_keypad();			//quet phim de dua ra gia tri phim vua nhap  			 
          		ma_key(key);		//lay ra gia tri phim de hthi			 
          	if ((gt_dich > 0)&&(hien_thi < gt_dich))
          		{ if (dem==0) 			  //nhan gia tri tu cam bien va dem
          		--gt_dich;}
          		if ((hien_thi==gt_dich)&&(gt_dich==0))
          		 led_bao = 1;
          		 else led_bao = 0;
                    gt_nhap = hien_thi;
                    c_tam = c_ht%10; c_ht = (c_ht - c_ht%10)/10;
                    chuyen_ma(c_tam);P1 = 0x0e;  delay(500);
                    c_tam = c_ht%10; c_ht = (c_ht - c_ht%10)/10;
                    chuyen_ma(c_tam); P1 = 0x0d; delay(500);      
                    c_tam = c_ht%10; c_ht = (c_ht - c_ht%10)/10;
                    chuyen_ma(c_tam); P1 = 0x08; delay(500);      
                    c_tam = c_ht%10; c_ht = (c_ht - c_ht%10)/10;
                    chuyen_ma(c_tam); P1 = 0x0b; delay(500);      
                 }
              }

          Comment


          • #6
            chào các bạn mình đang tìm hiểu c nhưng trong c ko có lệnh xoay cờ c với thanh ghi
            anh rành về ngôn ngữ này giúp mình với. chuyển đoạn code asm thành c giùm với:
            LAP1:
            JB P3.3, LAP1
            MOV C,P3.3
            JC NHANBIT_0
            SETB C
            RRC A
            JC END_SIGNAL
            SJMP LAP2
            NHANBIT_0:
            CLR C
            RRC A
            JC END_SIGNAL
            SJMP LAP3
            END_SIGNAL:
            LCALL LONG_DELAY
            RR A
            MOV P1, A

            thanks các bạn!

            Comment

            Về tác giả

            Collapse

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

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

            Collapse

            • tuyennhan
              Trả lời cho Tiếng Anh cho người Việt
              bởi tuyennhan
              Cái thư sai ngay câu chào Dear sir mới đúng Hi chỉ dùng cho người quen , các vấn đề về kỹ thuật nó không trả lời hoặc nói loanh quanh tránh ảnh hưởng đến công ty .
              Giup1 người cần không giúp người không cần với lại văn mình vợ người nha đừng quên .
              hôm nay, 07:44
            • vi van pham
              Trả lời cho Tiếng Anh cho người Việt
              bởi vi van pham
              Cám ơn những lời chúc tốt đẹp của em.

              Việc em làm giống như chê sếp dốt, chẳng những không có miếng xôi nào để ăn mà còn chịu nhiều trù dập lên bờ , xuống ruộng.

              Hãy tránh vết xe đổ của tui đi. Dành thời gian lo cho gia đình....
              hôm nay, 02:00
            • nhathung1101
              Trả lời cho Tiếng Anh cho người Việt
              bởi nhathung1101
              Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.

              Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.

              Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...
              Hôm qua, 22:18
            • dinhthuong80
              Trả lời cho Tiếng Anh cho người Việt
              bởi dinhthuong80
              Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

              Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
              Hôm qua, 14:51
            • dinhthuong80
              Trả lời cho Tiếng Anh cho người Việt
              bởi dinhthuong80
              Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

              Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
              Hôm qua, 14:39
            • dinhthuong80
              Trả lời cho Tiếng Anh cho người Việt
              bởi dinhthuong80
              Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

              Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
              Hôm qua, 14:28
            • bqviet
              Trả lời cho Tiếng Anh cho người Việt
              bởi bqviet
              Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
              21-02-2025, 20:26
            • mèomướp
              Trả lời cho Tiếng Anh cho người Việt
              bởi mèomướp
              Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
              21-02-2025, 12:32
            • vi van pham
              Trả lời cho Tiếng Anh cho người Việt
              bởi vi van pham
              Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

              Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
              20-02-2025, 21:31
            • bqviet
              Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
              bởi bqviet
              Thiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.
              20-02-2025, 17:22
            Đang tải...
            X