標題: 51單片機旋轉(zhuǎn)編碼器模塊KY-040調(diào)試程序+仿真 LCD1602顯示 [打印本頁]

作者: 854100995    時間: 2017-9-7 14:26
標題: 51單片機旋轉(zhuǎn)編碼器模塊KY-040調(diào)試程序+仿真 LCD1602顯示
給大家分享一個51單片機+1602液晶屏顯示 KY-040旋轉(zhuǎn)編碼器模塊的程序和仿真

程序功能:旋轉(zhuǎn)編碼器順時針旋轉(zhuǎn),顯示數(shù)值增加
               旋轉(zhuǎn)編碼器逆時針旋轉(zhuǎn),顯示數(shù)值減小
               旋轉(zhuǎn)編碼器按下,切換顯示ON/OFF

根據(jù)旋轉(zhuǎn)編碼器KY-040模塊資料可知:


在下降觸發(fā)模式下,AB進行電平比較:
A觸發(fā)的中斷:同加異減
B觸發(fā)的中斷:同減異加
反之亦然

那么可以通過手動模擬外部中斷觸發(fā)瞬間的電平狀態(tài)來進行仿真,
                      CLK(A) ---- P3^2
                      DT(B)  ---- P3^3
                      SW(Z)  ---- P3^4
外部中斷0下降沿觸發(fā)后,對B的電平進行判斷即可知道旋轉(zhuǎn)編碼器
的旋轉(zhuǎn)方向。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:

  1. #include<reg51.h>
  2. #include"lcd.h"
  3. #include<intrins.h>

  4. //外部中斷的IO
  5. sbit K1=P3^2;
  6. sbit K2=P3^3;
  7. sbit K3=P3^4;

  8. void IntConfiguration();
  9. void Delay(unsigned int n);
  10. unsigned char KeyValue=0;
  11. unsigned char state=0;
  12. /*******************************************************************************
  13. * 函 數(shù) 名       : main
  14. * 函數(shù)功能                 : 主函數(shù)
  15. * 輸    入       : 無
  16. * 輸    出       : 無
  17. *******************************************************************************/
  18. void main(void)
  19. {
  20.         LcdInit();
  21.         IntConfiguration();
  22.         LCDWrite_String(2, 0, 10, "Bian ma qi");
  23.         while(1)
  24.         {
  25.                 if(K3==0)
  26.                 {
  27.                         Delay(1);         //延時消抖
  28.                         if(K3==0)
  29.                         {
  30.                                 state=!state;
  31.                                 while(K3==0);
  32.                         }
  33.                 }
  34.                 if(state==1)
  35.                 {
  36.                         LcdWriteCom(0xc0+13);
  37.                         LcdWriteData('O');
  38.                         LcdWriteData('N');
  39.                         LcdWriteData(' ');
  40.                 }
  41.                 else
  42.                 {
  43.                         LcdWriteCom(0xc0+13);
  44.                         LcdWriteData('O');
  45.                         LcdWriteData('F');
  46.                         LcdWriteData('F');
  47.                 }
  48.                 LcdWriteCom(0xC0+4);
  49.                 LcdWriteData('0'+KeyValue/100%10);
  50.                 LcdWriteData('0'+KeyValue/10%10);
  51.                 LcdWriteData('0'+KeyValue%10);
  52.         }        
  53. }

  54. /*******************************************************************************
  55. * 函 數(shù) 名         : IntConfiguration()
  56. * 函數(shù)功能                   : 設(shè)置外部中斷
  57. * 輸    入         : 無
  58. * 輸    出         : 無
  59. *******************************************************************************/
  60. void IntConfiguration()
  61. {
  62.         //設(shè)置INT0
  63.         IT0=1;//跳變沿出發(fā)方式(下降沿)
  64.         EX0=1;//打開INT0的中斷允許。
  65.         
  66.         EA=1;//打開總中斷        
  67. }
  68. /*******************************************************************************
  69. * 函 數(shù) 名         : Delay(unsigned int n)
  70. * 函數(shù)功能                   : 延時
  71. * 輸    入         : n
  72. * 輸    出         : 無
  73. *******************************************************************************/

  74. void Delay(unsigned int n)   //延時50us誤差 0us
  75. {
  76.     unsigned char a,b;
  77.                 for(;n>0;n--)
  78.                 {
  79.             for(b=1;b>0;b--)
  80.         for(a=22;a>0;a--);
  81.                 }
  82. }
  83. /*******************************************************************************
  84. * 函 數(shù) 名         : Int0()        interrupt 0
  85. * 函數(shù)功能                   : 外部中斷0的中斷函數(shù)
  86. * 輸    入         : 無
  87. * 輸    出         : 無
  88. *******************************************************************************/

  89. void Int0()        interrupt 0                //外部中斷0的中斷函數(shù)
  90. {
  91.         if(K2==1)
  92.         {
  93.                 KeyValue++;
  94.         }
  95.         if(K2==0)
  96.         {
  97.                 KeyValue--;
  98.         }
  99.         if(KeyValue>200)
  100.         KeyValue=200;
  101.         if(KeyValue<1)
  102.         KeyValue=1;
  103. }


  104. ……………………

  105. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼


