久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4351|回復: 18
打印 上一主題 下一主題
收起左側

為什么STC8F單片機串口通訊發(fā)不出去啊?

[復制鏈接]
跳轉到指定樓層
樓主
ID:735654 發(fā)表于 2020-12-16 19:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /*UART.H*/
  2. #define uc unsigned char
  3. #define ui unsigned int
  4. #define ul unsigned long
  5. #define iuc idata unsigned char
  6. #define iui idata unsigned int
  7. #define iul idata unsigned long
  8. #define bt bit
  9. #define swch switch
  10. #define cs case
  11. #define whl while
  12. #define rtn return
  13. #define brk break
  14. #define itrpt interrupt

  15. uart_init(ul baud,ui prty,bt xos)
  16. {
  17. if(xos==1)
  18.   {
  19.   P_SW2|=0x80; /*啟動內部擴展區(qū)寄存器訪問功能*/
  20.   XOSCCR|=0xc0; /*啟動外部晶振*/
  21.   while(!(XOSCCR & 1)); /*待晶振頻率穩(wěn)定*/
  22.   CLKDIV=0x00; /*晶振不分頻*/
  23.   CKSEL=0x01; /*選用外部晶振*/
  24.   }
  25. SCON=0x50;   /*設定串口工作方式*/
  26. PCON=0x7f;  /*波特率不倍速*/
  27. TMOD|=0x20;  /*設置T0T1寄存器*/
  28. AUXR=0xfc;  /*配置輔助寄存器*/
  29. swch(baud)
  30.   {
  31.   cs 4800:   TH1=TL1=0x70;
  32.   cs 9600:   TH1=TL1=0xb8;
  33.   cs 19200:  TH1=TL1=0xdc;
  34.   cs 28800:  TH1=TL1=0xe8;
  35.   cs 38400:  TH1=TL1=0xee;
  36.   cs 57600:  TH1=TL1=0xf4;
  37.   cs 86400:  TH1=TL1=0xf8;
  38.   cs 115200: TH1=TL1=0xfa;
  39.   cs 230400: TH1=TL1=0xfd;
  40.   cs 460800: TH1=TL1=0xfe;
  41.   cs 691200: TH1=TL1=0xff;
  42.   }
  43. TR1=1; /*啟動定時器1*/
  44. swch(prty)
  45.   {
  46.   cs 0: {
  47.         PS=0;
  48.         IPH=0x00;
  49.         }
  50.   cs 1: {
  51.         PS=1;
  52.         IPH=0x00;
  53.         }
  54.   cs 2: {
  55.         PS=0;
  56.         IPH=0x10;
  57.         }
  58.   cs 3: {
  59.         PS=1;  /*將串口1中斷設置為高優(yōu)先*/
  60.         IPH=0x10; /*將串口1中斷設置為最高優(yōu)先*/
  61.         }
  62.   }
  63. REN=1; /*允許接收串口數(shù)據(jù)*/
  64. EA=1;  /*打開總中斷*/
  65. ES=1; /*打開串口中斷*/
  66. P3M1=0x01; /*00000001*/
  67. P3M0=0x02; /*00000010,將串口接收口設為高阻輸入模式,發(fā)送口設置為強推挽模式*/
  68. }

  69. uart_txd(uc udat[])
  70. {
  71. ui i;
  72. ui j=sizeof(udat);
  73. TI=RI=0;
  74. for(i=0;i<j;i++)
  75.   {
  76.   SBUF=udat[i];
  77.   while(TI==0)
  78.     {
  79.     ;
  80.     }
  81.   TI=0;
  82.   }
  83. }
復制代碼


