51单片机直流电机控制

直流电机控制转速,启停,方向,加速,减速,并且显示,各位给看看错哪了,怎么修改

/**********************************************

**********************************************/
#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位
}

img

img

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7639985
  • 这篇博客你也可以参考下:51单片机利用定时器按键控制数码管的加减
  • 除此之外, 这篇博客: 51单片机按键值显示在数码管上,数码管亮度控制,数码管显示原理中的 问题描述 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 平常按键检测程序,按下延时消抖,记录一个数字,再按下另一个记录一个数字,然后在一位数码管上显示,就出现了问题。数码管一直显示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);
    	}
    }
    	
    

  • 您还可以看一下 耿职老师的2019最全微信小程序开发,零基础学习到实战,登录,收藏,搜索,留言课程中的 小程序简介及课程成果展示小节, 巩固相关知识点

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);           // 延时一段时间,保证数码管亮度适中  
}