![]() |
發(fā)布時間: 2017-5-16 08:37
正文摘要:程序出問題了,電機轉(zhuǎn)不了,顯示也出不來。單片機新手,看不出哪兒出了問題。麻煩論壇里能幫忙朋友們幫我看看,謝謝 #include"reg51.h" #define uchar unsigned char #define uint unsigned int sbit k1=P1^ ... |
測量下你仿真圖左下角的那個U4(A:A)有沒有波形。你的電機是在中斷中運行的,受到P3.3腳控制。顯示是都沒顯示還是無法顯示轉(zhuǎn)速?你在兩個地方都調(diào)用了displaytolcd()。這可能會導致顯示混亂。如果是沒顯示轉(zhuǎn)速有P3.2接霍爾了沒有? |
哎喲喂,懂了! 發(fā)表于 2017-6-3 20:52 你上面那個程序還是不能用啊 |
連上傳感器就能測實時轉(zhuǎn)速嗎?要是連光電傳感器呢?怎么改啊 |
哎喲喂,懂了! 發(fā)表于 2017-5-16 12:54 仿真里面沒有L298n啊 |
#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)試成功了,上傳到這上面共后來者參考。 |
對,出了什么問題呢? |
學習了,想知道問題到底出在哪? |
cjjcjj1 發(fā)表于 2017-5-16 10:03 運用51單片機輸出pwm信號,再運用電機驅(qū)動芯片L298驅(qū)動直流電機轉(zhuǎn)動,用按鍵控制啟停、正反轉(zhuǎn)、運用PWM占空比多少調(diào)速;運用霍爾元件測電機轉(zhuǎn)速,在通過LCD顯示轉(zhuǎn)速。 |
呆萌俠 發(fā)表于 2017-5-16 10:00 直流電機,用單片機輸出PWM信號,再用L298驅(qū)動電機 |
用示波器看下PWM出來的波形是否正常。電機是什么電機,用的什么驅(qū)動呢? |
Powered by 單片機教程網(wǎng)