找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

当串口发送2时,为什么不能实现流水灯控制,求解,该怎么修改单片机代码可以实现这...

查看数: 5089 | 评论数: 15 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2021-4-27 11:25

正文摘要:

#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit led =P1; int i,a; char b[]={0xfe,0xfd,0xfb,0xfc,0xf7,0xef,0xdf,0xbf,0x7f}; void bule_Init() {      &nbs ...

回复

ID:569384 发表于 2021-4-29 08:17
ID:213173 发表于 2021-4-29 07:48
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit led =P1;
  5. int i,j,a;
  6. char b[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

  7. void bule_Init()
  8. {
  9.         TMOD= 0x20;
  10.         TH1 = 0xfd;
  11.         TL1 = 0xfd;
  12.         SM0 = 0;
  13.         SM1 = 1;
  14.         REN = 1;
  15.         TR1 = 1;
  16. }
  17. void main ()
  18. {
  19.         bule_Init();
  20.         P1=0xff;
  21.         while(1)
  22.         {
  23.                 if(RI==1)
  24.                 {
  25.                         a=SBUF;
  26.                         RI=0;
  27.                 }
  28.                 if(a==0)
  29.                 {
  30.                         P1=0x00;
  31.                 }
  32.                 else if(a==1)
  33.                 {
  34.                         P1=0xff;
  35.                 }
  36.                 else if(a==2)
  37.                 {
  38.                         for(i=0;i<8;i++)
  39.                         {
  40.                                 P1=b[i];
  41.                                 j=50000;
  42.                                 while(j--);
  43.                         }
  44.                 }
  45.         }
  46. }

复制代码
ID:889094 发表于 2021-4-29 00:01
串口接收程序RI的处理部分最好在串口中断服务程序里解决,TI在其它地方发送还可以,接收那样不好,说不定就是处理不到
ID:569384 发表于 2021-4-28 17:02
qwettyuio 发表于 2021-4-28 16:45
修改了,流水灯直接停在led8亮,不动了

这样你理解一下,你串口发送2,是单次的,单片机只接收到一次a=2,所以只会执行一次你的流水灯for循环。你看能不能想到解决办法,如果不能再回复一下,可以告诉你怎么做。
ID:858009 发表于 2021-4-28 16:45
haokey 发表于 2021-4-28 10:35
同意,本来已经有个while(1)了,这个else if(a == 2)里面的while(1)就多余了

修改了,流水灯直接停在led8亮,不动了
ID:858009 发表于 2021-4-28 16:44
sync763 发表于 2021-4-28 09:16
else if(a==2)
                        {
                                while(1)

改了,但是流水灯不循环了,直接停在led8不动了
ID:569384 发表于 2021-4-28 10:35
sync763 发表于 2021-4-28 09:16
else if(a==2)
                        {
                                while(1)

同意,本来已经有个while(1)了,这个else if(a == 2)里面的while(1)就多余了
ID:392485 发表于 2021-4-28 09:16
else if(a==2)
                        {
                               while(1)
                                {

                                        for(i=0;i<8;i++)
                                  P1=b;
                                }
                        }

将红色的部分删除试试。
ID:858009 发表于 2021-4-27 18:03
sync763 发表于 2021-4-27 16:26
while(1)
                                {
                                        for(i=0;i

可以是可以,但是串口输入0或者1是无效的。输入0串口发送应该是全亮,现在是死循环,没法中断
ID:595604 发表于 2021-4-27 17:59
延时函数发来,可以看看
ID:392485 发表于 2021-4-27 16:26
while(1)
                                {
                                        for(i=0;i<8;i++)
                                         {
                                             P1=b[i];
                                             delay();
                                           }
                                }
你自己完善一下delay()函数应该可以。
ID:858009 发表于 2021-4-27 16:20
sync763 发表于 2021-4-27 16:11
while(1)
                                {
                                        for(i=0;i

大佬能帮忙修改一下吗
ID:858009 发表于 2021-4-27 16:20
sync763 发表于 2021-4-27 16:11
while(1)
                                {
                                        for(i=0;i

加入延时报错
ID:392485 发表于 2021-4-27 16:11
while(1)
                                {
                                        for(i=0;i<8;i++)
                                  P1=b[i];
                                }
速度太快,看不出来效果,加一定的延时就能看出来了。
ID:647434 发表于 2021-4-27 15:12
不要用HEX模式,选用文本模式发送试试

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

Powered by 单片机教程网

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