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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機串口程序調試問題,請大神們幫忙 按鍵讓他發一條,它發9條

[復制鏈接]
跳轉到指定樓層
樓主
#include <reg51.h>
#include "string.h"

#define uchar unsigned char
#define uint unsigned  int


sbit S1=P1^0;
sbit S2=P1^1;
sbit S3=P1^2;
sbit S4=P1^3;
void uart_init(void)
{
     TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFA;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;

}
//

void uart_tx_byte(uchar dat)
{
   SBUF=dat;
   while(!TI);
   TI=0;



}

void uart_tx_string(uchar *P)
{
    while(*P)
           {
             uart_tx_byte(*P);
         P++;
           }
  }
void main()
{
   uart_init();


   while(1)
   {
      if(S1==0)    //按鍵S1按下
          {
            
                 uart_tx_string("EF 09 73 00 01 02 96 \n\r");
        
        
        
               
          }
          if(S2==0)   //按鍵S2按下
          {
            
                 uart_tx_string("EF 09 73 00 02 01 96 \n\r");

                        

          }
          if(S3==0)   //按鍵S3按下
          {
            
                 uart_tx_string("EF 09 66 03 00 00 83 \n\r");

                 
          }
          if (S4==0)
             uart_tx_string("EF 09 73 01 00 00 94 \n\r");
               
               
                 
          {
               
          }
            
   }

}


給位大神幫我看看哪里錯了,每按一下按鍵讓他發一條,它發9條。初學者,別笑話。

0.png (53.06 KB, 下載次數: 152)

0.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:161164 發表于 2022-1-5 17:45 | 只看該作者
加個消抖延時就可以了
  1. void main()
  2. {
  3.         uart_init();

  4.         while(1)
  5.         {static unsigned char delay;
  6.                 if(S1==0 || S2==0 || S3==0 || S4==0)//有鍵按下
  7.                 {
  8.                         if(delay<0xFF)delay++;//消抖延時
  9.                         if(delay == 250)
  10.                         {
  11.                                 if(S1==0)    //按鍵S1按下
  12.                                 {
  13.                                         uart_tx_string("EF 09 73 00 01 02 96 \n\r");
  14.                                 }
  15.                                 if(S2==0)   //按鍵S2按下
  16.                                 {
  17.                                         uart_tx_string("EF 09 73 00 02 01 96 \n\r");
  18.                                 }
  19.                                 if(S3==0)   //按鍵S3按下
  20.                                 {
  21.                                         uart_tx_string("EF 09 66 03 00 00 83 \n\r");
  22.                                 }
  23.                                 if (S4==0)
  24.                                 {
  25.                                         uart_tx_string("EF 09 73 01 00 00 94 \n\r");
  26.                                 }                               
  27.                         }
  28.                 }else{
  29.                         delay = 0;
  30.                 }
  31.         }
  32. }
復制代碼




回復

使用道具 舉報

板凳
ID:139866 發表于 2022-1-5 17:51 | 只看該作者
發9條多嗎,你這程序不發幾十條算少的了
你理順一下程序邏輯,看看你按下去按鍵的時候if判斷走了多少次
回復

使用道具 舉報

地板
ID:761175 發表于 2022-1-5 17:55 來自手機 | 只看該作者
天ノ憶 發表于 2022-1-5 17:51
發9條多嗎,你這程序不發幾十條算少的了
你理順一下程序邏輯,看看你按下去按鍵的時候if判斷走了多少次

謝了,跟盆友學寫了個蹩腳程序,望多指教
回復

使用道具 舉報

5#
ID:761175 發表于 2022-1-5 17:55 來自手機 | 只看該作者
lkc8210 發表于 2022-1-5 17:45
加個消抖延時就可以了

十分感謝,我試試
回復

使用道具 舉報

6#
ID:761175 發表于 2022-1-5 18:03 | 只看該作者
lkc8210 發表于 2022-1-5 17:45
加個消抖延時就可以了

十分感謝,用你的程序好了。
回復

使用道具 舉報

7#
ID:761175 發表于 2022-1-6 14:30 來自手機 | 只看該作者
稻草人008 發表于 2022-1-5 18:03
十分感謝,用你的程序好了。

大神你好現在又遇到新問題了,我在仿真上數據正常,燒到單片機里通過485轉出來在串口助手上顯示的數據不對。我改了下頭文件,stc12c5410ad的

IMG_20220106_142618.jpg (1.28 MB, 下載次數: 131)

