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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2642|回復: 1
打印 上一主題 下一主題
收起左側(cè)

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

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:871749 發(fā)表于 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正轉(zhuǎn)0反轉(zhuǎn)
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[]={//運算數(shù)字輸入數(shù)組
                                        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;
                                       
/************************ 主函數(shù) **************************/
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();        
                        
        }
        
}
/******************** 中斷初始化函數(shù) **************************/
void init()
{
        TMOD=0x01;
        TH0=0xfc;                                  //定時1ms
        TL0=0x66;
        ET0=1;
        EX0=1;
        IT0=1;
        EA=1;
        TR0=1;
}


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


//定時器0中斷服務(wù)函數(shù)
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;
        }

}

/************************ 顯示函數(shù) **************************/
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);
        }
}

/************************ 延時函數(shù) **************************/


void delayms(uchar x)
{
        uchar i ;
        while(x--)
        for(i=0;i<120;i++) ;
}
/****************矩陣鍵盤掃描函數(shù)******************/
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];    } //按下數(shù)字存儲到a
           }
           else//如果按下的是'/'            除法
           {zhuanxiang=1;}//正轉(zhuǎn)
        }

        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;//反轉(zhuǎn)
           }
        }
        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;  //數(shù)字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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久999| ww亚洲ww亚在线观看 | www.婷婷| 欧美一区二区三区四区视频 | 91国产视频在线观看 | 高清国产一区二区 | 久久久久久免费精品一区二区三区 | 亚洲欧美日韩在线一区二区 | 欧美视频xxx | 在线中文一区 | 久久99网| 成人黄色电影在线播放 | 国产精品久久av | 亚洲国产高清在线观看 | 成人福利在线观看 | 日韩欧美中文字幕在线视频 | 国产欧美一区二区精品久导航 | 欧美视频区 | 久久久久精 | 麻豆久久久久久久 | 久久精品成人 | 日韩在线免费 | 一区二区三区国产视频 | eeuss国产一区二区三区四区 | 国外激情av | 精品国产乱码久久久久久久久 | 亚洲在线免费观看 | 国产真实精品久久二三区 | 亚洲综合久久久 | 欧美日韩不卡 | 欧美日在线 | 日韩精品在线看 | 夜夜草| 亚洲精品一区二区三区在线 | 久久精品二区亚洲w码 | 日日骚av| 精品综合久久久 | 精品日本久久久久久久久久 | 亚洲va国产日韩欧美精品色婷婷 | 瑟瑟激情 | 欧美小视频在线观看 |