|
原理圖如下:
功能: 第一次按鍵后,馬達(dá)開(kāi)始工作;第二次按鍵則馬達(dá)停止。如只按一次,馬達(dá)工作30秒后休息5分鐘,并以此循環(huán)工作。
馬達(dá)工作時(shí)有LED指示。
單片機(jī)源程序如下:
#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進(jìn)行一次按鍵掃描
{
flag5ms = 0;
KeyScan();
KeyDriver();
}
if (Active) //啟動(dòng)狀態(tài)
{
LED = 0; //LED燈亮
if (flag1s)
{
flag1s = 0;
if (MotorOnTime >= 30) //馬達(dá)啟動(dòng)超過(guò)30s?
{
MOTOR = 0; //馬達(dá)停止
MotorOffTime++; //馬達(dá)停止累加
if (MotorOffTime >= 300) //馬達(dá)停止時(shí)間超過(guò)5分鐘?
{
MotorOnTime = 0; //馬達(dá)啟動(dòng)時(shí)間清零
MotorOffTime = 0; //馬達(dá)停止時(shí)間清零
}
}
else
{
MOTOR = 1; //馬達(dá)繼續(xù)啟動(dòng)
MotorOnTime++; //馬達(dá)啟動(dòng)時(shí)間累加
}
}
}
else //待機(jī)狀態(tài)
{
LED = 1; //LED燈滅
MOTOR = 0; //馬達(dá)停止
MotorOnTime = 0; //馬達(dá)啟動(dòng)時(shí)間清零
MotorOffTime = 0; //馬達(dá)停止時(shí)間清零
}
}
}
void GPIO_Init()
{
P2CON = 0x82; //10000010, P2.7和P2.1輸出,P2.0輸入
P2PH = 0x01; //P2.0帶上拉電阻
SC92F7250_NIO_Init(); //未使用引腳初始化
LED = 1; //LED燈滅
MOTOR = 0; //馬達(dá)停止
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp;
TMCON = 0x07; //Timer0選擇時(shí)鐘Fsys = 12MHz
tmp = 12000000;
tmp = (tmp * ms) / 1000;
tmp = 65536 - tmp;
// tmp = tmp + 20; //計(jì)時(shí)誤差補(bǔ)償
T0RH = (unsigned char)(tmp>>8);
T0RL = (unsigned char)tmp;
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = T0RH;
TL0 = T0RL;
ET0 = 1; //定時(shí)器0允許
TR0 = 1; //打開(kāi)定時(shí)器0
EA = 1;
}
void KeyScan()
{
static bit KeyIn;
static unsigned char i;
KeyIn = KEY; //讀取按鍵狀態(tài)
if (KeyIn == 0) //按鍵持續(xù)按下10ms視為有效
{
i++;
if (i >= 2)
{
i = 0;
KeySta = 1;
}
}
else if (KeyIn == 1) //按鍵彈起
{
KeySta = 0;
}
}
void KeyDriver()
{
if (KeyBackup != KeySta) //按鍵狀態(tài)發(fā)生變化
{
if (KeyBackup == 1) //按鍵彈起后有效
{
KeyAction();
}
KeyBackup = KeySta; //備份上一次按鍵狀態(tài)
}
}
void KeyAction()
{
if (KeyActionNumber == 0) //第一次按下,進(jìn)入啟動(dòng)狀態(tài)
{
KeyActionNumber = 1;
Active = 1;
}
else //再次按下,進(jìn)入待機(jī)狀態(tài)
{
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, 下載次數(shù): 52)
2021-1-27 10:10 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|