找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2878|回复: 3
收起左侧

按键控制电动机的速度和转向

[复制链接]
ID:154463 发表于 2016-12-13 17:07 | 显示全部楼层 |阅读模式
按键控制电动机的速度和转向

仿真图

仿真图


源程序:
  1. #include <REG52.H>
  2. #define uchar unsigned char
  3. #define uint unsigned int  
  4. #define ulong unsigned long
  5. #define CLK_WISE 0//顺时针方向转动
  6. #define INVERSE 1//逆时针方向转动
  7. #define HIGH 2//高电平
  8. #define LOW 1//低电平
  9. #define NULL 0//低电平
  10. sbit CTRL0=P2^0;//CTRL0为高电平,CTRL1为低电平时顺时针方向转动
  11. sbit CTRL1=P2^1;//CTRL0为低电平,CTRL1为高电平时逆时针方向转动
  12. uchar levelflag=0;//高低电平标志,取值为HIGH或LOW,分别代表高电平和低电平,或为NULL
  13. bit direction=CLK_WISE;/***方向标志,取值为CLK_WISE 或INVERSE*/
  14. static uchar speedcount=0;//加速标志,越大转速越快,最大到10,然后回归到0,循环。
  15.                                                 //程序中可以依据它来改变占空比
  16. uchar highcount;        //记录高电平定时次数

  17. /***定时器t0***/
  18. void time0(void) interrupt 1 using 1
  19. {       
  20.         TH0=0xff;
  21.         TL0=0xCE;
  22.         highcount++;//记录一出次数

  23.         //频率为固定的2kHZ左右,只是占空比发生变化
  24.         if(highcount<=speedcount)
  25.                 levelflag=HIGH;//高电平次数
  26.         if((highcount>speedcount)&&(highcount<=10))
  27.                 levelflag=LOW;//低电平次数       
  28.         if(highcount==10) //最大为10,然后从0开始循环。
  29.                 highcount=0;
  30.        
  31. }

  32. /****改变转向标志*****/
  33. void int1_srv (void) interrupt 2 using 2
  34. {
  35.         if(INT1==0)
  36.         {
  37.                 while(!INT1);
  38.                  direction=!direction;
  39.         }
  40. }

  41. /*******中断,调节占空比********/
  42. void change(void) interrupt 0 using 0
  43. {
  44.         if(INT0==0)
  45.         {
  46.                 while(!INT0);
  47.                  speedcount++;//记录加速次数               
  48.                 if(speedcount>10)
  49.                         speedcount=0;//最大为10,然后从0开始循环。
  50.         }
  51. }

  52. /****延时****/
  53. void delay(uchar i)
  54. {
  55.         while(i--)
  56.                 ;
  57. }

  58. /*****改变转向*****/
  59. void run(void)
  60. {
  61.         if(direction==CLK_WISE)        //顺时针转
  62.         {
  63.                 CTRL1=0;
  64.                 if(levelflag==HIGH)//高电平
  65.                 {
  66.                         levelflag=NULL;
  67.                         CTRL0=1;
  68.                 }
  69.                 if(levelflag==LOW)//低电平
  70.                 {
  71.                         levelflag=NULL;
  72.                         CTRL0=0;
  73.                 }
  74.         }
  75.         if(direction==INVERSE)        //逆时针转
  76.         {
  77.                 CTRL0=0;
  78.                 if(levelflag==HIGH)//高电平
  79.                 {
  80.                         levelflag=NULL;
  81.                         CTRL1=1;
  82.                 }
  83.                 if(levelflag==LOW)//低电平
  84.                 {
  85.                         levelflag=NULL;
  86.                         CTRL1=0;
  87.                 }
  88.         }
  89.        
  90. }
  91. void main()
  92. {       
  93.         EA=1;
  94.         TMOD=0x01;
  95.         ET0=1;//定时器0初始化
  96.         TR0=1;

  97.         EX0=1;
  98.         IT0=1;//外部中断0

  99.         EX1=1;
  100.         IT1=1;//外部中断1

  101.         TH0=0xff;
  102.         TL0=0xCE;//定时器0初始值

  103.         while(1)
  104.         {
  105.                 run();
  106.         }
  107. }
复制代码
0.png

所有资料下载:
例6.7.zip (51.33 KB, 下载次数: 28)
回复

使用道具 举报

ID:1 发表于 2017-1-7 00:23 | 显示全部楼层
51黑有你更精彩!!!
回复

使用道具 举报

ID:563570 发表于 2020-1-31 22:09 来自手机 | 显示全部楼层
真好,去试一试
回复

使用道具 举报

ID:476093 发表于 2020-2-6 09:49 | 显示全部楼层
去试试,我也学习一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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