找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机编码电机测速程序-PROTEUS仿真+KEIL5工程

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include "reg52.h"//此文件中定义了单片机的一些特殊功能寄存器
  2. #include <intrins.h>


  3. /***********数据类型声明***********/
  4. typedef unsigned int u16;//对数据类型进行声明定义
  5. typedef unsigned char u8;


  6. /***********IO口相关定义***********/
  7. sbit RS = P2^7;
  8. sbit RW = P2^6;
  9. sbit E = P2^5;
  10. sbit CH_B = P3^3;


  11. sbit PWM = P2^0;


  12. /**********变量定义*************/
  13. u8 flag = 1; //正反转标志位
  14. u8 count = 0; //定时器溢出次数计数  
  15. unsigned char  count1 = 0; //定时器溢出次数计数    0~255
  16. u16 Pulse_A = 0; //脉冲数计数
  17. float Speed_A = 0;//转数 r/min


  18. void Timer0Init();//定时器0初始化
  19. void Timer1Init();//定时器1初始化
  20. void Int0Init();  //外部中断0初始化
  21. void lcd_int();                                   //LCD初始化函数
  22. void lcd_w_cmd(unsigned char com);        //写命令字函数
  23. void lcd_w_dat(unsigned char dat);        //写数据函数
  24. unsigned char lcd_r_start();               //读状态函数
  25. void Delayus(unsigned int t); //延时函数
  26.            
  27. /*******************主函数*****************************************************/
  28. void main()
  29. {         
  30.           u8 i = '0';
  31.           u16 pulse_a = 0;
  32.           u8  arr[5]={0};
  33.     lcd_int();        //LCD初始化
  34.                 Timer0Init(); //定时器0初始化
  35.                 Timer1Init();//定时器1初始化
  36.     Int0Init(); //外部中断0初始化
  37.         
  38.                 while(1)
  39.                 {   
  40.                                          lcd_w_cmd(0x80 + 0x00); //设置LCD显示位置,第1行
  41.                                          if( flag == 0) //正反转判断
  42.                                          {                                                                                 
  43.                                                                  lcd_w_dat('Z');        //正转        
  44.                                          }
  45.                                          else
  46.                                          {
  47.                                                                  lcd_w_dat('F');        //反转
  48.                                          }


  49.                         
  50.                                          if( count >= 20) //20*50ms = 1s 计算转速
  51.                                          {
  52.                                                    count = 0; //清0
  53.                pulse_a = Pulse_A;  
  54.                                                    Pulse_A = 0; //清0
  55.                Speed_A = pulse_a * 60.0 / 24 ;         //计算转数 r/min        
  56.                         
  57.                                                    arr[0] = (u8)Speed_A/100 + '0'; //百位
  58.                                                          arr[1] = (u8)Speed_A/10%10 + '0';//十位
  59.                                                          arr[2] = (u8)Speed_A%10 + '0'; //个位
  60.                                                          arr[3] = '.'; //小数点
  61.                                                          arr[4] = (u8)(Speed_A*10)%10 + '0'; //十分位
  62.                                                 
  63.                                                    lcd_w_cmd(0x80+0x40);  //第二行显示位置
  64.                                                          
  65.                                                    for(i=0;i<5;i++)
  66.                                                    {
  67.                                                                   lcd_w_dat(arr[i]); //打印转数[/i][i]
  68.                                                          }
  69.            }
  70.                                          
  71.                                          
  72.                                          if( count1 >= 100 )   //周期100*1ms = 100ms
  73.                                          {
  74.                                                  count1 = 0        ;                                         
  75.                                          }
  76.                                          
  77.                                          if( count1 <= 80 )   //占空比  
  78.                                          {
  79.                                                         PWM = 1;                           //高电平 40ms
  80.                                          }
  81.                                          else
  82.                                          {
  83.                                                   PWM = 0 ;                           //低电平 100-50 = 50ms
  84.                                          }


  85.                 }
  86. }




  87. /*********外部中断0初始化**********************************/
  88. void Int0Init()  //设置INT0
  89. {
  90.     IT0=1;//跳变沿出发方式(下降沿)
  91.     EX0=1;//INT0的中断允许     
  92.     EA=1;//打开总中断        
  93. }


  94. /*外部中断0的中断函数*/
  95. void Int0()   interrupt 0               
  96. {
  97.    Pulse_A++; //脉冲数++
  98.          if(CH_B == 1)
  99.          {
  100.                   flag = 0;//正转
  101.          }
  102.          else
  103.    {
  104.                   flag = 1;//反转
  105.          }
  106. }
复制代码

全部资料51hei下载地址:
编码电机测速.rar (70.66 KB, 下载次数: 116)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:547658 发表于 2020-10-2 19:22 | 只看该作者
LCD显示字母‘z’表示电机正转
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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