所有資料51hei附件下載,注意仿真是用Proteus7.5畫的,高版本可能無法打開,請安裝7.5或7.8版本,擴展名為dsn的那個:
旋轉(zhuǎn)編碼器.zip (369.52 KB, 下載次數(shù): 1105)

作者: LXJ50    時間: 2017-9-7 17:34
好資料,一定要分享學習
作者: lekeak47    時間: 2018-1-16 23:20
看看,不知道如何?
作者: xrfxrfxrf008    時間: 2018-2-27 09:09
好東西  正是需要的
作者: Hwinnie    時間: 2018-3-10 14:59
找了一圈沒有旋轉(zhuǎn)編碼器,原來要這么搞
作者: h1007886499    時間: 2018-3-16 20:42
Hwinnie 發(fā)表于 2018-3-10 14:59
找了一圈沒有旋轉(zhuǎn)編碼器,原來要這么搞

可以分享下 嗎  
還沒賺夠黑幣
作者: bleach    時間: 2018-4-30 11:10
謝謝分享,正在用這個編碼器,很好的參考資料
作者: 906267461    時間: 2018-5-10 13:45
謝謝分享
作者: shtsw    時間: 2018-5-24 20:45
真好  我正在找,就看到了
作者: landisonss    時間: 2018-7-13 12:15
正需要謝謝樓主
作者: jinanyuanyue    時間: 2018-7-18 15:09
謝謝,樓主好人,我學了很久都看不明白,你這是雪中送炭啊
作者: 7782    時間: 2018-9-3 16:17
好資料,一定要學習學習
作者: 天12    時間: 2018-9-5 15:32
很棒的思路
作者: 15942379927    時間: 2018-10-21 19:02
謝謝。值得學習
作者: stkh    時間: 2018-11-11 19:22
很詳細,贊一個
作者: zx49666428    時間: 2018-11-11 19:45

謝謝分享,正在用這個編碼器,很好的參考資料
作者: tyrant988    時間: 2019-1-11 15:28
謝謝,很好,很實用
作者: mykt2012    時間: 2019-1-12 01:17
正好需要
作者: wangcongliang    時間: 2019-1-13 16:57
感謝樓主大佬啊,簡潔明了!
作者: 201610103061    時間: 2019-3-2 23:18
get!非常棒!

作者: guo1373766226    時間: 2019-4-7 00:08
好東西。!
作者: ElecC    時間: 2019-6-27 08:59
樓主,我試了你的仿真。點擊SW2的時候編碼器的值并沒有減小,沒反應(yīng),是程序有BUG嗎?還是什么地方?jīng)]操作對?
作者: boumbo    時間: 2019-7-6 18:11
感謝樓主分享,很受用
作者: 放心去飛    時間: 2019-7-8 17:24
學習一下好東西
作者: 小黑魚    時間: 2019-7-11 19:33
厲害,必須贊一個
作者: 萬萬123    時間: 2019-9-2 17:03
點贊。。。。
作者: mobicity    時間: 2019-10-6 21:31
編碼器看似很簡單的一個器件,其時一點都不簡單。學習下,感謝
作者: fancunwu    時間: 2019-10-7 13:51
ElecC 發(fā)表于 2019-6-27 08:59
樓主,我試了你的仿真。點擊SW2的時候編碼器的值并沒有減小,沒反應(yīng),是程序有BUG嗎?還是什么地方?jīng)]操作對 ...

就是 我也試了 值不會減 ,只會增加  不會減少,程序可能有問題。
作者: 51黑電子會員    時間: 2019-12-8 11:00
如何下載

作者: 51黑電子會員    時間: 2019-12-8 11:00
如何下載
作者: xuanmic    時間: 2020-1-16 21:56
謝謝樓主的分享。
作者: 道洲    時間: 2020-2-18 16:11

