基于单片机的直流电机转速检测与控制设计【毕业设计】

【毕业设计】33-基于单片机的直流电机的转速检测与控制设计(原理图工程+PCB工程+源代码工程+仿真工程+答辩论文)

文章目录

  • 【毕业设计】33-基于单片机的直流电机的转速检测与控制设计(原理图工程+PCB工程+源代码工程+仿真工程+答辩论文)
  • 资料要求
  • 任务书
  • 设计说明书
  • 摘要
  • 设计框架架构
  • 设计说明书及设计文件
  • 源码展示
  • 资料要求

    资料包含:毕业设计全套资料(精品)
    原理图工程文件
    原理图截图
    仿真模型工程文件
    仿真截图
    答辩论文低重复率文档,22550字
    英文文献及翻译
    visio流程图工程

    任务书

    设计内容:直流电机的转速检测与控制设计

    设计要求:

    1.在确定论文方向的基础上收集、整理资料,并在对所收集资料有所理解的基础上科学拟定题目,写出开题报告。

    2.论文要紧扣主题,思路清晰,主题明确。根据主题的具体要求,完成直流电机的转速检测方案设计、硬件选型、安装方法、检测后数值的处理等。

    3.利用单片机完成转速测量后的显示与闭环控制。

    4.通过LCD显示直流电机的转速值及控制信息。论文中采用的解决办法和思路,设计的控制过程,说明原理。并用电脑软件Proteus仿真。

    5.论文计算过程要说明,插图部分、仿真过程要做说明。

    论文方案设计部分,控制系统设计部分要附电路图,方案图。

    设计说明书

    摘要

    本次设计的设计步骤:首先是对控制系统的功能分析,然后开始选择设计中所涉及的元器件;使用AD绘制控制系统的电路图,使用Visio绘制系统程序框图,再使用keil软件对控制程序进行编写,最后再使用Proteus对整个控制系统实现仿真,并且还通过矩阵键盘来控制系统。该系统可以实现的功能有:控制系统的正转、反转;控制系统加速、减速;控制系统速度15RPM-150RPM。经过多次功能验证与测试,在保证功能完成的前提下具有较好的耐久性。

    设计框架架构

    前 言… 1

    第一章 绪论… 2

    第一节 研究背景… 2

    第二节 研究意义及目的… 2

    第三节 本文的主要研究内容… 3

    本章小结… 4

    第二章 直流电机转速检测与控制系统分析… 5

    第一节 系统设计的目的及要求… 5

    第二节 系统设计的方案分析… 6

    第三节 元器件的选择… 7

    第四节 系统结构的总框图… 9

    本章小结… 10

    第三章 直流电机的转速检测与控制的硬件电路设计… 11

    第一节 单片机最小系统的设计… 11

    第二节 电源的设计… 13

    第三节 矩阵按键的电路设计… 14

    第四节 电机以及驱动电路的设计… 15

    第五节 LCD120168液晶显示的电路设计… 15

    第六节 系统的总电路图… 16

    本章小结… 17

    第四章 直流电机的转速检测与控制的软件设计… 18

    第一节 Keil软件介绍… 18

    第二节 软件的总设计流程… 18

    第三节 矩阵按键模块的程序设计… 19

    第四节 LCD120168液晶显示程序设计… 21

    第五节 直流电机转速检测的程序设计… 22

    第六节 直流电机转速控制的程序设计… 23

    本章小结… 24

    第五章 直流电机转速检测与控制的设计仿真… 25

    第一节 Proteus软件介绍… 25

    第二节 仿真结果… 26

    本章小结… 33

    总 结… 34

    致 谢… 35

    参考文献… 36

    附 录… 38

    一、英文原文… 38

    二、英文翻译… 42

    三、工程图纸… 45

    四、源代码… 46

    设计说明书及设计文件

    请添加图片描述

    请添加图片描述
    请添加图片描述
    请添加图片描述
    请添加图片描述

    源码展示

    #include <showfun.h>
    #include <stdio.h>
    extern char fnLCMInit(); // LCM 初始化
    extern void at(unsigned char x,unsigned char y);/*设定文本x,y值*/
    extern void cls();	 // 清屏
    extern void charout(unsigned char *str); //ASCII(8*8) 显示函数
    extern void fnSetPos(unsigned char urow, unsigned char  ucol);	// 设置当前地址
    extern uchar dprintf(uchar x,uchar y,char *fmt);// ASCII(8*16) 及 汉字(16*16) 显示函数
    extern uchar fnPR12(uchar uCmd); // 写无参数的指令
    extern uchar fnPR13(uchar uData); // 写数据
    extern unsigned int Adc0832(unsigned char channel);
    extern void Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode);
    extern void Pixel(unsigned char PointX,unsigned char PointY, bit Mode);
    uchar dsp[10]={0,0,0,0,0,0,0,0,0,0,};
    char abc[3]={0,0,0,};
    uchar key=0;
    uint a=5;  //初始速度
    uchar n=5;   //速度增加或减小一次
    uchar count=1; 
    uint k1=0;
    uchar GeyKey();
    void delay(uchar i);
    void control();
    main()
    {       
     	fnLCMInit();   //液晶初始化
    	fnSetPos(0,0);    //液晶 设置当前地址
    	dprintf(8,0,"直流电机转速检测控制系统");
    	dprintf(12,15,"键盘 + :速度加");
    	dprintf(12,30,"键盘 - :速度减");
    	dprintf(12,45,"0 - 9:15 - 150 rpm");	
    	dprintf(12,60,"键盘 = :顺时针");
    	dprintf(12,75,"键盘 on/c :逆时针");
      dprintf(12,90,"转向:");  
      dprintf(12,102,"SET:");  
      dprintf(12,117,"NOW:");      
    /****设置初始状态****/
    	 P1_1=0;
       TMOD=0x15;
    	 TH1=0x3c;
    	 TL1=0xb0;
       TH0=0x00;
    	 TL0=0x00;
    	 ET0=1;
    	 ET1=1;
    	 TR0=1;
    	 TR1=1;  
    /****键盘设置****/  
        while(1)
    	{  key=GeyKey();
          switch(key)
           {   
               case '=': {P1_0=1;dprintf(48,90,"顺时针");control();break;}
               case 'c': {P1_0=0;dprintf(48,90,"逆时针");control();break;}      
    	                       
    		   default:  break;
            }
        }
    }
    /****键盘扫描****/
    uchar GeyKey()
    {
     	P1_4=0;
     	P1_5=1;
     	P1_6=1;
     	P1_7=1;
    	P3_0=1;
    	P3_1=1;
    	P3_2=1;
        P3_3=1;
    	_nop_();_nop_();
    	if(!P3_0)return '7';
     	if(!P3_1)return '8';
     	if(!P3_2)return '9';
        if(!P3_3)return '/';
     	P1_4=1;
     	P1_5=0;
     	P1_6=1;
     	P1_7=1;
    	_nop_();_nop_();
    	if(!P3_0)return '4';
     	if(!P3_1)return '5';
     	if(!P3_2)return '6';
        if(!P3_3)return '*';
     	P1_4=1;
     	P1_5=1;
     	P1_6=0;
     	P1_7=1;
    	_nop_();_nop_();
    	if(!P3_0)return '1';
     	if(!P3_1)return '2';
     	if(!P3_2)return '3';
        if(!P3_3)return '-';
     	P1_4=1;
     	P1_5=1;
     	P1_6=1;
     	P1_7=0;
    	_nop_();_nop_();
    	if(!P3_0)return 'c';
     	if(!P3_1)return '0';
     	if(!P3_2)return '=';
        if(!P3_3)return '+';
    	return 0;
    }
    /****延时程序****/
    void delay(uchar i)
    {  uchar j,k;
        for(;i>0;i--)
        for(j=15;j>0;j--)
        for(k=11;k>0;k--);
    }	
    void time()interrupt 3    //计时器T1—用于测速
    {    
         TR1=0;
         count++;    //每定时中断一次就加一
         k1+=TL0;
    	 if(count==51)
    	 {     
    	    sprintf(dsp,"%3d",k1);    //转化
    		  dprintf(48,117,dsp);   
          dprintf(88,117,"r/min");  
    		  count=1;
              k1=0;
          }
    	  TH1=0x3c; //0011 1100  //50ms一次中断
    	  TL1=0xb0; //1010 0000
    	  TH0=0x00;
    	  TL0=0x00;
    	  TR1=1;
    }
    /****调速控制****/
    void control()
    {     
           EA=1;    //开启计数中断,测速用
    	   while(1)
    	   {    if(a>=150) 
                   a=150;
    			if(a<=10) 
    			    a=10;
    			 P1_1=0;      //关闭电动机,脉冲输出
    			 delay(160-a);
    			 P1_1=1;      //开启电动机
    			 delay(a);
    			 key=GeyKey();			
    			if(key == '0')
    			{
    				a=15+5;	      
    			sprintf(dsp,"%3d",a-5);
    		  dprintf(48,102,dsp);   
          dprintf(88,102,"r/min");  
    			}else
    				if(key == '1')
    			{
    				a=30;	      
    			sprintf(dsp,"%3d",a);
    		  dprintf(48,102,dsp);   
          dprintf(88,102,"r/min"); 
    			}else
    				if(key == '2')
    			{
    				a=45;	      
    			sprintf(dsp,"%3d",a);
    		  dprintf(48,102,dsp);   
          dprintf(88,102,"r/min"); 
    			}else
    				if(key == '3')
    			{
    				a=60-5;	      
    			sprintf(dsp,"%3d",a+5);
    		  dprintf(48,102,dsp);   
          dprintf(88,102,"r/min"); 
    			}else
    				if(key == '4')
    			{
    				a=75-10;	      
    			sprintf(dsp,"%3d",a+10);
    		  dprintf(48,102,dsp);   
          dprintf(88,102,"r/min"); 
    			}else
    				if(key == '5')
    			{
    				a=90-10;	      
    			sprintf(dsp,"%3d",a+10);
    		  dprintf(48,102,dsp);   
          dprintf(88,102,"r/min"); 
    			}else
    				if(key == '6')
    			{
    				a=105-7;	      
    			sprintf(dsp,"%3d",a+7);
    		  dprintf(48,102,dsp);   
          dprintf(88,102,"r/min"); 
    			}else
    				if(key == '7')
    			{
    				a=120-8;	      
    			sprintf(dsp,"%3d",a+8);
    		  dprintf(48,102,dsp);   
          dprintf(88,102,"r/min"); 
    			}else
    				if(key == '8')
    			{
    				a=135-5;	      
    			sprintf(dsp,"%3d",a+5);
    		  dprintf(48,102,dsp);   
          dprintf(88,102,"r/min"); 
    			}else
    				if(key == '9')
    			{
    				a=150;	      
    			sprintf(dsp,"%3d",a);
    		  dprintf(48,102,dsp);   
          dprintf(88,102,"r/min"); 
    			}else
    			
    			 if(key=='-') 
    			 {
    				 a-=n;
             dprintf(48,102,"              ");
    			 }
    			 else 
    				 
    			   if(key=='+') 
    				 {
    					 a+=n;
    	         dprintf(48,102,"            ");
    				 }
    			 else
    			 
    			   if(key=='=')
    			   {  P1_0=1;    //调整为顺时针
    				   dprintf(48,90,"顺时针");//
    			 }
    			 else 	 
    			 if(key=='c')      //调整为逆时针
    			 {  P1_0=0;·
    			   dprintf(48,90,"逆时针");
    			 }
    			 else 			 
    			  if(key=='*')
    			  {   P1_1=0;
    			      break;
    			  }
    			  else
    			 if(key!=0)     //此处跳出循环回到主程序
    			   break;
    			 }
    		 EA=0;
    }
    
    
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于单片机的直流电机转速检测与控制设计【毕业设计】

    发表评论