- #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,表示右转。
- }
- }
- }
复制代码
|