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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

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

查看數: 14607 | 評論數: 12 | 收藏 2
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2017-5-16 08:37

正文摘要:

程序出問題了,電機轉不了,顯示也出不來。單片機新手,看不出哪兒出了問題。麻煩論壇里能幫忙朋友們幫我看看,謝謝 #include"reg51.h" #define uchar unsigned char #define uint unsigned int sbit k1=P1^ ...

回復

ID:511890 發表于 2019-5-24 03:13
測量下你仿真圖左下角的那個U4(A:A)有沒有波形。你的電機是在中斷中運行的,受到P3.3腳控制。顯示是都沒顯示還是無法顯示轉速?你在兩個地方都調用了displaytolcd()。這可能會導致顯示混亂。如果是沒顯示轉速有P3.2接霍爾了沒有?
ID:544760 發表于 2019-5-23 18:29
哎喲喂,懂了! 發表于 2017-6-3 20:52
好好學習,天天向上。嗯!沒了。

你上面那個程序還是不能用啊
ID:447777 發表于 2019-4-14 09:29
連上傳感器就能測實時轉速嗎?要是連光電傳感器呢?怎么改啊
ID:209158 發表于 2017-12-16 23:43
哎喲喂,懂了! 發表于 2017-5-16 12:54
直流電機,用單片機輸出PWM信號,再用L298驅動電機

仿真里面沒有L298n啊
ID:196520 發表于 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++)      //延時第一循環   
        for (i=0;i<120;i++);    //延時第二循環  
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602寫命令--------------------*/
void write_command(uchar command)
{
        rs=0;           //數據、命令選擇端0為命令
        rw=0;           //讀、寫選擇端0為寫
        P0=command;      //向LCD寫命令
        delay1(5);      //稍做延遲,代替檢測忙狀態  
        e=1;             //信號使能端高電平
        delay1(5);      //稍做延遲,代替檢測忙狀態  
        e=0;            //信號使能端低電平
}
/*-------------------------------------------------------*/
/*--------------------向LCD1602寫數據--------------------*/
void write_data(uchar data0)
{
        rs=1;       //數據、命令選擇端 1為數據
        rw=0;       //讀、寫選擇端0為寫
        P0=data0;      //向LCD寫數據
        delay1(5);      //稍做延遲,代替檢測忙狀態
        e=1;      //信號使能端高電平
        delay1(5);     //稍做延遲,代替檢測忙狀態
        e=0;      //信號使能端低電平
}
/*-------------------------------------------------------*/
/*-------------------外部中斷1計數程序-------------------*/
void counter(void) interrupt 2
{   

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

}
/*-------------------------------------------------------*/
/*------------------------LCD顯示------------------------*/
void displaytolcd()
{  
  write_command(0x80);     //向LCD1602寫命令80H  
  for (i=0;i<sizeof(display)-1;i++)   //循環要傳輸的字符個數次,每一次傳一個字符  
  {   
    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為下降沿觸發   
                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顯示
        }
}
終于調試成功了,上傳到這上面共后來者參考。
ID:201346 發表于 2017-5-16 14:36
對,出了什么問題呢?
ID:201278 發表于 2017-5-16 13:59
學習了,想知道問題到底出在哪?
ID:196520 發表于 2017-5-16 12:59
cjjcjj1 發表于 2017-5-16 10:03
你好!說一下你的整體思路和實現的過程

運用51單片機輸出pwm信號,再運用電機驅動芯片L298驅動直流電機轉動,用按鍵控制啟停、正反轉、運用PWM占空比多少調速;運用霍爾元件測電機轉速,在通過LCD顯示轉速。
ID:196520 發表于 2017-5-16 12:54
呆萌俠 發表于 2017-5-16 10:00
用示波器看下PWM出來的波形是否正常。電機是什么電機,用的什么驅動呢?

直流電機,用單片機輸出PWM信號,再用L298驅動電機
ID:82765 發表于 2017-5-16 10:03
提示: 作者被禁止或刪除 內容自動屏蔽
ID:201220 發表于 2017-5-16 10:00
用示波器看下PWM出來的波形是否正常。電機是什么電機,用的什么驅動呢?

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲久久久 | 91se在线 | 成人精品在线观看 | 亚洲一区久久 | 日本视频中文字幕 | 日韩国产高清在线观看 | 999久久久久久久久 国产欧美在线观看 | 精品国产乱码久久久久久蜜柚 | 成年人网站免费视频 | 日日干夜夜操 | 亚洲精品一二三区 | 国产亚洲精品美女久久久久久久久久 | 国产精品亚洲视频 | 中国大陆高清aⅴ毛片 | 国产精品海角社区在线观看 | 日韩一区二区三区在线 | 色爱区综合 | 欧美一级免费片 | 精品国产一区二区国模嫣然 | 国产一区二区三区四区五区3d | 性一交一乱一透一a级 | 91精品www| 免费观看毛片 | 男人的天堂亚洲 | 国产偷录叫床高潮录音 | 中文一区 | 精品少妇一区二区三区日产乱码 | 亚洲一区二区三区四区五区中文 | 少妇一级淫片aaaaaaaaa | av网站免费 | 成年免费大片黄在线观看岛国 | 第四色影音先锋 | 国产伦精品一区二区三区照片91 | 欧美一区二区免费 | 日日网| 久久国产精品一区二区 | 久草成人 | 国产精品日产欧美久久久久 | 亚洲精品一二三区 | 国产日韩欧美中文 | 色欧美综合 |