找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14774|回复: 8
打印 上一主题 下一主题
收起左侧

单片机直流电机控制电路原理图与源程序

  [复制链接]
跳转到指定楼层
楼主
直流电机控制电路仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. ///*************************************************************************************************************
  2. ///直流电机的pwm控制程序
  3. ///功能:直流电机的速度控制,速度测试,速度显示。
  4. ///作者:廖维斌,郭留涛
  5. ///*************************************************************************************************************


  6. #include<reg51.h>                                ///包含头文件
  7. #include<absacc.h>
  8. #define gew DBYTE[0X40]                        ///定义显示缓冲区 个位
  9. #define shiw DBYTE[0X41]                        //////////////////十位
  10. #define baiw DBYTE[0X42]                        //////////////////百位
  11. #define qianw DBYTE[0X43]                        //////////////////千位
  12. #define unint unsigned int                ///自定义变量
  13. #define uchar unsigned char
  14. sbit in1=P3^0;                                        ///控制位定义
  15. sbit in2=P3^1;
  16. sbit ena=P3^7;
  17. uchar code zm[12]={0Xc0,0Xf9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0x73,0x71};///在程序存储区定义字型码表
  18. uchar code wm[4]={0xfe,0xfd,0xfb,0xf7};///在程序存储区定义字位控制码表***选位
  19. uchar a=8;                                                ///占空比控制字
  20. uchar n=1;                                                ///速度增减量一
  21. uchar m=2;                                                ///速度增减量二
  22. unint speedbuf=0;                                ///速度值
  23. uchar zc=0;
  24. unint ys=0;
  25. key();                                                        ///子函数声明
  26. display();
  27. control();
  28. delays();
  29. speedcan();
  30. ///*************************************************************************************************************
  31. ///主函数
  32. ///*************************************************************************************************************
  33. main()       
  34. {
  35.         gew=shiw=baiw=qianw=0;                                ///显示初始化
  36.         P0=0xc0;                                       
  37.         P2=0;
  38.         in1=0;                                                ///电机控制的初始化
  39.         in2=0;
  40.         ena=1;
  41.         TMOD=0X15;                                        ///定时器1为定时模式,使用方式2;定时器0为计数模式,使用方式2
  42.         TH1=0Xfa;                                        ///装定时器初值
  43.         TL1=0X24;
  44.         TH0=0;                                                ///装计数器初值
  45.         TL0=0;
  46.         EA=1;                                                ///开总中断
  47.         ET0=1;                                                ///允许定时器0中断
  48.         ET1=1;                                                ///允许定时器1中断
  49.         TR0=1;                                                ///开计数器
  50.         TR1=1;                                                ///开定时器
  51.         while(1)                                        ///无限循环
  52.         {
  53.                 key();                                        ///调用按键扫描程序
  54.                 control();                                ///调用电机控制程序
  55.                 display();                                ///调用显示程序
  56.                 speedcan();                                ///调用速度处理程序
  57.         }
  58. }
  59. ///*************************************************************************************************************
  60. ///中断处理程序,实现输出方波占空比控制
  61. ///*************************************************************************************************************
  62. timer_1() interrupt 3 using 1        ///定时器1中断,使用寄存器组1
  63. {
  64.         TR1=0;                                                ///停止定时
  65.         zc++;                                                ///中断次数加1
  66.         ys++;
  67.         control();                                       
  68.         speedcan();
  69.         TH1=0Xfa;                                        ///重装定时初值
  70.         TL1=0X24;
  71.         TR1=1;
  72. }
  73. ///************************************************************************************************************
  74. ///脉宽控制程序,实现PWM的输出
  75. ///***********************************************************************************************************
  76. control()
  77. {
  78.         if(zc==a)
  79.         {
  80.                 ena=0;
  81.         }
  82.         if(zc==15)
  83.         {
  84.                 zc=0;
  85.                 ena=1;
  86.         }
  87. }
  88. ///*****************************************************************************************************************
  89. ///显示子函数,显示当前电机的速度
  90. ///****************************************************************************************************************
  91. display()
  92. {
  93.         uchar i;
  94.         gew=speedbuf%10;                                        ///求速度个位值送各位显示缓冲
  95.         shiw=(speedbuf/10)%10;                                        ///求速度十位值送十位显示缓冲
  96.         baiw=(speedbuf/100)%10;                                ///求速度百位值送百位显示缓冲
  97.         qianw=speedbuf/1000;                                ///求速度千位值送千位显示缓冲
  98.         for(i=0;i<4;)                                        ///循环选中数码管的每一位
  99.         {
  100.                 P2=wm[i];
  101.                 if(i==0)                                        ///显示个位
  102.                 {
  103.                         P0=zm[gew];
  104.                         delays();
  105.                 }
  106.                         else if(i==1)                        ///显示十位
  107.                         {
  108.                                 P0=zm[shiw];
  109.                                 delays();
  110.                         }
  111.                                 else if(i==2)                ///显示百位
  112.                                 {
  113.                                         P0=zm[baiw];
  114.                                         delays();
  115.                                 }
  116.                                         else if(i==3)        ///显示千位
  117.                                         {
  118.                                                 P0=zm[qianw];
  119.                                                 delays();
  120.                                         }               
  121.                 i++;
  122.         }

  123. }
  124. ///**********************************************************************************************************
  125. ///读速度值子函数,从计数器0中读计数值,经过计算,求出当前速度值
  126. ///*************************************************************************************************************
  127. speedcan()
  128. {
  129.         if(ys==500)
  130.         {
  131.                 TR0=0;                                                ///停止计数
  132.                 speedbuf=((TH0*256+TL0)*8)/3;///读计数器
  133.                 ys=0;
  134.                 TH0=0;                                                ///重装计数初值
  135.                 TL0=0;
  136.                 TR0=1;                                                ///开计数器
  137.         }
  138. }
  139. ///*********************************************************************************************************
  140. ///延时子函数
  141. ///***********************************************************************************************************
  142. delays()
  143. {
  144.         uchar i;
  145.         for(i=80;i>0;i--);
  146. }
  147. ///************************************************************************************************************
  148. ///键盘扫描子函数,实现电机的方向 速度的控制
  149. ///*********************************************************************************************************
  150. key()
  151. {
  152.         uchar i;
  153.         P1=0xff;                                                ///拉高P1口的电平
  154.         i=P1;                                                        ///读P1口
  155.         if(i==0xfe)                                                ///第一个键按下
  156.         {        delays();                                        ///延时去抖动
  157.                 if(i==0xfe)                                        ///再判断按键是否按下
  158.                 {
  159.                         in1=0;                                        ///电机顺时针转动
  160.                         in2=1;       
  161.                 }
  162.         }
  163.         if(i==0xfd)                                                ///第二个键是否按下
  164.         {
  165.                 delays();                                        ///延时去抖动
  166.                 if(i==0xfd)                                        ///再判断按键是否按下       
  167.                 {
  168.                         in1=1;                                         ///电机逆时针转动
  169.                         in2=0;
  170.                 }
  171.         }
  172.         if(i==0xfb)                                                ///第三个键是否按下
  173.         {
  174.                 delays();
  175.                 if(i==0xfb)
  176.                 {
  177.                         a=a+n;                                        ///速度加((慢速)
  178.                         if(a>=15)                                
  179.                                 a=15;
  180.                 }
  181.         }
  182.         if(i==0xf7)                                               
  183.         {
  184.                 delays();
  185.                 if(i==0xf7)
  186.                 {
  187.                         if(a>3)                                        ///速度减(慢速)
  188.                                 a=a-n;
  189.                         else
  190.                                 a=3;
  191.                 }
  192.         }
  193.         if(i==0xef)
  194.         {
  195.                 delays();
  196.                 if(i==0xef)
  197.                 {
  198.                         a=a+m;                                        ///速度加,(快速)
  199.                         if(a>=15)
  200.                                 a=15;
  201.                 }
  202.         }
  203.         if(i==0xdf)
  204.         {
  205.                 delays();
  206.                 if(i==0xdf)
  207.                         if(a>3)                                        ///速度减,(快速)
  208.                                 a=a-m;
  209.                         else
  210.                                 a=3;
  211.         }
  212.         if(i==0xbf)
  213.         {
  214.                 delays();
  215.                 if(i==0xbf)
  216.                 {
  217.                         in1=0;                                        ///停止转动
  218.                         in2=0;
  219.                 }
  220.         }
  221.         if(i==0x7f)
  222.         {
  223.                 delays();
  224.                 if(i==0x7f)
  225.                         a=5;                                        ///回到中间速度
  226.         }
  227.         while(P1!=0xff);                                ///等待按键放下
  228. }