IMG_20220106_142618.jpg
回復

使用道具 舉報

8#
ID:161164 發表于 2022-1-6 14:45 | 只看該作者
如果你現實用的是stc12c5410ad
要把定時器設為12分頻
void UartInit(void)                //9600bps@22.1184MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位數據,可變波特率
        AUXR &= 0xBF;                //定時器時鐘12T模式
        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
        TMOD &= 0x0F;                //設置定時器模式
        TMOD |= 0x20;                //設置定時器模式
        TL1 = 0xFA;                //設置定時初始值
        TH1 = 0xFA;                //設置定時重載值
        ET1 = 0;                //禁止定時器%d中斷
        TR1 = 1;                //定時器1開始計時
        ES = 1;
        EA = 1;
}
回復

使用道具 舉報

9#
ID:450849 發表于 2022-1-6 15:36 | 只看該作者
阻塞試延時是單片機程序設計最大的忌諱,
回復

使用道具 舉報

10#
ID:761175 發表于 2022-1-6 18:31 來自手機 | 只看該作者
boboxuexi 發表于 2022-1-6 15:36
阻塞試延時是單片機程序設計最大的忌諱,

十分感謝,等忙完試試。
回復

使用道具 舉報

11#
ID:908826 發表于 2022-1-6 19:45 | 只看該作者
正點原子論壇有個按鍵掃描程序,里面有個 靜態變量的用法,你可以了解一下,有個對你有幫助。
回復

使用道具 舉報

12#
ID:761175 發表于 2022-1-6 22:00 來自手機 | 只看該作者
13205495918 發表于 2022-1-6 19:45
正點原子論壇有個按鍵掃描程序,里面有個 靜態變量的用法,你可以了解一下,有個對你有幫助。

好的謝了,我去看看
回復

使用道具 舉報

13#
ID:761175 發表于 2022-1-7 15:08 | 只看該作者
lkc8210 發表于 2022-1-6 14:45
如果你現實用的是stc12c5410ad
要把定時器設為12分頻
void UartInit(void)                //9600bps@22.1184MHz

高手,你好,現在都調出來了,
但是我發的EF 09 73 00 01 02 96這字符在串口上讀出來的是ASCII正確,16進制45 46 20 30 39 20 37 33 20 30 30 20 30 32 20 30 31 20 39 36 20 0A 0D 。但是我要的是16位進制的。是不是需要轉碼
回復

使用道具 舉報

14#
ID:161164 發表于 2022-1-7 15:21 | 只看該作者
稻草人008 發表于 2022-1-7 15:08
高手,你好,現在都調出來了,
但是我發的EF 09 73 00 01 02 96這字符在串口上讀出來的是ASCII正確,16 ...

如果你要的是0xEF 0x09 0x73...就要轉碼
回復

使用道具 舉報

15#
ID:761175 發表于 2022-1-7 18:35 來自手機 | 只看該作者
lkc8210 發表于 2022-1-7 15:21
如果你要的是0xEF 0x09 0x73...就要轉碼

我要的是16進制下的EF 09 73 00 01 02 96
回復

使用道具 舉報

16#
ID:161164 發表于 2022-1-7 18:40 來自手機 | 只看該作者
稻草人008 發表于 2022-1-7 18:35
我要的是16進制下的EF 09 73 00 01 02 96

就是45 46 20 30 39 20 37 33 20 30 30 20 30 32 20 30 31 20 39 36 20 0A 0D嗎?
那就不用轉
回復

使用道具 舉報

17#
ID:761175 發表于 2022-1-7 19:02 來自手機 | 只看該作者
lkc8210 發表于 2022-1-7 18:40
就是45 46 20 30 39 20 37 33 20 30 30 20 30 32 20 30 31 20 39 36 20 0A 0D嗎?
那就不用轉

是不是我發的被我指定為文本了,然后它在轉了一遍
回復

使用道具 舉報

18#
ID:761175 發表于 2022-1-7 19:07 來自手機 | 只看該作者
稻草人008 發表于 2022-1-7 19:02
是不是我發的被我指定為文本了,然后它在轉了一遍

"EF 09 73 00 01 02 96這串數就是16進制的,在ascll上顯示正常,在16進制下就被轉了一下。是不是這樣。
回復

使用道具 舉報

19#
ID:761175 發表于 2022-1-7 19:16 來自手機 | 只看該作者
lkc8210 發表于 2022-1-7 18:40
就是45 46 20 30 39 20 37 33 20 30 30 20 30 32 20 30 31 20 39 36 20 0A 0D嗎?
那就不用轉