/*下面是主程序*/
  1. #include <STC8x.H>
  2. #include <UART.H>

  3. iui k,j;
  4. iui txdbuf[13]={'H','E','L','L','O','\x20','W','O','R','L','D','!','\0'};

  5. main()
  6. {
  7. uart_init(9600,3,1);
  8. while(1)
  9.   {
  10.   uart_txd(txdbuf);
  11.   }
  12. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:65956 發(fā)表于 2020-12-17 08:17 | 只看該作者
你這個串口配置也搞得太麻煩了吧,先改用一個最簡單的試試,試可以發(fā)送后再去搞這種比較復雜配置的

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:735654 發(fā)表于 2020-12-18 18:25 | 只看該作者
aking991 發(fā)表于 2020-12-17 08:17
你這個串口配置也搞得太麻煩了吧,先改用一個最簡單的試試,試可以發(fā)送后再去搞這種比較復雜配置的

我已經(jīng)焦頭爛額了,比這簡單的都搞過了,就TM是發(fā)布出去啊!
回復

使用道具 舉報

地板
ID:822755 發(fā)表于 2020-12-18 19:24 | 只看該作者
那是因為P_SW2沒有在設置外部時鐘后,沒有P_SW2=0,恢復操作傳統(tǒng)寄存器。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:735654 發(fā)表于 2020-12-19 13:58 | 只看該作者
本帖最后由 翼龍俠 于 2020-12-19 14:06 編輯
KongQuan 發(fā)表于 2020-12-18 19:24
那是因為P_SW2沒有在設置外部時鐘后,沒有P_SW2=0,恢復操作傳統(tǒng)寄存器。

謝謝啊,不過設置了也不行啊
回復

使用道具 舉報

6#
ID:863358 發(fā)表于 2020-12-19 14:17 | 只看該作者
試著一部分一部分的來,看看是哪部分出了問題
回復

使用道具 舉報

7#
ID:735654 發(fā)表于 2020-12-19 16:32 | 只看該作者
我簡化了一下。
  1. /*UART.H*/
  2. #define uc unsigned char
  3. #define ui unsigned int
  4. #define ul unsigned long
  5. #define iuc idata unsigned char
  6. #define iui idata unsigned int
  7. #define iul idata unsigned long
  8. #define bt bit
  9. #define swch switch
  10. #define cs case
  11. #define whl while
  12. #define rtn return
  13. #define brk break
  14. #define itrpt interrupt

  15. uart_init()
  16. {
  17. SCON=0x50;   /*設定串口工作方式*/
  18. PCON=0x7f;  /*波特率不倍速*/
  19. TMOD|=0x20;  /*設置T0T1寄存器*/
  20. AUXR=0xfc;  /*配置輔助寄存器*/
  21. TL1=TH1=0xb8;
  22. REN=1; /*允許接收串口數(shù)據(jù)*/
  23. EA=1;  /*打開總中斷*/
  24. ES=1; /*打開串口中斷*/
  25. P_SW1=0x00;
  26. }

  27. uart_txd(uc udat[])
  28. {
  29. ui i;
  30. ui j=sizeof(udat);
  31. TI=RI=0;
  32. for(i=0;i<j;i++)
  33.   {
  34.   SBUF=udat[i];
  35.   while(TI==0)
  36.     {
  37.     ;
  38.     }
  39.   TI=0;
  40.   }
  41. }
  42. /*主程序*/
  43. #include <STC8x.H>
  44. #include <UART.H>

  45. iui txdbuf[13]={'H','E','L','L','O','\x20','W','O','R','L','D','!','\0'};

  46. main()
  47. {
  48. uart_init();
  49. P_SW2=0x00;
  50. while(1)
  51.   {
  52.   uart_txd(txdbuf);
  53.   }
  54. }
復制代碼
回復

使用道具 舉報

8#
ID:822755 發(fā)表于 2020-12-19 22:56 | 只看該作者

你是沒理解P_SW2=0的作用吧。亂放位置。
  P_SW2 = 0x80; /*啟動內部擴展區(qū)寄存器訪問功能*/
  XOSCCR|=0xc0; /*啟動外部晶振*/
  while(!(XOSCCR & 1)); /*待晶振頻率穩(wěn)定*/
  CLKDIV=0x00; /*晶振不分頻*/
  CKSEL=0x01; /*選用外部晶振*/
P_SW2 = 0;
回復

使用道具 舉報

9#
ID:735654 發(fā)表于 2020-12-20 13:52 | 只看該作者
KongQuan 發(fā)表于 2020-12-19 22:56
你是沒理解P_SW2=0的作用吧。亂放位置。
  P_SW2 = 0x80; /*啟動內部擴展區(qū)寄存器訪問功能*/
  XOSCCR| ...

我已經(jīng)不用外部晶振了,P_SW2 = 0;我也寫了
回復

使用道具 舉報

10#
ID:453974 發(fā)表于 2020-12-20 18:15 | 只看該作者
試試吧,不行的話檢查一下電路
回復

使用道具 舉報

11#
ID:453974 發(fā)表于 2020-12-20 18:19 | 只看該作者
#include "STC8.H"
#include "intrins.h"


#define MAIN_Fosc                11059200L        
#define  uint32   unsigned long
#define  uint16   unsigned int  
#define  uint8    unsigned char  


                     
sbit led1=P0^0;            
sbit led2=P0^1;            


#define  TRUE    1
#define  FALSE   0
      
#define Buf_Max 50

volatile uint8 Flag=FALSE;

uint8 xdata Rec_Buf[Buf_Max];
uint8 i = 0;                        
uint8 uart1temp;


void delay_ms(uint16 x)
{  
        uint16 j,i;   
        for(j=0;j<x;j++)   
        {   
                for(i=0;i<1100;i++);   
        }  
}


void Uart1_Init(void)
{               
        PCON &= 0x3f;               
        SCON = 0x50;               
        AUXR |= 0x40;               
        AUXR &= 0xfe;               
        TMOD &= 0x0f;               
        TMOD |= 0x20;               
        TL1 = 0xDC;                  
        TH1 = 0xDC;                  
        ET1 = 0;                    
        TR1 = 1;                    
        ES = 1;                                       
        EA = 1;                                       
}


void SendDataByUart1(uint8 dat)
{
    SBUF = dat;                 
        while(TI == 0);            
        TI = 0;                     
}


void USART1_Tx_Puts(void)
{
          if(Flag)               
        {      
                ES = 0;                                             
            SendDataByUart1(uart1temp);      
            SendDataByUart1(0x0D);            
            SendDataByUart1(0x0A);            
                ES = 1;                                 
                Flag=FALSE;                       
          }
}


int main()
{
          P3M1 &= 0xFE;        P3M0 &= 0xFE;                          
        P3M1 &= 0xFD;        P3M0 |= 0x02;                          

        Uart1_Init();

        while(1)
        {
                USART1_Tx_Puts();   
        }
}


void Uart1() interrupt 4 using 1
{
        ES = 0;                           
        Flag=TRUE;                  
        if (RI)                     
          {
              RI = 0;                 
                uart1temp = SBUF;      
           }
           if (TI)                    
           {
              TI = 0;                 
           }
        ES =  1;                  
}
回復

使用道具 舉報

12#
ID:735654 發(fā)表于 2020-12-20 18:53 | 只看該作者
累不死的狗 發(fā)表于 2020-12-20 18:15
試試吧,不行的話檢查一下電路

要是電路問題,根本燒不進去!
回復

使用道具 舉報

13#
ID:278179 發(fā)表于 2020-12-20 23:44 | 只看該作者
不知道你使用的晶振頻率時多少,和波特率是不是相符,重新都定義一下
回復

使用道具 舉報

14#
ID:420836 發(fā)表于 2020-12-20 23:52 | 只看該作者
試試不同的單片機時鐘頻率
回復

使用道具 舉報

15#
ID:735654 發(fā)表于 2020-12-21 12:26 | 只看該作者
TTQ001 發(fā)表于 2020-12-20 23:52
試試不同的單片機時鐘頻率

我用11.0592 12 22.1184 24
回復

使用道具 舉報

16#
ID:735654 發(fā)表于 2020-12-21 12:27 | 只看該作者
TTQ001 發(fā)表于 2020-12-20 23:52
試試不同的單片機時鐘頻率

再說波特率不符的話,會收到亂碼,而我的電腦上根本檢測不到單片機發(fā)來的字節(jié)!
回復

使用道具 舉報

17#
ID:735654 發(fā)表于 2020-12-21 17:17 | 只看該作者
TTQ001 發(fā)表于 2020-12-20 23:52
試試不同的單片機時鐘頻率

而且我用示波器看了,一直是高電平,檢測不到起始位的下降沿
回復

使用道具 舉報

18#
ID:864875 發(fā)表于 2020-12-21 17:21 | 只看該作者
可以看看串口接口是不是松掉了
回復

使用道具 舉報

19#
ID:735654 發(fā)表于 2021-1-6 14:21 | 只看該作者
已解決,謝謝大家!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99re超碰| 成人精品视频在线观看 | 亚洲av毛片 | 色999视频| 欧美精选一区二区 | 亚洲一区 | 免费小视频在线观看 | 欧美精品久久久久 | 一级毛片视频在线 | 精品久久久久久久久久久久久久 | 在线不卡av| 自拍偷拍亚洲一区 | 一级毛片视频 | 亚洲精品一区二区 | 亚洲精品久久久久久国产精华液 | 欧美日本亚洲 | 欧美精品在线观看 | 中文字幕在线视频网站 | 欧美成人一级视频 | 国产精品69毛片高清亚洲 | 自拍亚洲| 国产精品美女久久久久久久网站 | 一区二区三区在线电影 | 亚洲成人自拍 | 国产精品明星裸体写真集 | 精品九九在线 | 日韩一区二区在线视频 | 亚洲精品综合一区二区 | 91精品国产综合久久久动漫日韩 | 国产女人精品视频 | 午夜网 | 国产91丝袜在线18 | 国产一区二区三区视频 | 成人国产在线视频 | 中文字幕第5页 | 99久久免费精品国产男女高不卡 | 欧美三区视频 | 黄色大片在线免费观看 | 欧美一区二区三区在线视频 | 韩日一区二区 | www日本在线观看 |