51单片机电机测速程序c语言,单片机仿真编码器电机测速程序

时间:2025-03-28 07:46:26

/***********头文件声明************/

#include ""//此文件中定义了单片机的一些特殊功能寄存器

/***********数据类型声明***********/

typedef unsigned int u16;//对数据类型进行声明定义

typedef unsigned char u8;

/***********IO口相关定义***********/

sbit LSA=P2^0;

sbit LSB=P2^1;

sbit MOTOR=P2^2;

/**********变量定义*************/

u16 Pulse;

u16 Speed;

u16 pwm;

/*******************************************************************************

* 函 数 名         : delay

* 函数功能                     : 延时函数,i=1时,大约延时10us

*******************************************************************************/

void delay(u16 i)

{

while(i--);

}

/*******************************************************************************

* 函数名       :DigDisplay()

* 函数功能                 :数码管显示函数

*******************************************************************************/

void DigDisplay()

{

u8 disp[2];

u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

u8 i;

for(i=0;i<2;i++)

{

switch(i)         //位选,选择点亮的数码管,

{

case(0):

LSA=0;LSB=1; break;//显示第0位

case(1):

LSA=1;LSB=0; break;//显示第1位

}

P0=disp[i];//发送数据

delay(10); //间隔一段时间扫描

P0=0x00;//消隐

}

disp[0]=smgduan[Speed/10];

disp[1]=smgduan[Speed%10];

}

/*******************************************************************************

* 函 数 名         : Int0Init()

* 函数功能                     : 设置外部中断0

*******************************************************************************/

void Int0Init()

{

//设置INT0

IT0=1;//跳变沿出发方式(下降沿)

EX0=1;//打开INT0的中断允许。

EA=1;//打开总中断

}

/*******************************************************************************

* 函 数 名         : Timer0Init

* 函数功能                     : 定时器0初始化

*******************************************************************************/

void Timer0Init()

{

TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

TH0 = 0xFC;//给定时器赋初值,定时1ms

TL0 = 0x18;

ET0=1;//打开定时器0中断允许

EA=1;//打开总中断

TR0=1;//打开定时器

}

/*******************************************************************************

* 函 数 名       : main

* 函数功能                   : 主函数

*******************************************************************************/

void main()

{

Int0Init();

Timer0Init();

pwm=50;

while(1);

}

/*外部中断0的中断函数*/

void Int0()        interrupt 0

{

Pulse++;//脉冲++

}

/*定时器0的中断函数*/

void Timer0() interrupt 1

{

static u8 Period,dis,PWM_Period;

TH0 = 0xFC;//定时1ms

TL0 = 0x18;

Period++;

PWM_Period++;

dis++;

/*******转速计算********/

if(Period == 100)//1*100ms

{

//计算速度S=(Pulse/360)*10*60 r/min

Speed=(Pulse)*1.6;

Pulse=0;

Period=0;

}

/*******PWM 输出********/

if(PWM_Period

if(PWM_Period >= pwm) MOTOR=0;

if(PWM_Period == 100)        PWM_Period=0;

/*******数码管显示********/

if(dis == 4)

{

DigDisplay();//数码管显示函数

dis=0;

}

}