標(biāo)題: 為啥我的步進(jìn)電機(jī)不還原?附單片機(jī)程序原理圖 [打印本頁(yè)]

作者: hyz@    時(shí)間: 2022-5-16 00:37
標(biāo)題: 為啥我的步進(jìn)電機(jī)不還原?附單片機(jī)程序原理圖


單片機(jī)源程序如下:
#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char                // 以后unsigned char就可以用uchar代替
#define uint  unsigned int                // 以后unsigned int 就可以用uint 代替


sbit ADC_CS     = P1^6;                         // ADC0832的CS引腳
sbit ADC_CLK    = P1^7;                         // ADC0832的CLK引腳
sbit ADC_DAT    = P3^2;                         // ADC0832的DI/DO引腳
sbit KeyMode_P  = P3^3;                                // 模式切換
sbit KeyDown_P  = P3^6;                                // 減按鍵
sbit KeyUp_P    = P3^7;                                // 加按鍵
sbit Led_P      = P2^0;                                // 指示燈
uchar gLight      = 40;                                // 窗簾開(kāi)關(guān)的閾值
uchar gMode=1;                                                                // 1是手動(dòng)模式,2是亮度自動(dòng)模式
uchar code Clock[]={0x80,0x40,0x20,0x10};                         // 步進(jìn)電機(jī)順時(shí)針旋轉(zhuǎn)數(shù)組
uchar code AntiClock[]={0x10,0x20,0x40,0x80};                // 步進(jìn)電機(jī)逆時(shí)針旋轉(zhuǎn)數(shù)組
/*********************************************************/
// 毫秒級(jí)的延時(shí)函數(shù),time是要延時(shí)的毫秒數(shù)
/*********************************************************/
void DelayMs(uint time)
{
        uint i,j;
        for(i=0;i<time;i++)
                for(j=0;j<112;j++);
}

void KeyScanf3()
{
        if(KeyMode_P==0)
        {
                gMode++;                                                        // 切換到下一模式
                if(gMode==3)                                        // 如果到盡頭了
                        gMode=1;                                                // 回到第一種模式
                DelayMs(10);                                        // 去除按鍵按下的抖動(dòng)
                while(!KeyMode_P);                // 等待按鍵是否
                DelayMs(10);                                        // 去除按鍵松開(kāi)的抖動(dòng)
        }
}
/*********************************************************/
// ADC0832的時(shí)鐘脈沖
/*********************************************************/
void WavePlus()
{
        _nop_();
        ADC_CLK = 1;
        _nop_();
        ADC_CLK = 0;
}


/*********************************************************/
// 獲取指定通道的A/D轉(zhuǎn)換結(jié)果
/*********************************************************/
uchar Get_ADC0832()
{
        uchar i;
        uchar dat1=0;
        uchar dat2=0;
        
        ADC_CLK = 0;                                // 電平初始化
        ADC_DAT = 1;
        _nop_();
        ADC_CS = 0;
        WavePlus();                                        // 起始信號(hào)
        ADC_DAT = 1;
        WavePlus();                                        // 通道選擇的第一位
        ADC_DAT = 0;      
        WavePlus();                                        // 通道選擇的第二位
        ADC_DAT = 1;
        
        for(i=0;i<8;i++)                // 第一次讀取
        {
                dat1<<=1;
                WavePlus();
                if(ADC_DAT)
                        dat1=dat1|0x01;
                else
                        dat1=dat1|0x00;
        }
        
        for(i=0;i<8;i++)                // 第二次讀取
        {
                dat2>>= 1;
                if(ADC_DAT)
                        dat2=dat2|0x80;
                else
                        dat2=dat2|0x00;
                WavePlus();
        }
        
        _nop_();                                                // 結(jié)束此次傳輸
        ADC_DAT = 1;
        ADC_CLK = 1;
        ADC_CS  = 1;   

        if(dat1==dat2)                        // 返回采集結(jié)果
                return dat1;
        else
                return 0;
}

/*********************************************************/
// 開(kāi)窗
/*********************************************************/
void Open()
{
        uint i,j;
        for(j=0;j<255;j++)                // 控制步進(jìn)電機(jī)正轉(zhuǎn)
        {
                for(i=0;i<4;i++)
                {
                        P2=Clock[ i];
                        DelayMs(3);
                }
        }
        Led_P=0;
}
/*********************************************************/
// 關(guān)窗
/*********************************************************/
void Close()
{
        uint i,j;
        for(j=0;j<255;j++)                // 控制步進(jìn)電機(jī)反轉(zhuǎn)
        {
                for(i=0;i<4;i++)
                {
                        P2=AntiClock[ i];
                        DelayMs(3);
                }
        }
        Led_P=1;
}
/*********************************************************/
// 主函數(shù)
/*********************************************************/
void main()
{
        uchar light;
while(1)
        {
                light=Get_ADC0832();
                light=light/2.5;                                        // 縮小光照檢測(cè)結(jié)果(在0-99)
                if(light>99)                                                        // 如果大于99
                        light=99;                                                                // 則依然保持99
                KeyScanf3();                                                        // 按鍵掃描(模式切換)
                /*手動(dòng)控制模式*/
                if(gMode==1)
                {
                        if(KeyDown_P==0)                // 如果關(guān)窗簾鍵按下了        
                        {
                                if(Led_P==0)                        // 如果窗簾當(dāng)前是打開(kāi)的
                                {
                                        Close();                                // 則關(guān)閉窗簾
                                }
                        }
                        if(KeyUp_P==0)                        // 如果開(kāi)窗簾鍵按下了
                        {
                                if(Led_P==1)                        // 如果窗簾當(dāng)前是關(guān)閉的
                                {
                                        Open();                                        // 則打開(kāi)窗簾
                                }
                        }        
                }
               
        
                /*光線控制模式*/
                if(gMode==2)
                {
                        if(light<gLight)                // 當(dāng)前光線小于設(shè)置的閾值
                        {
                                if(Led_P==0)                        // 如果窗簾當(dāng)前是打開(kāi)的
                                {
                                        Close();                                // 則關(guān)閉窗簾
                                }
                        }
                        else                                                                // 當(dāng)前光線大于或等于設(shè)置的閾值
                        {
                                if(Led_P==1)                        // 如果窗簾當(dāng)前是關(guān)閉的
                                {
                                        Open();                                        // 則打開(kāi)窗簾
                                }
                        }        
                }
               
                DelayMs(100);                                                        // 延時(shí)0.1秒
        }
}
作者: lkc8210    時(shí)間: 2022-5-16 09:30
啥叫還原?
作者: yzwzfyz    時(shí)間: 2022-5-16 10:35
這里的“還原”是指什么?




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