找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3258|回复: 8
收起左侧

stc单片机串口问题,求问大神!重金悬赏!

[复制链接]
ID:170589 发表于 2018-4-2 13:58 | 显示全部楼层 |阅读模式
5黑币
两个单片机通信,一个主机一个从机,如何做到让主机发送一个16进制的比如0x01,然后从机接收到之后可以switch {case 0x01:} 语句触发,现在试了很多次,就是不知道发送与接收之间的这个0x01或者其他字符或者数字该如何定义,或者转化,才能让主机发送到的字符或者数字被从机接收到,求问各位大神,当然有相关程序更好。

最佳答案

查看完整内容

第一:对于51单片机,只要是个8位的数据,串口都是一次性发送完成的,不存在什么转换、定义的问题。 第二:你要先做几个试验,验证你的单片机串口通讯是否成功。单片机向PC机上传数据,PC机向单片机下传数据。试验要点是:接收到的数据,是不是你发送的,你发送的数据单片机接收到没。那种从PC机发送,接收到直接回给PC机的程序是不行的。 第三:串口通讯最重要的是波特率设置,你是什么样的单片机、晶振是多少、你用了多大的波 ...
回复

使用道具 举报

ID:170589 发表于 2018-4-3 21:42 | 显示全部楼层
wulin 发表于 2018-4-3 10:47
在你的程序基础上改的,去掉暂时不用的语句,可以实现主从机通讯,你对比一下就知道错误在哪里
//主机代 ...

多谢多谢,程序还是波特率问题
回复

使用道具 举报

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:41 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-4-2 13:58
第一:对于51单片机,只要是个8位的数据,串口都是一次性发送完成的,不存在什么转换、定义的问题。
第二 ...

谢谢大神,解决了
回复

使用道具 举报

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: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: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:248705 发表于 2018-4-2 19:46 | 显示全部楼层
定义一个unsigned cahr类型的变量,主机选择任意一个IO口发送,0x01是八位二进制00000001,用一个for循环循环八次,每次发送一位数据。从机同样选择一个io口接收,每次会收到一位数据,for循环八次,接受到八位数据,参考iic总线的数据发送与接收机制
回复

使用道具 举报

ID:164602 发表于 2018-4-2 13:58 | 显示全部楼层
第一:对于51单片机,只要是个8位的数据,串口都是一次性发送完成的,不存在什么转换、定义的问题。
第二:你要先做几个试验,验证你的单片机串口通讯是否成功。单片机向PC机上传数据,PC机向单片机下传数据。试验要点是:接收到的数据,是不是你发送的,你发送的数据单片机接收到没。那种从PC机发送,接收到直接回给PC机的程序是不行的。
第三:串口通讯最重要的是波特率设置,你是什么样的单片机、晶振是多少、你用了多大的波特率等,你没说,所以没法帮助你。如果是51单片机,12M晶振,波特率最大4800,且要加倍(你应该懂吧!)。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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