- #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,表示右轉。
- }
- }
- }
復制代碼
|