帮忙解释下

2019-07-15 08:50发布

/****************************************************      =========  直流电机控制+速度显示  ==========****************************************************/#include<reg52.h>     //头文件
#define uchar unsigned char   //宏定义
#define uint  unsigned int
#define CYCLE 10     //定义PWM的周期T为10ms
//数码管段选定义      0     1    2    3    4    5 6  7   8    9
uchar code smg_du[]={0x28,0xee,0x72,0xa2,0xe4,0x41,0x21,0xea,0x70,0xa0,
        0x60,0x25,0x34,0x26,0x61,0x71,0xff};  //断码
uchar dis_smg[8] = {0};/***************************************************
    端口定义
***************************************************/
sbit PWM1=P2^0;     //PWM输出口1(电机正转)
sbit PWM2=P2^5;     //PWM输出口2(电机反转)
sbit K1=P2^7;     //加速
sbit K2=P2^6;     //减速
sbit K3=P2^3;     //正反转
sbit K4=P2^2;     //启动停止
//数码管位选定义
sbit smg_we1 = P3^4;     //数码管位选定义
sbit smg_we2 = P3^5;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;
/***************************************************/
uchar PWM_ON=0;     //PWM高电平时间
uchar count=0;       //中断计时
uchar num=0;
uchar num1=0;        //中断时间计数
uint num2=0;        //外部中断次数
uchar flat=0;     //正反转标示位
uchar flag=0;        //刷新数据标示位

/***************************************************
  函数名称:延时子函数
     函数功能:按键消抖
***************************************************/
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}

/***********************数码位选函数*****************************/
void smg_we_switch(uchar i)
{
switch(i)
{
  case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
}
}
/********************数码显示函数*************************/
void display()
{
static uchar i;   
uint shuju;
if(flag==1)
{
  flag=0;
  shuju=num2;    //电机一秒转的圈数  
  num2=0;
}
if(flat==0)
  dis_smg[3] = smg_du[10];  //"A" //正转
else
  dis_smg[3] = smg_du[15];  //"F" //反转
dis_smg[0] = smg_du[shuju % 10];   //显示
dis_smg[1] = smg_du[shuju / 10 % 10];
dis_smg[2] = smg_du[shuju / 100 % 10];  
i++;
if(i > 4)
  i = 0;
P1 = 0xff;      //段选         
smg_we_switch(i);   //位选
P1 = dis_smg;   //段选      
delayms(3);  
}
/***************************************************
    函数名称:按键子函数
    函数功能:
***************************************************/
void key()
{
if(K4==0)     //启动 停止
{
  delayms(5);
  if(K4==0)
  {
   while(!K4)
    display();    //显示函数
       num=!num;
  }
}
if(K1==0)     //加速键
{
  delayms(5);
  if(K1==0)
  {
   while(!K1)
    display();    //显示函数
   if(num<3)
   num++;
  }
}
if(K2==0)     //减速键
{
  delayms(5);
  if(K2==0)
  {
   while(!K2);
   if(num>0)
   num--;
  }
}
if(K3==0)       //电机正反转按键
{
  delayms(5);
  if(K3==0)
  {
   while(!K3) ;
   flat++;
   if(flat==2)
   flat=0;
   num1 = 0;
   num2 = 0;
  }
}

switch(num)
{
  case 0: PWM_ON=0;  break; //占空比为00%
  case 1: PWM_ON=40;  break; //占空比为40%
  case 2: PWM_ON=70;  break; //占空比为70%  case 3: PWM_ON=100;  break; //占空比为100%
  default:
  break;
}
}

void  init()
{
  PWM1=1;     //初始化
PWM2=1;
TMOD=0x11;     //打开定时器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
EA=1;
ET1=1;
TR1=1;
}
/**************************************************
    函数名称:主函数
    函数功能:
**************************************************/
void main()
{
    init();
while(1)
{

  key();
  display();   //显示函数
}
}

/**************************************************
    函数名称:定时器/计数器0中断子函数
    函数功能:
**************************************************/
void T1_time() interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
count++;
if(count>CYCLE)
  count=0;
if(count<PWM_ON)   //如果计时时间在不大于高电平时时间,电机转
{
  if(flat==0)
  {
   PWM1=0;
   PWM2=1;
  }
  if(flat==1)
  {
   PWM1=1;
   PWM2=0;
  }
}
else      //如果计时时间大于高电平时时间,电机停
{
  PWM1=1;
  PWM2=1;
}
}
void T0_time() interrupt 1   //定时器0
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num1++;
if(num1==20)      //每1s刷新一次数据
{
  num1=0;
  flag=1;
}
}
void timer() interrupt 0    //外部中断1
{
  num2++;
}


0条回答

一周热门 更多>