标题:
单片机pwm直流电机转速控制和测量装置
[打印本页]
作者:
zyn0
时间:
2019-12-16 07:44
标题:
单片机pwm直流电机转速控制和测量装置
/**************************************************************************************
实验现象:k3控制电机加速,k4控制电机减速,一个档位对应一种蜂鸣器频率,两个定时器,一个用于控制电机转速pwm,另一个控制蜂鸣器频率
接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)
本实验基于普中51单片机开发板
1,单片机-->LED&交通灯模块
P20-->D1
P0-->J6
LSA=P2^2;
LSB=P2^3;
LSC=P2^4;
led=P2^0; //定义P20口是beep
P21; //定义P21 为脉宽输出引脚
注意事项:
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include "intrins.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit beep=P2^0; //定义P20口是Beep(high)
sbit P21=P2^1; //定义P21 为脉宽输出引脚--接电机
//sbit k1=P1^0; //定义period增加
//sbit k2=P1^1;//定义period减少
sbit k3=P2^5;//定义high增加
sbit k4=P2^6;//定义high减少
sbit k5=P2^7;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//显示0~F-x的值
u16 period=100;
u16 high=50;
u16 high1=65;
void led();
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
* 函 数 名 : digdisplay
* 函数功能 : 显示
******************************/
void DigDisplay()
{
u8 i;
u8 index[8]={0};
u8 ration=high/period*100;//占空比
index[0]=period/1000;
index[1]=period%1000/100;
index[2]=period%1000%100/10;
index[3]=period%1000%100%10;
// index[4]=high/1000;
// index[5]=high%1000/100;
index[6]=high/10;
index[7]=high%10;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=smgduan[index[i]];//发送段码
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
/*******************************************************************************
* 函 数 名 : keypros
* 函数功能 : 按键处理函数,判断按键K1是否按下
*******************************************************************************/
void keypros()
{
if(high<0||high==90)
{
high=50;
led();
}
if(k3==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k3==0) //再次判断按键是否按下
{
TR0=1;
TR1=1;
high+=10;
led();
}
while(!k3); //检测按键是否松开
}
if(k4==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k4==0) //再次判断按键是否按下
{
TR0=1;
TR1=1;
high-=10;
led();
}
while(!k4); //检测按键是否松开
}
if(k5==0) //检测按键K1是否按下
{
delay(1000); //消除抖动 一般大约10ms
if(k5==0) //再次判断按键是否按下
{
TR0=0;
TR1=0;
P21=0;
beep=0;
high=0;
led();
}
while(!k5); //检测按键是否松开
}
}
void led()
{
switch(high)
{
case 0:P1=~0x00;break;
case 10:P1=~0x01;high1=5;break;
case 20:P1=~0x03;high1=20;break;
case 30:P1=~0x07;high1=35;break;
case 40:P1=~0x0f;high1=50;break;
case 50:P1=~0x1f;high1=65;break;
case 60:P1=~0x3f;high1=80;break;
case 70:P1=~0x7f;high1=90;break;
case 80:P1=~0xff;high1=100;break;
}
}
/*******************************************************************************
* 函 数 名 : Timer0Init
* 函数功能 : 定时器0初始化
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void TimerInit()
{
TMOD|=0X11;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
ET0=1;//打开定时器0中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
ET1=1;//打开定时器1中断允许
TR1=1;//打开定时器
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
TimerInit(); //定时器初始化
led();
while(1)
{
keypros();
DigDisplay();
}
}
/*******************************************************************************
* 函 数 名 : void Timer0() interrupt 1
* 函数功能 : 定时器0中断函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Timer0() interrupt 1
{
static u16 time;
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
time++;
if(time==high)
{
P21=0;
}
else if(time==100)
{
P21=1;
time=0;
}
}
void Timer1() interrupt 3
{
static u16 time1;
TH1=0XFC; //给定时器赋初值,定时1ms
TL1=0X18;
time1++;
if(time1==high1)
{
beep=0;
}
else if(time1==200)
{
beep=1;
time1=0;
}
}
复制代码
作者:
admin
时间:
2019-12-16 12:27
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
作者:
18894048956
时间:
2019-12-20 16:37
admin 发表于 2019-12-16 12:27
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
查看内容
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1