51单片机控制直流电机转速仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <reg52.h>
- sbit P20=P2^0;
- sbit P21=P2^1;
- sbit P22=P2^2;
- sbit P23=P2^3;
- sbit P24=P2^4;
- sbit P25=P2^5;
- sbit P26=P2^6;
- sbit P27=P2^7;
- sbit P30=P3^0;
- unsigned int ge,shi,bai,qian,g,s,b;
- unsigned int j=0,getdata=0,t;
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- void delay(unsigned int z) //延时
- {
- unsigned char x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void display() //显示
- {
- P0=table[ge];
- P20=1;
- P21=1;
- P22=1;
- P23=1;
- P24=1;
- P25=1;
- P26=1;
- P27=0;
- delay(5);
- P0=0x00;
- P0=table[shi];
- P20=1;
- P21=1;
- P22=1;
- P23=1;
- P24=1;
- P25=1;
- P26=0;
- P27=1;
- delay(5);
- P0=0x00;
- P0=table[bai];
- P20=1;
- P21=1;
- P22=1;
- P23=1;
- P24=1;
- P25=0;
- P26=1;
- P27=1;
- delay(5);
- P0=0x00;
- P0=table[qian];
- P20=1;
- P21=1;
- P22=1;
- P23=1;
- P24=0;
- P25=1;
- P26=1;
- P27=1;
- delay(5);
- P0=0x00;
- //P0=able[b];
- //P20=1;
- //P21=1;
- //P22=1;
- //P23=1;
- //P24=1;
- //P25=0;
- //P26=1;
- //P27=1;
- //delay(5);
- //P0=0x00;
- //
- //P0=table[s];
- //P20=1;
- //P21=1;
- //P22=1;
- //P23=1;
- //P24=1;
- //P25=1;
- //P26=0;
- //P27=1;
- //delay(5);
- //P0=0x00;
- //P0=table[g];
- //P20=1;
- //P21=1;
- //P22=1;
- //P23=1;
- //P24=1;
- //P25=1;
- //P26=1;
- //P27=0;
- //delay(5);
- //P0=0x00;
- if(P30==0)
- P0=0x40;
- P20=0;
- P21=1;
- P22=1;
- P23=1;
- P24=1;
- P25=1;
- P26=1;
- P27=1;
- delay(50);
- P0=0x00;
- }
- void init()//初始化
- {
- TMOD=0X11;//定时器0和1开启16位定时/计数模式(方式二)
- EX0=1;//允许开启外部中断0
- IT0=1;//设置中断0下降沿触发
- EA=1;//总开关开启
- ET0=1;//定时/计数器0溢出中断允许
- TR0=1;//启动定时器0
- TH0=(65536-1000)/256; //定时1ms
- TL0=(65536-1000)%256;
- }
- void main() //主程序
- {
- init();
- while(1)
- {
- ge=getdata%10;
- shi=getdata/10%10;
- bai=getdata/100%10;
- qian=getdata/1000%10;
- // g=n%10;
- // s=n/10%10;
- // b=n/100%10;
-
- display();
- }
- }
- //M
- void int0(void) interrupt 0 //外部中断0
- {
- j++; //每有一个脉冲触发就加1
-
- }
-
- void Timer0() interrupt 1 //定时器中断0
- {
- TR0=0;//关闭定时器0 暂停计时
- TH0=(65536-3000)/256;
- TL0=(65536-3000)%256;
- t++;
- if(t==1000)//设定1s判断一次转速
- {
- t=0;
- getdata=j*60.0/(24*3.0);//此电动机转一圈编码器产生24个脉冲
- j=0;
- }
- TR0=1;//开启定时器0 重新计时
- }
复制代码
全部资料51hei下载地址:
First.zip
(83.62 KB, 下载次数: 81)
|