A. 锘轰簬鍗旷墖链虹殑鐢靛姩链鸿皟阃熷疄楠岀郴缁熻捐
鍓嶈█
1
1.镐讳綋璁捐℃柟妗
2
锛堜竴锛夋柟妗堜竴锛歅WM娉㈣皟阃
2
锛堜簩锛夋柟妗堜簩锛氭櫠闂哥¤皟阃
2
2.鍗曞厓妯″潡璁捐
3
锛堜竴锛
H妗ラ┍锷ㄧ数璺璁捐℃柟妗
3
锛堜簩锛
璋冮熻捐℃柟妗
5
锛堜笁锛夌郴缁熺‖浠剁数璺璁捐
6
1.鐢垫簮鐢佃矾
6
2锛嶩妗ラ┍锷ㄧ数璺
6
3锛庡熀浜庨湇灏斾紶镒熷櫒镄勬祴阃熸ā鍧
7
4锛嶭CD鏄剧ず妯″潡
8
锛埚洓锛
璋冮熻捐℃ā鍧
9
1锛嶱WM娉㈣蒋浠惰蒋浠惰捐
9
2锛庢祴阃熻蒋浠惰捐
12
3.绯荤粺锷熻兘璋冭瘯
13
锛堜竴锛夎皟璇曡蒋浠朵粙缁
13
锛堜簩锛夌洿娴佺数链虹殑璋冮熷姛鑳戒豢鐪
14
1锛庤皟阃熷墠镄勬尝褰㈠浘
14
2锛庤皟阃熷悗镄勬尝褰㈠浘
14
锛堜笁锛夌数链洪熷害镄勬祴閲忓苟鏄剧ず锷熻兘浠跨湡
15
锛埚洓锛夌郴缁熺殑鐢佃矾铡熺悊锲
15
锛堜簲锛夌郴缁熺殑PCB锲
16
4.璁捐℃荤粨
17
5.鍙傝冩枃鐚
17
闄勫綍
17
B. 设计一个由单片机控制的电机转速检测系统,实时监测电机的转速,达到设定值,声音报警提示谢谢好心人啊!
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显示
}
}
C. 基于51单片机直流电机调速测速仿真原理
基于51单片机直流电机调速测速仿真原理是以STC90C52RC单片机为主控芯片,利用PWM的原理,通过按键对直流电机进行调速,实现正反转;采用霍尔传感器对直流电机的转动进行计数,并通过主控芯片将采集到的计数值转化为直流电机的当前速度值;利用LCD1602显示模块将计算得到的值进行实时显示。
D. 单片机直流电机调速系统的设计
单片机控制的直流电机调速系统
摘要:本文采用AT89C52作为主控芯片,设计了一种直流电机高速系统。AT89C52产生单极性工作制的定频PWM脉冲,配合驱动能力强大的L298,从而实现控制和调整直流电机转速和转向的功能。利用软件编程,能够设置多个占空比不同的脉冲,使得电机转速可以逐步增大或减小,同时在LCD上显示电机的工作状态,易于观察和识别。本设计主要由电机调速控制模块和LCD显示模块组成,具有电路简单,可靠性高,运行稳定的特点,是对于小型直流电机调速装置的一种探究。
关键词:AT89C52 定频PWM LCD 直流电机
目 录
1 绪论... 1
2 方案设计... 1
2.1 功能要求... 1
2.2 方案论证... 1
3 系统硬件的设计... 3
3.1 电机调速控制模块... 3
3.2 LCD显示模块... 6
3.3 硬件设计总原理图... 11
4 系统软件的设计... 12
4.1 主程序... 12
5 调试及性能分析... 14
5.1 调试与测试... 14
6 结论... 15
7 致谢... 15
参考文献... 17
附录... 18
E. 基于单片机的直流电机调速系统设计怎么测速
测速电路自己设计的话可以使用
红外对管
测速,或者
激光测速
。。。网上也有程序的
测速传感器
,自己找找就好了,有数据手册,可以说明怎么使用的,一般就是
高低电平
变化。你的
直流电机
上需要加一个测速
码盘
,靠这个检测的,也有其他方式,具体看你的测速传感器是什么样的。
F. 用51单片机测电机的转速,,,,,谢谢各位。。
用一个转速传感器或者编码器,利用单片机引脚的脉冲沿捕获中断,1个计数器用于记录2相邻脉冲捕获时间间隔,一个计数器用于记录脉冲数。
然后计算1s时间内脉冲的个数就是频率啦,再通过换算的电机转速;
G. 锘轰簬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;//鍏夌数浼犳劅鍣ㄤ俊鍙锋帴鍦═1涓
#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();
//鍒濆嫔寲瀹氭椂鍣═0
voidinit_timer0();
//鍒濆嫔寲瀹氭椂鍣═1
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;//瀹氭椂鍣═1鐢ㄤ簬鍗曚綅镞堕棿鍐呮敹鍒扮殑鑴夊啿鏁
//瑕侀熷害涓嶆槸寰埚揩锛孴1姘歌繙涓崭细鐩婂
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鏄镙″嗳绯绘暟锛屽傞熷害涓嶅嗳锛岃皟鑺侹镄勫ぇ灏
Disbuf[0]=(speed/1000)%10;
Disbuf[1]=(speed/100)%10;
Disbuf[2]=(speed/10)%10;
Disbuf[3]=speed%10;
}
//鍒濆嫔寲瀹氭椂鍣═0
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++);
}
//鍒濆嫔寲瀹氭椂鍣═1
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*/
}