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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3833|回復: 8
收起左側

stc單片機串口問題,求問大神!重金懸賞!

[復制鏈接]
ID:170589 發表于 2018-4-2 13:58 | 顯示全部樓層 |閱讀模式
5黑幣
兩個單片機通信,一個主機一個從機,如何做到讓主機發送一個16進制的比如0x01,然后從機接收到之后可以switch {case 0x01:} 語句觸發,現在試了很多次,就是不知道發送與接收之間的這個0x01或者其他字符或者數字該如何定義,或者轉化,才能讓主機發送到的字符或者數字被從機接收到,求問各位大神,當然有相關程序更好。

最佳答案

查看完整內容

第一:對于51單片機,只要是個8位的數據,串口都是一次性發送完成的,不存在什么轉換、定義的問題。 第二:你要先做幾個試驗,驗證你的單片機串口通訊是否成功。單片機向PC機上傳數據,PC機向單片機下傳數據。試驗要點是:接收到的數據,是不是你發送的,你發送的數據單片機接收到沒。那種從PC機發送,接收到直接回給PC機的程序是不行的。 第三:串口通訊最重要的是波特率設置,你是什么樣的單片機、晶振是多少、你用了多大的波 ...
回復

使用道具 舉報

ID:164602 發表于 2018-4-2 13:58 | 顯示全部樓層
第一:對于51單片機,只要是個8位的數據,串口都是一次性發送完成的,不存在什么轉換、定義的問題。
第二:你要先做幾個試驗,驗證你的單片機串口通訊是否成功。單片機向PC機上傳數據,PC機向單片機下傳數據。試驗要點是:接收到的數據,是不是你發送的,你發送的數據單片機接收到沒。那種從PC機發送,接收到直接回給PC機的程序是不行的。
第三:串口通訊最重要的是波特率設置,你是什么樣的單片機、晶振是多少、你用了多大的波特率等,你沒說,所以沒法幫助你。如果是51單片機,12M晶振,波特率最大4800,且要加倍(你應該懂吧!)。
回復

使用道具 舉報

ID:248705 發表于 2018-4-2 19:46 | 顯示全部樓層
定義一個unsigned cahr類型的變量,主機選擇任意一個IO口發送,0x01是八位二進制00000001,用一個for循環循環八次,每次發送一位數據。從機同樣選擇一個io口接收,每次會收到一位數據,for循環八次,接受到八位數據,參考iic總線的數據發送與接收機制
回復

使用道具 舉報

ID:170589 發表于 2018-4-2 20:07 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2018-4-2 15:49
第一:對于51單片機,只要是個8位的數據,串口都是一次性發送完成的,不存在什么轉換、定義的問題。
第二 ...

主機用的是STC15w4k32s4,從機用的是stc12c5a60s2,用主機測試了連電腦串口調試助手,發送正常,但是從機不知道該如何用串口調試助手測試接收,波特率已經檢查過了啊,11.0592,主機用的是4800不倍速,從機用的是4800倍速,主機代碼如下:
#include<STC15.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
        uchar good;
                               
                                sbit key1=P2^0;
                                sbit key2=P2^1;
                                sbit key3=P2^2;
                                sbit key4=P2^3;
                                sbit key5=P2^4;
                                sbit key6=P2^5;
                                sbit key7=P2^6;
                                sbit key8=P2^7;
                                sbit key9=P1^0;
                                sbit key10=P1^1;
                                sbit key11=P1^2;
                                sbit key12=P3^5;
                                sbit key13=P1^4;
                                sbit key14=P1^5;
                                sbit key15=P1^6;
                                sbit key16=P1^7;
                                sbit key17=P3^6;
                                sbit key18=P3^7;
void Uart1Init(void)                //4800bps@11.0592MHz//2¨ìØÂêéèÖÃ′®¿ú3õê¼»ˉ
{


        SCON = 0x50;                //8???,?????
        AUXR |= 0x40;                //???1???Fosc,?1T
        AUXR &= 0xFE;                //??1?????1???????
        TMOD &= 0x0F;                //?????1?16???????
        TL1 = 0xC0;                //??????
        TH1 = 0xFD;                //??????
        ET1 = 0;                //?????1??
        TR1 = 1;                //?????1
        ES=1;    //Æô¶ˉ′®¿úÖD¶Ï
}
void Uart2Init(void)                //9600bps@11.0592MHz
{

        S2CON = 0x50;                //8???,?????
        AUXR |= 0x04;                //???2???Fosc,?1T
        T2L = 0xC0;                //??????
        T2H = 0xFD;                //??????
        AUXR |= 0x10;                //?????2
        ES=1;
}
void Uart3Init(void)                //9600bps@11.0592MHz
{
        S3CON = 0x10;                //8???,?????
        S3CON |= 0x40;                //??3?????3???????
        T4T3M |= 0x02;                //???3???Fosc,?1T
        T3L = 0xC0;                //??????
        T3H = 0xFD;                //??????
        T4T3M |= 0x08;                //?????3
        ES=1;
}
void Uart4Init(void)                //9600bps@11.0592MHz
{
       

        S4CON = 0x10;                //8???,?????
        S4CON |= 0x40;                //??4?????4???????
        T4T3M |= 0x20;                //???4???Fosc,?1T
        T4L = 0xC0;                //??????
        T4H = 0xFD;                //??????
        T4T3M |= 0x80;                //?????4
        ES=1;
}

void Delay1000ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        _nop_();
        _nop_();
        i = 43;
        j = 6;
        k = 203;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

void trans1()//·¢Ëíoˉêy
{
        SBUF=0x01;                //½«òa·¢ËíμÄêy¾Y·Åèë′®¿úêy¾Y»o3åÇø
        while(!TI);                //μè′y·¢Ëííê3é
  TI=0;                     //ÇåáãTI·¢Ëííê3é±ê¼Ç



}
void trans2()//·¢Ëíoˉêy
{
  Delay1000ms();                //@11.0592MHz       
        S2BUF=0x01;                                    //½«òa·¢ËíμÄêy¾Y·Åèë′®¿úêy¾Y»o3åÇø
        while(!(S2CON&0x02));        //μè′y·¢Ëííê3é
  S2CON=S2CON & 0xfd;   //ÇåáãS2TI        
}
void trans3()//·¢Ëíoˉêy
{
        Delay1000ms()        ;        //@11.0592MHz
        S3BUF=0x01;                                    //½«òa·¢ËíμÄêy¾Y·Åèë′®¿úêy¾Y»o3åÇø
        while(!(S3CON&0x02));        //μè′y·¢Ëííê3é
  S3CON=S3CON & 0xfd;   //ÇåáãS3TI        
}
void trans4()//·¢Ëíoˉêy
{
        Delay1000ms()        ;        //@11.0592MHz
        S4BUF=0x01;                                    //½«òa·¢ËíμÄêy¾Y·Åèë′®¿úêy¾Y»o3åÇø
        while(!(S4CON&0x02));        //μè′y·¢Ëííê3é
  S4CON=S4CON & 0xfd;   //ÇåáãS4TI        
}

void IO_Init(void)
{       
        //½«P30 P31 éèÖÃÎa׼˫Ïò¿ú£¬′®¿ú1
        P3M1 &=~( (1<<0) | (1<<1) );  
        P3M0 &=~( (1<<0) | (1<<1) );   
        //½«P10 P11 éèÖÃÎa׼˫Ïò¿ú£¬′®¿ú2
        P1M1 &=~( (1<<0) | (1<<1) );  
        P1M0 &=~( (1<<0) | (1<<1) );  
        //½«P00 P01 éèÖÃÎa׼˫Ïò¿ú£¬′®¿ú3
        P0M1 &=~( (1<<0) | (1<<1) );  
        P0M0 &=~( (1<<0) | (1<<1) );   
        //½«P02 P03 éèÖÃÎa׼˫Ïò¿ú£¬′®¿ú4
        P0M1 &=~( (1<<2) | (1<<3) );  
        P0M0 &=~( (1<<2) | (1<<3) );   
}
void main()        //Ö÷3ìDò
{
        IO_Init();
        if(key12==0)      //Ïû¶¶3ìDò
         {
                 Uart1Init();
                 trans1();

                }                 
         }
從機代碼如下:
#include<STC12c5a60s2.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
        uchar good;
                                uchar count;
                                uint a;
        void UartInit()                //4800bps@11.0592MHz//2¨ìØÂêéèÖÃ′®¿ú3õê¼»ˉoˉêy
{
        PCON |= 0x80;                //????????SMOD
        SCON = 0x50;                //8???,?????
        AUXR |= 0x40;                //???1???Fosc,?1T
        AUXR &= 0xFE;                //??1?????1???????
        TMOD &= 0x0F;                //?????1???
        TMOD |= 0x20;                //?????1?8???????
        TL1 = 0x70;                //??????
        TH1 = 0x70;                //????????
        ET1 = 0;                //?????1??
        TR1 = 1;                //?????1
        EA=1;
        ES=1;
        }

void main()
{
UartInit()        ;
        while(1);

}
void uart1() interrupt 4
{
         if (RI)
       {
        RI = 0;
                                good=SBUF;
                switch (good)
{case 0x01:P2=0;
                break;

}
}
}

回復

使用道具 舉報

