帮忙解释下
2019-07-15 08:50发布
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
/**************************************************** ========= 直流电机控制+速度显示 ==========****************************************************/#include<reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
#define CYCLE 10 //定义PWM的周期T为10ms
//数码管段选定义 0 1 2 3 4 5 6 7 8 9
uchar code smg_du[]={0x28,0xee,0x72,0xa2,0xe4,0x41,0x21,0xea,0x70,0xa0,
0x60,0x25,0x34,0x26,0x61,0x71,0xff}; //断码uchar dis_smg[8] = {0};/***************************************************
端口定义
***************************************************/
sbit PWM1=P2^0; //PWM输出口1(电机正转)
sbit PWM2=P2^5; //PWM输出口2(电机反转)sbit K1=P2^7; //加速
sbit K2=P2^6; //减速
sbit K3=P2^3; //正反转
sbit K4=P2^2; //启动停止//数码管位选定义
sbit smg_we1 = P3^4; //数码管位选定义
sbit smg_we2 = P3^5;
sbit smg_we3 = P3^6;
sbit smg_we4 = P3^7;/***************************************************/
uchar PWM_ON=0; //PWM高电平时间
uchar count=0; //中断计时
uchar num=0;
uchar num1=0; //中断时间计数
uint num2=0; //外部中断次数
uchar flat=0; //正反转标示位
uchar flag=0; //刷新数据标示位
/***************************************************
函数名称:延时子函数
函数功能:按键消抖
***************************************************/
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/***********************数码位选函数*****************************/
void smg_we_switch(uchar i)
{
switch(i)
{
case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
}
}/********************数码显示函数*************************/
void display()
{
static uchar i;
uint shuju;
if(flag==1)
{
flag=0;
shuju=num2; //电机一秒转的圈数
num2=0;
}
if(flat==0)
dis_smg[3] = smg_du[10]; //"A" //正转
else
dis_smg[3] = smg_du[15]; //"F" //反转
dis_smg[0] = smg_du[shuju % 10]; //显示
dis_smg[1] = smg_du[shuju / 10 % 10];
dis_smg[2] = smg_du[shuju / 100 % 10];
i++;
if(i > 4)
i = 0;
P1 = 0xff; //段选
smg_we_switch(i); //位选
P1 = dis_smg; //段选
delayms(3);
}/***************************************************
函数名称:按键子函数
函数功能:
***************************************************/
void key()
{
if(K4==0) //启动 停止
{
delayms(5);
if(K4==0)
{
while(!K4)
display(); //显示函数
num=!num;
}
}
if(K1==0) //加速键
{
delayms(5);
if(K1==0)
{
while(!K1)
display(); //显示函数
if(num<3)
num++;
}
} if(K2==0) //减速键
{
delayms(5);
if(K2==0)
{
while(!K2);
if(num>0)
num--;
}
} if(K3==0) //电机正反转按键
{
delayms(5);
if(K3==0)
{
while(!K3) ;
flat++;
if(flat==2)
flat=0;
num1 = 0;
num2 = 0;
}
}
switch(num)
{
case 0: PWM_ON=0; break; //占空比为00%
case 1: PWM_ON=40; break; //占空比为40% case 2: PWM_ON=70; break; //占空比为70% case 3: PWM_ON=100; break; //占空比为100%
default:
break;
}
}
void init()
{
PWM1=1; //初始化
PWM2=1;
TMOD=0x11; //打开定时器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
EX0=1;
IT0=1;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
EA=1;
ET1=1;
TR1=1;
}/**************************************************
函数名称:主函数
函数功能:
**************************************************/
void main()
{
init();
while(1)
{
key();
display(); //显示函数 }
}
/**************************************************
函数名称:定时器/计数器0中断子函数
函数功能:
**************************************************/
void T1_time() interrupt 3
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
count++;
if(count>CYCLE)
count=0;
if(count<PWM_ON) //如果计时时间在不大于高电平时时间,电机转
{
if(flat==0)
{
PWM1=0;
PWM2=1;
}
if(flat==1)
{
PWM1=1;
PWM2=0;
}
}
else //如果计时时间大于高电平时时间,电机停
{
PWM1=1;
PWM2=1;
}
}void T0_time() interrupt 1 //定时器0
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
num1++;
if(num1==20) //每1s刷新一次数据
{
num1=0;
flag=1;
}
}void timer() interrupt 0 //外部中断1
{
num2++;
}
一周热门 更多>