導航:首頁 > 操作系統 > 單片機的電機轉速表設計視頻

單片機的電機轉速表設計視頻

發布時間:2022-06-24 09:38:55

Ⅰ 跪求!單片機直流電機轉速控制帶速度顯示的,課程設計!!有圖有!程序!!急啊!!

#include <showfun.h>
#include <stdio.h>

extern char fnLCMInit(); // LCM 初始化
extern void at(unsigned char x,unsigned char y);/*設定文本x,y值*/
extern void cls(); // 清屏
extern void charout(unsigned char *str); //ASCII(8*8) 顯示函數
extern void fnSetPos(unsigned char urow, unsigned char ucol); // 設置當前地址
extern uchar dprintf(uchar x,uchar y,char *fmt);// ASCII(8*16) 及 漢字(16*16) 顯示函數
extern uchar fnPR12(uchar uCmd); // 寫無參數的指令
extern uchar fnPR13(uchar uData); // 寫數據
extern unsigned int Adc0832(unsigned char channel);
extern void Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode);
extern void Pixel(unsigned char PointX,unsigned char PointY, bit Mode);

uchar dsp[10]={0,0,0,0,0,0,0,0,0,0,};
char abc[3]={0,0,0,};
uchar key=0;
uint a=100;
uchar n=5;
uchar count=1;
uint k1=0;

uchar GeyKey();
void delay(uchar i);
void control();

main()
{

fnLCMInit();
fnSetPos(0,0);
dprintf(0,0,"直流電機加-減速及測速系統");
dprintf(0,12,"鍵盤+:步長加速");
dprintf(0,24,"鍵盤-:步長減速");
dprintf(0,36,"鍵盤=:順時針轉");
dprintf(0,48,"鍵盤on/c:逆時針轉");

dprintf(0,72,"方向:");
dprintf(0,84,"轉速:");

P1_1=0;
TMOD=0x15;
TH1=0x3c;
TL1=0xb0;
TH0=0x00;
TL0=0x00;
ET0=1;
ET1=1;
TR0=1;
TR1=1;

while(1)
{ key=GeyKey();
switch(key)
{ case '1': { a=10;
//sprintf(abc,"%3.2f",a/255.0);
dprintf(0,96," 5 r/min");
//dprintf(0,96,abc);
dprintf(60,96,"r/min");
break; }
case '2': { a=25;dprintf(0,96," 25 r/min"); break; }
case '3': { a=40; dprintf(0,96," 40 r/min"); break; }
case '4': { a=55; dprintf(0,96," 60 r/min"); break; }
case '5': { a=70; dprintf(0,96," 80 r/min"); break; }
case '6': { a=90; dprintf(0,96,"100 r/min"); break; }
case '7': { a=110; dprintf(0,96,"120 r/min"); break; }
case '8': { a=130; dprintf(0,96,"135 r/min"); break; }
case '9': { a=150; dprintf(0,96,"150 r/min"); break; }
case '+': { dprintf(0,72,"方向: 順時針");
control();
break;
}
case '-': { P1_0=0;
dprintf(0,72,"方向: 逆時針");
control();
break;
}
case '=': {P1_0=1;dprintf(0,72,"方向: 順時針");break;}
case 'c': {P1_0=0;dprintf(0,72,"方向: 逆時針");break;}
case '/': {dprintf(0,72,"方向: 順時針");
control();}
default: break;
}
}
}

uchar GeyKey()
{
P1_4=0;
P1_5=1;
P1_6=1;
P1_7=1;
P3_0=1;
P3_1=1;
P3_2=1;
P3_3=1;
_nop_();_nop_();
if(!P3_0)return '7';
if(!P3_1)return '8';
if(!P3_2)return '9';
if(!P3_3)return '/';
P1_4=1;
P1_5=0;
P1_6=1;
P1_7=1;
_nop_();_nop_();
if(!P3_0)return '4';
if(!P3_1)return '5';
if(!P3_2)return '6';
if(!P3_3)return '*';

P1_4=1;
P1_5=1;
P1_6=0;
P1_7=1;
_nop_();_nop_();
if(!P3_0)return '1';
if(!P3_1)return '2';
if(!P3_2)return '3';
if(!P3_3)return '-';

P1_4=1;
P1_5=1;
P1_6=1;
P1_7=0;
_nop_();_nop_();
if(!P3_0)return 'c';
if(!P3_1)return '0';
if(!P3_2)return '=';
if(!P3_3)return '+';

return 0;
}

void delay(uchar i)
{ uchar j,k;
for(;i>0;i--)
for(j=15;j>0;j--)
for(k=11;k>0;k--);
}

