📄 dianji001.c
字号:
/**************************************************************
**项目名称:两相混合式步进电机驱动程序
**功能描述:
**说 明:
/**************************************************************
头文件预处理:
**************************************************************/
#include <reg52.h>
#include <math.h>
#include <stdio.h>
/**************************************************************
数据类型宏定义:
**************************************************************/
#define uchar unsigned char
#define uint unsigned int
/*============================================================
I/O Ports' Definition:
============================================================*/
sbit IN1=P2^0;
sbit IN2=P2^1;
sbit IN3=P2^2;
sbit IN4=P2^3;
sbit Led_Clk=P1^5; //clock port of 74HC164
sbit Led_Dat=P1^6; //data port of 74HC164
sbit Led_Cs=P1^7; //Led display controlling(using BJT's base)
/**************************************************************
全局变量声明:
**************************************************************/
uint t=15;
uchar fx;
uchar power;
uchar step0=0;
uchar step1=0;
uchar Cnt0=0;
uchar Cnt1=0;
uchar key_value,key_value_temp;
/**************************************************************
函数说明:
**************************************************************/
void Led_Display();
void Led_Write(uchar leddat);
void Key_Func();
//void zheng();
//void fan();
void delay(uint t);
void delay1();
/**************************************************************
code tab:
**************************************************************/
uchar code tab[]={
0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,//0-9
0xFF//dark all
};
void main()
{
TMOD=0x11; //甚至定时器0/1的工作方式
ET0=1; //允许定时器0中断
ET1=1; //允许定时器1中断
EA=1; //允许总中断
while(1)
{
Key_Func();
Led_Display();
}
}
/**************************************************************
**函数名称:Key_Func
**功能描述:键盘处理
***************************************************************
**调用函数:None
**参 数:None
**返 回 值:None
**************************************************************/
void Key_Func()
{
P1=0xff;
key_value=P1;
key_value=(key_value&0x1f);
do
{
key_value_temp=P1;
key_value_temp=(key_value_temp&0x1f);
delay1();
}while(key_value_temp!=0x1f);
switch(key_value)
{
case 0x1e: if(t<995) t+=5;
break;
case 0x1d: if(t>5) t-=5;
break;
case 0x1b: fx=0; //正向向运转
power=1;
TH0=0xBC;
TL0=0xb0;
TR1=0; //关闭定时器1
TR0=1; //启动定时器0
IN1=0;
IN2=1;
IN3=0;
IN4=1;
break;
case 0x17: fx=1; //反向运转
power=1;
TH1=0xBC;
TL1=0xb0;
TR0=0; //关闭定时器0
TR1=1; //启动定时器1
IN1=0;
IN2=1;
IN3=0;
IN4=1;
break;
case 0x0f: power=0; //停止运转
TR0=0; //关闭定时器0
TR1=0; //关闭定时器1
default: break;
}
}
/*==================Key_Func 函数结束=======================*/
/**************************************************************
**函数名称:Led_Display
**功能描述:LED数码管显示
***************************************************************
**调用函数:Led_Write
**参 数:None
**返 回 值:None
************************************************************/
void Led_Display()
{
uint p=t ;
uchar s ,i;
Led_Cs=1;
for (i=0;i<3;i++)
{
s=p%10;
p=p/10;
Led_Write(s);
}
//输出转速
Led_Write(10); //全黑,作为分割点
Led_Write(fx); //运转方向标识符 1为正向,0为反向
Led_Write(power);
Led_Cs=0;
delay1(); //输出运转标识符 1为运转,0为停转
}
/********************Led_Display 函数结束*********************/
/**************************************************************
**函数名称:Led_Write
**功能描述:移位寄存器送出一个字节的数据
***************************************************************
**调用函数:None
**参 数:None
**返 回 值:None
**************************************************************/
void Led_Write(uchar leddat)
{
uchar i;
uchar dat=tab[leddat];
for(i=0;i<8;i++)
{
if((dat&0x80)==0) Led_Dat=0;
else Led_Dat=1;
Led_Clk=0; //时钟端产生脉冲
Led_Clk=1; //送出一位数据
dat<<=1;
}
}
/*********************Led_Write 函数结束**********************/
/**************************************************************
**函数名称:delay
**功能描述:延时
***************************************************************
**调用函数:None
**参 数:None
**返 回 值:None
**************************************************************/
void delay1()
{
uchar i,k;
for(i=0;i<=50;i++)
for(k=0;k<15;k++)
{
;
}
}
/********************* delay 函数结束**********************/
void Tmr0_ISR() interrupt 1 using 1 //定时器0中断 正转
{
Cnt0++;
if(Cnt0==t)
{
Cnt0=0 ;
switch(step0)
{
case 0: IN1=1;
IN2=0;
break;
case 1: IN3=1;
IN4=0;
break;
case 2: IN2=1;
IN1=0;
break;
case 3: IN4=1;
IN3=0;
break; //正转输出顺序
}
if(step0==3) step0=0;
else step0++;
}
TH0=0x3c;
TH0=0xb0;
}
/**************************************************************/
void Tmr1_ISR() interrupt 3 using 2 //定时器1 反转
{
Cnt1++;
if(Cnt1==t)
{
Cnt1=0 ;
switch(step1)
{
case 0: IN4=1;
IN3=0;
break;
case 1: IN2=1;
IN1=0;
break;
case 2: IN3=1;
IN4=0;
break;
case 3: IN1=1;
IN2=0;
break; //反转输出顺序
}
if(step1==3) step1=0;
else step1++;
}
TH1=0x3c;
TH1=0xb0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -