📄 dianji.c
字号:
/*-------------------------------------------------------------------------------*/
/*********************************************************************************/
/*单片机:STC89C58RD+.晶振:11.0592M. */
/*P1.2为刹车,P1.3为旋转方向,P1.4为pwm输出,P3.5接光电编码器的一个引脚(A或B)控制旋 */
/*时间.P1.6接收过流信号;P2.6为过流指示灯,P2.7为T0运行指示灯 */
/* */
/*********************************************************************************/
/*-------------------------------------------------------------------------------*/
#include "REG51.H"
/*-------------------------------------------------------------------------------*/
#define uchar unsigned char
#define uint unsigned int
/*-------------------------------------------------------------------------------*/
#define pwm_speed1 0x08 //比值控制占空比,调速.
#define pwm_speed2 0x02 //
sbit stop=P1^2; //刹车.
sbit dir=P1^3; //方向.
sbit pwm=P1^4; //pwm输出.
sbit safety=P1^6; //接收过流信号.
sbit led_safety=P2^6; //过流指示灯.
sbit led_T0=P2^7; //T0运行正常指示灯.
/*-------------------------------------------------------------------------------*/
/*********************************************************************************/
uint pwm_HL=1; //pwm高低电平标志位.
uint unsafety_time; //记录过流次数.
uint pwm1=pwm_speed1,pwm2=pwm_speed2;
void main()
{
void delay_s(int t); //秒级延时.
TMOD=0x51;
delay_s(5);
TH1=0xFF; TL1=0xFA;
TH0=0xFF; TL0=0xED;
EA=1;
pwm=1;dir=1;stop=1; //pwm初始状态.
TR1=1;ET1=1;TR0=1;ET0=1;
for(;;)
{;}
}
/*-------------------------------------------------------------------------------*/
/****************************T0定时器中断产生pwm方波******************************/
void pwm_t0(void) interrupt 1
{
if(safety==1) //如果过流,进行处理.
{
unsafety_time++; //记录过留次数
stop=0;led_T0=1;led_safety=0; //刹车并点亮过流指示灯
delay_s(5);
TH1=0xFF;TL1=0xFA;
dir=!dir; //过流后反方向旋转
stop=1;
}
else //正常旋转调制.
{
led_safety=1; //过流指示等灭.
led_T0=0; //点亮T0运行指示灯.
if(pwm_HL==1) //pwm高电平
{
switch(pwm1--)
{
case 0: TH0=0xFF;TL0=0xED;
pwm_HL=0;pwm2=pwm_speed2;
break;
default:pwm=1;
TH0=0xFF;TL0=0xED;
break;
}
}
if(pwm_HL==0)
{
switch(pwm2--)
{
case 0: TH0=0xFF;TL0=0xED;
pwm_HL=1;pwm1=pwm_speed1;
break;
default:pwm=0;
TH0=0xFF;TL0=0xED;
break;
}
}
}
}
/*********************************************************************************/
/*-------------------------------------------------------------------------------*/
/*****************************T1计数器中断控制旋转方向****************************/
void dir_T1(void) interrupt 3
{
stop=0;led_T0=1; //刹车并熄灭T0运行指示灯.
pwm1=pwm_speed1;pwm2=pwm_speed2;
TH1=0xFF;TL1=0xFA;
delay_s(5);
dir=!dir; //改变方向.
stop=1;
}
/*********************************************************************************/
/*-------------------------------------------------------------------------------*/
/***********************************秒级延时函数**********************************/
void delay_s(uint t)
{
int i;uint j;
for(i=0;i<t;i++)
{
for(j=0;j<120000;j++)
{;}
}
}
/**********************************************************************************/
/*--------------------------------------结束--------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -