找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5103|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

基于單片機(jī)AT89S52的直流電機(jī)PWM調(diào)速控制系統(tǒng),仿真時(shí)無法反轉(zhuǎn),數(shù)碼管顯示不正常

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:50935 發(fā)表于 2013-6-14 13:03 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
#include<reg51.h>                  
#include<absacc.h>               
#include <intrins.h>  
#define uint unsigned int      //自定義變量
#define uchar unsigned char   
char gw,sw,bw,qw;
uchar j;  //定時(shí)次數(shù),每次20ms
uchar f=5; //計(jì)數(shù)的次數(shù)
sbit  P10=P1^0;    //PWM輸出波形1
sbit  P11=P1^1;    //PWM輸出波形2
sbit  P12=P1^2;           //正反轉(zhuǎn)
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};//程序存儲區(qū)定義字型碼表
char data led[4]={0x08,0x04,0x02,0x01};      //位碼
uint x;             //數(shù)碼管顯示的數(shù)值
display();   //數(shù)碼管顯示          
delays();    //延時(shí)函數(shù)
key();
displays();
main (void)
{        
        TMOD=0x51;           //T0方式1  定時(shí)計(jì)數(shù)        T1方式1計(jì)數(shù)
        TH0=0xb1;           //裝入初值          20MS
        TL0=0xe0;
        TH1=0x00;    //   計(jì)數(shù)567
        TL1=0x00;
        TR0=1;       //啟動  t0
        TR1=1;       //啟動t1
        gw=sw=bw=qw=0; //數(shù)碼管初始化
        P0=0xc0;
        P2=1;
        while(1)        //無限循環(huán)
         {
                display(); //數(shù)碼管顯示       
                 key();
          
         }
}
display()
{
        uchar i;                                                                                                                                                   
        gw=x%10;          //求速度個(gè)位值,送到個(gè)位顯示緩沖區(qū)
        sw=(x/10)%10;     //求速度十位值,送到十位顯示緩沖區(qū)
        bw=(x/100)%10;   //求速度百位值,送到百位顯示緩沖區(qū)
        qw=x/1000;        //求速度千位值,送到千位顯示緩沖區(qū)
        for(i=0;i<4;)
        {
                P2=led;
                if(i==0)                  //顯示個(gè)位
                {
                        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)                        //正轉(zhuǎn)時(shí)顯示"P"
                                {
                                 P0=0xf3;
                                 delays();
                                }
                                else
                                {
                                 P0=0x39;                 //反轉(zhuǎn)時(shí)顯示"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計(jì)數(shù),讀入計(jì)數(shù)值
        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;
        }        

仿真是無法實(shí)現(xiàn)反轉(zhuǎn),怎么改啊,數(shù)碼管顯示幾秒后就調(diào)到圖上狀態(tài)不變了

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:52115 發(fā)表于 2013-7-25 00:06 | 只看該作者
占空比太低的話電機(jī)帶不起來。
回復(fù)

使用道具 舉報(bào)

板凳
ID:63747 發(fā)表于 2014-7-18 15:31 | 只看該作者
本帖最后由 sz1001 于 2014-7-18 15:34 編輯

您的電路有誤,H橋部分弄錯(cuò)了,不能直接接地,要接到IO口上去,一個(gè)IO口只能一個(gè)狀態(tài),無法實(shí)現(xiàn)換向。H橋建議用H橋電路,使用方便;分立件太麻煩了。
回復(fù)

使用道具 舉報(bào)

地板
ID:44267 發(fā)表于 2015-11-16 11:30 | 只看該作者
diy的精神讓人欽佩
回復(fù)

使用道具 舉報(bào)

5#
ID:96682 發(fā)表于 2015-11-23 17:01 | 只看該作者
且不說源代碼,電路圖本身就有問題,只有兩者合二為一,才能達(dá)到你期望的結(jié)果。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表