pwmdianjitiaosu.rar

  • luomao1234
    了解作者
  • C/C++
    开发工具
  • 2KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 4
    下载次数
  • 2010-04-01 13:37
    上传日期
单电机的PWM调速控制,可自动边度,也可用使用按键手动调节
pwmdianjitiaosu.rar
  • 程序.txt
    4.8KB
内容介绍
//******************************** //程序 //********************************* #include"reg51.h" #include"math.h" #include"intrins.h" #define uchar unsigned char #define uint unsigned int uchar temp1,temp2; //定义占空比的变量 uchar t=0; //定义中断记数器 ///数码管 sbit shi=P1^6; /* 数码管 1--十位 */ sbit ge=P1^7; /* 数码管 2--个位 */ //uchar shuma; //****定义数码管的口,用P2口的P2^0到P2^7做为八位控制端, //uint num1,num2;//数码管显示的数--num1十位,num2个位 uchar code table[]={ 0x03,0x9f,0x25,0x0d, 0x99,0x49,0x41,0x1f, 0x01,0x09,0x11,0xc1, 0x63,0x85,0x61,0x71}; ///按键 sbit an0=P3^5; /* 正反转 */ sbit an1=P3^6; /* 加速 */ sbit an2=P3^4; /* 减速 */ ///电机控制位定义 sbit s1=P1^3; /* L298的Input 1 */ sbit s2=P1^4; /* L298的Input 2 */ uchar m1=0;//反转占空比 /* 电机1速度值 */ ///ad转换 sbit cs=P1^0; /* ad--cs */ sbit rd=P1^1; /* ad--rd */ sbit wr=P1^2; /* ad--wr */ uchar ad,ap; //定义ad的口,用P0口的P0^0到P0^7做为八位接受端, uchar k=1;//正反转标志;k==0--反转 sbit fz=P1^5; uint v; //**************************************** //***************延时函数**************** //*************************************** delay(uint z) { uint i,j; for(i=0;i<z;i++) { for(j=0;j<11;j++); } } //**************************************** //*************** 数码管-1-AD-显示函数 *********** //*************************************** void display1(uchar trnum) { uchar sw,gw; //函数中的十位个位 uint x,y; sw=trnum/16; gw=trnum%16; for(x=0;x<8;x++) { for(y=0;y<3;y++) { shi=0;ge=1; P2=table[sw]; delay(2); shi=1;ge=0; P2=table[gw]; delay(2); } } } //**************************************** //*************** 数码管-2-键盘-显示函数 *********** //*************************************** void display2(uchar tnum) { uchar swe;//,gwe; //函数中的十位个位 uint p,q; swe=tnum/16; //gwe=tnum%16; for(p=0;p<8;p++) { for(q=0;q<2;q++) { shi=0;ge=1; P2=table[swe]; delay(2); // shi=1;ge=0; // P2=table[gwe]; // delay(1); } } } //**************************************** //*************** 按键扫描函数 *********** //*************************************** void keyscan() { if(an1==0) //加速 { //delay(50); if(an1==0) { ap=ap+16; while(!an1); { display2(ap); } // delay(2); while(!an1) { display2(ap); } } } if(an2==0) //减速 { ap=ap-16; //delay(50); if(an2==0) { while(!an2) { display2(ap); } // delay(2); while(!an2) { display2(ap); } } } } //**************************************** //*************** 正负极扫描函数 *********** //*************************************** void fanzhuan() { if(an0==0) //反转 { delay(50); if(an0==0) { k=!k; while(!an0); } } } //**************************************** //*************** PWM---定时中断 *********** //*************************************** void timer0() interrupt 1 using 2 { TMOD=0x01; TH0=(65536-10)/256; //一次中断的时间为50us TL0=(65536-10)%256; if(t==0) /* 1个PWM周期完成后才会接受新数值 */ { temp1=ad; temp2=m1;//反转 } if(k==1) //小车正转的标志 { if(t<temp1) { s1=1; //右轮 s2=0; } else { s1=0; // 产生电机1的PWM信号 //一个PWM信号的周期为2.5ms s2=0; } } if(k==0) //小车正转的标志 { if(t<temp2) { s2=1; //右轮 s1=0; } else { s1=0; // 产生电机1的PWM信号 //一个PWM信号的周期为2.5ms s2=0; } } t++; //完成一次中断,记数一次 if(t>255) t=0; // 1个PWM信号由50次中断产生 } //主函数 void main() { TMOD=0x01; TH0=(65536-10)/256; //一次中断的时间为50us TL0=(65536-10)%256; EA=1; ET0=1; TR0=1; k=1; //m1=255; //display(m1); while(1) { if(fz==1) { //ad cs=0; wr=1; _nop_(); wr=0; _nop_(); wr=1; fanzhuan(); for(v=0;v<1;v++) { fanzhuan(); display1(ad); } //an0=0;//////////////////////////////////////////// P0=0xff; rd=1; _nop_(); rd=0; _nop_(); ad=P0;//; fanzhuan(); m1=ad; rd=1; delay(1); } else if(fz==0) { ap=145; display2(ap); ad=ap; m1=ap; while(1) { cs=1; fanzhuan(); keyscan(); ad=ap; m1=ap; } } keyscan(); } }
评论
    相关推荐