找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 5815|回復: 2
打印 上一主題 下一主題
收起左側(cè)

賽元SC92F725x單片機控制直流馬達 源程序與原理圖

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:803227 發(fā)表于 2021-1-27 10:09 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
原理圖如下:


功能: 第一次按鍵后,馬達開始工作;第二次按鍵則馬達停止。如只按一次,馬達工作30秒后休息5分鐘,并以此循環(huán)工作。
馬達工作時有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)                      //啟動狀態(tài)
                {
                        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;                 //馬達繼續(xù)啟動
                                        MotorOnTime++;             //馬達啟動時間累加
                                }
                        }
                }
                else                             //待機狀態(tài)
                {
                        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;              //讀取按鍵狀態(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)  //第一次按下,進入啟動狀態(tài)
        {
                KeyActionNumber = 1;
                Active = 1;
        }
        else                       //再次按下,進入待機狀態(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)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:662811 發(fā)表于 2021-3-4 20:39 | 只看該作者
很好的。謝謝樓主。
回復

使用道具 舉報

板凳
ID:608872 發(fā)表于 2021-4-19 09:20 | 只看該作者
賽元下載需要專用燒錄器,還是可以用SUB轉(zhuǎn)TTL或IIC呢
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表