找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5326|回复: 5
收起左侧

以单片机为核心的PWM占空比输出的直流调速系统的风扇

[复制链接]
ID:161244 发表于 2017-1-11 23:45 | 显示全部楼层 |阅读模式

仿真图

仿真图
源程序代码:
直流电机控制+速度显示
#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++;
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:161431 发表于 2017-1-12 11:01 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:89286 发表于 2017-1-12 19:15 | 显示全部楼层
thanks for sharing knowledge
回复

使用道具 举报

ID:89286 发表于 2017-1-12 19:16 | 显示全部楼层
thanks for sharing knowledge
回复

使用道具 举报

ID:62446 发表于 2017-1-12 20:22 | 显示全部楼层
学习一下,谢谢了
回复

使用道具 举报

ID:217011 发表于 2017-7-24 10:55 | 显示全部楼层
pwm输出输入口在哪里呢?我用的是l289n的电机驱动!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表