- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AT80C52的PWM控制电机正转反转加速减速
PWM调速 电机正反转 加速停止
/*********************************************************************
*本实验是基于普中科技的开发板设计直流电动机PWM调速实验。
*设计要求:k1控制电机正转,k2控制电机反转,k3控制电机加
*速,k4控制电机减速,k5控制电机停止。数码管显示电机转向,
*速度和所转圈数。并将速度发送到上位机。实验所用电机为12V
*自带增量式光电编码器。外部中断0触发方式为高电平触发方式效果更好。
**********************************************************************/
#include reg52.h
#include intrins.h
#define uchar unsigned char
#define uint unsigned int
sbit BRA=P2^5; // 刹车
sbit DIR=P2^6; // 转向
sbit PWM=P2^7; // 调速
sbit k1=P1^0; //正转
sbit k2=P1^1; //反转
sbit k3=P1^2; //加速
sbit k4=P1^3; //减速
sbit k5=P1^4; //停止
sbit ls138a=P2^2;
sbit ls138b=P2^3;
sbit ls138c=P2^4;
uchar flag; //方向标志位
uchar speed=50; //初始转速
uint quan_num; //圈数
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,
// 0 1 2 3 4
0x6d,0x7d,0x07,0x7f,0x6f,0x40};
// 5 6 7 8 9 -
void delay(uint x)
{
uchar i;
while(x--)
{for(i=0;i110;i++);}
}
/****************************************************************
* 名称 :init()
* 功能 :初始化函数,设置串口,定时器0,定时器1
* 输入 :无
* 输出 :无
****************************************************************/
void init()
{
SCON=0x50;//允许串接收发送
TMOD=0x21;//定时器1工作在模式2,为串口提供波特率;定时器0工作在模式1,产生PWM波
TH0=0xff; //定时100us
TL0=0xa4;
TH1=0xfd;//波特率为9600
TL1=0xfd;
IT0=1; //IT0=0低电平触发,IT0=1下降沿触发
TR0=1; //开定时器0
TR1=1; //开定时器1
ET0=1; //开定时器0中断
EA=1; //开总中断
}
/****************************************************************
* 名称 :display()
* 功能 :显示子函数,显示圈数,转速和转向
* 输入 :圈数,转速,转向
* 输出 :无
****************************************************************/
void display_sum(uint num) //圈数显示
{
P0=table[num%1000/100]; //显示圈数百位
ls138a=1;ls138b=0;ls138c=1;
delay(1);
P0=table[num%100/10]; //显示圈数十位
ls138a=0;ls138b=1;ls138c=1;
delay(1);
P0=table[num%10]; //显示圈数个位
ls138a=1;ls138b=1;ls138c=1;
delay(1);
}
void display_speed(uchar num) //转速显示
{
P0=table[num%100/10]; //显示转速十位
ls138a=1;ls138b=1;ls138c=0;
delay(1);
P0=table[num%10]; //显示转速个位
ls138a=0;ls138b=0;ls138c=1;
delay(1);
}
void display_dir(uchar num) //方向显示
{
P0
文档评论(0)