#include "reg52.h"
//////////////////////////键定义///////////////////////////////////
#define key_0 0
#define key_1 1
#define key_2 2
#define key_3 3
#define key_4 4
#define key_5 5
#define key_6 6
#define key_7 7
#define key_8 8
#define key_9 9
#define key_10 10
#define key_11 11
#define KEY_NUL 255
#define false 0
#define true 1
sbit KEY_LINE1= P1^0 ;
sbit KEY_LINE2= P1^1 ;
sbit KEY_LINE3= P1^2 ;
sbit KEY_LINE4= P1^3 ;
bit fKeyOff,fKeyIn ;
unsigned char temp;
unsigned char keyflag = 0; //按键模式标志位默认为模式0
unsigned char vKeyVal,vKeyBak; //定义按键值与备份值
unsigned int key_temp;
unsigned int displayset_time; //按下按键后显示的设置数字的时间
///////////////////////////定义PWM电机控制脚等///////////////////////////////////
sbit moter_pwm=P3^7;
unsigned int msecond_pwm;
unsigned int moter_speed=0; //在测速在用于存放实际采集的转速
unsigned int moter_speedset=5000; //用于存放用户设定的转速
unsigned char pwm_time=80; //存放脉冲的宽度
unsigned char pwm=80; //该变量每1MS减一,在中断中执行,当减为0时,说明电机断电时间到,则电机断电
unsigned int msecond; //闸门信号
char code LEDCODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00} ;//0---9
unsigned char LedP=0;
unsigned char DisBuff[6];
/*****************************************************************************************
**显示函数***
******************************************************************************************/
void PrintN(void)
{
DisBuff[2]=(moter_speed)/1000; //千位
DisBuff[3]=(moter_speed%1000)/100; //百位
DisBuff[4]=((moter_speed%1000)%100)/10; //十位
DisBuff[5]=((moter_speed%1000)%100)%10; //个位
DisBuff[1]=10; //消隐
DisBuff[0]=10;
}
void Print_keyset(void)
{
DisBuff[2]=key_temp/1000; //千位
DisBuff[3]=(key_temp%1000)/100; //百位
DisBuff[4]=((key_temp%1000)%100)/10; //十位
DisBuff[5]=((key_temp%1000)%100)%10; //个位
DisBuff[1]=10; //消隐
DisBuff[0]=10;
}
/****************************************************************************************
**函数功能:按键扫描
**函数入口:无
**函数出口:返回被按的按键的键值
****************************************************************************************/
unsigned char scanf_key( void )
{
unsigned char temp= KEY_NUL ;
P1= 0xef ; //1110 1111
if ( KEY_LINE1== 0 )
temp= key_0 ;
if ( KEY_LINE2== 0 )
temp= key_1 ;
if ( KEY_LINE3== 0 )
temp= key_2 ;
if ( KEY_LINE4== 0 )
temp= key_3 ;
//第二行
P1= 0xdf ; // 1101 1111
if ( KEY_LINE1== 0 )
temp= key_4 ;
if ( KEY_LINE2== 0 )
temp= key_5 ;
if ( KEY_LINE3== 0 )
temp= key_6 ;
if ( KEY_LINE4== 0 )
temp= key_7 ;
//第三行
P1= 0xbf ; // 1011 1111
if ( KEY_LINE1== 0 )
temp= key_8 ;
if ( KEY_LINE2== 0 )
temp= key_9 ;
if ( KEY_LINE3== 0 )
temp= key_10 ;
if ( KEY_LINE4== 0 )
temp= key_11 ;
return( temp ) ;
}
void timero(void) interrupt 1 // time0中断 中断号为 1
{
TL0= ( 65536-922 ) % 256 ;
TH0= ( 65536-922 ) / 256 ;
msecond_pwm++;
msecond++;
////////////////////测速部份////////////////////////////////////////////
if(msecond>999)//闸门信号为1秒
{
moter_speed=((TH1<<8)|TL1)*7.5; // (((TH1<<8)|TL1)/8)*60;
TL1=0;
TH1=0;
msecond=0;
}
//////////////////////////以下为按键处理部分////////////////////////////////
if(msecond%8== 0 ) // 10m秒进行判断一回
{
temp= scanf_key() ; // 读键
if( temp==KEY_NUL ) // 如果没有按键
{
fKeyOff= true ;
}else if( fKeyOff && vKeyBak== temp ) // 如果有值,且等于上回的值的话,说明按键有效
{
vKeyVal= temp ;
fKeyOff= false ;
fKeyIn = true ;
}else
{
vKeyBak= temp ;
}
}
////////////////////////////////////////////////////////////////////////////
if(displayset_time!=0)
{
displayset_time--;
Print_keyset();
}else
{
PrintN();
}
////////////////////动态扫描部份////////////////////////////////////////
P2= P2 & 0xc0 ; // P2 同 1100 0000 与
P2= P2 | 1<<LedP ; //
P0= LEDCODE[DisBuff[LedP]] ;
LedP++ ;
if( LedP >6 ) LedP= 0;
///////////////////////////PWM/////////////////////////////////////////
if (msecond_pwm>=350)
{
msecond_pwm=0;
moter_pwm=0;
if(moter_speed>moter_speedset)//调整下一个周期内的脉宽
{
pwm_time=pwm_time-1; //将高电平的延时间取出
pwm=pwm_time;
if(pwm_time==0) //当下一个脉宽时间到0时自动校 TMOD= 0x51 ; // 模式配置,time1 16位计数方式
TR0= 1 ; // time0 计数开始
ET0= 1 ; // 允许产生中断
EA= 1 ; // 总中断有效
TL0= ( 65536-1000 ) % 256 ;
TH0= ( 65536-1000 ) / 256 ;
moter_pwm=0;
TR1=1;
TL1=0;
TH1=0;
key_temp=0;
for(;;)
{
PrintN();
if( fKeyIn )
{
displayset_time=3000; //按键按完后显示3秒钟
fKeyIn= false ;
switch ( vKeyVal ) // 读键
{
///////////////按键0//////////////////////////////////
case key_0 :
if ( key_temp< 1000) // 不能超过4个数码管范围
{
key_temp=(key_temp)*10+0;
}
break;
//////////////按键1//////////////////////////////////
case key_1 :
if ( key_temp< 1000 ) // 不能超过4个数码管范围
{
key_temp=(key_temp)*10+1;
}
break ;
/////////////////按键2//////////////////////////////////
case key_2 :
if ( key_temp< 1000 ) // 不能超过4个数码管范围
{
key_temp=(key_temp)*10+2;
}
break;
////////////////按键3/////////////////////////////////
case key_3 :
if ( key_temp< 1000 ) // 不能超过八个数码管范围
{
key_temp=(key_temp)*10+3;
}
break;
/////////////////////////////////////////////////////
case key_4 :
if ( key_temp< 1000 ) // 不能超过八个数码管范围
{
key_temp=(key_temp)*10+4;
}
break;
//////////////////////////////////////////////////////
case key_5 :
if ( key_temp< 1000 ) // 不能超过八个数码管范围
{
key_temp=(key_temp)*10+5;
}
break;
//////////////////////////////////////////////////////
case key_6 :
if ( key_temp< 1000 ) // 不能超过八个数码管范围
{
key_temp=(key_temp)*10+6;
}
break;
////////////////////////////////////////////////////////
case key_7 :
if ( key_temp< 1000 ) // 不能超过八个数码管范围
{
key_temp=(key_temp)*10+7;
}
break;
////////////////////////////////////////////////////////
case key_8 :
if ( key_temp< 1000 ) // 不能超过八个数码管范围
{
key_temp=(key_temp)*10+8;
}
break;
////////////////////////////////////////////////////////
case key_9 :
if ( key_temp< 1000 ) // 不能超过八个数码管范围
{
key_temp=(key_temp)*10+9;
}
break;
///////////////////删除键/////////////////////////////////
case key_10 :
key_temp=key_temp/10;
break;
////////////////////确认键/////////////////////////////////
case key_11 :
if((key_temp>6000)||(key_temp<2000))//如果超过调速的范围则自动校正为5000转
key_temp=5000;
moter_speedset=key_temp;
break;
}
}
}
}
moter.rar_51 电机_51单片机_51单片机程序_电机调速_调速
版权申诉
91 浏览量
2022-09-24
15:26:53
上传
评论
收藏 2KB RAR 举报
钱亚锋
- 粉丝: 88
- 资源: 1万+