找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

串口通信问题 求助

[复制链接]
xiong57785 发表于 2011-7-31 16:51:52 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
先按按键 k1 就没事 助手出现Hello what do you want to do?
怎么我 L1 后再按按键就不显示 正常了 前面第一个Hello 的H就变成1了
发L2前面L就变2了   L3 L4 m1 m2 m3 m4 也一样
是SBUF里的数据没被清除吗
QQ截图未命名.png 任务5.rar (35.56 KB, 下载次数: 0)            付protuse



/************************************************************************

      说明:本程序主要完成上位机发送字符给单片机控制外围器件的任务
          时间:2011.7.30

*************************************************************************/

//头文件
#include <regx52.h>
//宏定义
#define uchar unsigned char
#define uint unsigned int

sbit k1 = P3 ^ 2;                //按键1
sbit speaker = P1 ^ 4;  // 蜂鸣器

uchar rev[]={""};        //接收到的字符
uchar ser_text[]="Hello, What do you want to do?";

//-----------------------------------------------------------------------
//函数声明
void System_Init();                //初始化
void Key_Scan();      //按键扫描函数
void Delay_1ms(uint z); //延时1ms函数
void Delay_1us(uint time_us);        //延时1us函数
void Serial_Txd(uchar *p);    //串口发送函数
void beer();
//-----------------------------------------------------------------------


/************************************************************************

                                              主函数

*************************************************************************/
void main()
{
        System_Init();

        while(1)
        {
                Key_Scan();        
        }

}

/***********************************************************************************

                         延时1ms函数

***********************************************************************************/
void Delay_1ms(uint z)
{
    uint x,y;
        for(x = z;x > 0;x--)
           for(y = 110;y >0;y--);
}

/***********************************************************************************

                         延时1us函数

***********************************************************************************/
void Delay_1us(uint time_us)
{
        while(--time_us);
}


/************************************************************************

                                              初始化函数

*************************************************************************/
void System_Init()
{
        SCON = 0X50;
        PCON = 0X00;
        TMOD = 0X20;
        TH1 = 0XFD;
        TL1 = 0XFD;
        EA = 1;
        ES = 1;
        TR1 = 1;
}

/************************************************************************

                                              串口中断函数

*************************************************************************/          
void Serial_Rxd() interrupt 4
{
        ES=0;
        if(RI)
        {
                rev[0] = SBUF;
                RI = 0;
                if(rev[0] == 'm')                     //如果第一个字符是m
                {
                        while(!RI);
                        rev[1] = SBUF;
                        RI = 0;
                        switch(rev[1])                                          //判断第二个字符
                        {
                                case '1':P2 = 0; P0 = 0xff; break;         //是1 第一个数码管亮
                                case '2':P2 = 1; P0 = 0xff; break;         //是2 第二个数码管亮
                                case '3':P2 = 2; P0 = 0xff; break;         //是3 第三个数码管亮
                                case '4':P2 = 3; P0 = 0xff; break;          //是4 第四个数码管亮
                        }
                       

                }
                if(rev[0] == 'L')                                  //如果第一个字符是m
                {
                        while(!RI);
                        rev[1] = SBUF;
                        RI = 0;
                        switch(rev[1])                                   //判断第二个字符
                        {
                                case '1':P1 = 0XFE; break;           //是1 第一个LED亮
                                case '2':P1 = 0XFD; break;           //是2 第二个LED亮
                                case '3':P1 = 0XFB; break;           //是3 第三个LED亮
                                case '4':P1 = 0XF7; break;            //是4 第四个LED亮

                        }

                }
                if(rev[0] == 'b')                                       //判断第一个字符是不是b
                {
                        while(!RI);
                        rev[1] = SBUF;
                        RI = 0;
                        if(rev[1] == 'e')                                   //判断第二个字符是不是e
                        {
                                while(!RI);
                                rev[2] = SBUF;
                                RI = 0;                                                  
                                if(rev[2] == 'e')                           //判断第三个字符是不是e
                                {
                                        while(!RI);
                                        rev[3] = SBUF;
                                        RI = 0;
                                        if(rev[3] == 'r')                  //判断第四个字符是不是r
                                        {
                                                beer();                          //全部是蜂鸣器响
                                        }
       
                                }

                        }

                }               
        }
        ES=1;

}                                                  

