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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

一個很不錯的51單片機直流電機調速設計,仿真程序都有

[復制鏈接]
跳轉到指定樓層
樓主
大家一起學習下。仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg52.h>
  2. /*********************************************
  3. * 定時器初值
  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. * 單片機管腳定義
  16. *********************************************/
  17. sbit KEY_ON_PIN = P3^4;
  18. sbit KEY_INC_PIN = P3^5;
  19. sbit KEY_DEC_PIN = P3^6;
  20. sbit pwm1=P1^4;

  21. sbit MOTO_LEFT = P2^4;
  22. sbit MOTO_RIGHT = P2^5;

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

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

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

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

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

  51. #define MOTO_ON                MOTO_LEFT = false;\
  52.                                         MOTO_RIGHT = true
  53. #define MOTO_OFF        MOTO_LEFT = true;\
  54.                                         MOTO_RIGHT = true
  55. /*********************************************
  56. * 全局變量定義
  57. *********************************************/
  58. code u8 DisCode[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88};

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

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

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

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

  84.         while(1)
  85.         {
  86.                 if(true == b10msEvent)        //10毫秒定時標志
  87.                 {
  88.                         b10msEvent = false;
  89.                         Key_Prosess();                //按鍵掃描
  90.                         Dynamic_Display();                //動態顯示

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

  146.         KeyTemp = Key_Scan();

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

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

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

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

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

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

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

  214.         KeyData = GetKey();

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

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

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

  245.                 default:
  246.                         break;
  247.         }
  248.         Speed_Display();
  249. }
  250. /*********************************************
  251. * 速度轉換成十進制數
  252. *********************************************/
  253. void Speed_Display(void)
  254. {
  255.         u8 i;

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

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

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

所有資料51hei提供下載:
直流電機課設.zip (171.69 KB, 下載次數: 109)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:631508 發表于 2019-11-21 18:55 | 只看該作者
數碼管老是跳三個數,是怎么回事
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人在线视频免费观看 | www精品美女久久久tv | 国产精品入口麻豆www | 精品一区二区三区四区 | 日韩欧美在线一区 | 国产日韩一区 | 激情五月婷婷 | 欧美精品99 | 日韩成人在线观看 | 日韩av成人 | 国产区一区二区三区 | 91精品一区二区三区久久久久 | h视频在线免费 | 91素人 | 精精久久| 日韩精品成人av | 91精品久久久久久久久 | 二区三区视频 | 99久久99| 精品少妇一区二区三区日产乱码 | 国产乱码精品一区二区三区五月婷 | 草久久久| 日韩精品视频在线播放 | 污书屋 | 亚洲精品乱码久久久久久9色 | 狠狠婷婷综合久久久久久妖精 | 亚洲精品日韩精品 | 精品中文字幕在线观看 | 欧美精品中文字幕久久二区 | 国产精品99久久久久久久久 | 精品美女久久久久久免费 | 久久久久久久久久久91 | 少妇黄色 | 国产成人精品在线 | 日本在线综合 | 在线国产一区 | 日韩av成人 | 精品视频一区二区 | 国产69精品久久99不卡免费版 | 天天干天天玩天天操 | 午夜在线观看视频 |