久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1104|回復: 2
打印 上一主題 下一主題
收起左側

為啥我的步進電機不還原?附單片機程序原理圖

[復制鏈接]
跳轉到指定樓層
樓主


單片機源程序如下:
#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;                                // 窗簾開關的閾值
uchar gMode=1;                                                                // 1是手動模式,2是亮度自動模式
uchar code Clock[]={0x80,0x40,0x20,0x10};                         // 步進電機順時針旋轉數組
uchar code AntiClock[]={0x10,0x20,0x40,0x80};                // 步進電機逆時針旋轉數組
/*********************************************************/
// 毫秒級的延時函數,time是要延時的毫秒數
/*********************************************************/
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);                                        // 去除按鍵按下的抖動
                while(!KeyMode_P);                // 等待按鍵是否
                DelayMs(10);                                        // 去除按鍵松開的抖動
        }
}
/*********************************************************/
// ADC0832的時鐘脈沖
/*********************************************************/
void WavePlus()
{
        _nop_();
        ADC_CLK = 1;
        _nop_();
        ADC_CLK = 0;
}


/*********************************************************/
// 獲取指定通道的A/D轉換結果
/*********************************************************/
uchar Get_ADC0832()
{
        uchar i;
        uchar dat1=0;
        uchar dat2=0;
        
        ADC_CLK = 0;                                // 電平初始化
        ADC_DAT = 1;
        _nop_();
        ADC_CS = 0;
        WavePlus();                                        // 起始信號
        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_();                                                // 結束此次傳輸
        ADC_DAT = 1;
        ADC_CLK = 1;
        ADC_CS  = 1;   

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

/*********************************************************/
// 開窗
/*********************************************************/
void Open()
{
        uint i,j;
        for(j=0;j<255;j++)                // 控制步進電機正轉
        {
                for(i=0;i<4;i++)
                {
                        P2=Clock[ i];
                        DelayMs(3);
                }
        }
        Led_P=0;
}
/*********************************************************/
// 關窗
/*********************************************************/
void Close()
{
        uint i,j;
        for(j=0;j<255;j++)                // 控制步進電機反轉
        {
                for(i=0;i<4;i++)
                {
                        P2=AntiClock[ i];
                        DelayMs(3);
                }
        }
        Led_P=1;
}
/*********************************************************/
// 主函數
/*********************************************************/
void main()
{
        uchar light;
while(1)
        {
                light=Get_ADC0832();
                light=light/2.5;                                        // 縮小光照檢測結果(在0-99)
                if(light>99)                                                        // 如果大于99
                        light=99;                                                                // 則依然保持99
                KeyScanf3();                                                        // 按鍵掃描(模式切換)
                /*手動控制模式*/
                if(gMode==1)
                {
                        if(KeyDown_P==0)                // 如果關窗簾鍵按下了        
                        {
                                if(Led_P==0)                        // 如果窗簾當前是打開的
                                {
                                        Close();                                // 則關閉窗簾
                                }
                        }
                        if(KeyUp_P==0)                        // 如果開窗簾鍵按下了
                        {
                                if(Led_P==1)                        // 如果窗簾當前是關閉的
                                {
                                        Open();                                        // 則打開窗簾
                                }
                        }        
                }
               
        
                /*光線控制模式*/
                if(gMode==2)
                {
                        if(light<gLight)                // 當前光線小于設置的閾值
                        {
                                if(Led_P==0)                        // 如果窗簾當前是打開的
                                {
                                        Close();                                // 則關閉窗簾
                                }
                        }
                        else                                                                // 當前光線大于或等于設置的閾值
                        {
                                if(Led_P==1)                        // 如果窗簾當前是關閉的
                                {
                                        Open();                                        // 則打開窗簾
                                }
                        }        
                }
               
                DelayMs(100);                                                        // 延時0.1秒
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:161164 發表于 2022-5-16 09:30 | 只看該作者
啥叫還原?
回復

使用道具 舉報

板凳
ID:123289 發表于 2022-5-16 10:35 | 只看該作者
這里的“還原”是指什么?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 四虎国产| 91在线视频观看 | 久久久999国产精品 中文字幕在线精品 | 亚洲天堂影院 | 男女下面一进一出网站 | 国偷自产av一区二区三区 | 成人小视频在线观看 | 在线观看国产视频 | 中文字幕一区二区三区在线观看 | 天天综合久久 | 国产乱码高清区二区三区在线 | 伊人精品一区二区三区 | 国产在线精品一区二区三区 | 成人在线精品视频 | 日韩在线视频一区二区三区 | 日本高清在线一区 | 国产日韩中文字幕 | 亚洲欧美中文日韩在线 | 黄免费观看 | 国产日韩精品一区 | 午夜影视网 | 亚洲精品电影 | 碰碰视频| 久草精品视频 | 一级在线视频 | h漫在线观看 | 日韩国产免费 | 偷拍亚洲色图 | 99久久免费精品 | 欧美精品一区二区三区在线播放 | 日韩精品一区二区三区在线观看 | av日韩精品| 国产精品美女一区二区 | 污书屋 | 黄色三级免费 | 羞羞的视频网站 | 国产成人99久久亚洲综合精品 | 日韩免费在线观看视频 | 精品久久久久久亚洲精品 | 国产精品亚洲第一区在线暖暖韩国 | 日韩欧美三区 |