找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2387|回复: 0
收起左侧

直流电机调速仿真与单片机源码

[复制链接]
ID:301955 发表于 2018-6-6 13:49 | 显示全部楼层 |阅读模式
直流电机调速仿真文件和程序在文件夹
0.png 0.png


单片机源程序如下:
  1. //**********cx.c************************************************
  2. #include <REG51.h>
  3. #include <string.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. #define Led_wx P2
  7. #define Led_dx P0
  8. //**********定义变量********************************************
  9. uchar pwm=20;                          //定义pwm周期数
  10. uchar pwmH=1;                          //定义高电平脉冲个数计数器
  11. uchar counter=0;                       //定义脉冲个数计数器
  12. uchar Ledplay[6];                                           //
  13. uchar bn=0;                            //
  14. uchar M=1;                             //
  15. bit SW=0;                              //
  16. bit LR=0;                              //
  17. //**********定义端口********************************************
  18. sbit KSW=P1^0;                         //定义启停控制引脚
  19. sbit KLR=P1^1;                         //定义左、右转控制引脚
  20. sbit KSPU=P1^2;                        //定义加速控制引脚
  21. sbit KSPD=P1^3;                        //定义减速控制引脚
  22. sbit M1=P3^0;                          //定义电机驱动控制引脚
  23. sbit M2=P3^1;                                                    //定义电机驱动控制引脚
  24. sbit M3=P3^7;                     
  25. //**********定义函数********************************************
  26. uchar code no[]=                       //-----------数码代码
  27. {
  28.   0x3f,                                //0
  29.   0x06,                                //1
  30.   0x5b,                                //2
  31.   0x4f,                                //3
  32.   0x66,                                //4
  33.   0x6d,                                //5
  34.   0x7d,                                //6
  35.   0x07,                                //7
  36.   0x7f,                                //8
  37.   0x6f,                                //9
  38.   0x38,                                //L 10
  39.   0x77,                                                                   //R 11
  40.   0x40                                                               //- 12
  41. };                                                                 
  42. uchar code wex[]=                                           //-----------显示位码
  43. {
  44.   0xfe,                                                                   //选中第一位
  45.   0xfd,                                                                   //选中第二位
  46.   0xfb,                                                                   //选中第三位
  47.   0xf7,                                                                   //选中第四位
  48.   0xef,                                                                   //选中第五位
  49.   0xdf                                                                   //选中第六位
  50. };
  51. //****************************************************************
  52. void Delay(unsigned int i)             //延时单次6us
  53. {
  54.    while(i--);
  55. }
  56. void DelayM(unsigned int t)                           //延时单次1ms
  57. {
  58.    unsigned char i;
  59.    while(--t!=0)
  60.    {
  61.           for(i=0;i<120;i++);
  62.    }
  63. }
  64. //*****************************************************************
  65. void putin (int u)                                           //字符载入函数-将字符装入显示寄存器
  66. {
  67.    Ledplay[bn]=no[u];
  68.    bn++;                                                       //换下一个显示缓冲环节
  69. }
  70. //*****************************************************************
  71. void clearRAM (void)                                   //寄存器清空函数-6个寄存器清空(0x00)
  72. {                                         
  73.    uchar a;                                                           //定义变量用于清空数据指针
  74.    for(a=0;a<6;a++)                                           //指向2个寄存器
  75.    {                                     
  76.          Ledplay[a]=0;                                       //将指向的寄存器清空
  77.    }
  78. }
  79. void ledxs(void)                                           //数码管显示子程序
  80. {
  81.   uchar i;
  82.   uchar Date=0;
  83.   uchar wx=0;
  84.   for(i=0;i<6;i++)                                           //扫描数码管1~6位
  85.   {
  86.          Date=wex[i];
  87.          Date=Date & 0x3f;                 //取低6位数据
  88.          wx=Led_wx & 0xc0 | Date;               //屏蔽高2位端口
  89.          Led_wx=wx;                                           //送数据
  90.          Led_dx=Ledplay[i];
  91.          DelayM(2);
  92.   }
  93. }
  94. void Time0_int(void)                                        //定时器T0初始化
  95. {
  96.         TMOD=0X02;
  97.         TH0=56;
  98.         TL0=56;
  99.         ET0=1;
  100.         EA=1;
  101.         TR0=1;
  102. }
  103. void Time0()        interrupt 1 using 1            //定时服务程序
  104. {
  105.         M3=1;
  106.         counter++;
  107.         if (counter>=pwmH)
  108.         {
  109.           M=0;
  110.         }
  111.         if (counter==pwm)
  112.         {
  113.           counter=0;
  114.           M=1;
  115.         }
  116. }
  117. //**********主函数*******************************************
  118. main()
  119. {
  120.    Time0_int();
  121.         while(1)
  122.         {
  123. //**********按键处理*****************************************
  124.           if(KSW==0)                                       //检测开始、停止
  125.           {                                                       
  126.                 DelayM(20);                                           //延时去抖
  127.                 if(KSW==0)
  128.                 {
  129.                   SW=~SW;
  130.                 }
  131.             while(KSW==0);                                   //等待键释放
  132.           }
  133.           if(KLR==0)                                           //检测左转、右转
  134.           {
  135.                 DelayM(20);                                       //延时去抖
  136.                 if(KLR==0)
  137.             {
  138.                   LR=~LR;
  139.                 }
  140.             while(KLR==0);                               //等待键释放
  141.           }
  142.           if(KSPU==0)                                       //检测加速
  143.           {
  144.                 DelayM(20);                                   //延时去抖
  145.                 if(KSPU==0)
  146.                 {
  147.                   pwmH++;
  148.                   if(pwmH==pwm)
  149.                   {
  150.                     pwmH=pwm-1;
  151.                   }
  152.                 }
  153.             while(KSPU==0);
  154.            }
  155.            if(KSPD==0)                                       //检测减速
  156.            {
  157.                   DelayM(20);                               //延时去抖
  158.                   if(KSPD==0)
  159.                   {
  160.                     pwmH--;
  161.                         if(pwmH==0)
  162.                         {
  163.                           pwmH=1;
  164.             }
  165.                   }
  166.                   while(KSPD==0);
  167.             }
  168. //****************************************************************
  169.                 if(SW==0)
  170.                 {
  171.                   M1=0;

  172.          M2=0;
  173.                   bn=0;
  174.                   clearRAM();
  175.                 }
  176.                 if(SW==1)
  177.             {
  178.               bn=0;
  179.                   clearRAM();
  180.                   putin(pwm%10);                              //显示PWM个位
  181.                   putin(pwm/10);                          //显示PWM十位
  182.                   putin(12);                                      //显示-
  183.                   putin(pwmH%10);                              //显示PWMH个位
  184.                   putin(pwmH/10);                              //显示PWMH十位
  185.                   if(LR==0)
  186.                   {
  187.                     M1=0;
  188.                         M2=M;
  189.                         putin(11);                                  //显示左转L
  190.                   }
  191.                   if(LR==1)
  192.                   {
  193.                         M1=M;
  194.                         M2=0;
  195.                         putin(10);                                  //显示右转R
  196.                   }
  197.                 }
  198.                 ledxs();                                         //数码管显示
  199.         }
  200. }
复制代码

所有资料51hei提供下载:
直流电机调速.rar (52.38 KB, 下载次数: 69)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表