标题: 以单片机为核心的PWM占空比输出的直流调速系统的风扇 [打印本页]

作者: 大大29    时间: 2017-1-11 23:45
标题: 以单片机为核心的PWM占空比输出的直流调速系统的风扇
源程序代码:
直流电机控制+速度显示
#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++;
}


作者: 吴天创    时间: 2017-1-12 11:01
学习学习
作者: faridzled    时间: 2017-1-12 19:15
thanks for sharing knowledge
作者: faridzled    时间: 2017-1-12 19:16
thanks for sharing knowledge
作者: a234358    时间: 2017-1-12 20:22
学习一下,谢谢了
作者: 迷失之吻    时间: 2017-7-24 10:55
pwm输出输入口在哪里呢?我用的是l289n的电机驱动!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1