#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://img2020.cnblogs.com/blog/1680900/202003/1680900-20200308111707796-1090831888.png)