新聞中心

        EEPW首頁 > 電源與新能源 > 設計應用 > PIC16F877A串口發送字符串問題

        PIC16F877A串口發送字符串問題

        作者: 時間:2018-08-17 來源:網絡 收藏

        PIC16F877A串口發送,查詢方式,就為了調出這個費了我一天時間,原來是串口芯片電壓問題,現總結如下:

        本文引用地址:http://www.104case.com/article/201808/387176.htm

        1、注意232串口芯片供電電壓,有5V和3.3V的

        2、注意TXD、RXD接線,單片機的TXD接232芯片的R2OUT,單片機的RXD接232芯片的T2IN

        3、注意ESP8266的UTXD接MCU的RX,URXD接MCU的TX

        4、注意ESP8266的UTXD接232的T2IN,URXD接232的R2OUT

        5、串口波特率設置成9600

        6、注意連接線的可靠性,如果用線連的話一定要檢查線和插座是否穩定連接

        7、系統連線如下圖所示

        PIC16F877A串口發送 - allegro_tyc - allegro_tyc的博客

        //以下是串口發送程序

        #include

        #define uchar unsigned char

        #define uint unsigned int

        __CONFIG(0x3B32);

        void delay2ms(uint x)

        {

        uint a,b;

        for(a=x; a>0; a--)

        for(b=152; b>0; b--);

        }

        void UART_SendByte(unsigned char dat)

        {

        TXREG=dat;

        while(TRMT==0);

        }

        void serial_init()

        {

        TRISC=0xbf;//設置RX為輸入,TX為輸出

        TXSTA=0x24;

        RCSTA=0x80;

        SPBRG=0x33;//本人使用的是8MHz晶振,9600=8000000/(16*(X+1))->X=51->X=0x33

        GIE=1;

        PEIE=1;

        RCIE=1;

        }

        void main()

        {

        serial_init();

        while(1)

        {

        UART_SendByte(0x31);

        UART_SendByte(0x32);

        UART_SendByte(0x33);

        delay2ms(500);

        }

        }

        //以下是MCU發送AT命名給ESP8266的程序

        #include

        #define uchar unsigned char

        #define uint unsigned int

        #define LEDRD1

        __CONFIG(0x3B32);

        #define LED_OPEN() (LED=1)

        #define LED_CLOSE() (LED=0)

        #defineCPU_FOSC8000000

        #defineBAUD9600

        unsigned char* LYMS=AT+CWMODE=3r;

        unsigned char* SZLY=AT+CWSAP=ESP8277_CYT,1234567890,11,3r;

        unsigned char* RST=AT+RSTr;

        unsigned char* LCAP=AT+CWLAPr;

        unsigned char* SZDLJ=AT+CIPMUX=1r;

        unsigned char* KQFU=AT+CIPSERVER=1,5000r;

        unsigned char* FSSJ=AT+CIFSRr;

        void delay2ms(uint x)

        {

        uint a,b;

        for(a=x; a>0; a--)

        for(b=152; b>0; b--);

        }

        void sys_init()

        {

        TRISD=0x00;//設置PORTD口為輸出

        }

        void usart_init()

        {

        TRISC=0xbf;//設置RX為輸入,TX為輸出

        TXSTA=0x24;

        RCSTA=0x80;

        SPBRG=0x33;//本人使用的是8MHz晶振,9600=8000000/(16*(X+1))->X=51->X=0x33

        GIE=1;

        PEIE=1;

        RCIE=1;

        }

        void usart0_putchar(unsigned char data)

        {

        while (!TRMT);

        TXREG = data;

        }

        void print(unsigned char* p_string)

        {

        while (*p_string)

        {

        if (*p_string != 'r')

        {

        usart0_putchar(*p_string);

        }

        else

        {

        usart0_putchar('r');

        usart0_putchar('n');

        }

        p_string++;

        }

        }

        void send_command()

        {

        print(LYMS);delay2ms(500);delay2ms(500);

        print(SZLY);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);

        print(RST);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);

        print(LCAP);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);

        delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);

        print(SZDLJ);delay2ms(500);delay2ms(500);

        print(KQFU);delay2ms(500);delay2ms(500);

        print(FSSJ);delay2ms(500);delay2ms(500);

        }

        void main()

        {

        sys_init();

        usart_init();

        send_command();

        while(1)

        {

        PORTD = 0xff;

        delay2ms(500);

        PORTD = 0x00;

        delay2ms(500);

        }

        }

        //以下是MCU發送AT命名給ESP8266的程序,并接收命令、解析并作出反應

        #include

        #define uchar unsigned char

        #define uint unsigned int

        unsigned char RX_Buffer[32];

        unsigned char RX_CNT=0;

        #define LED1RD1

        #define LED2RD2

        #define LED3RD3

        __CONFIG(0x3B32);

        #define LED1_OPEN() (LED1=1)

        #define LED1_CLOSE() (LED1=0)

        #define LED2_OPEN() (LED2=1)

        #define LED2_CLOSE() (LED2=0)

        #define LED3_OPEN() (LED3=1)

        #define LED3_CLOSE() (LED3=0)

        #defineCPU_FOSC8000000

        #defineBAUD9600

        unsigned char* LYMS=AT+CWMODE=3r;

        unsigned char* SZLY=AT+CWSAP=ESP8277_TYC,1234567890,11,3r;

        unsigned char* RST=AT+RSTr;

        unsigned char* LCAP=AT+CWLAPr;

        unsigned char* SZDLJ=AT+CIPMUX=1r;

        unsigned char* KQFU=AT+CIPSERVER=1,5000r;

        unsigned char* FSSJ=AT+CIFSRr;

        void delay2ms(uint x)

        {

        uint a,b;

        for(a=x; a>0; a--)

        for(b=152; b>0; b--);

        }

        void sys_init()

        {

        TRISD=0x00;//設置PORTD口為輸出

        }

        void usart_init()

        {

        TRISC=0x80;//設置RX為輸入,TX為輸出

        TXSTA=0x24;

        RCSTA=0x90;

        SPBRG=0x33;//本人使用的是8MHz晶振,9600=8000000/(16*(X+1))->X=51->X=0x33

        RCIE=0x01;

        TXEN=0x01;

        TXIE=0x01;

        PEIE=0x01; //外部中斷使能

        GIE=1;//總中斷使能

        }

        void usart0_putchar(unsigned char data)

        {

        while (!TRMT);

        TXREG = data;

        }

        void print(unsigned char* p_string)

        {

        while (*p_string)

        {

        if (*p_string != 'r')

        {

        usart0_putchar(*p_string);

        }

        else

        {

        usart0_putchar('r');

        usart0_putchar('n');

        }

        p_string++;

        }

        }

        void send_command()

        {

        print(LYMS);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);

        print(SZLY);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);

        print(RST);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);

        print(LCAP);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);

        delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);

        print(SZDLJ);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);

        print(KQFU);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);

        print(FSSJ);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);delay2ms(500);

        }

        void interrupt usart(void)

        {

        if(RCIERCIF)

        {

        //TXREG = RCREG;

        RX_Buffer[RX_CNT] = RCREG;

        if(RX_Buffer[0]==0x45)

        RX_CNT++;

        else

        RX_CNT=0;

        if(RX_CNT>=10)

        {

        if(RX_Buffer[0]==0x45RX_Buffer[1]==0x53RX_Buffer[2]==0x50)

        {

        if(RX_Buffer[4]==0x4CRX_Buffer[5]==0x45RX_Buffer[6]==0x44)

        {

        if(RX_Buffer[7]==0x31)

        {

        if(RX_Buffer[3]==0x4B)

        LED1_OPEN();

        if(RX_Buffer[3]==0x47)

        LED1_CLOSE();

        }

        }

        }

        RX_CNT=0;

        }

        }

        }

        void main()

        {

        sys_init();

        usart_init();

        send_command();

        LED1_OPEN();

        LED2_OPEN();

        LED3_OPEN();

        while(1);

        }



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 贵阳市| 大英县| 铜梁县| 明水县| 榆中县| 阳信县| 盘锦市| 鹤峰县| 曲麻莱县| 岳阳县| 太原市| 阜宁县| 连云港市| 丹寨县| 刚察县| 宜君县| 怀来县| 涞源县| 柞水县| 澄江县| 玉林市| 双牌县| 无为县| 抚松县| 巍山| 台山市| 义乌市| 华亭县| 鹰潭市| 伊宁市| 寿光市| 邮箱| 潮安县| 搜索| 昌乐县| 南雄市| 凤庆县| 玉龙| 大同县| 龙江县| 福清市|