[Hoi] Truyền 1 số tự nhiên bất kỳ từ PC xuống vđk

Thảo luận trong 'Giao Tiếp MCU-PC' bắt đầu bởi bienhou, 23 Tháng hai 2013.

Users Viewing Thread (Users: 0, Guests: 0)

Lượt xem: 1,723

  1. bienhou

    bienhou Member

    Cho em hỏi muốn truyền 1 số tự nhiên bất kỳ( em ví dụ gồm 3 chữ số) từ PC xuống vđk thông qua công UART thì làm thế nào ah. e làm mà nó truyền ko có đúng.
    Thanks các bác nhiều
  2. vancongck

    vancongck Trial Mod

    Bạn có thể đưa code và mô phỏng mọi người sẽ sửa cho bạn
  3. bienhou

    bienhou Member

    #include <REGX51.H>
    sbit A1 = P1^0;
    sbit A2 = P1^1;
    sbit A3 = P1^2;
    char str[3];
    unsigned char i=0,tram,chuc,donvi;
    int x;
    code unsigned char dataled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    void delay(int time)
    {int n;
    for(n=0;n<time;n++)
    {
    ;
    }
    }


    void hienthi(unsigned char num)
    {A1 = 1;
    P0 = dataled[num/100];
    delay(50);
    A1 = 0;
    P0 = 0xff;

    A2 = 1;
    P0 = dataled[num/10%10];
    delay(50);
    A2 = 0;
    P0 = 0xff;

    A3 = 1;
    P0 = dataled[num%10];
    delay(50);
    A2 = 0;
    P0 = 0xff;
    }
    void Setup_isr()
    {
    SCON = 0x52; /* Che do 1: 8-bit UART, cho phep truyen */
    TMOD = 0x20; /* timer 1 che do 2: 8-Bit tu dong nap lai. */
    TH1 = 0xfd ; /* toc do 9600 baud */
    TL1 = 0xfd ;
    TI = 0; /* co ngat nha^n.=0*/
    RI=0; /* co ngat' truye^n =0*/
    TR1 = 1;/* timer 1 run */
    ES =1;/* cho phep ngat noi tiep */
    }
    //===========================
    void nhan(void) interrupt 4 //Chuong trinh con dung ngat noi tiep
    {
    char ch;
    if(RI)
    {
    RI=0;
    ch=SBUF;
    str=ch;
    i++;
    if(i==3)
    {
    donvi = str[0]-48;
    chuc = str[1]-48;
    tram = str[2]-48;
    x= tram*100+chuc*10+donvi;
    str[3]=0;
    i=0;}}}
    void main()
    {
    Setup_isr();
    EA=1;
    while(1)
    {
    hienthi(x);
    }
    }
    day la doan code cua em
  4. Chào bạn!
    Theo kinh nghiệm của mình thì bạn nên truyền dữ liệu theo khung: ByteStart+Data+ByteStop.
    Ví dụ byte start là byte *, byte stop là byte #. Bạn cần truyền dữ liệu là 230 thì khung truyền sẽ là *230#
    Như vậy bạn chỉ cần nhận một khung và tách dữ liệu ra xử lý.
    Chúc bạn thành công! ^^
    bienhou thích bài này.
  5. bienhou

    bienhou Member

    cám ơn a đã rl . e chưa làm nhiều với UART nên ko có nhiều kinh nghiệm. anh nói rõ them giúp em.
  6. Chào bạn!
    Bạn nên xem lại câu lệnh str= ch. str là một mảng, ch chỉ là một kí tự. Nếu bạn viết như vậy thì luôn luôn ch chỉ gán cho str. Để sửa lại bạn chuyển thành str=ch;
    Chúc bạn thành công!
    hongtu thích bài này.
  7. XCross_hust

    XCross_hust New Member

    • This message is awaiting moderator approval, and is invisible to normal visitors.
    mình cũng đang làm về phần xử lý chuỗi nhận từ máy tính qua UART mà khá khó hiểu chưa biết phải làm ntn?
  8. kidteam

    kidteam New Member

    Truyền cái gì cũng như nhau thôi bạn
    Nói chung là truyền từng byte 1 mà thôi.
    Vấn đề là thỏa thuận giữa bên gửi và bên nhận.
  9. halinh

    halinh New Member

    chào các bác ! em cung chưa biết được các giải mã kí tự truyền từ pc xuống vdk và pc truyền xuống vdk là mã ascii hay là mã hex ? nhờ các bác chỉ giáo giúp em với ak ! em cảm ơn nhiều !
  10. phongkv2

    phongkv2 Thành Viên Nổi bật

    vdk nhan dc là mã nhị phân.
    halinh thích bài này.
  11. halinh

    halinh New Member

    em có một ví dụ như thế này truyền từ pc xuống và giải mã data ra led 7 đoạn nhưng em vân chua giải mã được các bác sửa giúp em với ak ! em cảm ơn nhiều ak !

    Các file đính kèm:

  12. halinh

    halinh New Member

    em thử băng cách này thì ok nhưng mà em nghĩ với sô lượng nhỏ thi ok nhưng muốn giai mã hết bảng mã ascii thì e là không ổn mong cao kiến của các anh chi giao cho ak !
    //----------------------------------
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.05.0 Professional
    Automatic Program Generator
    © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com

    Project :
    Version :
    Date : 6/14/2014
    Author : NeVaDa
    Company :
    Comments:


    Chip type : ATmega8L
    Program type : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    *****************************************************/

    #include <mega8.h>

    #include <delay.h>
    unsigned char ma1[]={0,255};
    unsigned char ma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    void send(unsigned char d)
    {
    unsigned char i;
    for(i=0;i<8;i++)
    {
    PORTC.1=0;
    if((d&0x80)==0x80) PORTC.0=1;else PORTC.0=0;
    PORTC.1=1;
    d*=2;
    }
    }
    #ifndef RXB8
    #define RXB8 1
    #endif

    #ifndef TXB8
    #define TXB8 0
    #endif

    #ifndef UPE
    #define UPE 2
    #endif

    #ifndef DOR
    #define DOR 3
    #endif

    #ifndef FE
    #define FE 4
    #endif

    #ifndef UDRE
    #define UDRE 5
    #endif

    #ifndef RXC
    #define RXC 7
    #endif

    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<DOR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)

    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];

    #if RX_BUFFER_SIZE <= 256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif

    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;

    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    status=UCSRA;
    data=UDR;
    if(data)
    {
    switch(data)
    {
    case '0': PORTC.2=0;send(ma[0]);PORTC.2=1; break;
    case '1': PORTC.2=0;send(ma[1]);PORTC.2=1; break;
    case '2': PORTC.2=0;send(ma[2]);PORTC.2=1; break;
    case '3': PORTC.2=0;send(ma[3]);PORTC.2=1; break;
    case '4': PORTC.2=0;send(ma[4]);PORTC.2=1; break;
    case '5': PORTC.2=0;send(ma[5]);PORTC.2=1; break;
    case '6': PORTC.2=0;send(ma[6]);PORTC.2=1; break;
    case '7': PORTC.2=0;send(ma[7]);PORTC.2=1; break;
    case '8': PORTC.2=0;send(ma[8]);PORTC.2=1; break;
    case '9': PORTC.2=0;send(ma[9]);PORTC.2=1; break;


    }
    }
    else {PORTC.2=0;send(ma1[1]);PORTC.2=1;}

    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
    rx_buffer[rx_wr_index++]=data;
    #if RX_BUFFER_SIZE == 256
    // special case for receiver buffer size=256
    if (++rx_counter == 0)
    {
    #else
    if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
    if (++rx_counter == RX_BUFFER_SIZE)
    {
    rx_counter=0;
    #endif
    rx_buffer_overflow=1;
    }
    }
    }

    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index++];
    #if RX_BUFFER_SIZE != 256
    if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #endif
    #asm("cli")
    --rx_counter;
    #asm("sei")
    return data;
    }
    #pragma used-
    #endif

    // Standard Input/Output functions
    #include <stdio.h>

    // Declare your global variables here

    void main(void)
    {
    char str[15];
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
    PORTB=0x00;
    DDRB=0xFF;

    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x04;
    DDRC=0xff;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    TCCR0=0x00;
    TCNT0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 9600
    UCSRA=0x00;
    UCSRB=0x98;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x33;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;

    // SPI initialization
    // SPI disabled
    SPCR=0x00;

    // TWI initialization
    // TWI disabled
    TWCR=0x00;

    // Global enable interrupts
    #asm("sei")
    PORTC.2=0;send(ma1[1]);send(ma1[1]);send(ma1[1]);PORTC.2=1;
    while (1)
    {



    }
    }
  13. bongthom1984

    bongthom1984 New Member

    lên top phụ chủ thớt...............................
  14. bienhou

    bienhou Member

    Bài viết cũng khá lâu rồi ! Mà 3 năm nay mình ko còn động đến điện tử nữa.một thời say mê :)! Để bắt đầu cái này bạn lên diễn đan dientuvietnam.net tham khảo bài viết của anh Bắc! Ở đó có tất cả những thứ bạn cần! Chúc bạn thành công
  15. Phan Dung Liem

    Phan Dung Liem Thành Viên Nổi bật

    Truyền từ PC xuống vi điều khiển thì dễ mà! Nếu số bạn truyền xuống là số 16bit thì cần phải tách thành 2 byte và lần lượt gửi xuống. Bạn tham khảo chương trình sau.
    Dưới vi điều khiển, bạn chỉ cần lấy 2 byte nhận được và ghép lại thành 1 số 16bit như ban đầu.

    Các file đính kèm:

Chia sẻ trang này

Lên trên