<wbr id="9qp22"><legend id="9qp22"><rt id="9qp22"></rt></legend></wbr>
<th id="9qp22"><noframes id="9qp22"><form id="9qp22"></form></noframes></th>

      <dd id="9qp22"><big id="9qp22"><video id="9qp22"></video></big></dd>
      <th id="9qp22"></th>
        <rp id="9qp22"><acronym id="9qp22"></acronym></rp>
        <dd id="9qp22"><pre id="9qp22"></pre></dd>

        1. <dd id="9qp22"><pre id="9qp22"></pre></dd>
          1. 打印

            [8/16位單片機] 請教PIC16F1933怎樣通過串口發送數據

            [復制鏈接]
            506|10
            跳轉到指定樓層
            樓主
            本帖最后由 Wayner 于 2019-10-4 09:11 編輯

            [size=13.3333px]我用單片機PIC16F1933的內部4M Hz振蕩,想通過單片機的串口腳TX發送數據出去。程序如下:
            [size=13.3333px]//PIC16F1933無外部晶振,使用內部4M振蕩
            [size=13.3333px]//RC6做TX,  RC7做RX
            [size=13.3333px]#include <htc.h>

            [size=13.3333px]  //配置字1
            [size=13.3333px]  __CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_ON & CP_ON & CPD_ON & BOREN_ON &
            [size=13.3333px]      CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);

            [size=13.3333px]  //配置字2
            [size=13.3333px]  __CONFIG(WRT_ALL & VCAPEN_OFF & PLLEN_OFF & STVREN_ON & BORV_25 & LVP_ON);

            [size=13.3333px]  typedef unsigned char UCHAR;
            [size=13.3333px]  typedef unsigned int UINT;
            [size=13.3333px]volatile UCHAR cRC_Dat[30];

            [size=13.3333px]void PortInit1933(void);
            [size=13.3333px]void UARTinit(void);
            [size=13.3333px]void DLYxmS(UCHAR ci);
            [size=13.3333px]void DLYx10mS(void);

            [size=13.3333px]  void PortInit1933(void)
            [size=13.3333px]  {
            [size=13.3333px]   ANSELA=0x0;
            [size=13.3333px]   SRCON0=0x0;
            [size=13.3333px]   TRISA=0x8;     //RA4接Busy輸出,RA3接/strobe輸入
            [size=13.3333px]   LATA=0x8;      //RA4 0,RA3 1

            [size=13.3333px]   ANSELB=0x0;
            [size=13.3333px]   TRISB=0x3;     //RB0接<-DB6, RB1接<-DB7
            [size=13.3333px]   LATB=0xc3;      //RB7,RB6是ISP引腳 RB0輸入, RB1輸入
            [size=13.3333px]   OPTION_REG=0x0; //允許弱上拉
            [size=13.3333px]   WPUB=0x3;      //RB0、RB1上拉
            [size=13.3333px]   LCDCON=0x0;    //禁止LCD

            [size=13.3333px]   TRISC=0xff;    //RC7-RX in,RC6-TX out, RC5~0 in  
            [size=13.3333px]   LATC=0xff;     //
            [size=13.3333px]  }

            [size=13.3333px]  void UARTinit(void)
            [size=13.3333px]  {
            [size=13.3333px]   SPBRGH=0x0;
            [size=13.3333px]   SPBRGL=25;     //9600bps
            [size=13.3333px]   BAUDCON=0x0;   //BRG16=0
            [size=13.3333px]   //bit4:SYNC 0=異步模式 ,bit3: SENDB 1=在下一次發送時發送同步間隔字符 (完成時由硬件清零)
            [size=13.3333px]   //bit2:高波特率選擇位,1  = 高速;;bit1:TRMT 發送移位寄存器狀態位,1  = TSR 為空
            [size=13.3333px]   //bit0:TX9D 發送數據的第 9 位
            [size=13.3333px]   TXSTA=0xc;     //,
            [size=13.3333px]   RCSTA=0x80;    //bit7:SPEN=1使能串口, bit4:CREN連續接收使能位 0  = 禁止接收器

            [size=13.3333px]  }

            [size=13.3333px]void DLYxmS(UCHAR ci)
            [size=13.3333px]{

            [size=13.3333px]UINT ix;
            [size=13.3333px]for(; ci !=0; ci--)
            [size=13.3333px]   {
            [size=13.3333px]           for(ix=0x7fff; ix !=0; ix--)  //ix=0x145
            [size=13.3333px]        {
            [size=13.3333px]              asm("nop");
            [size=13.3333px]        }   
            [size=13.3333px]   }
            [size=13.3333px]}

            [size=13.3333px]void DLYx10mS(void)
            [size=13.3333px]{
            [size=13.3333px]UINT ix;
            [size=13.3333px]for(ix=0x589; ix !=0; ix--)  //ix=0x145
            [size=13.3333px]   {
            [size=13.3333px]           asm("nop");
            [size=13.3333px]   }
            [size=13.3333px]}

            [size=13.3333px]void main(void)
            [size=13.3333px]{
            [size=13.3333px]volatile UCHAR ci;
            [size=13.3333px]OSCCON = 0x6a;    //4MHz  01101010
            [size=13.3333px]do
            [size=13.3333px]   {
            [size=13.3333px]    asm("nop");
            [size=13.3333px]    ci = OSCSTAT;   //bit 4 HFIOFR:高頻內部振蕩器就緒位,1  = HFINTOSC 就緒
            [size=13.3333px]   }while(!(ci & 0x10));  //

            [size=13.3333px]DLYx10mS();  
            [size=13.3333px]PortInit1933();
            [size=13.3333px]UARTinit();
            [size=13.3333px]for(;;)
            [size=13.3333px]   {
            [size=13.3333px]    TXEN=1;
            [size=13.3333px]        for(ci=0;ci<25;ci++)
            [size=13.3333px]          {        
            [size=13.3333px]           cRC_Dat[ci]=ci;
            [size=13.3333px]           TXREG=cRC_Dat[ci];
            [size=13.3333px]           
            [size=13.3333px]           DLYx10mS();
            [size=13.3333px]          }               
            [size=13.3333px]    DLYxmS(250);
            [size=13.3333px]        TXEN=0;        
            [size=13.3333px]        DLYxmS(250);
            [size=13.3333px]   }
            [size=13.3333px]}        

            [size=13.3333px]編譯燒錄正常,就是發不出數據。向大伙求助,哪里錯了?請指點

            使用特權

            評論回復
            沙發
             樓主 | 2019-10-4 09:13 | 只看該作者
            在 void PortInit1933(void)函數里,將TRISC=0xff改成TRISC=0xbf后,發送出來的全是00,00

            使用特權

            評論回復
            板凳
            | 2019-10-4 10:21 | 只看該作者
            先用MCC配置一下吧,會省很多事情。

            使用特權

            評論回復
            地板
            | 2019-10-4 12:00 | 只看該作者
            波特率對不對呀

            使用特權

            評論回復
            5
             樓主 | 2019-10-4 14:04 | 只看該作者
            本帖最后由 Wayner 于 2019-10-4 15:45 編輯
            北極風 發表于 2019-10-4 10:21
            先用MCC配置一下吧,會省很多事情。

            謝謝兩位的回復。我改用外部晶體振蕩器,還是一樣。用示波器看晶振波形。一會振蕩,一會不振蕩。應該原因是反復自動復位。可是我沒開看門狗啊。波特率是對的。

            使用特權

            評論回復
            6
            | 2019-10-4 20:14 | 只看該作者
            串口不要用延時,檢測發送完成狀態位,讓串口發送一直輸出,使用sscom32.exe看輸出,更改不同的波特率顯示,即使反復自動復位也可以看到串口輸出

            使用特權

            評論回復
            7
             樓主 | 2019-10-4 20:23 | 只看該作者
            空中白云 發表于 2019-10-4 20:14
            串口不要用延時,檢測發送完成狀態位,讓串口發送一直輸出,使用sscom32.exe看輸出,更改不同的波特率顯示 ...

            謝謝,我明天照你的辦法試試

            使用特權

            評論回復
            8
             樓主 | 2019-10-4 20:23 | 只看該作者
            空中白云 發表于 2019-10-4 20:14
            串口不要用延時,檢測發送完成狀態位,讓串口發送一直輸出,使用sscom32.exe看輸出,更改不同的波特率顯示 ...

            謝謝,我明天照你的辦法試試

            使用特權

            評論回復
            9
             樓主 | 2019-10-5 20:45 | 只看該作者
            謝謝回復。發現自己犯了低級錯誤,復位電路電阻和電容剛好焊錯位置了,焊正確就行了

            使用特權

            評論回復
            10
            | 2019-10-5 21:08 | 只看該作者
            那意思就是你系統根本沒跑起來

            使用特權

            評論回復
            11
             樓主 | 2019-10-5 21:11 | 只看該作者
            mintspring 發表于 2019-10-5 21:08
            那意思就是你系統根本沒跑起來

            是的

            使用特權

            評論回復
            掃描二維碼,隨時隨地手機跟帖
            您需要登錄后才可以回帖 登錄 | 注冊

            本版積分規則

            我要發帖 投訴建議 創建版塊 申請版主

            快速回復

            您需要登錄后才可以回帖
            登錄 | 注冊
            高級模式

            論壇熱帖

            在線客服 快速回復 返回頂部 返回列表
            成人短片线上看