EF 09 73 00 01 02 96這串數就是16進制的,在ascll上顯示正常,在16進制下就被轉了一下。是不是這樣。
回復

使用道具 舉報

20#
ID:517466 發表于 2022-1-7 19:49 | 只看該作者
對于接收方,它不知道來的是什么數據,是ASCII還是十六進制數據,它都統一按照16進制收取。所以發送方即使發的是ASCII碼,接收方會按照16進制收取ASCII碼對應的16進制數據。實際上,無論收發,走在線路上的數據都是二進制數據0和1的組合而已。所以才有協議一說,接收方按照發射方的意圖去解析數據。
回復

使用道具 舉報

21#
ID:761175 發表于 2022-1-7 20:03 來自手機 | 只看該作者
suncat0504 發表于 2022-1-7 19:49
對于接收方,它不知道來的是什么數據,是ASCII還是十六進制數據,它都統一按照16進制收取。所以發送方即使 ...

但是我要的數據它在ASCII里傳送正常,在16進制里就被編了一次,設備不認
回復

使用道具 舉報

22#
ID:761175 發表于 2022-1-8 01:05 來自手機 | 只看該作者
lkc8210 發表于 2022-1-6 14:45
如果你現實用的是stc12c5410ad
要把定時器設為12分頻
void UartInit(void)                //9600bps@22.1184MHz

大神你好,還是要請你幫忙。EF 09 73 00 01 02 96這串數就是16進制的,在ascll上顯示正常,在16進制下就被從編了一遍。是不是這樣。要怎么改。
回復

使用道具 舉報

23#
ID:161164 發表于 2022-1-8 09:15 | 只看該作者
稻草人008 發表于 2022-1-7 19:02
是不是我發的被我指定為文本了,然后它在轉了一遍

對~
所以你要以16進數組來發
char table_s1[] = {0xEF, 0x09, 0x73, 0x00, 0x02, 0x01, 0x96};
char table_s2[] = {0xEF, ...};
char table_s3[] = {0xEF, ...};
char table_s4[] = {0xEF, ...};

                                if(S1==0)    //按鍵S1按下
                                {
                                        uart_tx_string(table_s1);
                                }
                                if(S2==0)    //按鍵S2按下
                                {
                                        uart_tx_string(table_s2);
                                }
回復

使用道具 舉報

24#
ID:761175 發表于 2022-1-8 10:42 來自手機 | 只看該作者
lkc8210 發表于 2022-1-8 09:15
對~
所以你要以16進數組來發
char table_s1[] = {0xEF, 0x09, 0x73, 0x00, 0x02, 0x01, 0x96};

謝謝,我是搞硬件的,對軟件只知道點皮毛。。再次謝謝你的指點。
回復

使用道具 舉報

25#
ID:517466 發表于 2022-1-8 11:09 | 只看該作者
稻草人008 發表于 2022-1-7 20:03
但是我要的數據它在ASCII里傳送正常,在16進制里就被編了一次,設備不認

樓主,我覺得你應該抽點時間,看看串口通訊在芯片、線路上是怎么實現的。這個是基礎,學明白了,如何解決問題,你會有重新認識。用來實現數據傳送的,是芯片中的寄存器,你把數據送進去,通過線路送到接收方的寄存器。收發正常的場合,兩邊寄存器里的內容是一致的。當你把可顯示、打印的ASCII和不可顯示、打印的16禁止數據混合傳輸的時候,比如以下語句(假設printf做個輸出轉向,轉向給串口輸出,假設comout是輸出16進制數據給串口):
printf("12345"); // 注:這五個字符,對應的6進制數據為:0x31,0x32,0x33,0x34,0x35
unsigned char dat[]={0xF1,0xC1,0x00,0x23};
comout(dat,0,3);  // 像串口發送dat數組中從0號元素開始,到3號元素截止的數據,包含0號元素和3號元素
那么經過這些發送,接收方收到的數據,以16進制表達:0x31,0x32,0x33,0x34,0x35,0xF1,0xC1,0x00,0x23
當你使用APP接收這些數據,如果以文本形式表示出來的時候,因為前五個對應的是可顯示打印的數據,所以顯示“12345”,但后五個是沒法顯示的。
上面的發送,是可以用以下形式,一樣實現:
unsigned char dat[]={0x31,0x32,0x33,0x34,0x35,0xF1,0xC1,0x00,0x23};
comout(dat, 0, 8);
回復

