标题:
这个单片机程序电机一转数码管灭了?
[打印本页]
作者:
dpojf
时间:
2020-11-14 00:27
标题:
这个单片机程序电机一转数码管灭了?
当电机一转,数码管就灭了,偶尔闪一下,不知咋回事
IMG20201113152207.jpg
(1.09 MB, 下载次数: 41)
下载附件
2020-11-14 00:23 上传
作者:
dpojf
时间:
2020-11-14 00:33
程序是这个,电机一转,数码管就灭了
#include<reg51.h>
#include<intrins.h>
void zhongduan();
unsigned char num[]={0x00,0x01,0X02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
void delay(unsigned char x);
sbit sw=P3^0; sbit gw=P3^1; sbit moshi=P3^2; sbit yewei=P3^3; sbit qidong=P3^4;
sbit L1=P1^5; sbit L2=P1^4; sbit L3=P1^3; sbit L4=P1^2; sbit L5=P1^6; sbit L6=P1^7;sbit L7=P1^1;sbit L8=P1^0;
unsigned char s=0,g=0,i=0,b=0;
unsigned char j,h;
unsigned char aum=0;
unsigned char code FFW[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
unsigned char code REV[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
void SETP_MOTOR_FFW(unsigned char n)
{
unsigned char q,w;
for(q=0;q<5*n;q++)
{
for(w=0;w<8;w++)
{
P0 = FFW[w];
delay(25);
}
}
}
void SETP_MOTOR_REV(unsigned char n)
{
unsigned char q,w;
for(q=0;q<5*n;q++)
{
for(w=0;w<8;w++)
{
P0 = REV[w];
delay(25);
}
}
}
void de(unsigned char z)
{
unsigned char e,r;
for(e=z;e>0;e--)
for(r=110;r>0;r--);
}
sbit SPK=P3^5;
void main()
{
unsigned char N = 3;
EA=1;
ET1=1;
TMOD=0x10;
TH1=(65535-10000)/256;
TL1=(65535-10000)%256;
TR1=1;
P2=0x08; P3=0xff; P1=0x00; delay(200); P1=0xff; P3=0x00; delay(200); P3=0xff; P1=0xff;
while(1)
{
sw=1; P2=num[s]; delay(1); sw=0;
gw=1; P2=num[g];delay(1); gw=0;
if(moshi==0)
{
delay(2);
if(moshi==0)
{
while(!moshi);
b++;
if(b>2)
b=1;
}
}
if(yewei==0&&b>0)
{
delay(2);
if(yewei==0&&b>0)
while(!yewei);
i++;
if(i>4)
i=1;
}
switch(i)
{
case 0:
for(j=0;j<50;j++)
L1=1;L2=1;L3=1;L4=1; break;
case 1:
for(j=0;j<50;j++)
L1=0;L2=1;L3=1;L4=1; break;
case 2:
for(j=0;j<50;j++)
L1=1;L2=0;L3=1;L4=1; break;
case 3:
for(j=0;j<50;j++)
L1=1;L2=1;L3=0;L4=1; break;
case 4:
for(j=0;j<50;j++)
L1=1;L2=1;L3=1;L4=0; break;
default:break;
}
switch(b)
{
case 0:
for(j=0;j<100;j++)
P1=0xff; break;
case 1:
for(j=0;j<100;j++)
L5=1;L6=0; break;
case 2:
for(j=0;j<100;j++)
L5=0;L6=1; break;
default:break;
}
if(qidong==0&&i>0)
{
delay(2);
if(qidong==0&&i>0)
{
while(!qidong);
g=0;s=6;
while(1)
{
if(aum==100)
{
aum=0;
g--;
}
if(g==-1)
{
g=9;
s--;
}
if(s==-1)
{s=0;g=0;}
if(s==6)
{L7=0;}
if(s<5&&s>1)
{
L7=1;
SETP_MOTOR_REV(N);delay(100);SETP_MOTOR_FFW(N);delay(100);
sw=1; P2=num[s]; delay(1); sw=0;
gw=1; P2=num[g];delay(1); gw=0;
}
if(s<=1)
{L8=0;}
if(s<1&&g<1)
{P1=0xff;
de(100);
SPK=0;
de(100);
SPK=1;
}
sw=1; P2=num[s]; delay(1); sw=0; gw=1; P2=num[g];delay(1); gw=0;
}
}
}
}
}
void delay(unsigned char x)
{
unsigned char k;
while(x--)
for(k=0;k<255;k++);
}
void zhongduan() interrupt 3 using 0
{
TH1=(65535-10000)/256;
TL1=(65535-10000)%256;
aum++;
}
复制代码
作者:
xianfajushi
时间:
2020-11-14 15:33
程序问题
作者:
hejianmin
时间:
2020-11-14 18:04
检查程序
作者:
适得府君书
时间:
2020-11-16 09:07
无论是电机还是继电器在实际电路设计中都需要使用一个二极管做保护,防止开关时瞬间电流过大造成控制器件损坏。不过你这个是模拟的不知存不存在这种问题。
你的这个可能是另外一个问题那就是电机的对电流的需求过大,当电机启动时拉低了整个系统的电压,导致数码管供电不足导致偶尔闪烁一下。
作者:
权威人物
时间:
2020-11-16 09:28
说真的你这程序本来可以很简单的架构的,你写成这样真的懒得看,一就是,数码管的显示函数要不断调用刷新的,估计问题就是进入驱动电机的时候没有调用显示数码管或者很久才显示刷新一次导致的,二就是电压问题。
作者:
chenyinhu
时间:
2020-11-16 10:08
看你最后一个while(1),跳进去以后步进电机转的时候没刷新显示,数码管可不就不亮了嘛
作者:
aking991
时间:
2020-11-20 11:25
供电不足造成的,电机的电源和单片机工作电源分开就不会了,不然你要用低电压型的单片机,如STC15W系列等
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1