void time()interrupt 3
{
TR1=0;
count++;
k1+=TL0;
if(count==51)
{
sprintf(dsp,"%3d",k1);
dprintf(0,108,dsp);
dprintf(60,108,"r/min");
count=1;
k1=0;
}
TH1=0x3c;
TL1=0xb0;
TH0=0x00;
TL0=0x00;
TR1=1;

}

void control()
{
EA=1;
while(1)
{ if(a>=150)
a=150;
if(a<=10)
a=10;
P1_1=0;
delay(160-a);
P1_1=1;
delay(a);
key=GeyKey();
if(key=='-') a-=n;
else
if(key=='+') a+=n;
else
if(key=='=')
{ P1_0=1;
dprintf(0,72,"方向: 順時針");
}
else
if(key=='c')
{ P1_0=0;
dprintf(0,72,"方向: 逆時針");
}
else
if(key=='*')
{ P1_1=0;
break;
}
else
if(key!=0)
break;
}
EA=0;
}

Ⅱ 51單片機轉速表

用霍爾感測器採集轉速,然後用單片機的某一個引腳老接收高低電平信號,可以根據兩個相鄰的相同的電平之間的時間來求出轉動的頻率,再用LED來顯示,其實很簡單。多注意思考,多動手,自己寫程序,相信自己。

Ⅲ 如何用c51單片機設計汽車轉速表

不管用什麼來 你用C51的int管腳來測量電平信號的改變"其實就外部是中斷管腳" 圖中就是一種旋轉編碼器 假定編碼器旋轉1周給出的是1000次的電平跳變 那麼根據你的輪子轉一圈 編碼器轉N圈的比率 你在單片機的定時器裡面給出1S的采樣時間 輸出共多少次外部中斷觸發 就可以知道車速了

假定輪子周長是1m的話 輪子轉1圈 編碼器轉10圈 那麼如果1秒鍾轉1圈的輪子 最後單片機在1S內就應該得到 1 × 10 × 1000 = 10000次中斷信號那麼1秒一圈的輪子車速是多少呢 1m × 3600s = 3.6km/m = 216km/h

那麼在1S內 只有5000次中斷 就說明車速是上述過程的一半 即 108km/h

那麼 這就是一個正比例函數 n/100000 = V / 216; n是實際測出的1s內的中斷次數 v就是當前的速度

Ⅳ 單片機數顯轉速表的設計與製作 請高手幫忙看看哈!哪裡有什麼錯好像轉速值不對!

你的錯誤太多了,分太少,就不在你基礎上改了,其實這個功能很簡單,有兩種方式實現功能,我個人比較習慣用C,所以就不用匯編寫了
方式1:
#include<reg51.h>
sbit START=P0^0; //設置P0.0為開始按鍵
unsigned int k;
main()
{
EA=1;
P0=0;
P1=0;
TMOD=0x51; //T1為16位計數器,T0為16位計時器,使用晶振11.0592
TH0=0x4c; //50MS
TL0=0x00;
L0:
TR0=0;
k=0;
while(START==0);
TR0=1;
while(k!=20); //等待一分鍾
TR0=0;
P1=TH1*256+TL1;//最大計數不得大於65355,由P1口讀出計數值
goto L0;
}
void counter1(void) interrupt 1 //T0中斷
{
TH0=0x4c; //50MS
TL0=0x00;
TR0=1;
k++;
}
void counter3(void) interrupt 3 //T1中斷
{
TH0=0x00; //復位
TL0=0x00;
//這里可以加提示超量程語句
}
方式2
這種方式最簡單也是我最喜歡用的,就是中斷方式,直接給周期脈沖給中斷,1分鍾後,得出周期數
#include<reg51.h> //使用晶振11.0592
sbit START=P0^0; //設置P0.0為開始按鍵
unsigned int k;
main()
{
unsigned int i,j;
P0=0;
P1=0;
EA=1;EX0=1;IT0=1;
L0:
k=0;
while(START==0);

for(i=20;i>0;i--) //1分鍾延遲
for(j=46080;j>0;j--);
P1=k;//最大計數不得大於65355,由P1口讀出計數值
goto L0;
}
void counter0(void) interrupt 0 //外部中斷0,脈沖口直接接到外部中斷0口
{
k++;
}
程序都經過調試,能很好的完成你的要求

Ⅳ 如何利用單片機設定直流電機轉速

最好的辦法是在電動機軸上安裝測轉速的感測器,單片機檢測轉速,通過軟體與設定值比較,控制
PWM電路
,控制電動機的轉速。

Ⅵ 畢設基於單片機的旋轉顯示屏,電機的轉速是多少速度是怎麼設定的

