找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2266|回复: 2
收起左侧

电机不动,求帮忙看下单片机程序!

[复制链接]
ID:749922 发表于 2020-5-14 11:58 | 显示全部楼层 |阅读模式
想解决的问题电机不转动,转数不计数。

系统能够实现
用51单片机控制四相六线(8拍)步进电机并显示。
(1)预设步进电机所转圈数。(通过左下方16个按键可以输入0,1,2,3,4,5,6,7,8,9,11,12,13,14,清零,显示在屏幕上)
(2)可实现启停,正反转,加减速功能。(中间下方4个按钮控制,但是因为电机不转,失效。)
(3)同步显示圈数。(未显示)

综上:可以预设圈数,但电机不转,转数不显示。排查了一遍感觉程序没问题,问题可能出现在电路连接上,麻烦大家帮忙看一下,具体问题在哪里,点拨一下我改正,因为实在是找不出来了


电路图片如下:(可能看不清楚,我放在附录里
11111.png





程序如下:
#include <at89x51.h>
#define uchar unsigned char
//uchar code rst[]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};  
char seg_0[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};    //共阴极数码管
char seg_point[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};   // 带小数点
int a=0, b=0,c=0x01;
unsigned int t,key,x=0,y,z=0,m=0,n;
char ge,shi,bai,qian,wan;
char age,ashi,abai,aqian,awan;
uchar readkey;
uchar x_temp,y_temp;



/*延时程序*/
void delay(char i)
{char j=0,n=0;
for(;j<i;j++)
{for(;n<100;n++)   //0.5s延时
{
}
}
}



/*电动机转动程序*/
void time0() interrupt 1   //计数器T0 电机运转
{ TH0=(65536-t)/256;
TL0=(65536-t)%256;
if(b)    //判断方向
{
if(z/4<x||x==0)   //判断步数是否与设置相符
{
if(a)    //是否停止
{
if(c&0x08)
{
c=0X01;
z++;
}
else
{
c<<=1;
}
P3=c;
}
else
{
z=0;
}
}
else if(z/4==x) {a=0;}     //电机达到预设值
}
else
{
if(z/4<x||x==0)
{
if(a)
{
if(c&0x01)
{
c=0X08;
z++;
}
else
{
c>>=1;
}
P3=c;
}
else
{
z=0;
}
}
else if(z/4==x) {a=0;}       //同上
}
}



/*数码管显示程序*/
void time1() interrupt 3
{
TH1=0xd8;
TL1=0xef;
if(a)
{
P2=0XFE;   //个位通选
P0=seg_0[ge];
delay(5);
P2=0XFD;
P0=seg_0[shi];
delay(5);
P2=0XFB;
P0=seg_0[bai];
delay(5);
P2=0XF7;
P0=seg_0[qian];
delay(5);
P2=0XEF;
P0=seg_0[wan];
delay(5);
if(b==0)
{
P2=0XdF;
P0=0x40;
}
}
else
{
P2=0XFE;
P0=seg_0[age];
delay(5);
P2=0XFD;
P0=seg_0[ashi];
delay(5);
P2=0XFB;
P0=seg_0[abai];
delay(5);
P2=0XF7;
P0=seg_0[aqian];
delay(5);
P2=0XEF;
P0=seg_0[awan];
delay(5);
}
}



/*键盘扫描程序*/
void Key_Scan(void)
{
P1=0x0f;
x_temp=P1&0x0f;
if(x_temp!=0x0f)
{
P1=0xf0;
y_temp=P1&0xf0;
readkey=x_temp|y_temp;
readkey=~readkey;;
x++;
switch(readkey)
{
case 0x11:key=0; break;
case 0x21:key=1; break;
case 0x41:key=2;break;
case 0x81:key=3; break;
case 0x12:key=4;break;
case 0x22:key=5;break;
case 0x42:key=6; break;
case 0x82:key=7; break;
case 0x14:key=8; break;
case 0x24:key=9; break;
case 0x44:key=10;break;
case 0x84:key=11;break;
case 0x18:key=12;break;
case 0x28:key=13;break;
case 0x48:key=14;break;
case 0x88:key=15;break;
default: key=16;break;
}
}
}



/*主程序*/
main()
{
int i;
int j;
t=30000;
TH0=(65536-t)/256;
TL0=(65536-t)%256;
TMOD=0X11;
TR0=0X01;
TF0=0X00;
PT0=0;
ET0=0X01;
TH1=0xd8;
TL1=0xef;
TR1=0X01;
TF1=0X00;
PT1=1;
ET1=0X01;
EA=0X01;
P3=0x01;
P2=0XFE;
key=0;
while(1)

{


//圈数计算
j=z/4;
i=j;
ge=i%10;
i=j/10;
shi=i%10;
i=j/100;
bai=i%10;
i=j/1000;
qian=i%10;
i=j/10000;
wan=i%10;



//键盘显示值计算
P1=0x0f;
if(P1!=0x0f&&a==0)
{
if(P1!=0x0f&&a==0)   //电机未运转则键盘有效
{
Key_Scan();
}
if(key==15)   //清零
{
age=0;
ashi=0;
abai=0;
aqian=0;
awan=0;
x=0;
m=0;
}
else if(m<6553)
{
m=m*10+key;
age=m%10;
n=m/10;
ashi=n%10;
n=m/100;
abai=n%10;
n=m/1000;
aqian=n%10;
n=m/10000;
awan=n%10;
x=m;
}
while(P1!=0xf0);
}
while(P3_7)   //开关
{
while(P3_7);
a=~a;
}
while(P3_6)    //方向
{
while(P3_6);
b=~b;
}
while(P3_5)   //减速
{
while(P3_5);  //t最大值为65535
if(t<=40000)
{
t=t+10000;
}
}
while(P3_4)   //加速
{
while(P3_4);
if(t>=20000)
{
t=t-10000;
}
}
}
}



程序和电路图一起放在附录里,方便观看 希望大家能帮忙看一下。
电路和程序.zip (84.18 KB, 下载次数: 9)
回复

使用道具 举报

ID:749922 发表于 2020-5-14 12:23 | 显示全部楼层
求别沉
回复

使用道具 举报

ID:383631 发表于 2020-5-15 23:24 | 显示全部楼层
这个,你去看看样例设计
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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