/***********************************************************************************

                            按键扫描函数

***********************************************************************************/
void Key_Scan()
{
    if(k1 == 0)                                              //如果按键1被按下
        {
            Delay_1ms(21);                //延时20ms
                if(k1 == 0)                                      //按键1确实被按下
                {                                                   
                        Serial_Txd(ser_text);                      //串口发送函数
                    while(!k1)                              //松手检测
                    Delay_1ms(21);
                     while(!k1);
                }
        }
}


/************************************************************************

                                              串口发送函数

*************************************************************************/
void Serial_Txd(uchar *p)
{
        uint i;
        Delay_1ms(1);
        for(i = 0;i < 30;i++)
        {
                SBUF = *p++;
                while(!TI);
                TI = 0;
        }

}

/************************************************************************

                                              蜂鸣器函数

*************************************************************************/
void beer()
{
        uint i;
        for(i = 0;i < 1600;i++)                  //大概时间是1s
        {
                speaker = !speaker;
                Delay_1us(70);                 //控制发声频率
       
        }
}
 楼主| xiong57785 发表于 2011-7-31 16:53:22 | 显示全部楼层
另外程序哪里还可以改进 求赐教
y789 发表于 2011-8-6 08:27:34 | 显示全部楼层
写得非常好呀。。。。
y789 发表于 2011-8-6 08:29:46 | 显示全部楼层
/************************************************************************

      说明:本程序主要完成上位机发送字符给单片机控制外围器件的任务
          时间:2011.7.30

*************************************************************************/

//头文件
#include <regx52.h>
//宏定义
#define uchar unsigned char
#define uint unsigned int

sbit k1 = P3 ^ 2;                //按键1
sbit speaker = P1 ^ 4;  // 蜂鸣器

uchar rev[]={""};        //接收到的字符
uchar ser_text[]="Hello, What do you want to do?";

//-----------------------------------------------------------------------
//函数声明
void System_Init();                //初始化
void Key_Scan();      //按键扫描函数
void Delay_1ms(uint z); //延时1ms函数
void Delay_1us(uint time_us);        //延时1us函数
void Serial_Txd(uchar *p);    //串口发送函数
void beer();
//-----------------------------------------------------------------------


/************************************************************************

                                              主函数

*************************************************************************/
void main()
{
        System_Init();

        while(1)
        {
                Key_Scan();         
        }

}

/***********************************************************************************

                         延时1ms函数

***********************************************************************************/
void Delay_1ms(uint z)
{
    uint x,y;
        for(x = z;x > 0;x--)
           for(y = 110;y >0;y--);
}

/***********************************************************************************

                         延时1us函数

***********************************************************************************/
void Delay_1us(uint time_us)
{
        while(--time_us);
}


/************************************************************************

                                              初始化函数

*************************************************************************/
void System_Init()
{
        SCON = 0X50;
        PCON = 0X00;
        TMOD = 0X20;
        TH1 = 0XFD;
        TL1 = 0XFD;
        EA = 1;
        ES = 1;
        TR1 = 1;
}

/************************************************************************

                                              串口中断函数

*************************************************************************/         
void Serial_Rxd() interrupt 4
{
        ES=0;
        if(RI)
        {
                rev[0] = SBUF;
                RI = 0;
                if(rev[0] == 'm')                     //如果第一个字符是m
                {
                        while(!RI);
                        rev[1] = SBUF;
                        RI = 0;
                        switch(rev[1])                                          //判断第二个字符
                        {
                                case '1':P2 = 0; P0 = 0xff; break;         //是1 第一个数码管亮
                                case '2':P2 = 1; P0 = 0xff; break;         //是2 第二个数码管亮
                                case '3':P2 = 2; P0 = 0xff; break;         //是3 第三个数码管亮
                                case '4':P2 = 3; P0 = 0xff; break;          //是4 第四个数码管亮
                        }
                        

                }else if(rev[0] == 'L')                                  //如果第一个字符是L
                    {
                        while(!RI);
                        rev[1] = SBUF;
                        RI = 0;
                        switch(rev[1])                                   //判断第二个字符
                        {
                                case '1':P1 = 0XFE; break;           //是1 第一个LED亮
                                case '2':P1 = 0XFD; break;           //是2 第二个LED亮
                                case '3':P1 = 0XFB; break;           //是3 第三个LED亮
                                case '4':P1 = 0XF7; break;            //是4 第四个LED亮

                        }

                     }else if(rev[0] == 'b')                                       //判断第一个字符是不是b
                       {
                         while(!RI);
                         rev[1] = SBUF;
                         RI = 0;
                         if(rev[1] == 'e')                                   //判断第二个字符是不是e
                        {
                                while(!RI);
                                rev[2] = SBUF;
                                RI = 0;                                                   
                                if(rev[2] == 'e')                           //判断第三个字符是不是e
                                {
                                        while(!RI);
                                        rev[3] = SBUF;
                                        RI = 0;
                                        if(rev[3] == 'r')                  //判断第四个字符是不是r
                                        {
                                                beer();                          //全部是蜂鸣器响
                                        }
        
                                }

                        }

                }               
        }
        ES=1;

}                                                   

