1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

標題: 以單片機為核心的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://m.raoushi.com/bbs/) Powered by Discuz! X3.1