直流电机控制转速,启停,方向,加速,减速,并且显示,各位给看看错哪了,怎么修改
/**********************************************
**********************************************/
#include <reg51.h>
#include <string.h>
sbit motor_on=P1^0;
sbit motor_dir=P1^1;
sbit motor_inc=P1^2;
sbit motor_dec=P1^3;
sbit motor_zz=P3^0;
sbit motor_fz=P3^1;
unsigned char seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char num1=0;//记录定时器中断次数,T0定时最大值50毫秒,中断一次,累计20次中断,凑够一秒,读取一次T1的计数值
unsigned int dat;//记录频率值
unsigned int cnt=(65536-49800*11.0592/12);//定时50毫秒定时器T0的初值
int num=1;//高电平延时数
/***********************************
void delay(int i)
{
int k,j;
for(k=0;k<i;k++)
for(j=0;j<200;j++);
}
***********************************/
void delay(int i)
{
while(i--);
}
/**********************************/
void display()
{
int n=5;
P2=0xfe;
P0=seg[dat%10];
delay(n);
P2=0xfd;
P0=seg[dat%100/10];
delay(n);
P2=0xfb;
P0=seg[dat%1000/100];
delay(n);
P2=0xf7;
P0=seg[dat%10000/1000];
delay(n);
P2=0xef;
P0=seg[dat/10000];
delay(n);
}
/************************************/
void main()
{
TMOD=0X51;//T0设置成16位定时器,T1设置成16位计数器 0101 0001
TH0=cnt/256;//填装定时初值的高8位
TL0=cnt%256;//填装定时初值的低8位
ET0=1;//允许定时器T0中断
EA=1;//中断总允许
TR0=1;//启动定时器T0
TR1=1;//启动计数器T1
while(1)
{
display();
if(motor_on==1)
{
motor_zz=0;
motor_fz=0;
}
else
{
if(motor_inc==0)
{
while(motor_inc==0);
if(num<8)
num+=2;
}
if(motor_dec==0)
{
while(motor_dec==0);
if(num>2)
num-=2;
}
if(motor_dir==0)//正转
{
motor_zz=1;
delay(num);
motor_zz=0;
delay(10-num);
}
else
{
motor_fz=1;
delay(num);
motor_fz=0;
delay(10-num);
}
}
}
}
/*************************************/
void t_0()interrupt 1//定时器T0中断服务程序
{
num1++;//累计中断次数
if(num1==20)//如果到了1000毫秒
{
num1=0;
TR1=0;//关闭计数器T1
dat=TH1;
dat<<=8;
dat+=TL1;//读取16位计数值(频率值)
TH1=0;
TL1=0;//计数器清0
TR1=1;//启动计数器
}
TH0=cnt/256;//填装定时初值的高8位
TL0=cnt%256;//填装定时初值的低8位
}
平常按键检测程序,按下延时消抖,记录一个数字,再按下另一个记录一个数字,然后在一位数码管上显示,就出现了问题。数码管一直显示0 。
下面就是出问题程序,解决方案展示正确程序
#include <regx52.h>
sbit LS_A=P2^2;
sbit LS_B=P2^3;
sbit LS_C=P2^4;
unsigned code Nixie_Value[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void Nixie(unsigned char location,unsigned char number)
{ switch(location)
{
case 1: LS_A=0;LS_B=0;LS_C=0; break;
case 2: LS_A=1;LS_B=0;LS_C=0; break;
case 3: LS_A=0;LS_B=1;LS_C=0; break;
case 4: LS_A=1;LS_B=1;LS_C=0; break;
case 5: LS_A=0;LS_B=0;LS_C=1; break;
case 6: LS_A=1;LS_B=0;LS_C=1; break;
case 7: LS_A=0;LS_B=1;LS_C=1; break;
case 8: LS_A=1;LS_B=1;LS_C=1; break;
}
P0=Nixie_Value[number];
Delay(2);
P0=0X00;
}
unsigned char Key()
{
unsigned char KeyNumber=0;
if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}
if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}
return KeyNumber;
}
int main()
{
unsigned char value=0;
while(1)
{
value=Key();
Nixie(1,value);
}
}
void display() // 显示函数
{
int n=5;
P2=0xfe; // 设置数码管段选数据,从左往右扫描显示
P0=seg[dat%10]; // 显示个位数的数码管
delay(n); // 延时一段时间,保证数码管亮度适中
P2=0xfd; // 设置数码管段选数据,从左往右扫描显示
P0=seg[dat%100/10]; // 显示十位数的数码管
delay(n); // 延时一段时间,保证数码管亮度适中
P2=0xfb; // 设置数码管段选数据,从左往右扫描显示
P0=seg[dat%1000/100];// 显示百位数的数码管
delay(n); // 延时一段时间,保证数码管亮度适中
P2=0xf7; // 设置数码管段选数据,从左往右扫描显示
P0=seg[dat%10000/1000];// 显示千位数的数码管
delay(n); // 延时一段时间,保证数码管亮度适中
P2=0xef; // 设置数码管段选数据,从左往右扫描显示
P0=seg[dat/10000]; // 显示万位数的数码管
delay(n); // 延时一段时间,保证数码管亮度适中
}