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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機+編碼器+42步進電機的源程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:315295 發表于 2018-5-15 10:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
前幾天幫別做一個51的小東西需要編碼器,結果發現網上編碼器的程序比較不好找,自己根據別人一個巧妙的思路寫了一個讀編碼器讀數的程序,用LCD1602顯示出來。里邊還有使用L298N驅動42步進電機部分,可以參考一下。

單片機源程序如下:
  1. #include <reg52.h>

  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;

  4. //LCD1602定義
  5. #define LCD1602_DB P0        //LCD1602數據總線

  6. sbit LCD1602_RS = P2^7;         //RS端
  7. sbit LCD1602_RW = P2^6;         //RW端
  8. sbit LCD1602_EN = P2^5;         //EN端

  9. uchar code digit[ ]={"0123456789"}; //定義字符數組顯示數字
  10. uchar idata TEST[]="TEST";

  11. //電機正反轉二維數組 0為逆時針,1為順時針
  12. uchar code MotorCode[2][8]={{0x04,0x06,0x02,0x0a,0x08,0x09,0x01,0x05},{0x05,0x01,0x09,0x08,0x0a,0x02,0x06,0x04}};

  13. uchar MotorStatus;//電機正反轉標志位

  14. sbit EncoderA=P3^2;    //編碼器A相
  15. sbit EncoderB=P3^4;                 //編碼器B相

  16. uint EncoderCount=0 ;
  17. /* 毫秒軟件延時函數*/
  18. void delay_ms(uint x)
  19. {
  20.         uint a,b;
  21.         for(a=x;a>0;a--)
  22.                 for(b=114;b>0;b--);
  23. }

  24. /*=================================================
  25. *函數名稱:Read_Busy
  26. *函數功能:判斷1602液晶忙,并等待
  27. =================================================*/
  28. void Read_Busy()
  29. {
  30.         uchar busy;
  31.         LCD1602_DB = 0xff;//復位數據總線
  32.         LCD1602_RS = 0;          //拉低RS
  33.         LCD1602_RW = 1;          //拉高RW讀
  34.         do
  35.         {
  36.                 LCD1602_EN = 1;//使能EN
  37.                 busy = LCD1602_DB;//讀回數據
  38.                 LCD1602_EN = 0;         //拉低使能以便于下一次產生上升沿
  39.         }while(busy & 0x80); //判斷狀態字BIT7位是否為1,為1則表示忙,程序等待
  40. }
  41. /*=================================================
  42. *函數名稱:LCD1602_Write_Cmd
  43. *函數功能:寫LCD1602命令
  44. *調用:Read_Busy();
  45. *輸入:cmd:要寫的命令
  46. =================================================*/
  47. void LCD1602_Write_Cmd(uchar cmd)
  48. {
  49.         Read_Busy();         //判斷忙,忙則等待
  50.         LCD1602_RS = 0;
  51.         LCD1602_RW = 0;        //拉低RS、RW操作時序情況1602課件下中文使用說明基本操作時序章節
  52.         LCD1602_DB = cmd;//寫入命令
  53.         LCD1602_EN = 1;         //拉高使能端 數據被傳輸到LCD1602內
  54.         LCD1602_EN = 0;         //拉低使能以便于下一次產生上升沿
  55. }
  56. /*=================================================
  57. *函數名稱:LCD1602_Write_Dat
  58. *函數功能:寫LCD1602數據
  59. *調用:Read_Busy();
  60. *輸入:dat:需要寫入的數據
  61. =================================================*/
  62. void LCD1602_Write_Dat(uchar dat)
  63. {
  64.         Read_Busy();
  65.         LCD1602_RS = 1;
  66.         LCD1602_RW = 0;
  67.         LCD1602_DB = dat;
  68.         LCD1602_EN = 1;
  69.         LCD1602_EN = 0;
  70. }
  71. /*=================================================
  72. *函數名稱:LCD1602_Clear
  73. *函數功能:LCD1602清屏
  74. =================================================*/
  75. void LCD1602_Clear()
  76. {
  77.         Read_Busy();
  78.         LCD1602_Write_Cmd(0x01); //清屏
  79. }


  80. /*=================================================
  81. *函數名稱:LCD1602_Dis_OneChar
  82. *函數功能:在指定位置顯示一個字符
  83. *調用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();       
  84. *輸入:x:要顯示的橫坐標取值0-40,y:要顯示的行坐標取值0-1(0為第一行,1為第二行)
  85.                 dat:需要顯示的數據以ASCLL形式顯示
  86. =================================================*/
  87. void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat)
  88. {
  89.         if(y)        x |= 0x40;
  90.         x |= 0x80;
  91.         LCD1602_Write_Cmd(x);
  92.         LCD1602_Write_Dat(dat);               
  93. }
  94. /*=================================================
  95. *函數名稱:LCD1602_Dis_Str
  96. *函數功能:在指定位置顯示字符串
  97. *調用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
  98. *輸入:x:要顯示的橫坐標取值0-40,y:要顯示的行坐標取值0-1(0為第一行,1為第二行)
  99.                 *str:需要顯示的字符串
  100. =================================================*/
  101. void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
  102. {
  103.         if(y) x |= 0x40;
  104.         x |= 0x80;
  105.         LCD1602_Write_Cmd(x);
  106.         while(*str != '\0')
  107.         {
  108.                 LCD1602_Write_Dat(*str++);
  109.         }
  110. }
  111. /*=================================================
  112. *函數名稱:Init_LCD1602
  113. *函數功能:1602初始化
  114. *調用:        LCD1602_Write_Cmd();
  115. =================================================*/
  116. void Init_LCD1602()
  117. {
  118.         LCD1602_Write_Cmd(0x38); //        設置16*2顯示,5*7點陣,8位數據接口
  119.         LCD1602_Write_Cmd(0x0c); //打開顯示屏,不顯示光標,光標所在位置的字符不閃爍。
  120.         LCD1602_Write_Cmd(0x06); //讀寫一字節后地址指針加1
  121.         LCD1602_Write_Cmd(0x01); //清除顯示
  122. }

  123. void Motor_Forward() //電機正轉
  124. {
  125.         TMOD=0x01;
  126.         TH0=(65535-2000)/256;
  127.         TL0=(65535-2000)%256;
  128.         EA=1;
  129.         ET0=1;
  130.         TR0=1;
  131.         MotorStatus=0;
  132. }
  133. void Motor_Reversal() //電機反轉
  134. {
  135.         TMOD=0x01;
  136.         TH0=(65535-2000)/256;
  137.         TL0=(65535-2000)%256;
  138.         EA=1;
  139.         ET0=1;
  140.         TR0=1;
  141.         MotorStatus=1;
  142. }

  143. void Motor_Stop()  //停止電機
  144. {
  145.         ET0=0;
  146.         TR0=0;
  147.         P1=P1&0xF0;
  148. }


  149. uchar index = 0;  //定義節拍輸出索引
  150. void time0() interrupt 1
  151. {
  152.         uchar tmp;  //定義一個臨時變量

  153.         TH0=(65535-1000)/256;
  154.         TL0=(65535-1000)%256;
  155.        
  156.         tmp = P1; //用 tmp 把 P1 口當前值暫存
  157.   tmp = tmp & 0xF0; //用&操作清零低4位
  158.         //用|操作把節拍代碼寫到低4位
  159.   tmp = tmp | MotorCode[MotorStatus][index];
  160.         //把低4位的節拍代碼和高4位的原值送回 P1
  161.   P1 = tmp;
  162.   index++;  //節拍輸出索引遞增
  163.   index = index & 0x07;  //用&操作實現到8歸零
  164.        
  165. }

  166. Init_Encoder ()
  167. {
  168.         EA = 1;        //開總中斷
  169.         EX0 = 1;//開外部中斷1
  170.         IT0 = 1;//外部中斷1下降沿觸發
  171. }



  172. void main()
  173. {
  174.         Init_Encoder ();
  175.         Init_LCD1602();
  176.         Motor_Reversal();  
  177.         LCD1602_Dis_Str(0, 0, &TEST[0]);                                                                                //提示第一行MENU1       
  178.     while (1)
  179.                 {
  180.                         LCD1602_Dis_OneChar(0,1,digit[EncoderCount/10000]);
  181.                         LCD1602_Dis_OneChar(1,1,digit[EncoderCount%10000/1000]);
  182.                         LCD1602_Dis_OneChar(2,1,digit[EncoderCount%1000/100]);
  183.                         LCD1602_Dis_OneChar(3,1,digit[EncoderCount%100/10]);
  184.                         LCD1602_Dis_OneChar(4,1,digit[EncoderCount%10/1]);
  185.                         delay_ms(100);
  186. //      delay_ms(500);  //延時 2 ms,即 2 ms 執行一拍
  187. //                        Motor_Reversal(); //電機反轉
  188. //                        delay_ms(500);  //延時 2 ms,即 2 ms 執行一拍
  189. //                        Motor_Stop();
  190. //                        delay_ms(500);  //延時 2 ms,即 2 ms 執行一拍
  191.     }
  192.        
  193. }

  194. //外部中斷1中斷服務程序
  195. void int0() interrupt 0
  196. {
  197.         if (EncoderB)
  198.         {
  199.                 EncoderCount++;     //正轉
  200.         }else
  201.         {
  202.                 EncoderCount--;     //反轉
  203.         }
  204.         if (EncoderCount==360)
  205.         Motor_Stop();       
  206. }  
復制代碼

所有資料51hei提供下載:
42步進電機 編碼器.rar (32.23 KB, 下載次數: 489)


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

使用道具 舉報

沙發
ID:380367 發表于 2018-7-29 00:29 | 只看該作者
好東西
回復

使用道具 舉報

板凳
ID:331575 發表于 2018-10-21 20:26 | 只看該作者
好貼  頂上去
回復

使用道具 舉報

地板
ID:298008 發表于 2018-10-22 15:36 | 只看該作者
好東西,頂一頂。
回復

使用道具 舉報

5#
ID:432768 發表于 2018-11-25 11:39 | 只看該作者
學習學習
回復

使用道具 舉報

6#
ID:430087 發表于 2018-11-25 12:08 | 只看該作者
好東西,頂一頂!!
回復

使用道具 舉報

7#
ID:433645 發表于 2018-11-26 18:58 | 只看該作者
謝謝大佬
回復

使用道具 舉報

8#
ID:433645 發表于 2018-11-26 19:01 | 只看該作者
謝謝大佬的分享
回復

使用道具 舉報

9#
ID:383374 發表于 2019-1-22 01:34 來自觸屏版 | 只看該作者
太強了。。
回復

使用道具 舉報

10#
ID:165117 發表于 2019-1-24 14:34 | 只看該作者
謝謝大佬的分享,學習 學習!!
回復

