找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11127|回复: 7
收起左侧

51单片机驱动直流电机,测试可用,可调速

[复制链接]
ID:334683 发表于 2018-5-21 10:14 | 显示全部楼层 |阅读模式
51 驱动直流电机,测试可用,可调速

单片机源程序如下:
  1. #include <REG52.H>               //包含51单片机相关的头文件
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. /*==================
  5. 对各个输出端口的定义
  6. 对占空比的端口定义
  7. ====================*/
  8. sbit IN4=P1^3;                          //定义左轮前进  
  9. sbit IN3=P1^2;                          //定义左轮后退  
  10. sbit IN1=P1^0;                          //定义右轮前进  
  11. sbit IN2=P1^1;                                                        //定义右轮后退
  12. sbit ENA=P1^6;                                                     //定义右轮使能
  13. sbit ENB=P1^7;                                                    //定义左轮使能
  14. uint Duty_left;                                                        //定义左轮占空比
  15. uint Duty_right;                                                //定义右轮占空比
  16. uint i;                                                                    //中断中控制占空比变量

  17. /*===========
  18. ms级延时函数
  19. =============*/
  20. void delay(uint n)  
  21. {
  22.     int x,y;
  23.         for(x=n;x>0;x--)
  24.         for(y=115;y>0;y--);
  25. }
  26. /*=======
  27. 停止函数
  28. =========*/
  29. void tingzhi()
  30. {
  31.    Duty_left=0;                        //左轮占空比
  32.    Duty_right=0;                //右轮占空比
  33.    IN1=0;                                   
  34.    IN2=0;                                   
  35.    IN3=0;                                 
  36.    IN4=0;

  37. }

  38. /*=======
  39. 前进函数
  40. =========*/
  41. void qianjin()
  42. {  
  43.    Duty_left=100;                         //左轮占空比
  44.    IN4=0;
  45.    IN3=1;
  46.    delay(3000);
  47.    ENB=0;
  48.    delay(3000);
  49.    ENB=1;
  50. }




  51. /*============
  52. pwm初始化函数
  53. ==============*/
  54. void pwm_init()               
  55. {
  56.     TMOD |= 0x01;        //设置定时器工作方式0x01
  57.     TH0=(65536-1)/256; //取约150HZ,12M晶振,每次定时66us,分100次,
  58.         TL0=(65536-1)%256;        //这样开头定义的变量正好直接表示占空比的数值
  59.         EA=1;                          //打开总中断
  60.         ET0=1;                          //开启定时器0中断
  61.         TR0=1;                          //启动定时器0
  62. }
  63. main()
  64. {       
  65.    pwm_init();
  66.    while(1)
  67.    {
  68.                 qianjin();
  69.    }
  70. }
  71. /*========
  72. 中断函数
  73. ==========*/
  74. void T0_timer() interrupt 1
  75. {
  76.            i++;                 
  77.         if(i<=Duty_right)
  78.           ENA=1;
  79.         else
  80.           ENA=0;
  81.         if(i<=Duty_left)
  82.           ENB=1;
  83.         else
  84.           ENB=0;
  85.           if(i==100)
  86.           {
  87.                   i = 0;
  88.           }
  89.     TH0=(65536-1)/256; //取约150HZ,12M晶振,每次定时66us,分100次,
  90.         TL0=(65536-1)%256;        //这样开头定义的变量正好直接表示占空比的数值       
  91. }
复制代码

所有资料51hei提供下载:
直流电机驱动.zip (21.86 KB, 下载次数: 91)

评分

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

查看全部评分

回复

使用道具 举报

ID:436901 发表于 2018-11-30 23:46 | 显示全部楼层
还是不太懂它的原理
回复

使用道具 举报

ID:282457 发表于 2018-12-1 02:18 | 显示全部楼层
TH0=(65536-1)/256; //取约150HZ,12M晶振,每次定时66us,分100次,
TL0=(65536-1)%256;        //这样开头定义的变量正好直接表示占空比的数值

如果采用12T的89c52的话,这个定时时间应该是1us,频率是1MHz。
如果是1T的CPU,定时时间约1/12us,频率是12MHz.
正确的应该是(不会是故意写错的吧):
TH0=(65536-66)/256; //取约150HZ,12M晶振,每次定时66us,分100次,
TL0=(65536-66)%256;  

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:525407 发表于 2019-5-18 23:30 | 显示全部楼层
没有图么?
回复

使用道具 举报

ID:525407 发表于 2019-5-18 23:36 | 显示全部楼层
i都不初始化变量么?
回复

使用道具 举报

ID:525407 发表于 2019-5-18 23:37 | 显示全部楼层
定时器0溢出标志位也没清除
回复

使用道具 举报

ID:808225 发表于 2020-9-8 22:18 | 显示全部楼层
我个人觉得,这程序不能实现调速。整体看下来,这程序是截取的,而且截取的不对,怎么看都有问题。
回复

使用道具 举报

ID:817950 发表于 2020-9-11 16:08 | 显示全部楼层
直接硬件生成PWM吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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