复制代码

所有资料51hei提供下载:
直流电机的pwm控制.rar (162.44 KB, 下载次数: 158)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:407593 发表于 2018-11-19 21:10 | 只看该作者
这个里面没有Proteus仿真,骗人的
希望大家慎重,那个ddb文件也没有密码
回复

使用道具 举报

板凳
ID:423751 发表于 2018-12-6 21:27 | 只看该作者
非常感谢,哈哈哈哈哈哈
回复

使用道具 举报

地板
ID:648191 发表于 2019-11-24 13:28 | 只看该作者
写的很详细但是,不知道为什么几个按钮控制的不算是太好,还点看看
回复

使用道具 举报

5#
ID:298008 发表于 2019-12-13 19:51 | 只看该作者
谢谢楼主分享!!
回复

使用道具 举报

6#
ID:243394 发表于 2019-12-14 09:22 | 只看该作者
谢谢楼主分享!!
回复

使用道具 举报

7#
ID:927942 发表于 2021-6-4 18:04 | 只看该作者
左上角的示波器是如何调出来的
回复

使用道具 举报

8#
ID:927942 发表于 2021-6-4 18:07 | 只看该作者
仿真图里的按键不能控制转速和正反转
回复

使用道具 举报

9#
ID:967724 发表于 2021-9-24 08:09 | 只看该作者
如何修改能做到按钮控制速度?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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