找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请问这个程序为什么会这样呢?希望大神帮个忙看看

[复制链接]
跳转到指定楼层
楼主

程序在这里;
  1. #include<reg51.h>
  2. #include<stdio.h>
  3. void delay1(void);
  4. void delay2(void);
  5. void display(int);
  6. int bs=0;
  7. main()  
  8.   { char  a,b,c,d,j,*q,
  9.           done1[8]={0x01,0x02,0x04,0x00,0x01,0x04,0x02,0x00},
  10.           done2[8]={0x03,0x06,0x05,0x00,0x03,0x05,0x06,0x00},        done3[14]={0x01,0x03,0x02,0x06,0x04,0x05,0x00,0x01,0x05,0x04,0x06,0x02,0x03,0x00};
  11. L:  a=P1;   
  12.       while(!(a&0x08))    //判断是否启动,若没启动则重新判断
  13.   {  P3=0x08;
  14.              delay1();
  15.                   a=P1; }
  16.      //...............................................判断工作模式
  17.   if(a&0x01)                     //方式1模型
  18.   q=done1;
  19.   else if(a&0x02)                 //方式2模型
  20.   q=done2;
  21.   else if(a&0x04)                 //方式3模型
  22.   q=done3;
  23.      //...............................................判断电机转向
  24.   if(a&0x10)                 //判断电机是否要正转
  25.   { P3=0x10;                //P1.4口为1,电机正转,红灯亮
  26.     b=0;}
  27.   else
  28.   { P3=0x20;               //P1.4口为0,电机反转,黄灯亮
  29.     if(a&0x04)b=7;         //反转时将b置数,使指针指到数组反相序部分
  30.            else b=4; }
  31.    //....................................................
  32. d=b;
  33.    while(1)
  34.    { c=*(q+b);               //判断电机步数是否走完
  35.     if(c==0)b=d;               //步数走完,电机重新再走
  36.     else
  37.     {  P3=c;                 //从P3输出电机控制信号
  38.     b++;
  39.     bs++;                 //总步数加1
  40.     display(bs);              //显示步数
  41.     j=a;
  42.     a=P1;
  43.     if(a!=j)                     //判断P1口状态信号是否改变
  44.     { if(!(a&0x08))bs=0;         //若为停止信号,总步数清零
  45.     goto L; }           //状态信号改变,返回到开始,重新对电机控制
  46.     }
  47.   }
  48. }
  49. void delay1()      //延时5ms子程序
  50. { int i,j;
  51.     for(i=0;i<200;i++)
  52.     for(j=0;j<300;j++);
  53.       }
  54. void delay2()    //延时50us子程序
  55.   {   int i,j;
  56.       for(i=0;i<10;i++)
  57.    for(j=0;j<60;j++);
  58.    }
  59. void display(int n)
  60. {unsigned char tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
  61.    unsigned char i,k,t,num[4];
  62.    num[0]=n%10;                //将总步数的各位分别存在num数组中
  63.    num[1]=(n/10)%10;
  64.    num[2]=(n/100)%10;
  65.    num[3]=(n/1000)%10;
  66.    for(t=0;t<50;t++)             //扫描50次
  67.    {  k=0x08;                //位选码指向最左一位,第四位
  68.     for(i=0;i<4;i++)
  69.    {  P2=k;                    //从P2口输入位选码
  70.       P0=~(tab[num[i]]);      //取出显示码,并从P0口输出显示码
  71.    k=k>>1;                //求下一个位选码
  72.    delay2();
  73.    }
  74.    }
  75. }
复制代码

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

使用道具 举报

沙发
ID:327029 发表于 2019-12-23 07:49 | 只看该作者
你没注意共阴还是共阳数码管,你去查看下对应的16进制吧
回复

使用道具 举报

板凳
ID:470332 发表于 2019-12-23 10:29 | 只看该作者
你要问什么
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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