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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機矩陣鍵盤控制步進電機程序 請指教

[復制鏈接]
跳轉到指定樓層
樓主
ID:871749 發表于 2021-1-1 10:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int



uint count0=0;
uchar x,y=4;
uint motor_speed;
uint counter_motor,motor_measure,timer_limit;
uint num1,a=0,temp=0,flag=0;
uint counter_10ms,counter_1s;
uchar speed_set[3];
//uchar a;
sbit MOTOR_1B=P3^4;
sbit MOTOR_2B=P3^5;
sbit MOTOR_3B=P3^6;
sbit MOTOR_4B=P3^7;
bit zhuanxiang;//1正轉0反轉
bit flag_100ms,flag_10ms,flag_1s,start,enter_lock=1;
uchar code turn[]={0x10,0x20,0x40,0x80};//步進電機控制模型
uchar code LED_CS[4]={0xfe,0xfd,0xfb,0xf7};//位選1234
uchar code LED_CC_D[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰
uchar code LED_motor[2]={0x54,0x73};//n,p
uchar code table[]={//運算數字輸入數組
                                        7,8,9,0,
                                        4,5,6,0,
                                        1,2,3,0,
                                        0,0,0,0};
void delayus(uchar delayus);
void display();

void init();
void delayms(uchar x);                                
void keyscan();//按鍵掃描
char code dx516[3] _at_ 0x003b;
                                       
/************************ 主函數 **************************/
void main()
{
        init();
                while (1)
        {
                if(flag_1s)
                {
                        motor_measure=count0*10;   //(600/600)*count0
                        count0=0;
                        flag_1s=0;
                }
                if(flag_10ms)
                {
                        keyscan();
                        flag_10ms=0;
                }
                        display();        
                        
        }
        
}
/******************** 中斷初始化函數 **************************/
void init()
{
        TMOD=0x01;
        TH0=0xfc;                                  //定時1ms
        TL0=0x66;
        ET0=1;
        EX0=1;
        IT0=1;
        EA=1;
        TR0=1;
}


/************************ 中斷函數 **************************/
//外部中斷0服務函數
void init0() interrupt 0
{
        count0++;
}


//定時器0中斷服務函數
void timer0init() interrupt 1
{
        TH0=0xfc;                                  //定時1ms
        TL0=0x66;
        timer_limit=2500/motor_speed;
        if(++counter_1s>=1000)
        {
                flag_1s=1;
                counter_1s=0;
        }
        if(++counter_motor>=timer_limit)                                
        {
                counter_motor=0;
                if(start)
                {
                        if(zhuanxiang)
                        {
                                P3=turn[x];
                                x++;
                                if(x==4) x=0;
                        }
                        if(!zhuanxiang)
                        {
                                y--;
                                P3=turn[y];
                                if(y==0) y=4;
                        }
                }
        }
        if(++counter_10ms>=10)
        {
                flag_10ms=1;
                counter_10ms=0;
        }

}

/************************ 顯示函數 **************************/
void display()
{
        uint bai,shi,ge;
        bai=motor_speed/100;
        shi=motor_speed%100/10;
        ge=motor_speed%10;
        
        P2=LED_CS[0];P0=LED_motor[zhuanxiang];delayms(5);
        if(start==1)
        {
                bai=motor_measure/100;
                shi=motor_measure%100/10;
                ge=motor_measure%10;
                P2=LED_CS[1];P0=LED_CC_D[bai];delayms(5);
                P2=LED_CS[2];P0=LED_CC_D[shi];delayms(5);
                P2=LED_CS[3];P0=LED_CC_D[ge];delayms(5);
        }
        else
        {
                P2=LED_CS[1];P0=LED_CC_D[bai];delayms(5);
                P2=LED_CS[2];P0=LED_CC_D[shi];delayms(5);
                P2=LED_CS[3];P0=LED_CC_D[ge];delayms(5);
        }
}

/************************ 延時函數 **************************/


void delayms(uchar x)
{
        uchar i ;
        while(x--)
        for(i=0;i<120;i++) ;
}
/****************矩陣鍵盤掃描函數******************/
void keyscan(void)
{
        P1=0xfe;
        if(P1!=0xfe)
        {
           delayms(5);// 延遲5ms
           if(P1!=0xfe)
                         {  
                         temp=P1&0xf0;
            switch(temp)
            {
             case 0xe0:num1=0;   break;        //7
             case 0xd0:num1=1;   break;         //8
             case 0xb0:num1=2;   break;        //9
             case 0x70:num1=3;   break;        //÷
            }
           }   while(P1!=0xfe);
           
           if(num1==0||num1==1||num1==2)//如果按下的是'7','8'或'9
           {
                if(flag==1){flag=0;a=0;}
                        { a=a*10+table[num1];    } //按下數字存儲到a
           }
           else//如果按下的是'/'            除法
           {zhuanxiang=1;}//正轉
        }

        P1=0xfd;
        if(P1!=0xfd)
        {
           delayms(5);
           if(P1!=0xfd){  temp=P1&0xf0;
            switch(temp)
            {
             case 0xe0:num1=4; break; //4
             case 0xd0:num1=5; break; //5
             case 0xb0:num1=6; break; //6
             case 0x70:num1=7; break; //×
            }
           }   while(P1!=0xfd);//等待按鍵釋放
           if(num1==4||num1==5||num1==6&&num1!=7)//如果按下的是'4','5'或'6'
            { if(flag==1){flag=0;a=0;}
                a=a*10+table[num1];     }
           else//如果按下的是'×'
           {  zhuanxiang=0;//反轉
           }
        }
        P1=0xfb;
        if(P1!=0xfb){  delayms(5);
           if(P1!=0xfb) { temp=P1&0xf0;
            switch(temp)
            {
             case 0xe0:num1=8;    break;         //1
             case 0xd0:num1=9;    break;         //2
             case 0xb0:num1=10;   break;         //3
             case 0x70:num1=11;   break;         //-
            }
           }   while(P1!=0xfb);
           if(num1==8||num1==9||num1==10)//如果按下的是'1','2'或'3'
            {
                                if(flag==1){flag=0;a=0;}
                                a=a*10+table[num1];  
                        }
           else if(num1==11)//如果按下的是'-'
           {}
        }

        P1=0xf7;
        if(P1!=0xf7){   delayms(5);
           if(P1!=0xf7){ temp=P1&0xf0;
            switch(temp)
            {
             case 0xe0:num1=12; break;  //清0鍵   
             case 0xd0:num1=13; break;  //數字0   
             case 0xb0:num1=14; break;  //等于鍵   
             case 0x70:num1=15; break;  //加
            }                                                                  
                } while(P1!=0xf7);
           switch(num1)
           {
                   case 12:{a=0;}break;//按下的是"清零"
             case 13:{a=a*10+table[num1];}break;
             case 14:{motor_speed=a;enter_lock=0;start=1;}break;
             case 15:{motor_speed=0;start=0;}break;        //加鍵         
                        }
        }
        motor_speed=a;
}

/***************************************************/


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

使用道具 舉報

沙發
ID:949169 發表于 2021-12-28 10:57 | 只看該作者
有仿真圖嗎,兄弟
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩一 | 性网站免费| 欧美在线一二三 | 午夜爽爽男女免费观看hd | 国产精品日日夜夜 | jⅰzz亚洲| 99久久影院 | 亚洲女人天堂成人av在线 | 日韩午夜网站 | 亚洲不卡视频 | 中文字幕乱码一区二区三区 | 欧美成人影院 | 精品九九九 | 国产一区二区三区在线免费 | 欧美在线日韩 | 久久国产精品偷 | 一级国产精品一级国产精品片 | 亚洲精品 在线播放 | 国产成人综合在线 | 色综合一区二区三区 | 日韩一区二区免费视频 | 欧美在线视频一区二区 | 国产一区二区三区四区 | 伊人二区| 黄免费看 | 欧美激情精品久久久久 | 九色视频网 | 国产精品久久久久久久久免费桃花 | 欧美日韩不卡合集视频 | 日本高清不卡视频 | 神马福利 | jizjizjiz中国护士18| 国产亚洲人成a在线v网站 | 中文字幕亚洲区 | 成人精品鲁一区一区二区 | 亚洲成人一区二区在线 | 91一区二区 | 精品国产乱码久久久久久图片 | 久久精品一区二区三区四区 | 在线色网址 | 国内精品视频在线观看 |