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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8213|回復: 19
收起左側

STC15W408AS單片機串口通信 不成功

  [復制鏈接]
ID:516511 發表于 2019-9-17 20:04 | 顯示全部樓層 |閱讀模式
誰幫我看看怎么回事,我想通過按鈕IN1 的開關來控制串口發送一組數組命令
keil debug 的時候  看到TBUF 也是每個數組都發了

單片機源程序如下:
  1. //*********************************************************************/
  2. #include "STC15W408AS.h"
  3. #include <intrins.H>
  4. #define uchar unsigned char //宏定義字符型變量
  5. #define uint  unsigned int    //宏定義整型變量
  6. /********************************************************************
  7.                             波特率設定
  8. #define BAUD 0XFE80  //9600bps@ 11.0592MHZ


  9. uchar dat; //用于存儲單片機接收發送緩沖寄存器SBUF里面的內容

  10.         sbit IN1 = P1^2;            /*單片機1.2引腳檢測IN1是否動作*/
  11.        sbit IN2 = P1^3;            /*單片機1.3引腳檢測IN2是否動作*/
  12.        sbit IN3 = P1^4;            /*單片機1.4引腳檢測IN3是否動作*/
  13.        sbit IN4 = P1^5;            /*單片機1.5引腳檢測IN4是否動作*/
  14.        sbit IN5 = P1^6;            /*單片機1.6引腳檢測IN5是否動作*/
  15.        sbit IN6 = P1^7;            /*單片機1.7引腳檢測IN5是否動作*/
  16.        sbit IN7 = P5^4;            /*單片機5.4引腳檢測IN5是否動作*/
  17.        sbit IN8 = P5^5;            /*單片機5.5引腳檢測IN5是否動作*/
  18.       
  19.   sbit COM1 = P3^7;          /*單片機3.7引腳控制繼電器COM1*/
  20.   sbit COM2 = P3^6;          /*單片機3.6引腳控制繼電器COM2*/
  21.   sbit COM3 = P3^5;          /*單片機3.5引腳控制繼電器COM3*/
  22.   sbit COM4 = P3^4;          /*單片機3.4引腳控制繼電器COM4*/
  23.     bit bz1=0;
  24.     bit bz2=0;
  25.     bit bz3=0;
  26.     bit bz4=0;
  27.     bit bz5=0;
  28.     bit bz6=0;
  29.     bit bz7=0;
  30.     bit bz8=0;
  31. /********************************************************************
  32.                             定義特殊寄存器
  33. *********************************************************************/
  34. sbit RXB=P3^0;
  35. sbit TXB=P3^1;
  36. /********************************************************************
  37.                            定義數據類型
  38. *********************************************************************/
  39. uchar TBUF,RBUF;
  40. uchar TDAT,RDAT;
  41. uchar TCNT,RCNT;
  42. uchar TBIT,RBIT;
  43. uint TING,RING;
  44. uint TEND,REND;

  45. void UART_INIT(); //聲明函數

  46. uchar t,r;          //定義數據類型
  47. uchar but;      //數據存儲數組

  48. uchar code DisPlayOn[21]=
  49. {0x01, 0x30 ,0x41 ,0x30 ,0x41 ,0x30 ,0x43 ,0x02 ,0x43 ,0x32 ,0x30 ,0x33 ,0x44 ,0x36 ,0x30 ,0x30 ,0x30 ,0x31 ,0x03 ,0x73 ,0x0d};
  50. // 0A0A0CC203D60001s       開機
  51. uchar code DisPlayOff[21]=
  52. {0x01, 0x30 ,0x41 ,0x30 ,0x41 ,0x30 ,0x43 ,0x02 ,0x43 ,0x32 ,0x30 ,0x33 ,0x44 ,0x36 ,0x30 ,0x30 ,0x30 ,0x34 ,0x03 ,0x76 ,0x0d};
  53. // 0A0A0CC203D60004v    關機



  54. /********************************************************************
  55.                             延時函數
  56. *********************************************************************/
  57. void delay(uchar t)
  58. {
  59.   uchar i,j;
  60.    for(i=0;i<t;i++)
  61.    {
  62.         for(j=130;j>0;j--);
  63.      { ;
  64.      }
  65.    }
  66. }
  67. /****************發送函數*********************/
  68. void senduart2(char* str)
  69. {   
  70.      uchar i;
  71.             if(TEND)      //允許發送
  72.             {
  73.               TEND=0;
  74.                for(i=0;i<21;i++)
  75.                 {
  76.                   TBUF=str[i];
  77.                 }
  78.                   TING=1;
  79.             }
  80.             while(!TEND);
  81. }
  82. /********************************************************************
  83.                             主函數
  84. *********************************************************************/
  85. void main()
  86. {  
  87. TMOD=0X00;       //定時器T0設定
  88. AUXR=0X80;       //輔助寄存器
  89. TL0=BAUD;       //十六位寄存器
  90. TH0=BAUD>>8;   //十六位寄存器
  91. TR0=1;           //開定時器
  92. ET0=1;
  93. PT0=1;
  94. EA=1;           //開總中斷
  95. UART_INIT();   //串口初始化
  96. while(1)       //無線循環
  97. {
  98. if((IN1==0)&&(bz1==0))
  99. {
  100.   delay(10);
  101.   if(IN1==0)
  102.   {
  103.      bz1=1;
  104.      senduart2(DisPlayOn);
  105.   }
  106. }
  107. }
  108. }

  109. /********************************************************************
  110.                             定時器T0
  111. *********************************************************************/
  112. void tm0()interrupt 1 using 1
  113. {
  114. if(RING)
  115.   {
  116.    if(--RCNT==0)
  117.     {
  118.      RCNT=3;
  119.      if(--RBIT==0)
  120.         {
  121.          RBUF=RDAT;
  122.          RING=0;
  123.          REND=1;
  124.         }
  125.         else
  126.         {
  127.          RDAT>>=1;
  128.          if(RXB)RDAT|=0X80;
  129.         }

  130.     }
  131.   }
  132.     else if(!RXB)
  133.     {
  134.      RING=1;
  135.      RCNT=4;
  136.      RBIT=9;
  137.     }
  138.     if(--TCNT==0)
  139.     {
  140.     TCNT=3;
  141.     if(TING)
  142.     {
  143.       if(TBIT==0)
  144.       {
  145.       TXB=0;
  146.       TDAT=TBUF;
  147.       TBIT=9;
  148.       }
  149.       else
  150.       {
  151.       TDAT>>=1;
  152.       if(--TBIT==0)
  153.       {
  154.        TXB=1;
  155.        TING=0;
  156.        TEND=1;
  157.       }
  158.       else
  159.       {
  160.       TXB=CY;
  161.       }
  162.       }
  163.     }
  164.     }
  165. }
  166. /********************************************************************
  167.               功能:串口初始化,波特率9600,方式1
  168. *********************************************************************/
  169. void UART_INIT()
  170. {
  171. TING=0;
  172. RING=0;

  173. TEND=1;
  174. REND=0;

  175. TCNT=0;
  176. RCNT=0;
  177. }

  178. /********************************************************************
  179.                             結束
  180. *********************************************************************/