轉速是恆定的由電機的額定轉速決定
也可自行調節電壓或pwm
作為旋轉LED這些問題不大
主要的是單片機要知道電機的轉速
可通過紅外對管(或在旋轉pcb上裝光電門下面裝一個遮擋片)測量電機轉速
轉速是1分鍾轉的累計圈數
你可以測量
1秒轉的圈數成60就是轉速
通過轉速大小來設置led延時的長短

Ⅶ 設計一個由單片機控制的電機轉速檢測系統,實時監測電機的轉速,達到設定值,聲音報警提示謝謝好心人啊!

LCD1602顯示,如果轉速達到5000R/MIN,蜂鳴器就會報警
#include <reg52.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
/*-----------------------埠命名------------------------*/
sbit lcdrs=P2^7; //LCD的數據/命令選擇端
sbit lcdrw=P2^6; //LCD的讀寫選擇端
sbit lcden=P2^5; //LCD的使能信號端
sbit warning=P3^1; //蜂鳴器端
/*-------------------------------------------------------*/
/*-----------------------定義參數------------------------*/
uint i,j,z,count,zhuan,msec; //定義參數
uchar num,ge,shi,,qian; //變數聲明
uchar code table0[]={"Velometer"}; //定義顯示參數
uchar code table1[]={"Speed: r/min"};
/*-------------------------------------------------------*/
/*-----------------------毫秒延時------------------------*/
void delay0(uint z) //延時函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}

/*-------------------------------------------------------*/
/*--------------------向LCD1602寫命令--------------------*/
void write_com(uchar com)//寫命令子函數--寫指令
{
lcdrs=0;lcden=0;lcdrw=0; //此時命令
P0=com;//命令寫入P0口
delay0(5);
lcden=1;
delay0(5);//出現下降沿
lcden=0;
}

/*-------------------------------------------------------*/
/*--------------------向LCD1602寫數據--------------------*/
void write_data(uchar date)//寫命令子函數--寫數據
{
lcdrs=1;lcden=0;lcdrw=0;
P0=date;//數據寫入P0
delay0(5);
lcden=1;
delay0(5);//出現下降沿
lcden=0;
}

/*-------------------------------------------------------*/
/*-------------------外部中斷0計數程序-------------------*/
void counter(void) interrupt 0
{
EX0=0; //關外部中斷0
count++;
if(count==4) //4次循環為電機轉一圈
{
count=0; //初始化計數
z++; //轉圈計數加1
} //計數+1
EX0=1; //開外部中斷0
return;
}

/*-------------------------------------------------------*/
/*-----------------內部中斷0計時計數程序-----------------*/
void Timer_0(void) interrupt 1
{
TH0=0x3C; //50ms定時
TL0=0xB0;
msec++;
if(msec==20) //50*20=1S
{
msec=0;
zhuan=z*60;
z=0;
}
}
/*-------------------------------------------------------*/
/*----------------------埠初始化-----------------------*/
void int_all()
{
warning=0; //關蜂鳴器
z=0; //初始化z的值
count=0; //初始化count的值
zhuan=0; //初始化轉的值
TMOD=0x01; //內部中斷定時器選擇
TH0=0x3C; //50ms定時
TL0=0xB0;
lcdrw=0; //選擇LCD寫數據指令
lcden=0; //使能信號開始為低
write_com(0x38); //16*2顯示,5*7點陣,八位數據
delay0(15);
write_com(0x38);
delay0(15);
write_com(0x38);
write_com(0x08);//顯示關、關游標,不閃爍
write_com(0x01);//清屏
delay0(15);
write_com(0x04);
delay0(15);
write_com(0x0c);
EA=1; //開中斷總開關
ET0=1; //開內部中斷0
TR0=1; //計時器開始工作
IT0=1; //外部中斷0為下降沿觸發
EX0=1; //開外部中斷0
}

/*-------------------------------------------------------*/
/*------------------------LCD顯示------------------------*/
void display ()
{
write_com(0x01); //清屏
write_com(0x06); //調用寫命令函數,向右移動游標(增量)
write_com(0x80|0x03); //初始位置
for(num=0;table0[num] != '\0';num++) //第一行的字元
{
write_data(table0[num]);
delay0(1);
}
write_com(0x80|0x40); //換行
for(num=0;table1[num]!='\0';num++)
{
write_data(table1[num]);
delay0(1);
}
qian=(zhuan/1000+'0'); //轉換轉速的千位
=(zhuan/100%10+'0'); //轉換轉速的百位
shi=(zhuan/10%10+'0'); //轉換轉速的十位
ge=(zhuan%10+'0'); //轉換轉速的個位
write_com(0x80|0x46);
write_data(qian);
delay0(50);
write_com(0x80|0x47);
write_data();
delay0(50);
write_com(0x80|0x48);
write_data(shi);
delay0(50);
write_com(0x80|0x49);
write_data(ge);
delay0(5000);
}