使用道具 舉報

26#
ID:761175 發表于 2022-1-8 11:30 | 只看該作者
suncat0504 發表于 2022-1-8 11:09
樓主,我覺得你應該抽點時間,看看串口通訊在芯片、線路上是怎么實現的。這個是基礎,學明白了,如何解決 ...

謝謝指點,要好好學習學習一下
回復

使用道具 舉報

27#
ID:761175 發表于 2022-1-8 13:22 | 只看該作者
lkc8210 發表于 2022-1-7 15:21
如果你要的是0xEF 0x09 0x73...就要轉碼

//發送字符串到串口助手
#include <STC12C5410AD.h>
#include "string.h"

#define uchar unsigned char
#define uint unsigned  int



sbit S1=P1^3;
sbit S2=P1^2;
sbit S3=P1^1;
sbit S4=P1^0;


char table_s1[] = {0xEF, 0x09, 0x73, 0x00, 0x01, 0x02, 0x96};
char table_s2[] = {0xEF, 0x09, 0x73, 0x00, 0x02, 0x01, 0x96};
char table_s3[] = {0xEF, 0x09, 0x66, 0x03, 0x00, 0x00, 0x83};
char table_s4[] = {0xEF, 0x09, 0x73, 0x01, 0x00, 0x00, 0x94};


//初始化
void uart_init(void)               //9600bps@22.1184MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位數據,可變波特率
        AUXR &= 0xBF;                //定時器時鐘12T模式
        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
        TMOD &= 0x0F;                //設置定時器模式
        TMOD |= 0x20;                //設置定時器模式
        TL1 = 0xFA;                //設置定時初始值
        TH1 = 0xFA;                //設置定時重載值
        ET1 = 0;                //禁止定時器%d中斷
        TR1 = 1;                //定時器1開始計時
        ES = 1;
        EA = 1;
   
}
//

void uart_tx_byte(uchar dat)
{
   SBUF=dat;
   while(!TI);
   TI=0;



}

void uart_tx_string(uchar *P)
{
    while(*P)
           {
             uart_tx_byte(*P);
         P++;
           }
  }
void main()
     
{
        uart_init();

        while(1)

   
        {static unsigned char delay;
                if(S1==0 || S2==0 || S3==0 || S4==0)//有鍵按下
              {
                        if(delay<0xFF)delay++;//消抖延時
                        if(delay == 250)
                        {
                                if(S1==0)    //按鍵S1按下
                                {
                                        uart_tx_string(table_s1);
                                }
                                if(S2==0)   //按鍵S2按下
                                {
                                        uart_tx_string(table_s2);
                                }
                                if(S3==0)   //按鍵S3按下
                                {
                                        uart_tx_string(table_s3);
                                }
                                if (S4==0)           //按鍵S4按下
                                {
                                        uart_tx_string(table_s4);
                                }                              
                        }
                }else{
                 
       delay = 0;
                }
        }
}不全
高手,在幫我看看。怎么數據發不全
發送1:EF 09 73 00 01 02 96
接收1:EF 09 73
發送2:EF 09 66 03 00 00 83
接收2:EF 09 66 03


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品在线观看一区二区 | 99精品欧美一区二区蜜桃免费 | 婷婷综合在线 | 国产精品久久久久无码av | 国产精品视频导航 | 日韩一区二区三区在线观看 | 欧美色综合一区二区三区 | 日韩中文一区二区三区 | 成人免费视频观看视频 | av网站免费观看 | 91精品国产91久久久久游泳池 | 91传媒在线观看 | 中国美女av | 国产成人免费视频网站视频社区 | 婷婷综合久久 | 中文字幕一区在线观看视频 | 亚洲国产中文字幕 | 欧美 日韩 在线播放 | 欧美日韩成人在线 | 久久精品伊人 | 国产日韩欧美 | 欧美国产视频 | 久久人体视频 | 男人av的天堂 | 999热在线视频 | 中文字幕日韩欧美一区二区三区 | 午夜欧美 | 欧美日韩电影在线 | 国产情侣激情 | 97高清国语自产拍 | 亚洲精久久 | 超碰免费在线 | 欧美黄色大片在线观看 | 伊人精品 | 伊人欧美视频 | 亚洲视频一 | 九九精品热 | 91av在线电影 | 91电影在线| 天堂av中文在线 | 激情欧美日韩一区二区 |