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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2725|回復(fù): 26
收起左側(cè)

單片機(jī)串口程序調(diào)試問題,請大神們幫忙 按鍵讓他發(fā)一條,它發(fā)9條

[復(fù)制鏈接]
ID:761175 發(fā)表于 2022-1-5 16:56 | 顯示全部樓層 |閱讀模式
#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");
               
               
                 
          {
               
          }
            
   }

}


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

0.png
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-1-5 17:45 | 顯示全部樓層
加個(gè)消抖延時(shí)就可以了
  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++;//消抖延時(shí)
  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. }
復(fù)制代碼




回復(fù)

使用道具 舉報(bào)

ID:139866 發(fā)表于 2022-1-5 17:51 | 顯示全部樓層
發(fā)9條多嗎,你這程序不發(fā)幾十條算少的了
你理順一下程序邏輯,看看你按下去按鍵的時(shí)候if判斷走了多少次
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-5 17:55 來自手機(jī) | 顯示全部樓層
天ノ憶 發(fā)表于 2022-1-5 17:51
發(fā)9條多嗎,你這程序不發(fā)幾十條算少的了
你理順一下程序邏輯,看看你按下去按鍵的時(shí)候if判斷走了多少次

謝了,跟盆友學(xué)寫了個(gè)蹩腳程序,望多指教
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-5 17:55 來自手機(jī) | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-5 17:45
加個(gè)消抖延時(shí)就可以了

十分感謝,我試試
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-5 18:03 | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-5 17:45
加個(gè)消抖延時(shí)就可以了

十分感謝,用你的程序好了。
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-6 14:30 來自手機(jī) | 顯示全部樓層
稻草人008 發(fā)表于 2022-1-5 18:03
十分感謝,用你的程序好了。

大神你好現(xiàn)在又遇到新問題了,我在仿真上數(shù)據(jù)正常,燒到單片機(jī)里通過485轉(zhuǎn)出來在串口助手上顯示的數(shù)據(jù)不對。我改了下頭文件,stc12c5410ad的
IMG_20220106_142618.jpg
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:450849 發(fā)表于 2022-1-6 15:36 | 顯示全部樓層
阻塞試延時(shí)是單片機(jī)程序設(shè)計(jì)最大的忌諱,
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-6 18:31 來自手機(jī) | 顯示全部樓層
boboxuexi 發(fā)表于 2022-1-6 15:36
阻塞試延時(shí)是單片機(jī)程序設(shè)計(jì)最大的忌諱,

十分感謝,等忙完試試。
回復(fù)

使用道具 舉報(bào)

ID:908826 發(fā)表于 2022-1-6 19:45 | 顯示全部樓層
正點(diǎn)原子論壇有個(gè)按鍵掃描程序,里面有個(gè) 靜態(tài)變量的用法,你可以了解一下,有個(gè)對你有幫助。
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-6 22:00 來自手機(jī) | 顯示全部樓層
13205495918 發(fā)表于 2022-1-6 19:45
正點(diǎn)原子論壇有個(gè)按鍵掃描程序,里面有個(gè) 靜態(tài)變量的用法,你可以了解一下,有個(gè)對你有幫助。

好的謝了,我去看看
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-7 15:08 | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-6 14:45
如果你現(xiàn)實(shí)用的是stc12c5410ad
要把定時(shí)器設(shè)為12分頻
void UartInit(void)                //9600bps@22.1184MHz

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

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-1-7 15:21 | 顯示全部樓層
稻草人008 發(fā)表于 2022-1-7 15:08
高手,你好,現(xiàn)在都調(diào)出來了,
但是我發(fā)的EF 09 73 00 01 02 96這字符在串口上讀出來的是ASCII正確,16 ...

如果你要的是0xEF 0x09 0x73...就要轉(zhuǎn)碼
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-7 18:35 來自手機(jī) | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-7 15:21
如果你要的是0xEF 0x09 0x73...就要轉(zhuǎn)碼

我要的是16進(jìn)制下的EF 09 73 00 01 02 96
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-1-7 18:40 來自手機(jī) | 顯示全部樓層
稻草人008 發(fā)表于 2022-1-7 18:35
我要的是16進(jìn)制下的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嗎?
那就不用轉(zhuǎn)
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-7 19:02 來自手機(jī) | 顯示全部樓層
lkc8210 發(fā)表于 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嗎?
那就不用轉(zhuǎn)

是不是我發(fā)的被我指定為文本了,然后它在轉(zhuǎn)了一遍
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-7 19:07 來自手機(jī) | 顯示全部樓層
稻草人008 發(fā)表于 2022-1-7 19:02
是不是我發(fā)的被我指定為文本了,然后它在轉(zhuǎn)了一遍

"EF 09 73 00 01 02 96這串?dāng)?shù)就是16進(jìn)制的,在ascll上顯示正常,在16進(jìn)制下就被轉(zhuǎn)了一下。是不是這樣。
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-7 19:16 來自手機(jī) | 顯示全部樓層
lkc8210 發(fā)表于 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嗎?
那就不用轉(zhuǎn)

