标题:
STC15F2K60S2单片机可调脉冲数反应式步进电机驱动器程序
[打印本页]
作者:
无穷小量
时间:
2019-3-21 21:24
标题:
STC15F2K60S2单片机可调脉冲数反应式步进电机驱动器程序
单片机源码:
#include <STC15.h>
#include <INTRINS.h>
sbit PWMOUT = P3^7;
sbit CHFWD = P3^6;
unsigned char HighRH = 0; //高电平重载值的高字节
unsigned char HighRL = 0; //高电平重载值的低字节
unsigned char LowRH = 0; //低电平重载值的高字节
unsigned char LowRL = 0; //低电平重载值的低字节
void Delay500ms();
void ConfigPWM(unsigned int fr, unsigned char dc);
void ClosePWM();
void Delay20ms(); //@6.000MHz
void DigDisplay();
unsigned int i;
typedef unsigned int u16;
typedef unsigned char u8;
unsigned int cou;
u8 code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳
void delay(u16 i)
{
while(i--);
}
void main(){
AUXR &= 0X7f;//12T
P3M1 &= 0x00;
P3M0 |= 0xc0;//强推挽
cou = 1260;
IT0 = 1;
EX0 = 1;
IT1 = 1;
EX1 = 1;
EA = 1; //开总中断
while (1){
ConfigPWM(15, 50); //频率 15Hz,占空比 50%
while(i <= 45){DigDisplay();};
i = 0;
ClosePWM();
ConfigPWM(20, 50); //频率 20Hz,占空比 50%
while(i <= 60){DigDisplay();};
i = 0;
ClosePWM();
ConfigPWM(36, 50); //频率 55Hz,占空比 50%
while(i <= cou){DigDisplay();};
i = 0;
ClosePWM(); //关闭 PWM
ConfigPWM(20, 50); //频率 20Hz,占空比 50%
while(i <= 60){DigDisplay();};
i = 0;
ClosePWM();
ConfigPWM(15, 50); //频率 15Hz,占空比50%
while(i <= 45){DigDisplay();};
i = 0;
ClosePWM(); //关闭 PWM,相当于占空比 100%
CHFWD = ~CHFWD;
Delay500ms();
}
}
/* 数码管显示*/
void DigDisplay()
{
u16 s;
for(s=0;s<4;s++)
{
switch(s)
{
case(0):
P2 = 0xfe;P0 = smgduan[0]; break;
case(1):
P2 = 0xfd;P0 = smgduan[(cou/10)%10]; break;
case(2):
P2 = 0xfb;P0 = smgduan[(cou/100)%10]; break;
case(3):
P2 = 0xf7;P0 = smgduan[(cou/1000)]; break;
}
delay(3);
P0=0xFF;
}
}
void Delay27ms() //@6.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 158;
k = 145;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay500ms() //@6.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 12;
j = 103;
k = 57;
PWMOUT = 0;
do
{
do
{ DigDisplay();
while (--k);
} while (--j);
} while (--i);
}
/* 配置并启动 PWM,fr-频率,dc-占空比 */
void ConfigPWM(unsigned int fr, unsigned char dc){
unsigned int high, low;
unsigned long tmp;
tmp = (6000000/12) / fr; //计算一个周期所需的计数值
high = (tmp*dc) / 100; //计算高电平所需的计数值
low = tmp - high; //计算低电平所需的计数值
high = 65536 - high + 12; //计算高电平的重载值并补偿中断延时
low = 65536 - low + 12;//计算低电平的重载值并补偿中断延时
HighRH = (unsigned char)(high>>8); //高电平重载值拆分为高低字节
HighRL = (unsigned char)high;
LowRH = (unsigned char)(low>>8); //低电平重载值拆分为高低字节
LowRL = (unsigned char)low;
TMOD &= 0x0F; //清零 T1 的控制位
TMOD |= 0x10; //配置 T1 为模式 1
TH1 = HighRH; //加载 T1 重载值
TL1 = HighRL;
ET1 = 1; //使能 T1 中断
TR1 = 1; //启动 T1
PWMOUT = 1; //输出高电平
}
/* 关闭 PWM */
void ClosePWM(){
TR1 = 0; //停止定时器
ET1 = 0; //禁止中断
PWMOUT = 1; //输出高电平
}
void Add() interrupt 0
{
EX0 = 0;
Delay27ms();
if(P3^2 == 0){
cou = cou + 10;
}
//while(!P3^2);
EX0 = 1;
}
void Sub() interrupt 2
{
EX1 = 0;
Delay27ms();
if(P3^3 == 0){
cou = cou - 10;
}
//while(!P3^3);
EX1 = 1;
}
/* T0 中断服务函数,产生 PWM 输出 */
void InterruptTimer1() interrupt 3{
if (PWMOUT == 1){ //当前输出为高电平时,装载低电平值并输出低电平
TH1 = LowRH;
TL1 = LowRL;
i++;
PWMOUT = 0;
//DigDisplay();
}else{ //当前输出为低电平时,装载高电平值并输出高电平
TH1 = HighRH;
TL1 = HighRL;
PWMOUT = 1;
//DigDisplay();
}
}
复制代码
huasheng_3jieh.rar
2019-3-21 21:23 上传
点击文件名下载附件
下载积分: 黑币 -5
33.87 KB, 下载次数: 39, 下载积分: 黑币 -5
作者:
hxszrb
时间:
2020-6-10 22:26
来学习的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1