基于单片机AT89C52的步进电机的控制器设计分解

开始定时器中断允许定时器0工作方式2载入定时器初值定时器0和定时器1开启载入默认工作参数各个端口初始化 图4.2 系统初始化流程图

按键子程序:

1、延时子程序:在本延时子程序当中每调用一次延时子程序延时时间是1毫秒。

2、按键响应子函数:在本设计当中按键的一端接地,另一端接单片机的对应端口,所以当按键按下,既是将单片机对应端口电平拉低。所以在编程的时候判断按键按下是低电平有效。图4.3画出的是电机增速和减速的子程序框图。

21

程序入口程序入口判断增速按键按下YN判断减速按键按下YN去抖动去抖动再次判断YYN再次判断YYN判断是否是最高速N判断是否是最低速N速度档位加1结束速度档位减1结束

图4.3 增速减速子程序

C语言程序如下: #include #include #define uchar unsigned char #define uint unsigned int

uchar code ccw[]={0x08,0x04,0x02,0x01}; //逆时针旋转相序 //uchar code cw[]={0x01,0x02,0x04,0x08}; //顺时针旋转相序 //uchar code speed[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d}; //uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

//0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极数码管显示表

uchar code table_anode[]={ //共阳极0~f数码管编码

22

0xc0,0xf9,0xa4,0xb0,//0~3 0x99,0x92,0x82,0xf8,//4~7 0x80,0x90,0x88,0x83,//8~b 0xc6,0xa1,0x86,0x8e //c~f };

uchar code ccw8[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09}; //8拍旋转相序表

uint time,show1,show2,sym,temp,t,a,flag,i,j,rpm,n; sbit inc=P3^2;//加速 sbit dec=P3^3;//减速 sbit keyccw=P3^4;//逆时针转 sbit keycw=P3^5;//顺时针转 sbit pause=P3^6;//暂停 sbit fir=P2^0;//第一数码管 sbit sec=P2^1;//第二数码管

void init();//初始化定时器0,1,串口 void direc();//按键控制转向 void speedctl();//按键控制转速 void display();//速度显示函数 void delaynms(uint aa);//1ms延时函数

void main() {

init(); while(1) {

speedctl( ); direc(); display();

23

}

void wind_init() { }

TMOD=0X21;//定时器1为方式2,定时器0为方

式1 }

void speedctl() { 速

TH1=0xFD; TL1=0xFD;

TH0=(65536-1000)/256;//1毫秒定时中断TL0=(65536-1000)%6; TR1=1;//启动定时器1 EA=1;//打开总中断 ET0=1;//允许定时器0中断 TR0=1;//启动定时器0

if(inc==0) { n++; if(n==11)

n=10;

while(!inc)

display();

time=0; }

else if(dec==0) { n--;

24

//加

//减速

if(n==0)

n=1;

while(!dec)

display();

time=0; } switch(n) { case 1:

t=937;

面转一圈937ms,基准速度一分钟一圈 rpm=1;

break;

case 2: t=312; rpm=3;

break;

case 3: t=187; rpm=5;

break;

case 4: t=133; rpm=7;

break;

case 5: t=104; rpm=9;

break;

case 6:

25

//60/64转速一分钟一圈 里

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4