⑴ 单片机设计题目 转速计的设计(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]
这个可以帮你,不过最好你能写写具体的设计要求,那就更好了