仿真图
源程序代码: 直流电机控制+速度显示 #include<reg52.h> //头文件 #define uchar unsigned char //宏定义 #define uint unsigned int #define CYCLE 10 //定义PWM的周期T为10ms uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0Xff,0xc6,0x88};//0-9 R 共阳数码管段选数据 端口定义 sbit PWM1=P1^4; //PWM输出口1(电机正转) sbit PWM2=P1^3; //PWM输出口2(电机反转) sbit K1=P1^0; //加速 sbit K2=P1^1; //减速 sbit K3=P1^2; //正反转 //sbit W1=P2^3; //数码管位选 /***************************************************/ uchar PWM_ON=0; //PWM高电平时间 uchar count=0; //中断计时 uchar num=0; uchar num1=0; //中断时间计数 uint num2=0; //外部中断次数 uchar flat=0; //正反转标示位 uchar flag=0; //刷新数据标示位 sbit W0=P2^6; //位选口定义 sbit W1=P2^5; sbit W2=P2^4; sbit W3=P2^7; 函数名称:延时子函数 函数功能:按键消抖 void delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } 函数名称:按键子函数 函数功能: void key() { if(K1==0) //加速键 { delayms(5); if(K1==0) { while(!K1); 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; } } switch(num) { case 0: PWM_ON=0; break; //占空比为00% case 1: PWM_ON=7; break; //占空比为10% case 2: PWM_ON=8; break; //占空比为40% // case 4: PWM_ON=7; break; //占空比为70% case 3: PWM_ON=10; break; //占空比为100% default: break; } } 速度数据采集 void sudu() { uint shuju; if(flag==1) { flag=0; shuju=num2*2; //电机一秒转的圈数 num2=0; } P2=0xbf; if(flat==0) P0=table[11]; //"C" else P0=table[12]; //"A" delayms(5); P2=0xdf; P0=table[shuju/100]; delayms(5); P2=0xef; P0=table[shuju%100/10]; delayms(5); P2=0x7f; P0=table[shuju%10]; delayms(5); P2=0xff; } void init() { PWM1=1; //初始化 PWM2=1; TMOD=0x11; //打开定时器 TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; TR0=1; EX1=1; IT1=1; TH1=(65536-1000)/256; TL1=(65536-1000)%256; EA=1; ET1=1; TR1=1; W0=1; W1=1; W2=1; W3=1; } 函数名称:主函数 函数功能: void main() { init(); while(1) { key(); sudu(); } } 函数名称:定时器/计数器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-50000)/256; TL0=(65536-50000)%256; num1++; if(num1==10) //每0.5s刷新一次数据 { num1=0; flag=1; } } void timer() interrupt 2 //外部中断1 { num2++; }
|