/***********************************************************************************

                            按键扫描函数

***********************************************************************************/
void Key_Scan()
{
    if(k1 == 0)                                              //如果按键1被按下
        {
            Delay_1ms(21);                //延时20ms
                if(k1 == 0)                                      //按键1确实被按下
                {                                                   
                        Serial_Txd(ser_text);                      //串口发送函数
                    while(!k1)                              //松手检测
                    Delay_1ms(21);
                     while(!k1);
                }
        }
}


/************************************************************************

                                              串口发送函数

*************************************************************************/
void Serial_Txd(uchar *p)
{
        uint i;
        Delay_1ms(1);
        for(i = 0;i < 30;i++)
        {
                SBUF = *p++;
                while(!TI);
                TI = 0;
        }

}

/************************************************************************

                                              蜂鸣器函数

*************************************************************************/
void beer()
{
        uint i;
        for(i = 0;i < 1600;i++)                  //大概时间是1s
        {
                speaker = !speaker;
                Delay_1us(70);                 //控制发声频率
        
        }
}
- 本文内容摘录自:MCU资讯论坛(http://www.mcuzx.net/) 详细文章请参考:http://www.mcuzx.net/thread-1428-1-1.html
y789 发表于 2011-8-6 08:42:42 | 显示全部楼层
程序写得 真好。。。。。
y789 发表于 2011-8-6 09:06:41 | 显示全部楼层
我试验了, 将 中断函数 换成这样 一是好事的。。。。
/************************************************************************

                                              串口中断函数

*************************************************************************/         
void Serial_Rxd() interrupt 4
{
       // ES=0;
        if(RI)
        {
                rev[0] = SBUF;
                RI = 0;
                if(rev[0] == 'm')                     //如果第一个字符是m
                {
                        while(!RI);
                        rev[1] = SBUF;
                        RI = 0;
                        switch(rev[1])                                          //判断第二个字符
                        {
                                case '1':P2 = 0; P0 = 0xff; break;         //是1 第一个数码管亮
                                case '2':P2 = 1; P0 = 0xff; break;         //是2 第二个数码管亮
                                case '3':P2 = 2; P0 = 0xff; break;         //是3 第三个数码管亮
                                case '4':P2 = 3; P0 = 0xff; break;          //是4 第四个数码管亮
                        }
                        

                }
                if(rev[0] == 'L')                                  //如果第一个字符是m
                {
                        while(!RI);
                        rev[1] = SBUF;
                        RI = 0;
                        switch(rev[1])                                   //判断第二个字符
                        {
                                case '1':P1 = 0XFE; break;           //是1 第一个LED亮
                                case '2':P1 = 0XFD; break;           //是2 第二个LED亮
                                case '3':P1 = 0XFB; break;           //是3 第三个LED亮
                                case '4':P1 = 0XF7; break;            //是4 第四个LED亮

                        }

                }
                if(rev[0] == 'b')                                       //判断第一个字符是不是b
                {
                        while(!RI);
                        rev[1] = SBUF;
                        RI = 0;
                        if(rev[1] == 'e')                                   //判断第二个字符是不是e
                        {
                                while(!RI);
                                rev[2] = SBUF;
                                RI = 0;                                                   
                                if(rev[2] == 'e')                           //判断第三个字符是不是e
                                {
                                        while(!RI);
                                        rev[3] = SBUF;
                                        RI = 0;
                                        if(rev[3] == 'r')                  //判断第四个字符是不是r
                                        {
                                                beer();                          //全部是蜂鸣器响
                                        }
        
                                }

                        }

                }               
        }
      //  ES=1;

}   
y789 发表于 2011-8-6 09:07:17 | 显示全部楼层
求解。。。。。
能说说  ES= 0 关闭串口中断 这是什么意思吗???
y789 发表于 2011-8-6 09:54:35 | 显示全部楼层
在线等待中。。。。。
y789 发表于 2011-8-6 09:55:14 | 显示全部楼层
如果ES  = 0 那么 其他的中断在想使用 是不是就不能够实用串口了呢????
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 10:58 , Processed in 0.065020 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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