找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5801|回复: 8
打印 上一主题 下一主题
收起左侧

通过串口控制流水灯流动和停止的程序,发送字符1后实现流水灯,但却不能控制停止。

[复制链接]
跳转到指定楼层
楼主
ID:379308 发表于 2018-9-29 21:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#include<intrins.h>

typedef unsigned char  u8;
typedef unsigned int   u16;

u8 n[]="01";
void UsartConfig();
void delay_ms(u8 ms);

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

void UsartInterrupt() interrupt 4
{
        u8 m;
        u8 ReceiveData;
        m=SBUF;
        if(m==n[1])
        {
                P2=0xFE;
                while(1)
                {
                        P2=_crol_(P2,1);
                        delay_ms(150);
                }       
        }
        if(m==n[0])
        {
                P2=0XFF;
        }       
        ReceiveData=SBUF;                  //将PC机缓冲器中的内容存入变量寄存器中
        RI=0;                     //单片机接收完成后
        SBUF=ReceiveData;                 //单片机接收完了的数据存到缓冲器中
        while(!TI);              //判断是否发送完成
        TI=0;                                         //发送完成
       
}

void delay_ms(u8 ms)
{
        u8 a,b;
        for(;ms>0;ms--)
        {
                for(a=49;a>0;a--)
                {
                        for(b=1;b>0;b--);
                }
        }       
}

void main()
{
        UsartConfig();
        while(1);       
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:261288 发表于 2018-9-30 07:26 | 只看该作者
数组声明不合法u8 n[]="01";改为u8 n[]={0,1};

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:164602 发表于 2018-9-30 08:11 | 只看该作者
串口中断服务程序不对嘛。
这个程序进入流水灯后,就进入到死循环了,你以后的所有操作都无效啊。
建议:将控制的内容,放在主循环内,不要放在中断程序中。这样,就可以不用循环流水灯,而是if流水灯,通过中断,随时都可以停止的。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:279667 发表于 2018-9-30 08:51 | 只看该作者
在UsartInterrupt函数中,有while的判断,并且条件一直都是个真值,无法跳出该循环,一般情况下,不建议在中断函数中做耗时比较长的操作。可以增加一个跑马灯的函数,并且引入一个开关变量,在中断中来改变这个变量,从而控制这个跑马灯的函数执行效果。可以这样试试看。

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:396960 发表于 2018-9-30 09:06 | 只看该作者
1,校验用的数组 n[]="01";  你是赋值字符串了,其实个人觉得直接赋值 十六进制数方便些。
2,应该是中断函数有问题吧?中断函数里怎么用while(1) ?? 没试过这么用的。改一下看看

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:308437 发表于 2018-9-30 09:10 | 只看该作者
     if(m==n[1])
        {
                P2=0xFE;
                while(1)
                {
                        P2=_crol_(P2,1);
                        delay_ms(150);
                }        
        }
这里不改这个样写的。那个流水灯循环要放在主循环中。你串口下发的是标志位,要不然,就会进入死循环,后面再发的指令接受不到的

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:373388 发表于 2018-9-30 12:49 | 只看该作者
中断里while循环是个死循环,不出来了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:379308 发表于 2018-10-6 15:19 | 只看该作者
phang 发表于 2018-9-30 09:06
1,校验用的数组 n[]="01";  你是赋值字符串了,其实个人觉得直接赋值 十六进制数方便些。
2,应该是中断 ...

控制流水灯需要使用循环,我用在中断里是有问题,请问该如何改啊?感谢感谢

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:297824 发表于 2018-10-12 12:11 | 只看该作者
我改了一下代码,你试试。


unsigned char Uart_Command_Flag;//全局变量,指示接收到的命令

void UsartInterrupt() interrupt 4
{
        u8 m;
    //    u8 ReceiveData;
        m=SBUF;
        if(m==n[1])
        {
         Uart_Command_Flag = 1;//置标志位
                        /*    P2=0xFE;
                while(1)
                {
                        P2=_crol_(P2,1);
                        delay_ms(150);
                }    */   
        }
        if(m==n[0])
        {
            Uart_Command_Flag = 0;//清标志位
                    //      P2=0XFF;
        }        
        ReceiveData=SBUF;                  //将PC机缓冲器中的内容存入变量寄存器中
        RI=0;                     //单片机接收完成后
        SBUF=ReceiveData;                 //单片机接收完了的数据存到缓冲器中
        while(!TI);              //判断是否发送完成
        TI=0;                                         //发送完成
        
}



void main()
{
        UsartConfig();
        while(1)
                        if(1 == Uart_Command_Flag)
            {
                do{P2=0xFE;}while(0);
                                P2=_crol_(P2,1);
                delay_ms(150);
            }
                        else
                                P2=0XFF;
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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