|
想解決的問題:電機不轉(zhuǎn)動,轉(zhuǎn)數(shù)不計數(shù)。
系統(tǒng)能夠?qū)崿F(xiàn):
用51單片機控制四相六線(8拍)步進電機并顯示。
(1)預(yù)設(shè)步進電機所轉(zhuǎn)圈數(shù)。(通過左下方16個按鍵可以輸入0,1,2,3,4,5,6,7,8,9,11,12,13,14,清零,顯示在屏幕上)
(2)可實現(xiàn)啟停,正反轉(zhuǎn),加減速功能。(中間下方4個按鈕控制,但是因為電機不轉(zhuǎn),失效。)
(3)同步顯示圈數(shù)。(未顯示)
綜上:可以預(yù)設(shè)圈數(shù),但電機不轉(zhuǎn),轉(zhuǎn)數(shù)不顯示。排查了一遍感覺程序沒問題,問題可能出現(xiàn)在電路連接上,麻煩大家?guī)兔匆幌,具體問題在哪里,點撥一下我改正,因為實在是找不出來了
電路圖片如下:(可能看不清楚,我放在附錄里)
11111.png (34.51 KB, 下載次數(shù): 55)
下載附件
2020-5-14 11:22 上傳
程序如下:
#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}; //共陰極數(shù)碼管
char seg_point[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E}; // 帶小數(shù)點
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延時
{
}
}
}
/*電動機轉(zhuǎn)動程序*/
void time0() interrupt 1 //計數(shù)器T0 電機運轉(zhuǎn)
{ TH0=(65536-t)/256;
TL0=(65536-t)%256;
if(b) //判斷方向
{
if(z/4<x||x==0) //判斷步數(shù)是否與設(shè)置相符
{
if(a) //是否停止
{
if(c&0x08)
{
c=0X01;
z++;
}
else
{
c<<=1;
}
P3=c;
}
else
{
z=0;
}
}
else if(z/4==x) {a=0;} //電機達到預(yù)設(shè)值
}
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;} //同上
}
}
/*數(shù)碼管顯示程序*/
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)
{
//圈數(shù)計算
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) //電機未運轉(zhuǎn)則鍵盤有效
{
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) //開關(guān)
{
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, 下載次數(shù): 9)
2020-5-14 11:56 上傳
點擊文件名下載附件
|
|