復制代碼
回復

使用道具 舉報

ID:213173 發表于 2019-9-18 08:39 | 顯示全部樓層
給你一個STC408AS基本的串口收發示例
無標題.jpg

  1. #include <STC15F2K60S2.H>

  2. unsigned char i;
  3. bit flag=0;
  4. /*----------------------------
  5.                          串口初始化
  6. -----------------------------*/
  7. void UartInit(void)                //9600bps@11.0592MHz
  8. {
  9.         SCON = 0x50;                //8位數據,可變波特率
  10.         AUXR |= 0x40;                //定時器1時鐘為Fosc,即1T
  11.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  12.         TMOD &= 0x0F;                //設定定時器1為16位自動重裝方式
  13.         TL1 = 0xE0;                        //設定定時初值
  14.         TH1 = 0xFE;                        //設定定時初值
  15.         ET1 = 0;                                //禁止定時器1中斷
  16.         TR1 = 1;                                //啟動定時器1
  17.         EA = 1;                                //開總中斷
  18.         ES = 1;                                //開串口接收中斷
  19. }

  20. void main()
  21. {
  22.         UartInit();
  23.         while(1)
  24.         {
  25.                 if(flag)
  26.                 {
  27.                         flag=0;                //完成標志清0
  28.                         ES = 0;                //關串口接收中斷
  29.                         SBUF=i;                //發送收到的數據
  30.                         while(!TI);        //等待發送結束
  31.                         TI=0;                        //發送中斷請求標志位清0
  32.                         ES = 1;                //開串口接收中斷
  33.                 }
  34.         }
  35. }
  36. /*----------------------------
  37. UART 中斷服務程序
  38. -----------------------------*/
  39. void Uart() interrupt 4
  40. {
  41.         RI = 0;        //清除RI位
  42.         i = SBUF;//讀取收到的數據
  43.         flag=1;        //完成標志置1
  44. }
