找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4862|回复: 2
收起左侧

赛元SC92F725x单片机控制直流马达 源程序与原理图

[复制链接]
ID:803227 发表于 2021-1-27 10:09 | 显示全部楼层 |阅读模式
原理图如下:
1.png

功能: 第一次按键后,马达开始工作;第二次按键则马达停止。如只按一次,马达工作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.png

全部资料51hei下载地址:
MotorDriver.rar (44.72 KB, 下载次数: 50)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:662811 发表于 2021-3-4 20:39 | 显示全部楼层
很好的。谢谢楼主。
回复

使用道具 举报

ID:608872 发表于 2021-4-19 09:20 | 显示全部楼层
赛元下载需要专用烧录器,还是可以用SUB转TTL或IIC呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表