原理图如下:
功能: 第一次按键后,马达开始工作;第二次按键则马达停止。如只按一次,马达工作30秒后休息5分钟,并以此循环工作。
马达工作时有LED指示。
单片机源程序如下:
#include "INC/SC92F725x_C.H"
sbit LED = P2^1;
sbit KEY = P2^0;
sbit MOTOR = P2^7;
//#define LED P21
//#define KEY P20
//#define MOTOR P27
unsigned char T0RH;
unsigned char T0RL;
unsigned char MotorOnTime;
unsigned int MotorOffTime;
bit flag5ms;
bit flag1s;
bit KeyBackup;
bit KeySta;
bit KeyActionNumber;
bit Active;
void GPIO_Init();
void ConfigTimer0(unsigned int ms);
void KeyScan();
void KeyDriver();
void KeyAction();
void main()
{
GPIO_Init();
ConfigTimer0(1);
while(1)
{
if (flag5ms) //每5ms进行一次按键扫描
{
flag5ms = 0;
KeyScan();
KeyDriver();
}
if (Active) //启动状态
{
LED = 0; //LED灯亮
if (flag1s)
{
flag1s = 0;
if (MotorOnTime >= 30) //马达启动超过30s?
{
MOTOR = 0; //马达停止
MotorOffTime++; //马达停止累加
if (MotorOffTime >= 300) //马达停止时间超过5分钟?
{
MotorOnTime = 0; //马达启动时间清零
MotorOffTime = 0; //马达停止时间清零
}
}
else
{
MOTOR = 1; //马达继续启动
MotorOnTime++; //马达启动时间累加
}
}
}
else //待机状态
{
LED = 1; //LED灯灭
MOTOR = 0; //马达停止
MotorOnTime = 0; //马达启动时间清零
MotorOffTime = 0; //马达停止时间清零
}
}
}
void GPIO_Init()
{
P2CON = 0x82; //10000010, P2.7和P2.1输出,P2.0输入
P2PH = 0x01; //P2.0带上拉电阻
SC92F7250_NIO_Init(); //未使用引脚初始化
LED = 1; //LED灯灭
MOTOR = 0; //马达停止
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
TMCON = 0x07; //Timer0选择时钟Fsys = 12MHz
tmp = 12000000;
tmp = (tmp * ms) / 1000;
tmp = 65536 - tmp;
// tmp = tmp + 20; //计时误差补偿
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1; //定时器0允许
TR0 = 1; //打开定时器0
EA = 1;
}
void KeyScan()
{
static bit KeyIn;
static unsigned char i;
KeyIn = KEY; //读取按键状态
if (KeyIn == 0) //按键持续按下10ms视为有效
{
i++;
if (i >= 2)
{
i = 0;
KeySta = 1;
}
}
else if (KeyIn == 1) //按键弹起
{
KeySta = 0;
}
}
void KeyDriver()
{
if (KeyBackup != KeySta) //按键状态发生变化
{
if (KeyBackup == 1) //按键弹起后有效
{
KeyAction();
}
KeyBackup = KeySta; //备份上一次按键状态
}
}
void KeyAction()
{
if (KeyActionNumber == 0) //第一次按下,进入启动状态
{
KeyActionNumber = 1;
Active = 1;
}
else //再次按下,进入待机状态
{
KeyActionNumber = 0;
Active = 0;
}
}
void InterruptTimer0() interrupt 1
{
static unsigned char i;
static unsigned char j;
TH0 = T0RH;
TL0 = T0RL;
i++;
if (i >= 5)
{
i = 0;
flag5ms = 1;
j++;
if (j >= 200)
{
j = 0;
flag1s = 1;
}
}
}
全部资料51hei下载地址:
MotorDriver.rar
(44.72 KB, 下载次数: 50)
|