使用道具 舉報

11#
ID:165117 發表于 2019-1-24 14:35 | 只看該作者
有沒有電路圖啊????
回復

使用道具 舉報

12#
ID:493584 發表于 2019-5-4 16:30 | 只看該作者
樓主用的是八拍的嗎?
回復

使用道具 舉報

13#
ID:522695 發表于 2019-5-21 22:16 | 只看該作者
頂上去,學習了
回復

使用道具 舉報

14#
ID:537232 發表于 2019-6-10 17:03 | 只看該作者
大哥,沒圖?
回復

使用道具 舉報

15#
ID:559272 發表于 2019-6-10 19:14 | 只看該作者
很給力!
回復

使用道具 舉報

16#
ID:282095 發表于 2019-6-10 21:43 | 只看該作者
42步進電機用的是多少拍的啊
回復

使用道具 舉報

17#
ID:565555 發表于 2019-6-18 12:01 | 只看該作者
感謝大佬。。。。。。。。。。。!
回復

使用道具 舉報

18#
ID:451441 發表于 2019-8-5 10:22 | 只看該作者
這個是好東西,謝謝分享
回復

使用道具 舉報

19#
ID:595908 發表于 2019-10-30 19:04 | 只看該作者
謝謝分享
回復

使用道具 舉報

20#
ID:413383 發表于 2019-11-8 23:58 | 只看該作者
有沒有電路圖啊????
回復

使用道具 舉報

21#
ID:20672 發表于 2019-11-14 13:06 | 只看該作者
謝謝分享
回復

使用道具 舉報

22#
ID:754694 發表于 2020-5-18 12:42 來自觸屏版 | 只看該作者
學習了,感謝樓主
回復

使用道具 舉報

23#
ID:187802 發表于 2020-5-20 10:39 | 只看該作者

謝謝分享
回復

使用道具 舉報

24#
ID:688460 發表于 2020-7-2 06:39 | 只看該作者
寶貝不錯,好好學習了,謝謝樓主!
回復

使用道具 舉報

25#
ID:903206 發表于 2021-4-14 23:10 來自觸屏版 | 只看該作者
有仿真沒?
回復

使用道具 舉報

26#
ID:229761 發表于 2021-12-27 14:32 | 只看該作者
不完全,是不是要下載壓縮包?
回復

使用道具 舉報

27#
ID:399179 發表于 2023-8-30 21:59 來自觸屏版 | 只看該作者
謝謝樓主!有沒有電路圖?
回復

使用道具 舉報

28#
ID:24486 發表于 2024-1-16 19:32 | 只看該作者
這個是好東西,謝謝分享。
回復

使用道具 舉報

29#
ID:1108751 發表于 2024-10-24 13:09 | 只看該作者
有圖嗎,要怎么接線
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩中文字幕av | 成人午夜在线 | av在线一区二区三区 | 欧美另类视频 | 久久久久亚洲国产| 国产精品自拍视频网站 | 成人综合视频在线观看 | 日韩欧美二区 | a看片| 91直接看| 亚洲一区二区三区在线播放 | 久久国产精品网站 | 一区二区三 | 天堂中文资源在线 | 久久亚洲经典 | 亚洲欧美视频一区 | 国产午夜高清 | 日本免费黄色一级片 | h视频在线看| 黄色一级大片视频 | 国产精品自产拍 | 日韩av视屏| 久久久片| 国内精品一区二区三区 | 自拍偷拍第一页 | 色婷婷亚洲一区二区三区 | 免费网站在线 | 91精品国产一区二区三区 | 国产1页| 精品一区二区三区91 | 久久久欧洲 | 国产日韩精品一区 | 在线观看视频91 | 午夜网站视频 | 影音先锋中文字幕在线观看 | 久久精品亚洲一区二区三区浴池 | 婷婷久久精品一区二区 | 久久另类 | 久久丁香| 成人免费一级视频 | 日本不卡一区 |