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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14263|回復: 12
打印 上一主題 下一主題
收起左側

基于51單片機PWM調速,用霍爾元件測速,并實時顯示轉速,程序出問題了。

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

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


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

        count=0;   
        z=0;

   }
}
/*-------------------------------------------------------*/
/*----------------------端口初始化-----------------------*/
void int_all()
{  
        z=0;       //初始化z的值  
        count=0;      //初始化count的值  
        zhuan=0;      //初始化轉的值  
        rw=0;       //選擇LCD寫數據指令  
        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;      //內部中斷定時器選擇;定時器0工作在方式1,定時器1工作在方式2
        TH0=0x3c;      //50ms定時  
        TL0=0xb0;
                TH1=0xF7;                  //
            TL1=0xF7;
        EA=1;       //開中斷總開關
                IT0=1;       //外部中斷0為下降沿觸發(fā)
        ET0=1;       //開內部中斷0
        TR0=1;       //計時器開始工作   
        EX0=1;       //開外部中斷0

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

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

這是仿真的圖

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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;                                  //正反轉按鍵K2
sbit up=P1^2;                                  //加速按鍵up
sbit down=P1^3;                                  //減速按鍵down
sbit in1=P1^5;                                  //正反轉輸入口
sbit in2=P1^6;
sbit ENA=P1^7;                                  //PWM信號輸入口
sbit LED1=P2^3;                                   //綠燈正轉
sbit LED2=P2^4;                                   //紅燈反轉
uchar a=1;
uchar c=0;
uchar count=48;                              //速度上限
uchar t=0;
char speed=20;                              //初始速度

/*-----------------------端口命名------------------------*/
sbit rs=P2^0;                 //LCD的數據/命令選擇端
sbit rw=P2^1;                  //LCD的讀寫選擇端
sbit e=P2^2;                   //LCD的使能信號端  
/*-------------------------------------------------------*/
/*-----------------------定義參數------------------------*/
uint i,z,cou,zhuan,msec;     //定義參數
uchar display[]={"speed=     r/min "};     //定義顯示參數
/*-------------------------------------------------------*/
/*-----------------------正反轉延時函數------------------*/
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--);
        }
}
/*------------------------------------------------------*/
/*-----------------------啟停函數------------------------*/
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;
        }
}         
/*-------------------------------------------------------*/
/*-----------------------正反轉函數----------------------*/
void zhengfan()
{        if(k1==1)
        {
                ENA=0;
        }
        else if(k2==1)                       //正轉
        {
                LED1=1;
                LED2=0;
                delay();
                ENA=1;
                in1=1;
                in2=0;
        }
        else if(k2==0)                                  //開關按下反轉
        {
                LED1=0;
                LED2=1;
                delay();
                ENA=1;
                in1=0;
                in2=1;
        }               
}
/*--------------------------------------------------------*/
/*-----------------------增減速函數-----------------------*/
void speed_control()
{

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

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

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

                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();     //數據處理
        displaytolcd();     //LCD顯示
        }
}
終于調試成功了,上傳到這上面共后來者參考。
回復

使用道具 舉報

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

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

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

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

使用道具 舉報

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

仿真里面沒有L298n啊
回復

使用道具 舉報

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

使用道具 舉報

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腳控制。顯示是都沒顯示還是無法顯示轉速?你在兩個地方都調用了displaytolcd()。這可能會導致顯示混亂。如果是沒顯示轉速有P3.2接霍爾了沒有?
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美乱人伦视频 | 91久久精品一区二区二区 | 国产成人久久精品一区二区三区 | 欧美在线观看网站 | 视频一区二区三区中文字幕 | 亚洲国产成人精品女人久久久 | 色偷偷噜噜噜亚洲男人 | 国产精品a一区二区三区网址 | 亚洲一区中文字幕 | 久久久九九 | 日韩免费一区二区 | 热re99久久精品国99热观看 | www.日日干| 国产永久免费 | 可以免费观看的av | 精品视频免费 | 国产福利在线小视频 | 欧美视频二区 | 日韩图区 | 一级二级三级在线观看 | 一区二区在线 | 欧美日韩一| 三级视频在线观看电影 | 伊人久操| 亚洲在线一区 | 亚洲视频免费观看 | 国产亚洲成av人在线观看导航 | 久久久成人精品 | 日韩精品中文字幕一区二区三区 | 日韩一区二区三区在线视频 | 亚洲综合五月天婷婷 | 午夜精品一区二区三区在线视 | 国产色视频网站 | 91麻豆产精品久久久久久夏晴子 | 国际精品久久 | 欧美日韩在线一区 | 久久国产精品亚洲 | 久久国产欧美一区二区三区精品 | 日韩在线精品强乱中文字幕 | 亚洲精品久久久蜜桃网站 | 亚洲一区中文字幕在线观看 |