找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机仿真编码器电机测速程序

[复制链接]
ID:342451 发表于 2020-4-20 23:02 | 显示全部楼层 |阅读模式
利用Proteus8.6,元器件库编码器电机结合51单片机,进行速度测量由此可以延伸利用仿真实现PID电机转速控制(请自行设计)
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
TIM截图20200420225903.png

单片机源程序如下:
  1. /***********头文件声明************/
  2. #include "reg52.h"//此文件中定义了单片机的一些特殊功能寄存器
  3. /***********数据类型声明***********/
  4. typedef unsigned int u16;//对数据类型进行声明定义
  5. typedef unsigned char u8;
  6. /***********IO口相关定义***********/
  7. sbit LSA=P2^0;
  8. sbit LSB=P2^1;
  9. sbit MOTOR=P2^2;
  10. /**********变量定义*************/
  11. u16 Pulse;
  12. u16 Speed;
  13. u16 pwm;
  14. /*******************************************************************************
  15. * 函 数 名         : delay
  16. * 函数功能                     : 延时函数,i=1时,大约延时10us
  17. *******************************************************************************/
  18. void delay(u16 i)
  19. {
  20.         while(i--);        
  21. }
  22. /*******************************************************************************
  23. * 函数名       :DigDisplay()
  24. * 函数功能                 :数码管显示函数
  25. *******************************************************************************/
  26. void DigDisplay()
  27. {
  28.   u8 disp[2];
  29.   u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  30.         u8 i;
  31.         for(i=0;i<2;i++)
  32.         {
  33.                 switch(i)         //位选,选择点亮的数码管,
  34.                 {
  35.                         case(0):
  36.                                 LSA=0;LSB=1; break;//显示第0位
  37.                         case(1):
  38.                                 LSA=1;LSB=0; break;//显示第1位
  39.                 }
  40.                 P0=disp[i];//发送数据
  41.                 delay(10); //间隔一段时间扫描        
  42.                 P0=0x00;//消隐
  43.         }
  44.         disp[0]=smgduan[Speed/10];        
  45.         disp[1]=smgduan[Speed%10];        
  46. }
  47. /*******************************************************************************
  48. * 函 数 名         : Int0Init()
  49. * 函数功能                     : 设置外部中断0
  50. *******************************************************************************/
  51. void Int0Init()
  52. {
  53.         //设置INT0
  54.         IT0=1;//跳变沿出发方式(下降沿)
  55.         EX0=1;//打开INT0的中断允许。        
  56.         EA=1;//打开总中断        
  57. }
  58. /*******************************************************************************
  59. * 函 数 名         : Timer0Init
  60. * 函数功能                     : 定时器0初始化
  61. *******************************************************************************/
  62. void Timer0Init()
  63. {
  64.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
  65.         TH0 = 0xFC;//给定时器赋初值,定时1ms  
  66.   TL0 = 0x18;
  67.         ET0=1;//打开定时器0中断允许
  68.         EA=1;//打开总中断
  69.         TR0=1;//打开定时器               
  70. }
  71. /*******************************************************************************
  72. * 函 数 名       : main
  73. * 函数功能                   : 主函数
  74. *******************************************************************************/
  75. void main()
  76. {        
  77.         Int0Init();
  78.         Timer0Init();
  79.         pwm=50;
  80.         while(1);
  81. }
  82. /*外部中断0的中断函数*/
  83. void Int0()        interrupt 0               
  84. {
  85.   Pulse++;//脉冲++
  86. }
  87. /*定时器0的中断函数*/
  88. void Timer0() interrupt 1
  89. {
  90.         static u8 Period,dis,PWM_Period;
  91.         TH0 = 0xFC;//定时1ms  
  92.         TL0 = 0x18;
  93.         Period++;        
  94.         PWM_Period++;        
  95.         dis++;
  96.         /*******转速计算********/
  97.         if(Period == 100)//1*100ms
  98.         {
  99.                 //计算速度S=(Pulse/360)*10*60 r/min
  100.                 Speed=(Pulse)*1.6;
  101.                 Pulse=0;
  102.                 Period=0;
  103.         }
  104.         /*******PWM 输出********/
  105.         if(PWM_Period <  pwm) MOTOR=1;
  106.         if(PWM_Period >= pwm) MOTOR=0;
  107.         if(PWM_Period == 100)        PWM_Period=0;
  108.         /*******数码管显示********/
  109.         if(dis == 4)
  110.         {
  111.                 DigDisplay();//数码管显示函数        
  112.                 dis=0;               
  113.         }
  114. }
复制代码

所有资料51hei提供下载:
基于51单片机的转速测量.zip (139.97 KB, 下载次数: 122)




评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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