⑴ 單片機設計題目 轉速計的設計(LED顯示)
可以做,但有償!這不是舉手之勞,是要坐下來好好細心寫並調試的。要尊重知識!
⑵ 網站遲遲未被收錄沒有備案,請問怎麼辦啊
堅持有規律的優化更新,網站完善得差不多後,向網路等搜索引擎提交網站的地址就行了。
⑶ 求基於51單片機的轉速測量的設計(代碼),最好C語言實現的,給些指導也行!
測速得需要外部電路啊,單個單片機不行啊,如上圖測電機轉的速度就加了編碼盤,和光電感測器測速啊。
⑷ 設計一個由單片機控制的電機轉速檢測系統,實時監測電機的轉速,達到設定值,聲音報警提示謝謝好心人啊!
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顯示
}
}
⑸ 單片機課程設計轉速測量儀設計
這個你使用單片機P3.5腳的T1計數器功能就可以實現了,
不過注意一點,你所採集的信號要通過施密特反相器,否則有可能誤判;
⑹ 用單片機中斷功能實現轉速的測量
我的博客上有一個用中斷計數的程序,你可以去參考,實際上轉速大多是產生的脈沖.
⑺ 基於51單片機的轉速測量設計,程序編寫!電路模擬圖
測量轉速,使用光電感測器,被測電機帶動紙片旋轉,我們在紙片上開了10小孔,電機每旋轉一周就會產生10個脈沖,產生12個脈沖,要求將轉速值(轉/分)顯示在數碼管上。
實驗程序如下:
#include<REG52.H>
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
#defineLED_DATP1
sbitLED_SEG0=P0^3;
sbitLED_SEG1=P0^2;
sbitLED_SEG2=P0^1;
sbitLED_SEG3=P0^0;
//sbitpin_SpeedSenser=P3^5;//光電感測器信號接在T1上
#defineTIME_CYLC100//12M晶振,定時器10ms中斷一次我們1秒計算一次轉速//1000ms/10ms=100
#definePLUS_PER10//碼盤的齒數,這里假定碼盤上有10個齒,即感測器檢測到10個脈沖,認為1圈
#defineK100.0//校準系數
unsignedcharcodetable[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchardataDisbuf[4];//顯示緩沖區
uintTcounter=0;//時間計數器
bitFlag_Fresh=0;//刷新標志
bitFlag_clac=0;//計算轉速標志
bitFlag_Err=0;//超量程標志
//在數碼管上顯示一個四位數
voidDisplayFresh();
//計算轉速,並把結果放入數碼管緩沖區
voidClacSpeed();
//初始化定時器T0
voidinit_timer0();
//初始化定時器T1
voidinit_timer1();
//延時函數
voidDelay(uintms);
voidit_timer0()interrupt1/*interruptaddressis0x000b*/
{
TF0=0;//d定時器T0用於數碼管的動態刷新
//
TH0=0xC0;/*initvalues*/
TL0=0x00;
Flag_Fresh=1;
Tcounter++;
if(Tcounter>TIME_CYLC)
{Flag_clac=1;//周期到,該重新計算轉速了
}
}
voidit_timer1()interrupt3/*interruptaddressis0x001b*/
{
TF1=0;//定時器T1用於單位時間內收到的脈沖數
//要速度不是很快,T1永遠不會益處
Flag_Err=1;//如果速度很高,我們應考慮另外一種測速方法,:脈沖寬度算轉速
}
voidmain(void)
{
Disbuf[0]=0;//開機時,初始化為0000
Disbuf[1]=0;
Disbuf[2]=0;
Disbuf[3]=0;
init_timer0();
init_timer1();
while(1)
{
if(Flag_Fresh)
{Flag_Fresh=0;
DisplayFresh();//定時刷新數碼管顯示
}
if(Flag_clac)
{Flag_clac=0;
ClacSpeed();//計算轉速,並把結果放入數碼管緩沖區
Tcounter=0;//周期定時清零
TH1=TL1=0x00;//脈沖計數清零
}
if(Flag_Err)//超量程處理
{
//數碼管顯示字母'EEEE'
Disbuf[0]=0x9e;//開機時,初始化為0000
Disbuf[1]=0x9e;
Disbuf[2]=0x9e;
Disbuf[3]=0x9e;
while(1)
{DisplayFresh();//不再測速等待復位i
}
}
}
}
//在數碼管上顯示一個四位數
voidDisplayFresh()
{
P2|=0xF0;
LED_SEG0=0;
LED_DAT=table[Disbuf[0]];
Delay(1);
P2|=0xF0;
LED_SEG1=0;
LED_DAT=table[Disbuf[1]];
Delay(1);
P2|=0xF0;
LED_SEG2=0;
LED_DAT=table[Disbuf[2]];
Delay(1);
P2|=0xF0;
LED_SEG3=0;
LED_DAT=table[Disbuf[3]];
Delay(1);
P2|=0xF0;
}
//計算轉速,並把結果放入數碼管緩沖區
voidClacSpeed()
{
uintspeed;
uintPlusCounter;
PlusCounter=TH1*256+TL1;
speed=K*(PlusCounter/PLUS_PER)/60;//K是校準系數,如速度不準,調節K的大小
Disbuf[0]=(speed/1000)%10;
Disbuf[1]=(speed/100)%10;
Disbuf[2]=(speed/10)%10;
Disbuf[3]=speed%10;
}
//初始化定時器T0
voidinit_timer0()
{
TMOD&=0xf0;//定時10毫秒/*Timer0mode1withsoftwaregate*/
TMOD|=0x01;/*GATE0=0;C/T0#=0;M10=0;M00=1;*/
TH0=0xC0;/*initvalues*/
TL0=0x00;
ET0=1;/*enabletimer0interrupt*/
EA=1;/*enableinterrupts*/
TR0=1;/*timer0run*/
}
//延時函數
voidDelay(uintms)
{
uchari;
while(ms--)
for(i=0;i<100;i++);
}
//初始化定時器T1
voidinit_timer1()
{
TMOD&=0x0F;/*Counter1mode1withsoftwaregate*/
TMOD|=0x50;/*GATE0=0;C/T0#=1;M10=0;M00=1;*/
TH1=0x00;/*initvalues*/
TL1=0x00;
ET1=1;/*enabletimer1interrupt*/
EA=1;/*enableinterrupts*/
TR1=1;/*timer1run*/
}
⑻ 基於at89c51單片機的電子式轉速里程錶設計應該怎樣答辯
可以做這個~~
⑼ 基於51單片機轉速測量的程序,望高手幫我解釋一下。
#include <reg51.h>
#include <INTRINS.H>
#define FOSC 11.0592
unsigned int speed;
unsigned char key;
unsigned char led_table[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xff,0xf6};
long speed_count,speed_count1;
unsigned char speed_check;
unsigned int second_flag;
unsigned char speed_table[4];
unsigned char speed_table1[10];
//定時器頻率1000Hz
void timer1_init(void)
{
EA=0;
TMOD=0x10;
//TH1=1000*FOSC/12/256;
//TL1=(unsigned int)(1000*FOSC/12)%256;
TH1=254;
TL1=51;
TR1=1;
TCON|=0X04; //外部中斷下降觸發
EX1=1; //允許外部中斷
ET1=1;
EA=1;
}
void int1_routine(void) interrupt 2
{
speed_count++;
P1^=0X02;
}
void timer1_routine(void) interrupt 3
//void timer1_routine(void)
{
TH1=254;
//TH1=0xf0;
TL1=51;
//speed_count++;
second_flag++;
}
void main(void)
{
unsigned int i,j,k;
// unsigned char sum;
unsigned speed_table[3];
long time_id;
timer1_init();
speed=0;
P2=0x0f;
P0=0xf0;
P3=0x08;
key=0;
P1=0x00;
speed_check=0;
while(1)
{
//P1^=0XFE;
j=1;
//speed=1234;
speed_table[0]=speed/1000;
speed_table[1]=speed%1000/100;
speed_table[2]=speed%100/10;
speed_table[3]=speed%10;
for(i=0;i<4;i++)
{
P2=j^0xff;
j<<=1;
P0=(led_table[speed_table[i]])&0xfe;
for(k=0;k<250;k++) ;
}
//speed=speed_count;
if(second_flag>=1000) /*中斷1000次進入 */
{
second_flag=0;
time_id++;
speed_table1[time_id%10]=speed_count;/*外部中斷量轉存(是很聰明的方法學習了)*/
speed_count=0;
speed=(speed_table1[0]+speed_table1[1]+speed_table1[2]+speed_table1[3]+speed_table1[4]+speed_table1[5]+speed_table1[6]+speed_table1[7]+speed_table1[8]+speed_table1[9])*6; /*(10X6)10秒的外部中斷量乘以6就是轉速了*/
//speed=speed/2+(speed_table[0]+speed_table[1]+speed_table[2])*6;
}
}
}
⑽ 基於單片機的轉速測量系統設計,求硬體原理圖,模擬圖。知道的熱心人士能不能發給我,[email protected]
這個可以幫你,不過最好你能寫寫具體的設計要求,那就更好了