找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5583|回复: 9
收起左侧

STC89C52单片机(PWM直流电机调速正反转带eeprom记忆)源程序

  [复制链接]
ID:424598 发表于 2020-10-25 16:29 | 显示全部楼层 |阅读模式
好久没玩单片机, 又花了些时间重新找回感觉
花了三天时间测试买了很久的L298N迷你板, 之前接了单片机的P0^0和P0^1结果没有反应, 还以为是L298N坏了
L298N模块1.jpg

L298N模块2.jpg


老样子, 单片机代码我尽量备注详细, 别问我要电路图啊, 引脚接线我都已注明清楚
  1. /*******************************************************************/
  2. /* 程序名称:STC89C52_PWM直流电机调速及正反转
  3. /* 单片机型号:STC89C52系列 晶振:11.00592 MHz
  4. /* 单片机供电5V, L298N模块可共用电源, 也可以单独外接电源(具体看L298N模块说明)
  5. /* 直流电机的PWM波控制,可以直接调速从0到100共21级(每级+5)
  6. /* 所谓的占空比其实就是利用计数改变0和1的比列
  7. /*     大家可以接LED测试, 当占空比越大, LED灯闪烁越慢, 当占空比越小, LED闪烁越快, 直到眼睛都看不出有闪烁
  8. /* 新增功能:
  9. /* 2020.10.24 新增长按停止, 短按保留正反转
  10. /* 2020.10.25 将调速等级和正反转状态写入EEPROM, 以便关机后再次开机能保留关机前状态
  11. /*****************************************************************/


  12. #include "eeprom.h"
  13.         
  14. #define TH0_TL0 (65536-1000)//设定中断的间隔时长

  15. //引脚声明
  16. sbit Key_add=P2^0; //电机加速(轻触开关一脚接P2^0, 斜对脚接GND)
  17. sbit Key_minus=P2^1; //电机减速(轻触开关一脚接P2^1, 斜对脚接GND)
  18. sbit Key_fr=P2^2; //电机反向(轻触开关一脚接P2^2, 斜对脚接GND)

  19. //L298N模块+引脚接VCC, -引脚接GND
  20. //MOTOR-A二个引脚接电机的二个引脚, 正反自己按需求调整
  21. sbit PWM1=P2^6; //PWM1 (接L298N模块的L298N模块的INT1)
  22. sbit PWM2=P2^7; //PWM2 (接L298N模块的L298N模块的INT2)

  23. //配合eeprom使用
  24. uchar code set1[21]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15}; //用来判断调速等级
  25. uchar code set2[2]={0x01,0x02}; //用来判断正反转
  26. uint zsdj; //转速等级
  27. uchar count0; //低电平的占空比
  28. uchar count1 = 0;//高电平的占空比
  29. bit Flag;//电机正反转标志位 -- 1正转,0反转
  30. bit zt = 1; //记录状态(1启动, 0停止)


  31. //用于判断Key_fr的长按短按
  32. #define key_S 500 //宏定义短按(约20ms)
  33. #define key_L 16000 //宏定义长按(约2/3s)
  34. #define key_M 8000 //宏定义长按间隔(约1/3s)


  35. /************函数声明**************/
  36. void Write_Eeprom(void); //写eeprom
  37. void Motor_High_speed(void); //马达高速
  38. void Motor_Low_speed(void); //马达低速
  39. void Motor_Forward_and_Reverse(void); //马达正反转
  40. void Timer0_init(void); //定时器0初始化


  41. /*写eeprom*/
  42. void Write_Eeprom(void){
  43.         IapEraseSector(0x2000); //擦除0x2000--0x21FF
  44.         IapProgramByte(0x2001,set1[zsdj]); //存储count0
  45.         IapProgramByte(0x2002,set2[Flag]); //存储Flag
  46. }


  47. /*******按键+处理增加PWM,PWM越大,电机越快**********/
  48. void Motor_High_speed(void)
  49. {
  50.         if(Key_add==0)
  51.         {
  52.                 Delay(10);
  53.                 if(Key_add==0)
  54.                 {
  55.                         count0 += 5;
  56.                         zsdj += 1;

  57.                         if(count0 >= 100)
  58.                         {
  59.                                 count0 = 100;
  60.                         }        
  61.                         if(zsdj >= 20)
  62.                         {
  63.                                 zsdj = 20;
  64.                         }
  65.                         Write_Eeprom(); //eeprom操作
  66.                 }
  67.                 while(!Key_add);//等待键松开
  68.         }
  69. }

  70. /*******按键-处理减少PWM,PWM越小,电机越慢**********/
  71. void Motor_Low_speed(void)
  72. {
  73.         if(Key_minus==0)
  74.         {
  75.           Delay(10);
  76.           if(Key_minus==0)
  77.           {
  78.             count0 -= 5;
  79.                         zsdj -= 1;
  80.                         
  81.             if(count0 <= 0)
  82.             {
  83.                     count0 = 0;
  84.             }
  85.                         if(zsdj <= 0)
  86.                         {
  87.                                 zsdj = 0;
  88.                         }
  89.                         Write_Eeprom(); //eeprom操作
  90.           }
  91.           while(!Key_minus);
  92.         }
  93. }

  94. /************电机正反向控制**************/
  95. void Motor_Forward_and_Reverse(void)
  96. {
  97.                 static uint jcs=0; //计数变量
  98.                 if(!Key_fr)   
  99.                 {  
  100.                         jcs++;  
  101.                         if(jcs>=key_L) //长按
  102.                         {      
  103.                                 jcs=key_M; //设一个值
  104.                                 zt=0; //停止
  105.                         }
  106.                 }  
  107.                 else //按键抬起
  108.                 {  
  109.                                 if(jcs>key_S && jcs<key_M)//短按
  110.                                 {
  111.                                         if(zt==1){
  112.                                                 Flag=~Flag; //当状态为1时,才会切换正反转                        
  113.                                                 Write_Eeprom(); //eeprom操作
  114.                                         }
  115.                                         if(zt==0){
  116.                                                 PWM1=0; //当状态为0时,启动为正转
  117.                                                 PWM2=1;        
  118.                                         }
  119.                                         zt=1; //设状态为1
  120.                                 }
  121.                                 jcs=0;  //count清0
  122.                 }
  123. }

  124. /***********定时器0初始化***********/
  125. void Timer0_init(void)
  126. {
  127.         TMOD=0x01; //定时器0工作于方式1
  128.         TH0=TH0_TL0/256;
  129.         TL0=TH0_TL0%256;
  130.         TR0=1;
  131.         ET0=1;
  132.         EA=1;
  133. }

  134. /*********主函数********************/
  135. void main(void)
  136. {
  137.         //开机初始化定时器0
  138.         Timer0_init();
  139.         
  140.         //开机读取记忆数据(转速等级)
  141.         switch(IapReadByte(0x2001))
  142.         { //判断
  143.                 case 0x01:count0=0;zsdj=0;break;
  144.                 case 0x02:count0=5;zsdj=1;break;
  145.                 case 0x03:count0=10;zsdj=2;break;
  146.                 case 0x04:count0=15;zsdj=3;break;
  147.                 case 0x05:count0=20;zsdj=4;break;
  148.                 case 0x06:count0=25;zsdj=5;break;
  149.                 case 0x07:count0=30;zsdj=6;break;
  150.                 case 0x08:count0=35;zsdj=7;break;
  151.                 case 0x09:count0=40;zsdj=8;break;
  152.                 case 0x0A:count0=45;zsdj=9;break;
  153.                 case 0x0B:count0=50;zsdj=10;break;
  154.                 case 0x0C:count0=55;zsdj=11;break;
  155.                 case 0x0D:count0=60;zsdj=12;break;
  156.                 case 0x0E:count0=65;zsdj=13;break;
  157.                 case 0x0F:count0=70;zsdj=14;break;
  158.                 case 0x10:count0=75;zsdj=15;break;
  159.                 case 0x11:count0=80;zsdj=16;break;
  160.                 case 0x12:count0=85;zsdj=17;break;
  161.                 case 0x13:count0=90;zsdj=18;break;
  162.                 case 0x14:count0=95;zsdj=19;break;
  163.                 case 0x15:count0=100;zsdj=20;break;
  164.                 default:count0=50;zsdj=10;
  165.         }
  166.         
  167.         //开机读取记忆数据(正向或反向)
  168.         if(IapReadByte(0x2002)==0x01){
  169.                 Flag = 0;
  170.         }
  171.         else if(IapReadByte(0x2002)==0x02){
  172.                 Flag = 1;
  173.         }

  174.         while(1)
  175.         {         
  176.           Motor_High_speed(); //加速
  177.           Motor_Low_speed(); //减速
  178.                 Motor_Forward_and_Reverse(); //正反转
  179.         }
  180. }
