久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14323|回復: 12
打印 上一主題 下一主題
收起左側(cè)

基于51單片機PWM調(diào)速,用霍爾元件測速,并實時顯示轉(zhuǎn)速,程序出問題了。

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:196520 發(fā)表于 2017-5-16 08:37 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
程序出問題了,電機轉(zhuǎn)不了,顯示也出不來。單片機新手,看不出哪兒出了問題。麻煩論壇里能幫忙朋友們幫我看看,謝謝
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^0;                                  //啟停按鍵K1
sbit k2=P3^2;                                  //正反轉(zhuǎn)按鍵K2
sbit up=P1^2;                                  //加速按鍵up
sbit down=P1^3;                                  //減速按鍵down
sbit in1=P1^5;                                  //正反轉(zhuǎn)輸入口
sbit in2=P1^6;
sbit ENA=P1^7;                                  //PWM信號輸入口
sbit LED1=P2^3;                                   //綠燈正轉(zhuǎn)
sbit LED2=P2^4;                                   //紅燈反轉(zhuǎn)
uchar a=0;
uchar count=48;                              //速度上限
uchar t=0;
char speed=20;                              //初始速度
uint qt;
/*-----------------------端口命名------------------------*/
sbit rs=P2^0;                 //LCD的數(shù)據(jù)/命令選擇端
sbit rw=P2^1;                  //LCD的讀寫選擇端
sbit e=P2^2;                   //LCD的使能信號端  
/*-------------------------------------------------------*/
/*-----------------------定義參數(shù)------------------------*/
uint i,z,count,zhuan,msec;     //定義參數(shù)
uchar display[]={" speed=        r/min "};     //定義顯示參數(shù)
/*-------------------------------------------------------*/
/*-----------------------正反轉(zhuǎn)延時函數(shù)------------------*/
viod delay(void)
{
        uchar i,j,k;
        for(i=50;i>0;i--)
        {
                for(j=200;j>0;j--)
                        for(k=230;k>0;k--)
        }
}
/*------------------------------------------------------*/
/*-----------------------啟停函數(shù)------------------------*/
void qiting(uint b)                                //b為啟停標志
{
        if(k1==0)
        {
                ENA=1;
                b=1;
        }
        else
        {
                ENA=0;
                b=0;
        }
        return b;
}
/*-------------------------------------------------------*/
/*-----------------------正反轉(zhuǎn)函數(shù)----------------------*/
void INTT0_zhengfan() interrupt 2
{
        a++;
        if(a==1)                       //正轉(zhuǎn)
        {
                LED1=1;
                LED2=0;
                ENA=0;
                delay();
                ENA=1;
                in1=1;
                in2=0;
        }
        else                                  //反轉(zhuǎn)
        {
                LED1=0;
                LED2=1;
                ENA=0;
                delay();
                ENA=1;
                in1=0;
                in2=1;
        }
        if(a>=2)
        {
                a=0;
        }               
}
/*--------------------------------------------------------*/
/*-----------------------增減速函數(shù)-----------------------*/
void speed_control()
{
        if(up==0)                                         //增速
        {
                speed++;
                while(up==0)                     //即時對計滿數(shù)的speed值控制在設(shè)定范圍之內(nèi)
                if(speed>count)speed=count;
        }
        if(down==0)                                            //減速
        {
                speed--;
                while(down==0)                 
                if(speed<0)speed=0;
        }
}
/*----------------------------------------------------------------------------*/
/*-------輸出PWM的定時器中斷(與增減函數(shù)配合輸出PWM信號)---------------------*/
void timer0_PWM() interrupt 3  //計滿1ms跳一次,有speed個之后PWM跳變
{
        if(t<speed)        ENA=1;
        else ENA=0;
        t++;
        if(t>=count)t=0;
}
/*-------------------------------------------------------*/
/*-----------------------毫秒延時------------------------*/
void delay1(uint ms)
{  
        uint i,j;               //為延時引入i,j兩參數(shù)  
        for (j=0;j<ms;j++)      //延時第一循環(huán)   
        for (i=0;i<120;i++);    //延時第二循環(huán)  
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602寫命令--------------------*/
void write_command(uchar command)
{
        rs=0;           //數(shù)據(jù)、命令選擇端0為命令
        rw=0;           //讀、寫選擇端0為寫
        P0=command;      //向LCD寫命令
        delay1(5);      //稍做延遲,代替檢測忙狀態(tài)  
        e=1;             //信號使能端高電平
        delay1(5);      //稍做延遲,代替檢測忙狀態(tài)  
        e=0;            //信號使能端低電平
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602寫數(shù)據(jù)--------------------*/
void write_data(uchar data0)
{
        rs=1;       //數(shù)據(jù)、命令選擇端 1為數(shù)據(jù)
        rw=0;       //讀、寫選擇端0為寫
        P0=data0;      //向LCD寫數(shù)據(jù)
        delay1(5);      //稍做延遲,代替檢測忙狀態(tài)
        e=1;      //信號使能端高電平
        delay1(5);     //稍做延遲,代替檢測忙狀態(tài)
        e=0;      //信號使能端低電平
}
/*-------------------------------------------------------*/
/*-------------------外部中斷0計數(shù)程序-------------------*/
void counter(void) interrupt 0
{   

        count++;  
        if(count==2)      //2次循環(huán)為發(fā)動機轉(zhuǎn)一圈  
        {   
        count=0;     //初始化計數(shù)   
             z++;      //轉(zhuǎn)圈計數(shù)加1
          }   


}
/*-------------------------------------------------------*/
/*------------------------LCD顯示------------------------*/
void displaytolcd()
{  
  write_command(0x80);     //向LCD1602寫命令80H  
  for (i=0;i<sizeof(display)-1;i++)   //循環(huán)要傳輸?shù)淖址麄數(shù)次,每一次傳一個字符  
  {   
    write_data(display);   
      delay(5);  
  }
}
/*-------------------------------------------------------*/  
/*-----------------內(nèi)部中斷0計時計數(shù)程序-----------------*/
void Timer_0(void) interrupt 1
{  
   TH0=0x3c;      //50ms定時  
   TL0=0xb0;  
   msec++;  
   if(msec==20)      //50*20=1S  
   {   
        msec=0;
        zhuan=60*z;        //每分鐘轉(zhuǎn)速
        displaytolcd();   

        count=0;   
        z=0;

   }
}
/*-------------------------------------------------------*/
/*----------------------端口初始化-----------------------*/
void int_all()
{  
        z=0;       //初始化z的值  
        count=0;      //初始化count的值  
        zhuan=0;      //初始化轉(zhuǎn)的值  
        rw=0;       //選擇LCD寫數(shù)據(jù)指令  
        delay1(15);      //延時15ms  
        write_command(0x38);     //向LCD1602寫命令38H  
        delay1(5);      //延時5ms  
        write_command(0x0e);     //向LCD1602寫命令0EH  
        delay1(5);      //延時5ms  
        write_command(0x06);     //向LCD1602寫命令06H
        TMOD=0x21;      //內(nèi)部中斷定時器選擇;定時器0工作在方式1,定時器1工作在方式2
        TH0=0x3c;      //50ms定時  
        TL0=0xb0;
                TH1=0xF7;                  //
            TL1=0xF7;
        EA=1;       //開中斷總開關(guān)
                IT0=1;       //外部中斷0為下降沿觸發(fā)
        ET0=1;       //開內(nèi)部中斷0
        TR0=1;       //計時器開始工作   
        EX0=1;       //開外部中斷0

                IT1=1;       //外部中斷1為下降沿觸發(fā)   
                ET1=1;
            TR1=1;
                EX1=1;
}
/*-------------------------------------------------------*/
/*-----------------------數(shù)據(jù)處理------------------------*/
void  disp_count()
{  
display[9]=(zhuan/1000+'0');    //轉(zhuǎn)換轉(zhuǎn)速的千位  
display[10]=(zhuan/100%10+'0');    //轉(zhuǎn)換轉(zhuǎn)速的百位  
display[11]=(zhuan/10%10+'0');    //轉(zhuǎn)換轉(zhuǎn)速的十位   
display[12]=(zhuan%10+'0');    //轉(zhuǎn)換轉(zhuǎn)速的個位
}
void main()
{       
        int_all();
        while(1)
        {       
                qiting(qt);
                if(qt==1)
                {
                        speed_control();
                }
                disp_count();     //數(shù)據(jù)處理
        displaytolcd();     //LCD顯示
        }
}

1.jpg (124.67 KB, 下載次數(shù): 120)

這是仿真的圖

這是仿真的圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩

相關(guān)帖子

回復

使用道具 舉報

沙發(fā)
ID:201220 發(fā)表于 2017-5-16 10:00 | 只看該作者
用示波器看下PWM出來的波形是否正常。電機是什么電機,用的什么驅(qū)動呢?
回復

使用道具 舉報

板凳
ID:82765 發(fā)表于 2017-5-16 10:03 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
回復

使用道具 舉報

地板
ID:196520 發(fā)表于 2017-5-16 12:54 | 只看該作者
呆萌俠 發(fā)表于 2017-5-16 10:00
用示波器看下PWM出來的波形是否正常。電機是什么電機,用的什么驅(qū)動呢?

直流電機,用單片機輸出PWM信號,再用L298驅(qū)動電機
回復

使用道具 舉報

5#
ID:196520 發(fā)表于 2017-5-16 12:59 | 只看該作者
cjjcjj1 發(fā)表于 2017-5-16 10:03
你好!說一下你的整體思路和實現(xiàn)的過程

運用51單片機輸出pwm信號,再運用電機驅(qū)動芯片L298驅(qū)動直流電機轉(zhuǎn)動,用按鍵控制啟停、正反轉(zhuǎn)、運用PWM占空比多少調(diào)速;運用霍爾元件測電機轉(zhuǎn)速,在通過LCD顯示轉(zhuǎn)速。
回復

使用道具 舉報

6#
ID:201278 發(fā)表于 2017-5-16 13:59 | 只看該作者
學習了,想知道問題到底出在哪?
回復

使用道具 舉報

7#
ID:201346 發(fā)表于 2017-5-16 14:36 | 只看該作者
對,出了什么問題呢?
回復

使用道具 舉報

8#
ID:196520 發(fā)表于 2017-6-3 20:40 | 只看該作者
#include"reg51.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^0;                                  //啟停按鍵K1
sbit k2=P1^1;                                  //正反轉(zhuǎn)按鍵K2
sbit up=P1^2;                                  //加速按鍵up
sbit down=P1^3;                                  //減速按鍵down
sbit in1=P1^5;                                  //正反轉(zhuǎn)輸入口
sbit in2=P1^6;
sbit ENA=P1^7;                                  //PWM信號輸入口
sbit LED1=P2^3;                                   //綠燈正轉(zhuǎn)
sbit LED2=P2^4;                                   //紅燈反轉(zhuǎn)
uchar a=1;
uchar c=0;
uchar count=48;                              //速度上限
uchar t=0;
char speed=20;                              //初始速度

/*-----------------------端口命名------------------------*/
sbit rs=P2^0;                 //LCD的數(shù)據(jù)/命令選擇端
sbit rw=P2^1;                  //LCD的讀寫選擇端
sbit e=P2^2;                   //LCD的使能信號端  
/*-------------------------------------------------------*/
/*-----------------------定義參數(shù)------------------------*/
uint i,z,cou,zhuan,msec;     //定義參數(shù)
uchar display[]={"speed=     r/min "};     //定義顯示參數(shù)
/*-------------------------------------------------------*/
/*-----------------------正反轉(zhuǎn)延時函數(shù)------------------*/
void delay(void)
{
        uchar i,j,k;
        for(i=50;i>0;i--)
        {
                for(j=100;j>0;j--)
                        for(k=230;k>0;k--);
        }
}
/*------------------------------------------------------*/
/*-----------------------啟停函數(shù)------------------------*/
void qiting()                                //b為啟停標志
{
        if(k1==0)
        {
                if(c<=0)
                {
                        LED1=1;
                        LED2=0;
                }
                ENA=1;
                c++;
                if(c >= 3)
                {
                         c = 2;
                }
        }
        else
        {
                LED1=0;
                LED2=0;
                ENA=0;
                c=0;
        }
}         
/*-------------------------------------------------------*/
/*-----------------------正反轉(zhuǎn)函數(shù)----------------------*/
void zhengfan()
{        if(k1==1)
        {
                ENA=0;
        }
        else if(k2==1)                       //正轉(zhuǎn)
        {
                LED1=1;
                LED2=0;
                delay();
                ENA=1;
                in1=1;
                in2=0;
        }
        else if(k2==0)                                  //開關(guān)按下反轉(zhuǎn)
        {
                LED1=0;
                LED2=1;
                delay();
                ENA=1;
                in1=0;
                in2=1;
        }               
}
/*--------------------------------------------------------*/
/*-----------------------增減速函數(shù)-----------------------*/
void speed_control()
{

        if(up==0)                                         //增速
        {
                speed++;
                while(up==0)                     //即時對計滿數(shù)的speed值控制在設(shè)定范圍之內(nèi)
                if(speed>count)speed=count;
        }
        if(down==0)                                            //減速
        {
                speed--;
                while(down==0)                 
                if(speed<0)speed=0;
        }
}
/*----------------------------------------------------------------------------*/
/*-------輸出PWM的定時器中斷(與增減函數(shù)配合輸出PWM信號)---------------------*/
void timer0_PWM() interrupt 3  //計滿1ms跳一次,有speed個之后PWM跳變
{
        if(k1==0)
        {
                if(t<speed)        ENA=1;
                else ENA=0;
                t++;
                if(t>=count)t=0;
        }
}
/*-------------------------------------------------------*/
/*-----------------------毫秒延時------------------------*/
void delay1(uint ms)
{  
        uint i,j;               //為延時引入i,j兩參數(shù)  
        for (j=0;j<ms;j++)      //延時第一循環(huán)   
        for (i=0;i<120;i++);    //延時第二循環(huán)  
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602寫命令--------------------*/
void write_command(uchar command)
{
        rs=0;           //數(shù)據(jù)、命令選擇端0為命令
        rw=0;           //讀、寫選擇端0為寫
        P0=command;      //向LCD寫命令
        delay1(5);      //稍做延遲,代替檢測忙狀態(tài)  
        e=1;             //信號使能端高電平
        delay1(5);      //稍做延遲,代替檢測忙狀態(tài)  
        e=0;            //信號使能端低電平
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602寫數(shù)據(jù)--------------------*/
void write_data(uchar data0)
{
        rs=1;       //數(shù)據(jù)、命令選擇端 1為數(shù)據(jù)
        rw=0;       //讀、寫選擇端0為寫
        P0=data0;      //向LCD寫數(shù)據(jù)
        delay1(5);      //稍做延遲,代替檢測忙狀態(tài)
        e=1;      //信號使能端高電平
        delay1(5);     //稍做延遲,代替檢測忙狀態(tài)
        e=0;      //信號使能端低電平
}
/*-------------------------------------------------------*/
/*-------------------外部中斷1計數(shù)程序-------------------*/
void counter(void) interrupt 2
{   

        cou++;  
        if(cou==2)      //2次循環(huán)為發(fā)動機轉(zhuǎn)一圈  
        {   
                cou=0;     //初始化計數(shù)   
             z++;      //轉(zhuǎn)圈計數(shù)加1
          }   
     

}
/*-------------------------------------------------------*/
/*------------------------LCD顯示------------------------*/
void displaytolcd()
{  
  write_command(0x80);     //向LCD1602寫命令80H  
  for (i=0;i<sizeof(display)-1;i++)   //循環(huán)要傳輸?shù)淖址麄數(shù)次,每一次傳一個字符  
  {   
    write_data(display[i]);   
      delay1(5);  
  }
}
/*-------------------------------------------------------*/  
/*-----------------內(nèi)部中斷0計時計數(shù)程序-----------------*/
void Timer_0(void) interrupt 1
{  
   TH0=0x3c;      //50ms定時  
   TL0=0xb0;  
   msec++;  
   if(msec==20)      //50*20=1S  
   {   
        msec=0;
        zhuan=60*z;        //每分鐘轉(zhuǎn)速
        displaytolcd();   
                 
        z=0;
               
   }
}
/*-------------------------------------------------------*/
/*-----------------------數(shù)據(jù)處理------------------------*/
void  disp_count()
{  
display[7]=(zhuan/1000+'0');    //轉(zhuǎn)換轉(zhuǎn)速的千位  
display[8]=(zhuan/100%10+'0');    //轉(zhuǎn)換轉(zhuǎn)速的百位  
display[9]=(zhuan/10%10+'0');    //轉(zhuǎn)換轉(zhuǎn)速的十位   
display[10]=(zhuan%10+'0');    //轉(zhuǎn)換轉(zhuǎn)速的個位
}
/*-------------------------------------------------------*/
/*----------------------端口初始化-----------------------*/
void int_all()
{  
                  in1=1;                        //下面五行為啟停、正反轉(zhuǎn)初始化
                in2=0;                        //2
                LED1=0;                        //3
                LED2=0;                        //4
                ENA=0;                        //5
        z=0;       //初始化z的值  
        cou=0;      //初始化co的值  
        zhuan=0;      //初始化轉(zhuǎn)的值  
        rw=0;       //選擇LCD寫數(shù)據(jù)指令  
        delay1(15);      //延時15ms  
        write_command(0x38);     //向LCD1602寫命令38H  
        delay1(5);      //延時5ms  
        write_command(0x0e);     //向LCD1602寫命令0EH  
        delay1(5);      //延時5ms  
        write_command(0x06);     //向LCD1602寫命令06H
        TMOD=0x21;      //內(nèi)部中斷定時器選擇;定時器0工作在方式1,定時器1工作在方式2
        TH0=0x3C;      //50ms定時  
        TL0=0xb0;
                TR0=1;         //定時器0工作,用于測速
                TH1=0xA3;                  //1ms定時
            TL1=0xA3;
                TR1=1;                  //定時器1工作,用于調(diào)速
        EA=1;       //開中斷總開關(guān)

                IT1=1;       //外部中斷1為下降沿觸發(fā)   
                ET1=1;                   //T1允許中斷
                ET0=1;                        //T0允許中斷
                EX1=1;                  //外部中斷1允許中斷
               
}

void main()
{       
        int_all();
        ENA=0;
        while(1)
        {       
                qiting();
                zhengfan();
                if(k1==0)
                {
                        speed_control();
                }
                disp_count();     //數(shù)據(jù)處理
        displaytolcd();     //LCD顯示
        }
}
終于調(diào)試成功了,上傳到這上面共后來者參考。
回復

使用道具 舉報

9#
ID:196520 發(fā)表于 2017-6-3 20:52 | 只看該作者
好好學習,天天向上。嗯!沒了。

QQ截圖20170603204213.png (45.77 KB, 下載次數(shù): 112)

這是仿真圖,因為proteus中好像沒有霍爾元件,所以沒法實時測轉(zhuǎn)速,實現(xiàn)的功能就是電機啟停、正反轉(zhuǎn)、加減 ...

這是仿真圖,因為proteus中好像沒有霍爾元件,所以沒法實時測轉(zhuǎn)速,實現(xiàn)的功能就是電機啟停、正反轉(zhuǎn)、加減 ...
回復

使用道具 舉報

10#
ID:209158 發(fā)表于 2017-12-16 23:43 | 只看該作者
哎喲喂,懂了! 發(fā)表于 2017-5-16 12:54
直流電機,用單片機輸出PWM信號,再用L298驅(qū)動電機

仿真里面沒有L298n啊
回復

使用道具 舉報

11#
ID:447777 發(fā)表于 2019-4-14 09:29 | 只看該作者
連上傳感器就能測實時轉(zhuǎn)速嗎?要是連光電傳感器呢?怎么改啊
回復

使用道具 舉報

12#
ID:544760 發(fā)表于 2019-5-23 18:29 | 只看該作者
哎喲喂,懂了! 發(fā)表于 2017-6-3 20:52
好好學習,天天向上。嗯!沒了。

你上面那個程序還是不能用啊
回復

使用道具 舉報

13#
ID:511890 發(fā)表于 2019-5-24 03:13 | 只看該作者
測量下你仿真圖左下角的那個U4(A:A)有沒有波形。你的電機是在中斷中運行的,受到P3.3腳控制。顯示是都沒顯示還是無法顯示轉(zhuǎn)速?你在兩個地方都調(diào)用了displaytolcd()。這可能會導致顯示混亂。如果是沒顯示轉(zhuǎn)速有P3.2接霍爾了沒有?
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜久久久久久久久久一区二区 | 日本成人中文字幕在线观看 | 日韩三级免费网站 | 亚洲二区视频 | 99精品免费久久久久久久久日本 | 国产精品一码二码三码在线 | 日韩成人在线网站 | 一区日韩 | 天天艹天天干天天 | 久久久久九九九女人毛片 | 亚洲一区二区精品视频 | 欧美婷婷 | 亚洲精品www久久久 www.蜜桃av | 伊人久操 | 婷婷桃色网 | 免费a级毛片在线播放 | 日韩精品网站 | 日本精品一区二区三区在线观看视频 | 华人黄网站大全 | 国产欧美一区二区三区另类精品 | 成年视频在线观看福利资源 | 免费成人国产 | 国产激情一区二区三区 | 玖玖在线免费视频 | 久热久草 | 欧美成人激情 | 成人午夜网站 | 国产伊人精品 | 91精品国产美女在线观看 | 欧美一区二区三区一在线观看 | 麻豆a级片 | 国产精品一区二区三区在线 | 欧美日韩在线一区二区 | 中文字幕一区二区三区在线观看 | 2018天天干天天操 | 免费毛片网 | 成人欧美日韩一区二区三区 | 天堂久久久久久久 | 超碰在线免费公开 | 欧美日高清视频 | 久久精品欧美一区二区三区麻豆 |