if((PWM_h<200)&(turn_flag==1)) {
PWM_h+=20; }
turn_flag=0;
if((20<=PWM_h<300)&&(turn_flag==0)) {
PWM_h-=20; }
//if(PWM_h<=20)turn_flag=1;
}
// if(t_flag>=1000){ // PWM_h++; // t_flag==0;} }
if(mRun==1) {
EA=0; /*关CPU中断*/ PWM_out=0; if( flag0==1) { speed=0;
speed_disp(); flag0=0; } }
} }
2. 加入控制开关,不同开关控制对应电机高转速、中等转速、低转速。 程序
#include
typedef unsigned char uchar; typedef unsigned int uint; sbit PWM_out=P1^7; sbit mRun=P2^0; sbit Din=P1^0;// sbit CLK=P1^1;// sbit di=P2^5;
sbit zhong=P2^6; sbit gao=P2^7;
uint period=300; uint time=0; uint PWM_h=80; uint count=0; uint speed=0; uint dat_t=0; uint turn_flag=1; uchar dispflag=0;
uchar data disdata[8]; unsigned char code LED_Map[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x58,0x5e,0x79,0x71,0,0x40 };//0-F , ,-
void delay(int count) {
unsigned int i;
for(i=0;i uchar LED_code[8]; uchar i,j,chr,sel; /////////////// for(i=0;i<8;i++) LED_code[i]=LED_Map[disdata[i]]; // LED_code[i]=0x3f; for(i=0;i<8;i++) { chr= LED_code[i]; // if(i==1) chr= chr|0x80; sel=0x80; for(j=0;j<8;j++) { Din=chr&sel; CLK=0; sel=sel>>1; delay(1); CLK=1; delay(1); } } } void speed_disp()//速度显示 { // speed=123; disdata[0]=speed/100;//取10位 disdata[1]=speed0/10;//取个位 disdata[2]=speed;//取个位 disdata[3]=16; disdata[4]=16; disdata[5]=16; disdata[6]=16; disdata[7]=16; if(disdata[2]==0) { disdata[2]=0x10;//如果十位为零则不显示 } display(); } void int0() interrupt 0 using 0 { count++; if (dat_t>=1000) { speed=(count-1)*10/12; dispflag=1; count=0; dat_t=0; } } void timer0() interrupt 1 using 1 { TH0=0xfc; //定时器装载初值,设置脉冲信号的占空比(65536-1000=fc18) TL0=0x18; time++; dat_t++; if(time>period) time=0; 1ms if(time<=PWM_h) /*高电平持续时间结束,变低*/ PWM_out=1; /*经过反相器反相*/ else if((time>PWM_h)&&(time<=period)) /*周期时间到,变高*/ { // time=0; PWM_out=0; /*经过反相器反相*/ } // if(time==period) time=0; } void main() { uchar flag0=0; P1=0x00; PWM_out=0; speed=0; speed_disp(); TMOD=0x01; /*定时器0方式1*/ TH0=0xfc; //定时器装载初值,设置脉冲信号的占空比(65536-1000=fc18) TL0=0x18; dat_t=0; ET0=1; /*开定时器0中断*/ TR0=1; /*启动定时器0*/ IT0=1; EX0=1; EA=1; while(1) { if(mRun==0) { EA=1; /*开CPU中断*/ flag0=1; if (dispflag==1) { dispflag=0; speed_disp(); PWM_h=200; turn_flag=0; if(di==1) { PWM_h=10; 1ms } //turn_flag=0; if(zhong==1) { PWM_h=80; } if(gao==1) { { PWM_h=250; }} //if(PWM_h<=20)turn_flag=1; } // if(t_flag>=1000){ // PWM_h++; // t_flag==0;} } if(mRun==1) { EA=0; /*关CPU中断*/ PWM_out=0; if( flag0==1) { speed=0; speed_disp(); flag0=0; } } } } 五 实验心得体会 最后一个实验比较难,也是比较考验的一个实验,但是,在队友的合作下,还是做了出来。本次实验我们了解脉宽调制(PWM)的原理,学习如何使用PWM输出模拟量驱动直流电机,有进一步熟悉了51系列单片机的延时程序。