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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)控制直流電機(jī)PWM調(diào)速程序+仿真

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:70481 發(fā)表于 2014-12-17 16:47 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
這個(gè)程序和電路都是自己弄出來的 現(xiàn)在分享給51hei的朋友們。
ON/OFF: 電機(jī)轉(zhuǎn)/停
INC: 占空比1%~100%遞增,每步1%
DEC: 占空比100%~1%遞減,每步1%
三位數(shù)碼管顯示,從1~100,表示占空比1%~100%


仿真文件和程序下載: moto.rar (68.74 KB, 下載次數(shù): 404)

評分

參與人數(shù) 1黑幣 +5 收起 理由
yinkun230 + 5 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:70481 發(fā)表于 2014-12-17 16:48 | 只看該作者
源碼:
  1. #include <reg52.h>
  2. /*********************************************
  3. * 定時(shí)器初值
  4. *********************************************/
  5. #define T0HIGH        0xec
  6. #define T0LOWW        0x8a

  7. /*********************************************
  8. *
  9. *********************************************/
  10. typedef unsigned char        u8;
  11. typedef unsigned int        u16;
  12. typedef unsigned long        u32;
  13. typedef bit                                BOOL;

  14. /*********************************************
  15. * 單片機(jī)管腳定義
  16. *********************************************/
  17. sbit KEY_ON_PIN = P2^0;
  18. sbit KEY_INC_PIN = P2^1;
  19. sbit KEY_DEC_PIN = P2^2;

  20. sbit MOTO_LEFT = P3^6;
  21. sbit MOTO_RIGHT = P3^7;

  22. /*********************************************
  23. * 按鍵定義
  24. *********************************************/
  25. #define KEY_NULL                0xff
  26. #define KEY_LONG_PERIOD        25
  27. #define KEY_CONTINUE_PERIOD        20

  28. #define KEY_DOWN                0x80
  29. #define KEY_CONTINUE        0x40
  30. #define KEY_UP                        0x20

  31. #define KEY_STATE_INIT                0
  32. #define KEY_STATE_WOBBLE        1
  33. #define KEY_STATE_PRESS                2
  34. #define KEY_STATE_LONG                3
  35. #define KEY_STATE_CONTINUE        4
  36. #define KEY_STATE_RELEASE        5

  37. #define KEY_ON_VALUE                1
  38. #define KEY_INC_VALUE                2
  39. #define KEY_DEC_VALUE                3

  40. #define KEY_ON                (KEY_ON_VALUE | KEY_DOWN)
  41. #define KEY_INC                (KEY_INC_VALUE | KEY_DOWN)
  42. #define KEY_INC_CON        (KEY_INC_VALUE | KEY_CONTINUE)
  43. #define KEY_DEC                (KEY_DEC_VALUE | KEY_DOWN)
  44. #define KEY_DEC_CON        (KEY_DEC_VALUE | KEY_CONTINUE)
  45. /*********************************************
  46. * 常量定義
  47. *********************************************/
  48. #define true        1
  49. #define false        0

  50. #define MOTO_ON                MOTO_LEFT = false;\
  51.                                         MOTO_RIGHT = true
  52. #define MOTO_OFF        MOTO_LEFT = true;\
  53.                                         MOTO_RIGHT = true
  54. /*********************************************
  55. * 全局變量定義
  56. *********************************************/
  57. code u8 DisCode[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xff};

  58. u8 PWMpercent = 0;
  59. u8 DisNum[4] = {0x0a, 0x0a, 0x0a, 0x00};
  60. u8 DisPosition = 0;
  61. u8 SecCount = 0;
  62. u8 u10msNum = 0;

  63. BOOL b10msEvent = false;
  64. BOOL b100msEvent = false;
  65. BOOL b1secEvent = false;
  66. BOOL MotoStart = false;
  67. BOOL MotoRun = false;

  68. void Key_Prosess(void);
  69. void Dynamic_Display(void);
  70. void Speed_Display(void);

  71. /*********************************************
  72. * 主函數(shù)
  73. *********************************************/
  74. main()
  75. {
  76.         TMOD = 0x01;
  77.         TH0 = T0HIGH;
  78.         TL0 = T0LOWW;
  79.         TR0 = 1;
  80.         ET0 = 1;
  81.         EA = 1;
  82.         P1 = 0x00;

  83.         while(1)
  84.         {
  85.                 if(true == b10msEvent)        //10毫秒定時(shí)標(biāo)志
  86.                 {
  87.                         b10msEvent = false;
  88.                         Key_Prosess();                //按鍵掃描
  89.                         Dynamic_Display();                //動態(tài)顯示

  90.                         if(true == MotoStart)        //如果電機(jī)啟動
  91.                         {
  92.                                 if(true == MotoRun)
  93.                                 {
  94.                                         if(--u10msNum == 0)                //如果電機(jī)轉(zhuǎn)動時(shí)間到,停止電機(jī)
  95.                                         {
  96.                                                 MotoRun = false;
  97.                                                 MOTO_OFF;
  98.                                         }
  99.                                 }
  100.                                 if(true == b1secEvent)                //PWM周期為1秒,1秒鐘時(shí)間到,開始下一個(gè)周期
  101.                                 {
  102.                                         b1secEvent = false;
  103.                                         MotoRun = true;
  104.                                         MOTO_ON;
  105.                                         u10msNum = PWMpercent;
  106.                                 }
  107.                         }
  108.                 }
  109.         }
  110. }
  111. /*********************************************
  112. * 清顯示
  113. *********************************************/
  114. void Num_Clear(void)
  115. {
  116.         u8 i;
  117.         for(i=0; i<3; i++)
  118.         {
  119.                 DisNum[ i] = 0x0a;
  120.         }
  121.         DisNum[3] = 0x00;
  122. }
  123. /*********************************************
  124. * 讀鍵值
  125. *********************************************/
  126. u8 Key_Scan(void)
  127. {
  128.         if(KEY_ON_PIN == false)
  129.                 return KEY_ON_VALUE;
  130.         if(KEY_INC_PIN == false)
  131.                 return KEY_INC_VALUE;
  132.         if(KEY_DEC_PIN == false)
  133.                 return KEY_DEC_VALUE;
  134.         return KEY_NULL;
  135. }
  136. /*********************************************
  137. * 按鍵狀態(tài)掃描
  138. *********************************************/
  139. u8 GetKey(void)
  140. {
  141.         static u8 KeyState = KEY_STATE_INIT;
  142.         static u8 KeyTimeCount = 0;
  143.         static u8 LastKey = KEY_NULL;        //保存按鍵釋放時(shí)候的鍵值
  144.         u8 KeyTemp = KEY_NULL ;

  145.         KeyTemp = Key_Scan();

  146.         switch(KeyState)
  147.         {
  148.                 case KEY_STATE_INIT:        //初始狀態(tài)
  149.                         if(KEY_NULL != KeyTemp)        //有鍵按下
  150.                         {
  151.                                 KeyState = KEY_STATE_WOBBLE;        //進(jìn)入消抖
  152.                         }
  153.                         break;

  154.                 case KEY_STATE_WOBBLE:        //消抖
  155.                         KeyState = KEY_STATE_PRESS;
  156.                         break;

  157.                 case KEY_STATE_PRESS:
  158.                         if(KEY_NULL != KeyTemp)
  159.                         {
  160.                                 LastKey = KeyTemp;        //保存鍵值,以便在釋放按鍵狀態(tài)返回鍵值
  161.                                 KeyTemp |= KEY_DOWN;        //按鍵按下
  162.                                 KeyState = KEY_STATE_LONG;
  163.                         }
  164.                         else
  165.                         {
  166.                                 KeyState = KEY_STATE_INIT;
  167.                         }
  168.                         break;

  169.                 case KEY_STATE_LONG:
  170.                         if(KEY_NULL != KeyTemp)
  171.                         {
  172.                                 if(++KeyTimeCount >= KEY_LONG_PERIOD)
  173.                                 {
  174.                                         KeyTimeCount = 0;
  175.                                         KeyState = KEY_STATE_CONTINUE;
  176.                                 }
  177.                         }
  178.                         else
  179.                         {
  180.                                 KeyState = KEY_STATE_RELEASE;
  181.                         }
  182.                         break;

  183.                 case KEY_STATE_CONTINUE:
  184.                         if(KEY_NULL != (KeyTemp))
  185.                         {
  186.                                 if(++KeyTimeCount >= KEY_CONTINUE_PERIOD)
  187.                                 {
  188.                                         KeyTimeCount = 0;
  189.                                         KeyTemp |= KEY_CONTINUE;  //連擊按鍵事件發(fā)生
  190.                                 }
  191.                         }
  192.                         else
  193.                         {
  194.                                 KeyState = KEY_STATE_RELEASE;
  195.                         }
  196.                         break;

  197.                 case KEY_STATE_RELEASE:
  198.                         LastKey |= KEY_UP;        //按鍵釋放
  199.                         KeyTemp = LastKey;
  200.                         KeyState = KEY_STATE_INIT;
  201.                         break;

  202.                 default:
  203.                         break;
  204.         }
  205.         return KeyTemp;
  206. }
  207. /*********************************************
  208. * 按鍵功能處理
  209. *********************************************/
  210. void Key_Prosess(void)
  211. {
  212.         u8 KeyData;

  213.         KeyData = GetKey();

  214.         switch(KeyData)
  215.         {
  216.                 case KEY_ON:        //開關(guān)電機(jī)
  217.                         if(true == MotoStart)
  218.                         {
  219.                                 MotoStart = false;
  220.                                 Num_Clear();
  221.                                 MOTO_OFF;
  222.                                 MotoRun = false;
  223.                                 PWMpercent= 0;
  224.                         }
  225.                         else
  226.                         {
  227.                                 MotoStart = true;
  228.                                 MOTO_ON;
  229.                                 MotoStart = true;
  230.                                 MotoRun = true;
  231.                                 u10msNum = PWMpercent = 1;
  232.                         }
  233.                         break;

  234.                 case KEY_INC:        //單步增加
  235.                 case KEY_INC_CON:        //連續(xù)增加
  236.                         if((PWMpercent < 100) && MotoStart)                //PWM從1%~100%
  237.                                 PWMpercent++;
  238.                         break;

  239.                 case KEY_DEC:        //單步減小
  240.                 case KEY_DEC_CON:        //連續(xù)減小
  241.                         if((PWMpercent > 1) && MotoStart)                //PWM從1%~100%
  242.                                 PWMpercent--;
  243.                         break;

  244.                 default:
  245.                         break;
  246.         }
  247.         Speed_Display();
  248. }
  249. /*********************************************
  250. * 速度轉(zhuǎn)換成十進(jìn)制數(shù)
  251. *********************************************/
  252. void Speed_Display(void)
  253. {
  254.         u8 i;

  255.         DisNum[1] = PWMpercent / 100;
  256.         DisNum[2] = PWMpercent % 100 / 10;
  257.         DisNum[3] = PWMpercent % 10;
  258.         for(i=1; i<3; i++)
  259.         {
  260.                 if(DisNum[ i] != 0)
  261.                         break;
  262.                 DisNum[ i] = 0x0a;
  263.         }
  264. }
  265. /*********************************************
  266. * 動態(tài)顯示速度百分比
  267. *********************************************/
  268. void Dynamic_Display(void)
  269. {
  270.         static u8 DisPinOn = 0x01;

  271.         DisPinOn <<= 1;
  272.         if(DisPinOn == 0x10)
  273.         {
  274.                 DisPosition = 0;
  275.                 DisPinOn = 0x01;
  276.         }
  277.         P0 = 0xff;
  278.         P1 = DisPinOn;
  279.         P0 = DisCode[DisNum[DisPosition++]];
  280. }
  281. /*********************************************
  282. * 定時(shí)器0中斷
  283. *********************************************/
  284. void timer0(void) interrupt 1
  285. {
  286.         TH0 = T0HIGH;
  287.         TL0 = T0LOWW;

  288.         b10msEvent = true;                //10毫秒中斷
  289.         if(++SecCount == 100)
  290.         {
  291.                 SecCount = 0;
  292.                 b1secEvent = true;                //1秒到時(shí)
  293.         }
  294. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:117923 發(fā)表于 2016-5-2 12:19 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

地板
ID:60479 發(fā)表于 2016-6-29 19:25 | 只看該作者
單片機(jī)控制直流電機(jī)PWM調(diào)速程序+仿真
回復(fù)

使用道具 舉報(bào)

5#
ID:139602 發(fā)表于 2016-9-17 11:10 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

6#
ID:140342 發(fā)表于 2016-9-24 18:29 | 只看該作者

謝謝分享
回復(fù)

使用道具 舉報(bào)

7#
ID:141057 發(fā)表于 2016-10-1 15:35 | 只看該作者
謝謝  分享
回復(fù)

使用道具 舉報(bào)

8#
ID:142813 發(fā)表于 2016-10-15 11:56 | 只看該作者
很久就想搞個(gè)這,終于找到了
回復(fù)

使用道具 舉報(bào)

9#
ID:148442 發(fā)表于 2016-11-22 01:56 | 只看該作者
謝謝分享,正在做這個(gè)程序。
回復(fù)

使用道具 舉報(bào)

10#
ID:154654 發(fā)表于 2017-1-1 21:19 | 只看該作者
謝謝分享,很好用
回復(fù)

使用道具 舉報(bào)

11#
ID:161244 發(fā)表于 2017-1-11 02:54 | 只看該作者

謝謝分享,哈哈
回復(fù)

使用道具 舉報(bào)

12#
ID:170753 發(fā)表于 2017-5-21 16:24 來自手機(jī) | 只看該作者
感謝樓主分享
回復(fù)

使用道具 舉報(bào)

13#
ID:188115 發(fā)表于 2017-7-12 13:07 | 只看該作者

感謝樓主分享
回復(fù)

使用道具 舉報(bào)

14#
ID:220284 發(fā)表于 2017-7-18 10:28 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

15#
ID:250118 發(fā)表于 2017-11-16 17:37 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

16#
ID:254318 發(fā)表于 2017-11-27 19:24 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

17#
ID:779781 發(fā)表于 2020-6-16 09:08 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 99精品在线观看 | 欧美精品二区 | 在线免费看黄 | 99久久久久 | 国产精品不卡视频 | 天天插天天射天天干 | 免费一二区 | 日韩在线中文字幕 | 久久国内 | 成人免费福利 | 国产高清无av久久 | 久久精品一区二区 | 久草中文在线 | 久久综合av | 欧美日韩一区二区三区视频 | 国产毛片毛片 | 亚洲欧美在线一区 | 九九九久久国产免费 | 欧美高清性xxxxhdvideosex | 久久精品综合 | 成人欧美一区二区 | 精品久久久久国产免费第一页 | 国产成人小视频 | 91久久国产 | 91视频在线| 久久精品亚洲 | 精品国产欧美在线 | 成人精品国产一区二区4080 | 久久久tv| 日韩精品区 | 91视频进入 | 老熟女毛片 | 日韩精品一区二区三区久久 | 激情久久av一区av二区av三区 | 国产精品福利在线 | 日韩欧美一区二区三区免费观看 | 欧美日韩一 | 欧美精品久久久久 | 亚洲一区二区三区在线免费 | 亚洲国产一区二区视频 | 国产精品日日做人人爱 |