找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 20966|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

旋轉(zhuǎn)編碼開關(guān)在單片機(jī)方面使用 附程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:86860 發(fā)表于 2015-7-26 01:36 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
         旋轉(zhuǎn)編碼開關(guān),比如數(shù)碼電位器  驅(qū)動(dòng)程序      具有左轉(zhuǎn)、右轉(zhuǎn)和按下三個(gè)功能,有五個(gè)腳,它的外形如下圖所示:

                    


(1) 1、3腳要外接上拉電阻,一般10K就足矣;
(2) 2腳一般接地就行;
(3) 4、5腳是下按鍵的開關(guān)接線(按下時(shí),4腳為低電平);
實(shí)物接線示意圖為:



                                       

     判斷正轉(zhuǎn) 和反轉(zhuǎn)的關(guān)鍵就是:當(dāng)BMA為低電平時(shí),BMB的跳變沿是怎樣的——上升沿表示正轉(zhuǎn),下降沿表示反轉(zhuǎn)。只要用代碼把這itP27=P2^7;
sbit P26=P2^6;
sbit P25=P2^5;
uchar codetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar count=0;
uchar flag;
ucharLast_BMB_status;
ucharCurrent_BMB_status;
//************************************************
void delay(uchar z)   //大約1ms的延時(shí)
{
   uchar x,y;
   for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}
//************************************************
void display()//顯示子程序
{
   P0=table[count];   //個(gè)位
   P27=0;
   delay(10);
   P27=1;
   P0=table[count0/10];   //十位
   P26=0;
   delay(10);
   P26=1;
   P0=table[count/100];   //百位
   P25=0;
   delay(10);
   P25=1;
}
//************************************************
void main()
{
   TMOD="0x01";   //定時(shí)器0,工作方式1
   TH0=0xD8;
   TL0=0xF0;    //給定時(shí)器裝上初值,10ms中斷一次
   ET0=1;   //打開定時(shí)器中斷
   EA =1;   //打開總中斷
   TR0=1;   //啟動(dòng)定時(shí)器0



   while(1)
   {
      Last_BMB_status=BMB;


      while(!BMA)   //BMA為低電平時(shí)
      {
         Current_BMB_status=BMB;
          flag="1";   //標(biāo)志位置為1說(shuō)明編碼開關(guān)被旋轉(zhuǎn)了
      }


      if(flag==1)
      {
          flag="0";   //時(shí)刻要注意這一點(diǎn)!給標(biāo)志位清零
         if((Last_BMB_status==0)&&(Current_BMB_status==1))//BMB上升沿表示正轉(zhuǎn)
          {
             count++;
             if(count==255)
             {
                count="0";
             }
          }
         if((Last_BMB_status==1)&&(Current_BMB_status==0))//BMB下降沿表示反轉(zhuǎn)
          {
             count--;
             if(count==0)
             {
                count="255";
             }
          }
      }
   }
}
//************************************************
void timer0() interrupt 1   //定時(shí)器0的中斷服務(wù)程序
{
   TH0=0xD8;
   TL0=0xF0;   //再次裝入初值
   display();  //每隔10ms顯示一次
   if(!BMC)    //按下旋轉(zhuǎn)編碼開關(guān)則計(jì)數(shù)清零
   {
      count="0";
   }
}


-------------------------------------------------------------------------------------------------


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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:227864 發(fā)表于 2018-9-15 10:06 | 只看該作者
正在研究這個(gè),學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

板凳
ID:394424 發(fā)表于 2019-11-18 16:15 | 只看該作者
我試過(guò)了  樓主的方法不錯(cuò) 贊
回復(fù)

使用道具 舉報(bào)

地板
ID:394424 發(fā)表于 2019-11-21 09:33 | 只看該作者
樓主在嗎 有的時(shí)候編碼開關(guān)會(huì)卡死while(!BMA)   //BMA為低電平時(shí)  
回復(fù)

使用道具 舉報(bào)

5#
ID:394424 發(fā)表于 2019-11-21 10:04 | 只看該作者
我覺(jué)得可能用外部中斷的辦法做比較好
回復(fù)

使用道具 舉報(bào)

6#
ID:949182 發(fā)表于 2021-7-17 16:20 來(lái)自手機(jī) | 只看該作者
Wprogrammer 發(fā)表于 2019-11-18 16:15
我試過(guò)了  樓主的方法不錯(cuò) 贊

這程序多垃圾啊,你說(shuō)好用?
回復(fù)

使用道具 舉報(bào)

7#
ID:135943 發(fā)表于 2022-6-17 21:58 | 只看該作者
qianlong999 發(fā)表于 2021-7-17 16:20
這程序多垃圾啊,你說(shuō)好用?

兄臺(tái),這用詞好像有點(diǎn)過(guò)。。。其實(shí)技術(shù)論壇最好的狀態(tài)是談?wù),反駁別人不好不是不可以。盡量也把自己的思路拿出來(lái)對(duì)比更好。
回復(fù)

使用道具 舉報(bào)

8#
ID:496636 發(fā)表于 2022-6-18 13:41 | 只看該作者
從其它網(wǎng)站復(fù)制過(guò)來(lái)的,那個(gè)count="0",怎么加了個(gè)雙引號(hào),其它網(wǎng)站就如此。復(fù)制過(guò)來(lái)也得改改錯(cuò)誤
回復(fù)

使用道具 舉報(bào)

9#
ID:69115 發(fā)表于 2022-6-19 15:12 | 只看該作者
A相低電平時(shí),根據(jù)B相的上升沿和下降沿,來(lái)判斷旋轉(zhuǎn)方向.確是是簡(jiǎn)單有效的方法.
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表