复制代码

全部代码请下载附件 STC89C52(PWM直流电机调速正反转带eeprom记忆).zip (190.92 KB, 下载次数: 143)

评分

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

查看全部评分

回复

使用道具 举报

ID:89286 发表于 2020-10-26 08:01 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:838184 发表于 2020-11-3 11:16 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:722684 发表于 2020-11-7 16:00 | 显示全部楼层
Thanks for sharing
回复

使用道具 举报

ID:840797 发表于 2020-11-9 07:01 | 显示全部楼层
虽然暂时看不懂,还是要顶一个。
回复

使用道具 举报

ID:100749 发表于 2020-11-12 10:28 来自手机 | 显示全部楼层
没有电路图吗
回复

使用道具 举报

ID:967893 发表于 2021-9-24 10:16 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:540334 发表于 2021-9-25 00:00 来自手机 | 显示全部楼层
受教了,感谢大师
回复

使用道具 举报

ID:917597 发表于 2021-10-15 17:32 | 显示全部楼层
萌新求教,有没有大佬能够解释一下,我想问一下按下按键之后,对应的zsdj和count0变化以后,是怎样改变pwm波的占空比的?我只看到按键程序改变转速等级和占空比变量的数值最后面的定时器中断貌似没改变时间啊,是我理解不到位吗?
回复

使用道具 举报

ID:970710 发表于 2021-10-20 08:42 | 显示全部楼层
感谢分享,你的资料很有参考价值!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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