湖南大学电气院1单片机课程设计学院:电气与信息工程学院班级:07级电气工程及其自动化3班设计者:设计名称:直流电机调速指导老师:张志文教授湖南大学电气院2目录一.课程设计题目及其实现目标……………………3二.设计原理图…………………………………4三.设计原理及其实现方法…………………………5四.流程图…………………………………6五.程序清单…………………………………7六.课程设计心得…………………………………13湖南大学电气院3一.课程设计题目及其实现目标课程设计题目:直流电机调速实现的目标1).通过键盘改变脉冲的占空比从而达到改变转速使得电机转速从高到低,从低到高2).通过改变pwm的极性从而改变电机的转向,实现正反转3).能够通过数码显示管显示电机的转速和电机的转向4).通过启动键唯一启动电机,从而达到防止电机误启动的目的5).能够通过键盘快速达到电机预先设定的速度和转向备注:由于没有传感器,所以本课程设计中没有设计测速模块,所显示的速度为理论速度,并非电机的实际转速湖南大学电气院4二.设计原理图注:本原理图采用proteus绘制湖南大学电气院5三.设计原理及其实现方法1.速度调节的实现通过控制L298的使能端“允许”或者“禁止”,通过改变a(脉冲宽度)的值,从而达到控制PWM脉冲宽度调节电机转速的目的2.转向的控制通过L298中的H桥,从AT89C51中的P1_6和P1_7输出控制信号控制BJT的基极电压,控制L298中H桥的BJT通断,从而达到控制电机转向的目的附:A.L298的原理图B.本设计所需要芯片以及作用AT89C51:单片机L298:控制电机驱动和转向74L408:四与门芯片8255A:用于扩展51端口,作显示用2803:显示缓冲用MAX239:串口通讯芯片湖南大学电气院6四.流程图NYYNYNYYNNYNYN入口P1_6=0,P1_7=1,P1_4=1OrP1_6=1,P1_7=0,P1_4=1启动停止加速减速预设速度进入预先设定的值a=a+n,P1_4=0a=a-n,P1_4=0反转/正传a150a10a=150a=10电机停转P1_5=1,P1_4=1P1_5=0湖南大学电气院7五.程序清单#includeat89x51.h#includemotor_ctr.h#includeabsacc.h#includestdio.h#includeintrins.h#definePAXBYTE[0x1FFF]//A口地址;#definePBXBYTE[0x3FFF]//B口地址;#definePCXBYTE[0x5FFF]//C口地址;#defineCONXBYTE[0x7FFF]//*控制字地*/;ucharkey=0;//定义key为全局变量uinta=100;ucharn=5;//单次增加的步长,用于输出脉冲占空比控制uintk1=0,mn=10;//设置mn为转向标志位ucharbai,shi,ge;uintseg_code[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xff};//0~9的七段显示代码;/*THEMAINPROCESS*/voidmain(){CON=0x80;P1_5=0;//使电机停转;TMOD=0x15;//定时器1工作在模式1TH1=0xFF;//定时器1的溢出中断时间为50ms;TL1=0xb0;ET1=1;TR1=1;while(1){key=GetKey();/*case1~case9是预先设定的速度,方便电机直接调节到该速度,避免通过’+’键调节*/switch(key){case'1':{a=10;break;}case'2':{a=25;break;}case'3':{a=40;break;}case'4':{a=55;break;}case'5':{a=70;break;}case'6':{a=90;break;}case'7':{a=110;break;}case'8':{a=130;break;}case'9':{a=150;break;}湖南大学电气院8case'+':{P1_4=0;control();break;}//电机加速case'-':{control();break;}//’-‘代表减速case'=':{P1_7=0;P1_6=1;mn=0;control();break;}//电机顺时针转case'c':{P1_7=1;P1_6=0;mn=1;control();break;}//逆时针转case'/':{control();}//‘/‘键按下时,电机开始转动default:break;//不影响电机运行}}}/*THEENDOFMAINPROCESS*//*THEINTERRUPTIONFUNCTION*/voidtime()interrupt3//中断号为3,即是定时器1溢出中断{//此处是计时50ms中断一次TR1=0;//此函数用于显示速度k1+=TL0;display(a/100,a%100/10,a%10,mn);/*if(count==51){sprintf(s,%04d,k1%1000);//注意sprintf的用法;//确保有四位输出count=1;k1=0;}display(a,bai,shi,ge);*/TH1=0x3c;TL1=0xb0;TH0=0x00;TL0=0x00;TR1=1;}/*THEINTERRUPTIONFUNCTION*//*THEGETKEYFUNCTIONWHICHWASUSEDTOGETTHEINFORMATIONFROMTHEKEY*//*行信号从P1口的低四位读进,列信号从P2口的高四位读进*/ucharGetKey(){P1_0=0;P1_1=1;P1_2=1;P1_3=1;湖南大学电气院9P2_0=1;P2_1=1;P2_2=1;P2_3=1;_nop_();_nop_();//适当的延时以便消除抖动if(!P2_0)return'7';if(!P2_1)return'8';if(!P2_2)return'9';if(!P2_3)return'/';P1_0=1;P1_1=0;P1_2=1;P1_3=1;_nop_();_nop_();if(!P2_0)return'4';if(!P2_1)return'5';if(!P2_2)return'6';if(!P2_3){P1_4=0;return'*';}P1_0=1;P1_1=1;P1_2=0;P1_3=1;_nop_();_nop_();if(!P2_0)return'1';if(!P2_1)return'2';if(!P2_2)return'3';if(!P2_3)return'-';P1_0=1;P1_1=1;P1_2=1;P1_3=0;_nop_();_nop_();if(!P2_0)return'c';if(!P2_1){P1_4=0;return'0';}//P1_4和P1_5脚通过一个“与”门用来防止误启动if(!P2_2)return'=';if(!P2_3)return'+';return0;}/*延时程序*/湖南大学电气院10/*THEDELAYFUNCTION*/voiddelay(uinti){uintj,k;for(;i0;i--)for(j=10;j0;j--)for(k=10;k0;k--);}/*THEDISPLAYFUNCTION*/voiddisplay(ucharbai,ucharshi,ucharge,uintmn){PB=0x08;//00001000PA=seg_code[ge];delay(2);PB=0x04;//00000100PA=seg_code[shi];delay(2);PB=0x02;//00000010PA=seg_code[bai];delay(2);PB=0x01;//00000001PA=seg_code[mn];delay(2);//注意这儿的延时越短越好,应为处理终端的时间越短,对电机//的实时性显示就越好;}/*THECONTROLFUNCTION*//*由于参数a是一个全局变量,代表着脉冲的占空比,每次调用函数时;必须注意参数a值;*//*如果按键为‘-’,‘+’(加速减速)以及‘c',’=‘(正转反转)时,不需跳出循环,按其他键时,需要跳出循环,必须需要重新设置占空比*//*P1_4和P1_5脚通过一个“与”门用来防止误启动*/voidcontrol(){EA=1;while(1){湖南大学电气院11if(a=150)a=150;//设置了a的最大值,限定了电机的最高速度if(a=10)a=10;//设置了a的最小值,限定了电机的最高速度P1_5=1;//与P1_4信号形成控制L298的控制信号达到控制转速的目的delay(a);//调用延时,形成脉宽的调节P1_5=0;//电机逐渐停转;delay(160-a);/*以下的程序改变a的值达到改变脉冲宽度的目的*/key=GetKey();if(key=='-')//减速a=a-n;elseif(key=='+'){a=a+n;}//加速elseif(key=='=')//如果按下’=‘键,则电机顺时针转;{P1_6=1;P1_7=0;mn=0;}elseif(key=='c')//反转{P1_7=1;P1_6=0;P1_4=1;mn=1;}elseif(key=='*'||key=='0')//如果按下停止键’*‘或者’0’;{P1_5=0;P1_4=1;//ENA=0(P1_5=0)电机停转;break;}elseif(key!=0)//如果没有按键按下,则继续在此while循环中运行{switch(key){case'1':{a=10;break;}case'2':{a=25;break;}case'3':{a=40;break;}case'4':{a=55;break;}case'5':{a=70;break;}case'6':{a=90;break;}case'7':{a=110;break;}case'8':{a=130;break;}case'9':{a=150;break;}湖南大学电气院12default:break;}}}EA=1;}附:motor_ctr.hFILEtypedefunsignedcharuchar;typedefunsignedintuint;externucharGetKey();externvoiddelay(uinti);externvoidcontrol();voiddisplay(ucharbai,ucharshi,ucharge,uintmn);湖南大学电气院13六.课程设计心得两周的课程设计结束了,总得算来,这两周的课程设计体会颇多。这是我们第一次亲自设计一个系统,包括硬件和软件,还自己动手焊接了诸多的元器件,体会到了科研的滋味。起初我们想用汇编编写的,因为我们才刚刚学过AT89C51的汇编语言,印象很深刻。但是在编写的过程中,我感觉到,用汇编语言,我很难表达出自己的意思,很难达到目的。后来思来想去还是决定改用C语言,毕竟我对C语言自我感觉还是很好的。但是,面对的首要问题是,如何将C语言和硬件结合起来编程,面对这一个问题,我先后从图书馆借来了《单片机C语言教程》和《手把手教你学单片机C语言这两本》,老老实实的学习了这方面的内容。但是,随着编程的进行,我发现之前的原理图设计存在问题,因为我原先设计是将列信号从P3口的低四位,这样造成了下载的时候按键时造成下载不成功,但在仿真的时候完全正确。后来改用P2口的时候就可以达到了目的。在系统的调试中,遇见了任何键都可以启动的问题,在停止电机转动后,按下加速等键,电机自动启动,这样不利于调速的系统的应用。我设想了改用P1_4引脚和P1_5引脚通过与门(74L408芯片)后,作为L298的使能信号,控制L298的