⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test.c

📁 通过单片机测电机的转速
💻 C
字号:
#include "reg52.h" 
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //共阴极0~9对应16进制数
//数码管位选控制口定义
sbit LED4=P2^7;
sbit LED3=P2^6;
sbit LED2=P2^5;
sbit LED1=P2^4;
//按键口申明
sbit S1=P2^3;
sbit S2=P2^2;
sbit S3=P2^1;

sbit PWM=P3^3;	//控制电机的PWM口
unsigned char tabArry[4];	//存入显示数据

char flag=1;	//按键标志,当flag=1时表示没有按下,当flag=0时表示有按键按下
int counter;	//用于频率计定时器计数,当为50时,定时为1秒
int speed,setspeed=16;	//电机实际转速,设定的电机转速
int speedcount;	//转速计数
int keycount=0;	//按键计数,为0时测转速,为1时设置转速
int z_counter=0;	//占空比计数,计100次
int zkb=50;			//所调制的占空比
int pwmcount=0;
//毫秒延时程序
void delayms(int ms)
{
	uchar i;
    while(ms--)
	 {
	  	for(i=250;i>0;i--);
	 }
}
//数据分位
void change(char ch,unsigned int frequency)
{
	tabArry[0]=ch;	   	//显示字母,A为测得转速,b为设置转速
	tabArry[1]=frequency%1000/100; //百位
	tabArry[2]=frequency%100/10;  	//十位
	tabArry[3]=frequency%10;		//个位
}
//键盘扫描
void keyscan()
{
	if(flag==1)
	{
		if(S3==0)	  	//用S3切换实际转速与设定转速
		{	
			delayms(2);	//延时去抖
			if(S3==0)
			{
				flag=0;
				keycount++;
				if(keycount>=2) keycount=0;
			}
		}		
	
		if(S2==0 && keycount==1) 	//设置转速加1
		{	
			delayms(2);
			if(S2==0 && keycount==1)
			{
				flag=0;
				setspeed++;
				if(setspeed>1000) setspeed=999;
			}
		}
		if(S1==0 && keycount==1)	//设置转速减1
		{	
			delayms(2);
			if(S1==0 && keycount==1)
			{
				flag=0;
				setspeed--;
				if(setspeed<0) setspeed=0;
			}
		}

	}	
	if(S1!=0 && S2!=0 && S3!=0) flag=1;	  //判断按键是否弹起
} 

//显示函数
void display()
{
	
	switch(keycount)	
	{
		case 0:						//当keycount=0时显示实际转速
			change(0x0a,speed);
			break;
		case 1:
			change(0x0b,setspeed); 	//当keycount=1时显示设置转速
			break;
	}  
	
	P0 = table[tabArry[0]];
	LED1=0;
	delayms(2);
	LED1=1;

	P0 = table[tabArry[1]];
	LED2=0;
	delayms(2);
	LED2=1;

	P0 = table[tabArry[2]];
	LED3=0;
	delayms(2);
	LED3=1;

	P0 = table[tabArry[3]];
	LED4=0;
	delayms(2);
	LED4=1;	
}
//程序初始化
void Init()
{
	TMOD=0x11; //定时器1方式1,定时器0方式1

	TH0=0x70;//定义20ms,用于测速,晶振22.1184MHz					
	TL0=0x00;

    TH1=0xf8; //定义1mS,用于控制电机转速
	TL1=0xcc;

    ET0=1;//允许定时0中断
	ET1=1;//允许定时1中断
	TR0=1;//定时器0启动
	TR1=1;//定时器1启动
	EX0=1;//允许外部中断
	IT0=1;//边沿出发
	EA=1;//总中断打开	
}
//*******************************************************
void main(void)
{
    Init();
	while(1)
	{
	   	keyscan();//按键程序
		display();//显示程序
   }
}
//定时器0,用于测电机转速
void timer0() interrupt 1
{  
 	TH0=0x70;//定义20ms 				
	TL0=0x00;
	counter++;
 	if(counter>=50)	//1s时将电机脉冲读出
	{
	    counter=0; 		//定时器计数清零,便于下一次测速计数
		speed=speedcount;	//将测得的频率赋给speed显示
		speedcount=0;	//将电机转速计数清零,重新计数
	}

}
//定时器1,用于控制PWM输出
void timer1() interrupt 3
{  
    TH1=0xf8;	//重新赋初值
	TL1=0xcc;
	z_counter++; 	//占空比计数加1
	if(z_counter>=100)	z_counter=0; 	//当计数超过100后清零,便于重新计数
	if(setspeed>speed)		//当设定的值大于实际值时,所调制的占空比加1
	{
		zkb++;
		if(zkb>100) zkb=100;
	}
	else if(setspeed<speed) 	//当设定的值小于实际值时,所调制的占空比减1
	{
		zkb--;
		if(zkb<0) zkb=0;
	}
	else zkb=50;   	//当设定的值等于实际值时,所调制的占空恒为50
	if(z_counter<zkb) PWM=0;
	else PWM=1;	

}

//外中断0,用于电机速度计数,每产生一次中断计数一次
void  Pint0() interrupt 0       
{  
 	speedcount++;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -