Ⅰ 跪求!单片机直流电机转速控制带速度显示的,课程设计!!有图有!程序!!急啊!!
#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波来控制电机的转速。