ID:164602 發表于 2018-4-3 08:32 | 顯示全部樓層
liujinxu1205 發表于 2018-4-2 20:07
主機用的是STC15w4k32s4,從機用的是stc12c5a60s2,用主機測試了連電腦串口調試助手,發送正常,但是從機 ...

11.0592M晶振,可以使用絕大部分波特率,不在4800限制內!!!
你用的單片機都是比較高級的,我只有STC89C52RC的例子,不過是可以用的。

上位機:功能是將矩陣鍵盤的按鍵值,發送給從機(我的兩板開發板一模一樣),并接收從機發回的數據,通過LED燈的顯示,表示接收和發送數據的關系。如:主機發送9,那么回傳的數據也應該讓LED燈以二進制方式顯示9。/*
串口實驗:單片機與單片機之間的通訊,這是主機程序
*/                                                                         

#include<reg51.h>

#define LED P2
#define JP P1

unsigned char JZ;
bit AJ;       

void UsartConfiguration();
void Delay10ms(unsigned int c);
void KeyDown(void);

void main()//主函數
{
        UsartConfiguration();
        Delay10ms(10);
        while(1)
        {
                KeyDown();
                if (AJ==1)
                {
                        AJ=0;
                        SBUF = JZ;
                        while (!TI);
                        TI = 0;
                }
        }
}

void UsartConfiguration()//設置串口
{
        SCON=0X50;
        TMOD=0X20;
        PCON=0X80;
        TH1=0XF3;
        TL1=0XF3;
        TR1=1;
        EA=1;
        ES=1;
}

void Delay10ms(unsigned int c)//延時10ms
{
    unsigned char a, b;
    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }         
        }      
}

void KeyDown(void)
{
        unsigned char a=0;
        JP=0x0f;
        if(JP!=0x0f)
        {
                Delay10ms(1);
                if(JP!=0x0f)
                {
                        AJ=1;
                        switch(JP)
                        {
                                case(0X07):        JZ=0;break;
                                case(0X0b):        JZ=1;break;
                                case(0X0d): JZ=2;break;
                                case(0X0e):        JZ=3;break;
                        }
                        JP=0Xf0;
                        switch(JP)
                        {
                                case(0X70):        JZ=JZ;break;
                                case(0Xb0):        JZ=JZ+4;break;
                                case(0Xd0): JZ=JZ+8;break;
                                case(0Xe0):        JZ=JZ+12;break;
                        }
                        for (a=0;(a<50)&&(JP!=0xf0);a++)
                        {
                                Delay10ms(1);
                        }
                }
        }
}

void FSSZ(void) interrupt 4
{
        RI=0;
        LED=~SBUF;
        Delay10ms(1);
}



從機程序:功能是接收主機發來的數據,并且用數碼管顯示出來,再將收到的數據發回主機。

#include<reg51.h>

#define SMG P0

unsigned char k;
unsigned char code XSM[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};

void UsartConfiguration();
void Delay10ms(unsigned int c);

void main()
{
        UsartConfiguration();
        Delay10ms(10);
        while(1)
        {
        }
}

void UsartConfiguration()
{
        SCON=0X50;
        TMOD=0X20;
        PCON=0X80;
        TH1=0XF3;
        TL1=0XF3;
        TR1=1;
        ES=1;
        EA=1;
}

void Delay10ms(unsigned int c)
{
    unsigned char a, b;
    for (;c>0;c--)
        {
                for (b=38;b>0;b--)
                {
                        for (a=130;a>0;a--);
                }         
        }      
}

void CKTX() interrupt 4
{
        RI=0;
        k=SBUF;
        SMG=XSM[k];
        SBUF=k;
        while (!TI);
        TI = 0;
}


這個程序,就是我對你說的試驗程序。
先試驗兩程序與PC機間是否可以正常通訊,然后再試驗兩單片機是否可以正常通訊。
我用的板子電路是這樣的:
1.jpg

2.jpg

3.jpg

4.jpg


回復

使用道具 舉報

ID:213173 發表于 2018-4-3 10:47 | 顯示全部樓層
liujinxu1205 發表于 2018-4-2 20:07
主機用的是STC15w4k32s4,從機用的是stc12c5a60s2,用主機測試了連電腦串口調試助手,發送正常,但是從機 ...

