简易直流电机启动、停止、正反转三者相互制约控制系统的项目工程

#include<reg52.h>//包含52单片机内部寄存器头文件
#define uchar unsigned char // 自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
#define int int//自定义int为int(即有符号整数型数据,数据范围:-32768到32767。)
sbit M1=P1^6;//位定义直流电机M1端
sbit M2=P1^7;//位定义直流电机M2端
sbit K1=P3^7;//位定义启动按键K1
sbit K2=P3^6;//位定义停止按键K2
sbit K3=P3^5;//位定义正转按键K3 
sbit K4=P3^4;//位定义反正按键K4 
uchar qidongflag,tingzhiflag,zhengzhuanflag,fanzhuanflag;//声明启动标志位变量、停止标志位变量、正转标志位变量、反转标志位变量、
int Value;//声明数值变量
//int ge ,shi,bai,qian;//声明数值变量个位变量、数值变量十位变量、数值变量百位变量、数值变量千位变量、
//uchar qitingflag;
//unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管段码数字0~9字码表,低电平点亮数码管段码数字0~9。
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x38,0x77,0x71,} ; //共阴数码管段码数字0~9、字符O、字符S、字符L、字符R、无显示等字符字码表,高电平点亮数码管段码数字0~9。
  void delay(int z)//延时程序
{
   int x,y;
   for(x=z;x>0;x--)
    for(y=110;y>0;y--);
 }
  void ShuMaGuanDisplayValue(int Value)//数码管显示数值函数
{  
//   qian=Value/1000;//数值变量个位变量值
//   bai=Value%1000/100;//数值变量十位变量值
//   shi=Value%100/10;//数值变量百位变量值
//   ge=Value%10;//数值变量千位变量值
  
   P2=0xfe;//数码管千位显示位
   P0=table[10];//数码管千位数值显示
   delay(2);//延时

   P2=0xfd;//数码管百位显示位
   P0=table[10];//数码管百位数值显示
   delay(2);//延时

   P2=0xfb;//数码管十位显示位
   P0=table[10];//数码管十位数值显示
   delay(2);//延时
   
   P2=0xf7;//数码管个位显示位
   P0=table[Value];//数码管个位数值显示
   delay(2);//延时
 }
  void zhengzhuanhanshu()//正转函数
{
   M1=1;//直流电机M1端置1
   M2=0;//直流电机M2端置0
  }
  void fanzhuanhanshu()//反转函数
{
   M1=0;//直流电机M1端置0
   M2=1;//直流电机M2端置1
  }
  void KeyScan()//按键扫描函数
{
   if(K1==0)//是否按下启动按键K1
 {
    delay(5);//消除抖动
//  ShuMaGuanDisplayValue(Value);//延时
    if(K1==0) //再次判断是否按下启动按键K1
  {
     delay(5);//消除抖动
     qidongflag=1;//启动标志位变量置1
     while(!K1);//等待启动键K1复位(断开)
//   while(!K1)//等待启动按键K1复位(断开)
//   ShuMaGuanDisplayValue(Value);//延时
    }
  }
   if(qidongflag==1)//判断启动标志位变量是否为1
 {         
    if(K3==0)//是否按下正转按键K3
  {
     delay(5);//消除抖动
//   ShuMaGuanDisplayValue(Value);//延时
     if(K3==0)//再次判断是否按下正转按键K3
    {
      delay(5);//消除抖动
      zhengzhuanflag=1;//正转标志位变量置1
      fanzhuanflag=0;//反转标志位变量置0
      while(!K3);//等待正转按键K3复位(断开)
//    while(!K3)//等待正转按键K3复位(断开)
//    ShuMaGuanDisplayValue(Value);//延时
     }
   }
     if(K4==0)//是否按下反转按键K4
   {
      delay(5);//消除抖动
//    ShuMaGuanDisplayValue(Value);//延时
      if(K4==0)//再次判断是否按下反转按键K4
     {
       delay(5);//消除抖动
       zhengzhuanflag=0;//正转标志位变量置0
       fanzhuanflag=1;//反转标志位变量置1
       while(!K4);//等待反转按键K4复位(断开)
//     while(!K4)//等待反转按键K4复位(断开)
//     ShuMaGuanDisplayValue(Value);//延时 
      }
   }
    if(K2==0)//是否按下停止键K2
  {
     delay(5);//消除抖动
//   ShuMaGuanDisplayValue(Value);//延时
     if(K2==0)//再次判断是否按下停止键K2
    {
      delay(5);//消除抖动
      tingzhiflag=1;//停止标志位变量置1
      qidongflag=0;//启动标志位变量置0
      zhengzhuanflag=0;//正转标志位变量置0
      fanzhuanflag=0;//反转标志位变量置0
      M1=1;//直流电机M1端置1
      M2=1;//直流电机M2端置1  
      while(!K2);//等待停止键K2复位(断开)
//    while(!K2)//等待停止键K2复位(断开)
//    ShuMaGuanDisplayValue(Value);//延时 
     }
    }
   }
  }
  void main()//主函数
{        
   while(1)//死循环
 {
    KeyScan();//按键扫描函数
    if(qidongflag==1&&zhengzhuanflag==0&&fanzhuanflag==0)//判断启动标志位变量是否为1和正转标志位变量是否为0和反转标志位变量是否为0
    ShuMaGuanDisplayValue(0);//数码管显示字符O,表示启动信号。
    if(tingzhiflag==1&&qidongflag==0&&zhengzhuanflag==0&&fanzhuanflag==0)//判断停止标志位变量是否为1和启动标志位变量是否为0和正转标志位变量是否为0和反转标志位变量是否为0
    ShuMaGuanDisplayValue(5);//数码管显示字符S,表示停止信号。
    if(zhengzhuanflag==1&&fanzhuanflag==0)//判断正转标志位变量是否为1和反转标志位变量是否为0
  {
     zhengzhuanhanshu();//正转
     ShuMaGuanDisplayValue(11);//数码管显示字符L,表示正转。
   }
    if(zhengzhuanflag==0&&fanzhuanflag==1)//判断正转标志位变量是否为0和反转标志位变量是否为1
  {
     fanzhuanhanshu();//反转
     ShuMaGuanDisplayValue(12);//数码管显示字符R,表示右转。
   }
  }
 }

原文地址:https://www.cnblogs.com/AChenWeiqiangA/p/12441350.html