好資料,一定要分享學習
作者: xmfjfhcel    時間: 2020-2-18 17:24
想不到這兒有這個資料, 之前看了這個東東,不知道原理,也沒敢下手買。 先標記下,空了好好學習學習。
作者: lindeijun1    時間: 2020-2-19 15:44
謝謝樓主分享!。!
作者: xiejp03    時間: 2020-4-12 21:51
好資料,一定要分享學習
作者: 一只小月白    時間: 2020-5-9 16:35
謝謝。≌眯枰
作者: foi    時間: 2020-6-20 16:33
這個是測角度的嗎

作者: Eip_Nit    時間: 2020-6-20 22:21
很好用,很詳細
作者: yyzf998    時間: 2020-7-2 07:05
好東西,好好學習,天天向上!感謝樓主的無私奉獻!
作者: thanksbaby    時間: 2020-7-2 08:56
編碼器,io口捕捉脈沖,很好的資料,謝謝
作者: marsyu1991    時間: 2020-8-2 23:39
原理是看懂了,但是按照目前的程序來看,因為51單片機的邊沿觸發(fā)只能設(shè)定下降沿觸發(fā),并不能設(shè)定任意沿觸發(fā),因此該程序的效果還是存在點問題
作者: 652018634    時間: 2020-10-23 05:29
謝謝分享,正在用這個編碼器,很好的參考資料
作者: xyllovezuu    時間: 2020-11-3 18:11
很好的學習資料,謝謝分享!
作者: catlu    時間: 2021-3-5 18:19
感謝樓主的例程,正在研究怎么永這個編碼器當開關(guān)用
作者: yangyouyoulin    時間: 2021-6-7 08:38
剛好想用這個編碼器,很好的參考資料,謝謝!
作者: bomb1999    時間: 2021-6-8 19:58
下載運行了一下模擬,顯示數(shù)可增可減,目前問題是如何將此類編碼器與接收譯碼端的連接與適當?shù)目刂戚敵觥8兄x樓主解惑
作者: bomb1999    時間: 2021-6-8 20:20
手里有兩種編碼器 一直木有用上呢
作者: chenmanan    時間: 2021-8-9 00:06
謝謝分享,正在用這個編碼器,很好的參考資料
作者: CIKAR    時間: 2021-10-1 07:39
正是需要的 非常不錯
作者: xiexugang    時間: 2021-10-1 23:31
旋轉(zhuǎn)編碼器程序,沒有那么復(fù)雜的,一個8位變量,大概4條if語句就可以實現(xiàn)的
作者: Simpron1    時間: 2021-10-2 08:40
寫的很好 加油樓主 感謝樓主分享
作者: 628    時間: 2021-10-5 12:56
附件里沒有proteus仿真文件啊
作者: heicad    時間: 2021-10-5 14:56
628 發(fā)表于 2021-10-5 12:56
附件里沒有proteus仿真文件啊

仿真文件是用Proteus7.5畫的,dsn文件那個,你裝個7.5就能打開了
作者: guojizhou    時間: 2021-10-13 12:01
fancunwu 發(fā)表于 2019-10-7 13:51
就是 我也試了 值不會減 ,只會增加  不會減少,程序可能有問題。

我也是
作者: 21cnsound    時間: 2022-1-20 15:25
謝謝分享,不過還是沒看懂怎么模擬左轉(zhuǎn)還是右轉(zhuǎn)?
作者: 21cnsound    時間: 2022-1-20 15:27
謝謝LZ分享,不過還是沒看懂怎么操作旋轉(zhuǎn)的
作者: 21cnsound    時間: 2022-1-21 11:10
請問,仿真時怎么操作SW1和SW2來模擬出左轉(zhuǎn)和右轉(zhuǎn)呢?
按順序按這兩個開關(guān)好像不行吧
作者: haokanma77    時間: 2022-3-6 08:27
留個記號,爭取試試
作者: Kongman    時間: 2022-3-15 15:47
Mark一下
作者: houwei0303    時間: 2022-3-20 14:56
感覺不是特別靈敏
作者: 374866830    時間: 2022-4-2 18:39
Hwinnie 發(fā)表于 2018-3-10 14:59
找了一圈沒有旋轉(zhuǎn)編碼器,原來要這么搞

兄弟,能分享下嗎?
作者: jinanyuanyue    時間: 2022-5-18 15:34
對這個感興趣,謝謝分享
作者: innere    時間: 2022-9-15 08:11
guojizhou 發(fā)表于 2021-10-13 12:01
我也是

最后解決了嗎,折騰了兩天,我快崩潰了




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