在你的程序基礎上改的,去掉暫時不用的語句,可以實現主從機通訊,你對比一下就知道錯誤在哪里
//主機代碼如下:
#include<STC15.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar good;
uchar j=0;       
sbit key1 =P2^0;
sbit key2 =P2^1;
sbit key3 =P2^2;
sbit key4 =P2^3;
sbit key5 =P2^4;
sbit key6 =P2^5;
sbit key7 =P2^6;
sbit key8 =P2^7;
sbit key9 =P1^0;
sbit key10=P1^1;
sbit key11=P1^2;
sbit key12=P3^5;
sbit key13=P1^4;
sbit key14=P1^5;
sbit key15=P1^6;
sbit key16=P1^7;
sbit key17=P3^6;
sbit key18=P3^7;
void Uart1Init(void)                //4800bps@11.0592MHz//2¨ì??êéè??′??ú3?ê??ˉ
{
        SCON = 0x50;                //8???,?????
        AUXR |= 0x40;                //???1???Fosc,?1T
        AUXR &= 0xFE;                //??1?????1???????
        TMOD &= 0x0F;                //?????1?16???????
        TL1 = 0xC0;                //??????
        TH1 = 0xFD;                //??????
        ET1 = 0;                //?????1??
        TR1 = 1;                //?????1
}

void delay1ms(uint k)                        //1T/1ms延時程序       
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=1150;j>0;j--);       
}

void trans1(uchar i)//·¢?íoˉêy
{
        SBUF=i;                //??òa·¢?íμ?êy?Y·?è?′??úêy?Y?o3???
        while(!TI);                //μè′y·¢?ííê3é
        TI=0;                     //??á?TI·¢?ííê3é±ê??
}

void main()
{               
        Uart1Init();
        while(1)       
        {
                if(key12==0)
                {
                        delay1ms(20);
                        if(key12==0)
                        {                       
                                j++;
                                if(j>=2)
                                        j=0;
                                trans1(j);
                                while(!key12);
                        }
                }
        }
}

//從機代碼如下:
#include<STC12c5a60s2.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar good;
uchar count;
uint a;

void UartInit()                //4800bps@11.0592MHz//2¨ì??êéè??′??ú3?ê??ˉoˉêy
{
        PCON |= 0x80;                //????????SMOD
        SCON = 0x50;                //8???,?????
        AUXR |= 0x40;                //???1???Fosc,?1T
        AUXR &= 0xFE;                //??1?????1???????
        TMOD &= 0x0F;                //?????1???
        TMOD |= 0x20;                //?????1?8???????
        TL1 = 0x70;                //??????
        TH1 = 0x70;                //????????
        ET1 = 0;                //?????1??
        TR1 = 1;                //?????1

        EA=1;
        ES=1;
}

void main()
{
        UartInit();
        while(1);
}
void uart1() interrupt 4
{
        RI = 0;
        good=SBUF;
        switch(good)
        {
                case 0x01:P2=0xf0;
                break;       
                case 0x02:P2=0x0f;
                break;       
        }
}

回復

使用道具 舉報

ID:170589 發表于 2018-4-3 21:41 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2018-4-2 13:58
第一:對于51單片機,只要是個8位的數據,串口都是一次性發送完成的,不存在什么轉換、定義的問題。
第二 ...

謝謝大神,解決了
回復

使用道具 舉報

ID:170589 發表于 2018-4-3 21:42 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2018-4-3 08:32
11.0592M晶振,可以使用絕大部分波特率,不在4800限制內!!!
你用的單片機都是比較高級的,我只有STC8 ...

辛苦大神了,這個問題解決了
回復

使用道具 舉報

ID:170589 發表于 2018-4-3 21:42 | 顯示全部樓層
wulin 發表于 2018-4-3 10:47
在你的程序基礎上改的,去掉暫時不用的語句,可以實現主從機通訊,你對比一下就知道錯誤在哪里
//主機代 ...

多謝多謝,程序還是波特率問題
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久久久久亚洲精品 | 91在线看网站 | 中文字幕av高清 | 欧美一区久久 | 午夜精品在线 | 欧美一级毛片免费观看 | 美女国产| 国产视频精品免费 | 免费在线观看黄色av | 亚洲国产视频一区二区 | 欧美日韩在线观看视频网站 | 日本免费一区二区三区 | 性色综合 | 久久精品国产亚洲夜色av网站 | 午夜精品久久久 | 午夜小电影 | 91久久国产精品 | 春色av| 久草免费在线视频 | 中文字幕在线一区 | 一区二区中文字幕 | 日韩在线成人 | 久久综合九色综合欧美狠狠 | 欧美九九九 | 爱草在线 | 国产视频久久久久 | 国产精品久久久久久中文字 | 国产一区二区三区视频 | 中文字幕精品一区 | 亚洲福利一区二区 | 欧美精品片 | 日韩av成人在线 | 在线观看国产三级 | 精品国产亚洲一区二区三区大结局 | 精品久久久久久久久久久久久 | 久久小视频 | 国产精品一区久久久 | 国产精品久久久久一区二区三区 | 亚洲国产精品一区二区三区 | 韩国久久| 日韩毛片 |