復制代碼



回復

使用道具 舉報

ID:516511 發表于 2019-9-18 21:50 | 顯示全部樓層
wulin 發表于 2019-9-18 08:39
給你一個STC408AS基本的串口收發示例

按你給的列子,沒收到
回復

使用道具 舉報

ID:516511 發表于 2019-9-18 22:07 | 顯示全部樓層
wulin 發表于 2019-9-18 08:39
給你一個STC408AS基本的串口收發示例

按你程序,調試沒成功!
回復

使用道具 舉報

ID:213173 發表于 2019-9-19 07:40 | 顯示全部樓層
rockcmc2000 發表于 2019-9-18 22:07
按你程序,調試沒成功!

這個程序是經過實物驗證的,可能是你對串口助手不熟悉,操作不當。
回復

使用道具 舉報

ID:272119 發表于 2019-9-22 23:39 | 顯示全部樓層
STC的串口一定沒有問題,樓主看下一步步排查吧,有示波器最好用示波器查TX/RX信號
回復

使用道具 舉報

ID:256929 發表于 2019-9-25 23:45 | 顯示全部樓層
#include <STC15F2K60S2.H>

typedef unsigned char BYTE;
typedef unsigned int WORD;

        WORD temp;
        bit flag=0;

//串口初始化函數

void UartInit(){          //時鐘頻率18.432MHZ         串口波特率115200
    SCON=0x50;                //8為數據,可變波特率
           T2L=0Xd8 ;                   //定時器初始值
        T2H=0xff;
        AUXR=0x15;                //串口1定時器2為波特率發生器,并啟動定時器2.
        ES=1;                         //開啟串口中斷
        EA=1;                         //開啟總中斷
}


void main(){
  
            UartInit();
        while(1){
                 if(flag){
                 flag=0;
                 ES=0;
                 SBUF=temp;
                 while(!TI);
                 TI=0;
                 ES=1;
                }
        }
}

//串口中斷服務程序

void Uart() interrupt 4 using 1
{

        RI=0;
        temp=SBUF;
        flag=1;
       
}
回復

使用道具 舉報

ID:585284 發表于 2019-9-26 09:34 | 顯示全部樓層
wulin 發表于 2019-9-18 08:39
給你一個STC408AS基本的串口收發示例

這款單片機沒有定時器1
回復

使用道具 舉報

ID:213173 發表于 2019-9-26 11:16 | 顯示全部樓層
靳可 發表于 2019-9-26 09:34
這款單片機沒有定時器1

你說的沒錯,STC15W408AS沒有T1,我上面的示例是用的ISP15W4K58S4做的,這樣不嚴謹。應該用T2做波特率發生器。向樓主及壇友們致歉。
用T2做波特率發生器串口初始化如下:
void UartInit(void)                //9600bps@11.0592MHz
{
        SCON = 0x50;                //8位數據,可變波特率
        AUXR |= 0x01;                //串口1選擇定時器2為波特率發生器
        AUXR |= 0x04;                //定時器2時鐘為Fosc,即1T
        T2L = 0xE0;                //設定定時初值
        T2H = 0xFE;                //設定定時初值
        AUXR |= 0x10;                //啟動定時器2
        EA = 1;              //開總中斷
        ES= 1;                   //開串口接收中斷
}
回復

