標(biāo)題: 賽元SC92F725x單片機(jī)控制直流馬達(dá) 源程序與原理圖 [打印本頁(yè)]

作者: fangbl    時(shí)間: 2021-1-27 10:09
標(biāo)題: 賽元SC92F725x單片機(jī)控制直流馬達(dá) 源程序與原理圖
原理圖如下:


功能: 第一次按鍵后,馬達(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)

作者: 15553588136    時(shí)間: 2021-3-4 20:39
很好的。謝謝樓主。
作者: yinnan128    時(shí)間: 2021-4-19 09:20
賽元下載需要專(zhuān)用燒錄器,還是可以用SUB轉(zhuǎn)TTL或IIC呢




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1