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

            Đang tải...
            X