用数码管显示四相异步电动机的步数,为什么会乱显示?正反转和停止都没有问题。
程序如下:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code zixingma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit key1=P3^0; //正转
sbit key2=P3^1; //反转
sbit key3=P3^2; //停止
sbit a=P2^0;
sbit b=P2^1;
sbit c=P2^2;
sbit d=P2^3;
sbit P10=P1^0;
sbit P11=P1^1;
uchar num1=0;
uchar num2=0;
uchar bushu,flag;
void zheng(void);
void fan(void);
void ting(void);
void key_scan(void);
void delay1m(uint x)
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<200;j++);
}
void delay5ms(void)
{
unsigned char i,j;
for(i=10;i>0;i--)
for(j=248;j>0;j--);
}
void main()
{
flag=0;
while(1)
{
key_scan();
switch(flag)
{
case 1:zheng();break;
case 2:fan();break;
case 3:ting();break;
}
}
}
void zheng()
{
switch(num1)
{
case 0:a=1;b=0;c=0;d=0;delay1m(100);break;
case 1:a=1;b=1;c=0;d=0;delay1m(100);break;
case 2:a=0;b=1;c=0;d=0;delay1m(100);break;
case 3:a=0;b=1;c=1;d=0;delay1m(100);break;
case 4:a=0;b=0;c=1;d=0;delay1m(100);break;
case 5:a=0;b=0;c=1;d=1;delay1m(100);break;
case 6:a=0;b=0;c=0;d=1;delay1m(100);break;
case 7:a=1;b=0;c=0;d=1;delay1m(100);break;
}
P0=0xff;
P10=1;
P11=0;
P0=zixingma[bushu/10];
delay5ms();
P0=0xff;
P10=0;
P11=1;
P0=zixingma[bushu%10];
delay5ms();
num1++;
bushu++;
delay1m(200);
if(num1==8)
num1=0;
}
void fan()
{
switch(num2)
{
case 0:a=1;b=0,c=0,d=0;delay1m(100);break;
case 1:a=1;b=0,c=0,d=1;delay1m(100);break;
case 2:a=0;b=0,c=0,d=1;delay1m(100);break;
case 3:a=0;b=0,c=1,d=1;delay1m(100);break;
case 4:a=0;b=0,c=1,d=0;delay1m(100);break;
case 5:a=0;b=1,c=1,d=0;delay1m(100);break;
case 6:a=0;b=1,c=0,d=0;delay1m(100);break;
case 7:a=1;b=1,c=0,d=0;delay1m(100);break;
}
P0=0xff;
P10=1;
P11=0;
P0=zixingma[bushu/10];
delay5ms();
P0=0xff;
P10=0;
P11=1;
P0=zixingma[bushu%10];
delay5ms();
num2++;
bushu++;
delay1m(200);
if(num2==8)
num2=0;
}
void ting()
{
P1=0;
P2=0;
num1=0;
num2=0;
flag=0;
P0=0xff;
bushu=0;
delay1m(200);
}
void key_scan()
{
if(key1==0)
{
delay5ms();
if(key1==0)
{
flag=1;
bushu=0;
while(key1==1)
delay5ms();
}
}
if(key2==0)
{
delay5ms();
if(key2==0)
{
flag=2;
bushu=0;
while(key2==1)
delay5ms();
}
}
if(key3==0)
{
delay5ms();
if(key3==0)
{
flag=3;
while(key3==1)
delay5ms();
}
}
}
|