找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3359|回复: 18
打印 上一主题 下一主题
收起左侧

为什么STC8F单片机串口通讯发不出去啊?

[复制链接]
跳转到指定楼层
楼主
ID:735654 发表于 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; /*启动内部扩展区寄存器访问功能*/
  20.   XOSCCR|=0xc0; /*启动外部晶振*/
  21.   while(!(XOSCCR & 1)); /*待晶振频率稳定*/
  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中断设置为高优先*/
  60.         IPH=0x10; /*将串口1中断设置为最高优先*/
  61.         }
  62.   }
  63. REN=1; /*允许接收串口数据*/
  64. EA=1;  /*打开总中断*/
  65. ES=1; /*打开串口中断*/
  66. P3M1=0x01; /*00000001*/
  67. P3M0=0x02; /*00000010,将串口接收口设为高阻输入模式,发送口设置为强推挽模式*/
  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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:65956 发表于 2020-12-17 08:17 | 只看该作者
你这个串口配置也搞得太麻烦了吧,先改用一个最简单的试试,试可以发送后再去搞这种比较复杂配置的

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:735654 发表于 2020-12-18 18:25 | 只看该作者
aking991 发表于 2020-12-17 08:17
你这个串口配置也搞得太麻烦了吧,先改用一个最简单的试试,试可以发送后再去搞这种比较复杂配置的

我已经焦头烂额了,比这简单的都搞过了,就TM是发布出去啊!
回复

使用道具 举报

地板
ID:822755 发表于 2020-12-18 19:24 | 只看该作者
那是因为P_SW2没有在设置外部时钟后,没有P_SW2=0,恢复操作传统寄存器。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:735654 发表于 2020-12-19 13:58 | 只看该作者
本帖最后由 翼龙侠 于 2020-12-19 14:06 编辑
KongQuan 发表于 2020-12-18 19:24
那是因为P_SW2没有在设置外部时钟后,没有P_SW2=0,恢复操作传统寄存器。

谢谢啊,不过设置了也不行啊
回复

使用道具 举报

6#
ID:863358 发表于 2020-12-19 14:17 | 只看该作者
试着一部分一部分的来,看看是哪部分出了问题
回复

使用道具 举报

7#
ID:735654 发表于 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; /*允许接收串口数据*/
  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 发表于 2020-12-19 22:56 | 只看该作者

你是没理解P_SW2=0的作用吧。乱放位置。
  P_SW2 = 0x80; /*启动内部扩展区寄存器访问功能*/
  XOSCCR|=0xc0; /*启动外部晶振*/
  while(!(XOSCCR & 1)); /*待晶振频率稳定*/
  CLKDIV=0x00; /*晶振不分频*/
  CKSEL=0x01; /*选用外部晶振*/
P_SW2 = 0;
回复

使用道具 举报

9#
ID:735654 发表于 2020-12-20 13:52 | 只看该作者
KongQuan 发表于 2020-12-19 22:56
你是没理解P_SW2=0的作用吧。乱放位置。
  P_SW2 = 0x80; /*启动内部扩展区寄存器访问功能*/
  XOSCCR| ...

我已经不用外部晶振了,P_SW2 = 0;我也写了
回复

使用道具 举报

10#
ID:453974 发表于 2020-12-20 18:15 | 只看该作者
试试吧,不行的话检查一下电路
回复

使用道具 举报

11#
ID:453974 发表于 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 发表于 2020-12-20 18:53 | 只看该作者
累不死的狗 发表于 2020-12-20 18:15
试试吧,不行的话检查一下电路

要是电路问题,根本烧不进去!
回复

使用道具 举报

13#
ID:278179 发表于 2020-12-20 23:44 | 只看该作者
不知道你使用的晶振频率时多少,和波特率是不是相符,重新都定义一下
回复

使用道具 举报

14#
ID:420836 发表于 2020-12-20 23:52 | 只看该作者
试试不同的单片机时钟频率
回复

使用道具 举报

15#
ID:735654 发表于 2020-12-21 12:26 | 只看该作者
TTQ001 发表于 2020-12-20 23:52
试试不同的单片机时钟频率

我用11.0592 12 22.1184 24
回复

使用道具 举报

16#
ID:735654 发表于 2020-12-21 12:27 | 只看该作者
TTQ001 发表于 2020-12-20 23:52
试试不同的单片机时钟频率

再说波特率不符的话,会收到乱码,而我的电脑上根本检测不到单片机发来的字节!
回复

使用道具 举报

17#
ID:735654 发表于 2020-12-21 17:17 | 只看该作者
TTQ001 发表于 2020-12-20 23:52
试试不同的单片机时钟频率

而且我用示波器看了,一直是高电平,检测不到起始位的下降沿
回复

使用道具 举报

18#
ID:864875 发表于 2020-12-21 17:21 | 只看该作者
可以看看串口接口是不是松掉了
回复

使用道具 举报

19#
ID:735654 发表于 2021-1-6 14:21 | 只看该作者
已解决,谢谢大家!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表