/*-------------------------------------------------------*/
/*-------------------轉速過高警告程序--------------------*/
void warning_speed()
{
if(zhuan>2400||zhuan<800) //高於5000轉打開警告
{
warning=1;
}
if(zhuan<=2400&&zhuan>800) //低於5000轉關閉警告
{
warning=0;
}
}
/*-------------------------------------------------------*/
/*------------------------主函數-------------------------*/
void main()
{
int_all(); //全局初始化
while(1)
{
warning_speed(); //轉速警告
display (); //LCD顯示
}
}

Ⅷ 怎樣用單片機控制電機轉速

在這里我只說說一般的直流電機。你可以使單片機一個引腳輸出一個可調占空比的方波,用三極體將這個方波(數字信號)轉成一個穩定的直流(模擬信號)電壓,通過調節占空比,就可以調節這個直流電壓的大小,就可以控制直流電機的轉速了。

Ⅸ 單片機pwm控制電機轉速

單片機控制電機轉速:
如果只有一個轉向的話就比較容易了,如果要有正反兩個轉向,就需要一個H橋,並且兩個I/O口輸出高低電頻控制。
比如用P1口的P1.0,P1.1,P1.2三個I/O口接按鍵,P3.4口接電頻輸出,編個定時程序及按鍵程序,如果是快(全速運行),那就P3.4口直接輸出高電頻「1」;中(50%),那就讓P3.4口0—50ms輸出高電頻「1」,50ms—100ms輸出低電頻「0」,後面就一直以50ms進行一次取反;慢(就用10%吧),0—40ns輸出高電頻「1」,41ns—400ns輸出低電頻「0」,這樣為一個周期,後面就一直循環吧。
如果按鍵P1.0按下,執行方式1,全速運行,否則以默認方式運行;按鍵P1.1按下,執行方式2,改變占空比,以50%的速度運行,否則,不作改變;按鍵P1.2按下,執行方式3,改變占空比,以10%的速度運行,否則,不作改變。

Ⅹ 單片機如何控制電機轉速

利用單片機的定時器TIMER_A(TA)中斷產生脈沖信號,通過在響應的中斷程序中實現步進電機步數和圈數的准確計數,通過PWM實現轉速控制。

可以利用P10埠的中斷關閉TA中斷程序,並推入堆棧,停止電機;P11中斷則開啟TA中斷,堆棧推入程序計器(PC),開啟電機。

P31埠輸出高電平由PMM8713的U/D埠控制電機的轉向;P3.0~P37埠接8279的8個數據介面。

單片機掃描到矩陣鍵盤有鍵按下時,利用P2埠的中斷設置TA,控制啟停、調速和轉向等,同時單片機反饋給8279控制LED管顯示轉速和轉向。

(10)單片機的電機轉速表設計視頻擴展閱讀

1、單片機所接收到控制命令暫存在RXBUFFER中,與存儲在片內Flash的中斷程序的入口地址相比較,相同就進入中斷,實現步進電機的控制。

2、當P1.0中為高電平時,其內部三極體導通,使電機轉動。當P1.0為低電平時,內部三極體截止,電路斷開,電機停止轉動。所以在程序中可以利用P1.0口輸出PWM波來控制電機的轉速。

閱讀全文

與單片機的電機轉速表設計視頻相關的資料

熱點內容
攻城掠地如何注銷其他伺服器 瀏覽:892
資料庫日誌文件壓縮 瀏覽:495
k3壓縮機不工作 瀏覽:728
java編譯後的文件 瀏覽:652
程序員那麼可愛追妻片段28 瀏覽:667
app怎麼上傳相冊的照片 瀏覽:467
詩經集PDF 瀏覽:919
什麼安卓車機互聯軟體最好用 瀏覽:459
列印機伺服器是什麼 瀏覽:546
upxapp是什麼軟體 瀏覽:454
程序員平均年薪40萬 瀏覽:224
java設置單元格格式 瀏覽:957
手機app怎麼主動還款 瀏覽:828
下音樂用什麼app好 瀏覽:598
什麼app能代替酷狗音樂 瀏覽:161
雨刮器怎麼連接安卓手機 瀏覽:85
colorfilterandroid 瀏覽:563
如何連接學院伺服器 瀏覽:954
除了蜜柚app還有什麼 瀏覽:341
單片機寫延時 瀏覽:422