直流电机测速并显示
可实现功能: 1 可控制左右旋转 2 可控制停止转动
3 有测速功能,即时显示在液晶上
4 有速度档位选择,分五个档次,但不能精确控速 5 档位显示在液晶上
用到的知识:
1 用外部中断检测电机送来的下降沿,在一定时间里统计 脉冲个数,进行算出转速。
2 通过改变占空比可改变电机速度,占空比的改变可以通 过改变定时器的重装初值来实现。
3 要想精确控制速度,还需要用自动控制理论里的PID算 法,但参数难以选定,故在此设计中没有涉及!
#include<>
#define uchar unsigned char #define uint unsigned int
sbit PW1=P1^0 ;
sbit PW2=P1^1 ; ; write_data('0'+shi); write_data('0'+ge); }
/******延时函数********/ void delay(uint z) {
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--) ; }
/************写指令************/ void write_com(uchar com) {
lcdrs=0; Da=com; delay(1); lcden=1; delay(1); lcden=0; }
/************写数据**********/ void write_data(uchar date) {
lcdrs=1; Da=date; delay(1); lcden=1; delay(1); lcden=0; }
/************液晶初始化**********/ void lcd_init() {
lcden=0;
write_com(0x38) ; //初始化
write_com(0x0c) ; //打开光标 标闪
write_com(0x01) ; //清显示 write_com(0x80+0x40); write_data('0');
不显示光标 光标不闪,0x0f光 0x0c 0x0e write_data(' '); write_data('G'); write_data('e'); write_data('a'); write_data('r'); }
/***********键盘扫描程序**********/ void keyscan() {
if(stop==0) {
TR1=0; //关闭定时器0 end_turn; // 停止供电 write_com(0x80+0x40); write_data('0'); }
if(left==0) {
TR1=1;
dflag=1; //转向标志置位则左转 write_com(0x80+0x40);
write_data('0'+sflag); }
if(right==0) {
TR1=1;
dflag=0; //转向标志复位则右转 write_com(0x80+0x40); write_data('0'+sflag); }
if(accelerate==0) {
delay(10) ; //延时消抖 if(accelerate==0) {
while(accelerate==0) ; //等待松手 sflag++; if(sflag==2) {
t0=20000;
t1=30000; //占空比为百分之60
即可停止转动 write_com(0x80+0x40); write_data('2'); }
if(sflag==3) {
t0=15000;
if(sflag==5) } }
}
t1=35000; //占空比为百分之70 write_com(0x80+0x40); write_data('3'); }
if(sflag==4) {
t0=10000;
t1=40000; //占空比为百分之80 write_com(0x80+0x40); write_data('4'); }
{
t0=5000;
t1=45000; //占空比为百分之90 write_com(0x80+0x40); write_data('5'); }
if(sflag>=6) {
sflag=0;
t0=25000; t1=25000;
write_com(0x80+0x40); write_data('1'); }
因篇幅问题不能全部显示,请点此查看更多更全内容