EF 09 73 00 01 02 96這串?dāng)?shù)就是16進(jìn)制的,在ascll上顯示正常,在16進(jìn)制下就被轉(zhuǎn)了一下。是不是這樣。
回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2022-1-7 19:49 | 顯示全部樓層
對于接收方,它不知道來的是什么數(shù)據(jù),是ASCII還是十六進(jìn)制數(shù)據(jù),它都統(tǒng)一按照16進(jìn)制收取。所以發(fā)送方即使發(fā)的是ASCII碼,接收方會按照16進(jìn)制收取ASCII碼對應(yīng)的16進(jìn)制數(shù)據(jù)。實(shí)際上,無論收發(fā),走在線路上的數(shù)據(jù)都是二進(jìn)制數(shù)據(jù)0和1的組合而已。所以才有協(xié)議一說,接收方按照發(fā)射方的意圖去解析數(shù)據(jù)。
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-7 20:03 來自手機(jī) | 顯示全部樓層
suncat0504 發(fā)表于 2022-1-7 19:49
對于接收方,它不知道來的是什么數(shù)據(jù),是ASCII還是十六進(jìn)制數(shù)據(jù),它都統(tǒng)一按照16進(jìn)制收取。所以發(fā)送方即使 ...

但是我要的數(shù)據(jù)它在ASCII里傳送正常,在16進(jìn)制里就被編了一次,設(shè)備不認(rèn)
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-8 01:05 來自手機(jī) | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-6 14:45
如果你現(xiàn)實(shí)用的是stc12c5410ad
要把定時(shí)器設(shè)為12分頻
void UartInit(void)                //9600bps@22.1184MHz

大神你好,還是要請你幫忙。EF 09 73 00 01 02 96這串?dāng)?shù)就是16進(jìn)制的,在ascll上顯示正常,在16進(jìn)制下就被從編了一遍。是不是這樣。要怎么改。
回復(fù)

使用道具 舉報(bào)

ID:161164 發(fā)表于 2022-1-8 09:15 | 顯示全部樓層
稻草人008 發(fā)表于 2022-1-7 19:02
是不是我發(fā)的被我指定為文本了,然后它在轉(zhuǎn)了一遍

對~
所以你要以16進(jìn)數(shù)組來發(fā)
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);
                                }
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-8 10:42 來自手機(jī) | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-8 09:15
對~
所以你要以16進(jìn)數(shù)組來發(fā)
char table_s1[] = {0xEF, 0x09, 0x73, 0x00, 0x02, 0x01, 0x96};

謝謝,我是搞硬件的,對軟件只知道點(diǎn)皮毛。。再次謝謝你的指點(diǎn)。
回復(fù)

使用道具 舉報(bào)

ID:517466 發(fā)表于 2022-1-8 11:09 | 顯示全部樓層
稻草人008 發(fā)表于 2022-1-7 20:03
但是我要的數(shù)據(jù)它在ASCII里傳送正常,在16進(jìn)制里就被編了一次,設(shè)備不認(rèn)

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

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-8 11:30 | 顯示全部樓層
suncat0504 發(fā)表于 2022-1-8 11:09
樓主,我覺得你應(yīng)該抽點(diǎn)時(shí)間,看看串口通訊在芯片、線路上是怎么實(shí)現(xiàn)的。這個(gè)是基礎(chǔ),學(xué)明白了,如何解決 ...

謝謝指點(diǎn),要好好學(xué)習(xí)學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:761175 發(fā)表于 2022-1-8 13:22 | 顯示全部樓層
lkc8210 發(fā)表于 2022-1-7 15:21
如果你要的是0xEF 0x09 0x73...就要轉(zhuǎn)碼

//發(fā)送字符串到串口助手
#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位數(shù)據(jù),可變波特率
        AUXR &= 0xBF;                //定時(shí)器時(shí)鐘12T模式
        AUXR &= 0xFE;                //串口1選擇定時(shí)器1為波特率發(fā)生器
        TMOD &= 0x0F;                //設(shè)置定時(shí)器模式
        TMOD |= 0x20;                //設(shè)置定時(shí)器模式
        TL1 = 0xFA;                //設(shè)置定時(shí)初始值
        TH1 = 0xFA;                //設(shè)置定時(shí)重載值
        ET1 = 0;                //禁止定時(shí)器%d中斷
        TR1 = 1;                //定時(shí)器1開始計(jì)時(shí)
        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++;//消抖延時(shí)
                        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;
                }
        }
}不全
高手,在幫我看看。怎么數(shù)據(jù)發(fā)不全
發(fā)送1:EF 09 73 00 01 02 96
接收1:EF 09 73
發(fā)送2:EF 09 66 03 00 00 83
接收2:EF 09 66 03


回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 最新高清无码专区 | 在线观看国产视频 | 亚洲精品一区二区三区四区高清 | 九九在线| 成年人的视频免费观看 | 国产精品久久久久久久久免费 | 在线欧美 | 久久99国产精一区二区三区 | 久久精品日 | 久久久久久亚洲 | 久久久久国产一区二区三区四区 | 午夜影院在线观看视频 | 五月天国产视频 | 国产精品 亚洲一区 | 亚洲黄色一区二区三区 | 在线永久看片免费的视频 | 国产亚洲精品精品国产亚洲综合 | 中文字幕不卡在线观看 | www.亚洲一区 | 成人婷婷 | 精品久久久999 | 国产精品一区二区三区在线播放 | 久久亚洲一区 | 伊人网99 | 超碰伊人久久 | 欧美日韩一区二区在线观看 | 亚洲视频在线看 | a毛片视频网站 | 天天射网站 | 国产小视频在线观看 | 成人久久18免费网站麻豆 | av三级在线观看 | 中文字幕在线免费视频 | 亚洲黄色视屏 | 一区二区三区日本 | 99色在线视频 | 99精品网| 国产精品美女www | 在线观看av网站 | 亚洲精品一 | 亚洲 91|