使用道具 舉報

ID:516511 發表于 2019-9-29 11:32 | 顯示全部樓層
謝謝各位,,我已經解決了這個問題。
回復

使用道具 舉報

ID:230975 發表于 2019-9-30 10:40 | 顯示全部樓層
你沒有定義REN的值的啊。REN為1接收,為0不接收。在SCON里面。你按照WULIN師傅的指導,應該是可以的。
回復

使用道具 舉報

ID:560467 發表于 2019-10-2 12:30 | 顯示全部樓層
有檢查是不是頻率不對么,這樣子會產生亂碼或者你引腳有沒有接對????txd對rxd。。。rxd對txd
回復

使用道具 舉報

ID:560467 發表于 2019-10-2 12:30 | 顯示全部樓層
有檢查是不是頻率不對么,這樣子會產生亂碼或者你引腳有沒有接對????txd對rxd。。。rxd對txd
回復

使用道具 舉報

ID:639986 發表于 2019-11-12 13:18 | 顯示全部樓層
rockcmc2000 發表于 2019-9-29 11:32
謝謝各位,,我已經解決了這個問題。

請問怎么解決的
回復

使用道具 舉報

ID:662183 發表于 2019-12-18 20:03 | 顯示全部樓層
wulin 發表于 2019-9-18 08:39
給你一個STC408AS基本的串口收發示例

學習。目前正用得上
回復

使用道具 舉報

ID:667739 發表于 2019-12-18 20:28 | 顯示全部樓層
看一下官方例程吧,最好
回復

使用道具 舉報

ID:637324 發表于 2020-2-18 13:20 | 顯示全部樓層
我也遇到這個問題了,真的是STC15408AS沒有定時器1,
感謝大家
回復

使用道具 舉報

ID:8977 發表于 2020-5-2 21:38 | 顯示全部樓層
太坑了,我也遇到這個問題,我也懷疑是不是定時器1有什么問題,看了芯片手冊,說有5個定時器
回復

使用道具 舉報

ID:619669 發表于 2020-6-16 13:40 | 顯示全部樓層
孤獨戰士591 發表于 2019-9-25 23:45
#include

typedef unsigned char BYTE;

好蛋疼,搞了好久了用串口助手還是串口不通,收不到發不出,用了好幾個STC15系列單片機都越來越不好用了
回復

使用道具 舉報

ID:619669 發表于 2020-6-16 13:44 | 顯示全部樓層
孤獨戰士591 發表于 2019-9-25 23:45
#include

typedef unsigned char BYTE;

你這個我也試過了,這個408就是不行,我用的串口助手,相同程序改在52上可以
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 激情自拍偷拍 | 日韩精品成人一区二区三区视频 | 精品亚洲永久免费精品 | 黄色91在线| 亚洲不卡在线观看 | 久久av影院| 精品久久久久久久久久久下田 | 成人在线精品视频 | 日韩电影一区 | 亚洲精品小视频在线观看 | 国产91九色 | 国产精品视频一二三区 | 亚洲国产精品99久久久久久久久 | 91玖玖| 欧美一区二区三区视频 | 日本一区二区三区在线观看 | 一级黄色绿像片 | 欧美黄色网 | 九九热在线免费观看 | 国产欧美精品一区二区三区 | 在线视频亚洲 | 国产福利在线看 | 亚洲人成人一区二区在线观看 | 国产欧美日韩 | 成人亚洲 | 精品久久久网站 | 草草视频在线播放 | av国产精品毛片一区二区小说 | 久久国产日韩 | 色成人免费网站 | 日韩电影在线 | 中文字幕日本一区二区 | 91免费在线看 | 九色av| 二区在线观看 | 在线一区视频 | 亚洲一区二区三区四区五区中文 | 日韩精品免费 | 国产精品久久久久久 | heyzo在线| 成人深夜福利 |