标题: 单片机串口通信问题 发送数字 led灯反转程序如何写? [打印本页]

作者: a66301208a    时间: 2019-2-8 22:57
标题: 单片机串口通信问题 发送数字 led灯反转程序如何写?
这是串口通信的问题,发送一个数字  0  led灯就会反转。我想一次发送123456789一共9个数字才能让led反转要怎么写?

IMG_20190208_223152.jpg (653.33 KB, 下载次数: 49)

IMG_20190208_223152.jpg

作者: yaoji123    时间: 2019-2-9 08:15
接收9个字符,用字符连接函数将其连接后作判断。
作者: wulin    时间: 2019-2-9 09:12
楼主这是自定义通讯协议问题。首先要把收到的字符按序分别保存在缓存中,1帧字符接收完毕后产生一个结束标志。然后对缓存中保存的字符解析判断,正确:执行相应任务。错误:清除缓存,重新等待接收。1帧数据通常由数据头、有效数据、验证码、数据尾等组成。其目的是为了保证传输信号的准确性。
作者: HC6800-ES-V2.0    时间: 2019-2-9 14:38
我做了一个程序,满足123456789的数字,控制LED灯开关。
/*
长数字控制控制
*/
#include<reg51.h>

sbit LED0=P2^0;

unsigned char i=0,k;
//unsigned char DD[5];

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

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

void UsartConfiguration()//9600bps@11.0592MHz
{
        SCON=0X50;
        TMOD=0X20;
        PCON=0X80;
        TH1=0XFa;
        TL1=0XFa;
        TR1=1;
        ET1=0;
        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;
        if (k==0x12)
        {
                if (i==0)
                {
                        i++;
                }
                else
                {
                        i=0;
                }
        }
        if (k==0x34)
        {
                if (i==1)
                {
                        i++;
                }
                else
                {
                        i=0;
                }
        }
        if (k==0x56)
        {
                if (i==2)
                {
                        i++;
                }
                else
                {
                        i=0;
                }
        }
        if (k==0x78)
        {
                if (i==3)
                {
                        i++;
                }
                else
                {
                        i=0;
                }
        }
        if (k==0x09)
        {
                if (i==4)
                {
                        i++;
                }
                else
                {
                        i=0;
                }
        }
        if (i==5)
        {
                LED0=~LED0;
                i=0;
        }
}

作者: HC6800-ES-V2.0    时间: 2019-2-9 14:55
如果你是用字符串进行控制,我也是有程序的。
/*
长字符串控制
*/
#include<reg51.h>

sbit LED0=P2^0;

unsigned char i=0,k;
unsigned char DD[11];

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

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

void UsartConfiguration()//设置串口12M\4800
{
        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;
        if (k!='\n')
        {
                DD[i]=k;
                i++;
                if (i>11)
                {
                        i=0;
                }
        }
        else
        {
                DD[i]=k;
                i=0;
                if ((DD[0]=='1')&&(DD[1]=='2')&&(DD[2]=='3')&&(DD[3]=='4')&&(DD[4]=='5')&&(DD[5]=='6')&&(DD[6]=='7')&&(DD[7]=='8')&&(DD[8]=='9')&&(DD[9]==0x0d)&&(DD[10]==0x0a))
                {
                        LED0=~LED0;
                }
        }
}
程序要求,字符串必须以回车结束,字符串长度最大九位
作者: 就你****    时间: 2019-2-10 11:02
wulin 发表于 2019-2-9 09:12
楼主这是自定义通讯协议问题。首先要把收到的字符按序分别保存在缓存中,1帧字符接收完毕后产生一个结束标 ...

这个建议很好,楼主再调调




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1