找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5140|回复: 5
打印 上一主题 下一主题
收起左侧

基于单片机AT89S52的直流电机PWM调速控制系统,仿真时无法反转,数码管显示不正常

[复制链接]
跳转到指定楼层
楼主
#include<reg51.h>                  
#include<absacc.h>               
#include <intrins.h>  
#define uint unsigned int      //自定义变量
#define uchar unsigned char   
char gw,sw,bw,qw;
uchar j;  //定时次数,每次20ms
uchar f=5; //计数的次数
sbit  P10=P1^0;    //PWM输出波形1
sbit  P11=P1^1;    //PWM输出波形2
sbit  P12=P1^2;           //正反转
sbit  P13=P1^3;           //加速
sbit  P14=P1^4;          //减速
sbit  P15=P1^5;          //停止
sbit  P16=P1^6;   //启动
uchar k;
uchar t;   //脉冲加减
uchar code smg[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x73,0x71};//程序存储区定义字型码表
char data led[4]={0x08,0x04,0x02,0x01};      //位码
uint x;             //数码管显示的数值
display();   //数码管显示          
delays();    //延时函数
key();
displays();
main (void)
{        
        TMOD=0x51;           //T0方式1  定时计数        T1方式1计数
        TH0=0xb1;           //装入初值          20MS
        TL0=0xe0;
        TH1=0x00;    //   计数567
        TL1=0x00;
        TR0=1;       //启动  t0
        TR1=1;       //启动t1
        gw=sw=bw=qw=0; //数码管初始化
        P0=0xc0;
        P2=1;
        while(1)        //无限循环
         {
                display(); //数码管显示       
                 key();
          
         }
}
display()
{
        uchar i;                                                                                                                                                   
        gw=x%10;          //求速度个位值,送到个位显示缓冲区
        sw=(x/10)%10;     //求速度十位值,送到十位显示缓冲区
        bw=(x/100)%10;   //求速度百位值,送到百位显示缓冲区
        qw=x/1000;        //求速度千位值,送到千位显示缓冲区
        for(i=0;i<4;)
        {
                P2=led;
                if(i==0)                  //显示个位
                {
                        P0=smg[gw];
                delays();
                }
                        else if(i==1)     //显示十位
                        {
                        P0=smg[sw];
                delays();
                        }
                                else if(i==2)  //显示百位
                                {
                                P0=smg[bw];
                                delays();
                                }
                           else if(i==3)           //显示千位
                          {
                                if(k==0)                        //正转时显示"P"
                                {
                                 P0=0xf3;
                                 delays();
                                }
                                else
                                {
                                 P0=0x39;                 //反转时显示"C"       
                                 }
                                 }                                 
                i++;
        }
}
delays()
{
        uchar i;
        for(i=5000;i>0;i--);
}
void t0() interrupt 1 using 2
{
        TH0=0xb1;  //重装t0
        TL0=0xe0;
        f--;
        if(k==0)
        {
          if(f<t)
          P10=1;
          else  
          P10=0;       
          P11=0;
         }
        else  
        {
                if(f<t)
                P11=1;
                else
                P11=0;
                P10=0;
        }
        if(f==0)
                {
                f=5;
                }  
         j++;
         if(j==50)
        {
        j=0;
        x=TH1*256+TL1;         //t1方式1计数,读入计数值
        TH1=0x00;
        TL1=0x00;
        x++;
        display();
        }
}
key()
{
if(P12==0)                //如果按下,
        {
         while(!P12)    //去抖动
         display();
         k=~k;
        }          
        if(P16==0)     //启动
        {
        while(P16==0);
        IE=0x8a;
        }           
if(P13==0)         //加速
        {
        while (P13==0);
        t++;
        }
                if(t>=5)
                t=5;
if(P14==0)  //减速
                        {
                        while(P14==0);
                        t--;
                        }
                        if(t<1)
                        t=1;
if(P15==0)    //停止
        {
        while(P15==0);

        EA=0;
        P10=0;
        P11=0;
        }        

仿真是无法实现反转,怎么改啊,数码管显示几秒后就调到图上状态不变了

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:52115 发表于 2013-7-25 00:06 | 只看该作者
占空比太低的话电机带不起来。
回复

使用道具 举报

板凳
ID:63747 发表于 2014-7-18 15:31 | 只看该作者
本帖最后由 sz1001 于 2014-7-18 15:34 编辑

您的电路有误,H桥部分弄错了,不能直接接地,要接到IO口上去,一个IO口只能一个状态,无法实现换向。H桥建议用H桥电路,使用方便;分立件太麻烦了。
回复

使用道具 举报

地板
ID:44267 发表于 2015-11-16 11:30 | 只看该作者
diy的精神让人钦佩
回复

使用道具 举报

5#
ID:96682 发表于 2015-11-23 17:01 | 只看该作者
且不说源代码,电路图本身就有问题,只有两者合二为一,才能达到你期望的结果。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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