微控制器应用课程设计.docx
- 文档编号:10094475
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:22
- 大小:1.21MB
微控制器应用课程设计.docx
《微控制器应用课程设计.docx》由会员分享,可在线阅读,更多相关《微控制器应用课程设计.docx(22页珍藏版)》请在冰点文库上搜索。
微控制器应用课程设计
苏州市职业大学
课程设计说明书
名称MotorSpeedControl
2011年6月13日至2011年6月17日共1周
院 系电子信息工程系
班级
姓名
系 主 任
教研室主任
指导教师
苏州市职业大学
课程设计任务书
课程名称:
微控制器应用课程设计
起讫时间:
院系:
班 级:
指导教师:
系主任:
一、课程设计课题
MotoSpeedControl
二、课程设计要求
在规定的时间内,用C语言完成程序的编写,然后把程序载入到Butterfly实验板进行调试,最终实现由微控制器控制的风扇的转动。
其中,课程设计报告应包含以下内容:
1、课程设计说明书
2、课程设计任务书
3、目录
4、需求分析
5、设计过程
6、运行结果
7、程序代码
8、心得体会
9、参考文献
三、课程设计工作量
从2011年6月13日到6月17日,共一周时间,24学时。
四、课程设计说明书内容(有指导书的可省略)
1、课程设计名称
2、时间
3、院系、班级、姓名
4、系主任、教研室主任、指导老师
需求分析6
一、课程设计目的7
二、设计过程7
2.1MotorSpeedControl工作原理7
2.2结构分析8
2.3实训步骤11
三、运行结果12
四、源程序代码14
4.1Demonstrator.c程序14
4.2PC_COMM.C程序17
五、心得体会22
六、参考文献23
需求分析
微控制器的发展趋势:
一方面,若是以不同微控制器的销售数目来看,可以发现几个趋势,首先是8位微控制器长期居微控制器市场的主要份额,并在2007年以后开始略有动摇。
8位微控制器的出货数目以往皆占整体微控制器出货数目的七至八成以上,自2007年以后,8位微控制器的龙头地位渐渐下滑,其出货数目占整体微控制器市场的比重在2010年后将下滑至七成以下。
第二是我们可以观察到在非8位微控制器的高阶微控制器领域应用中,32位微控制器持续取代16位元微控制器的趋势相当明显,32位微控制器在2006年首度超越16位微控制器,市占率稳居第二,同时其出货数目将持续上升,到了2010年,32位微控制器将有机会达到32.62%的市占率,成为另一个重要的微控制器应用领域。
32位微控制器的逐渐兴起主要是由于各项家电与消费电子产品需要更多更强大的功能,而更复杂的影音应用、智能判断与控制领域也需要效能更强大的处理器,因此32位微控制器将逐渐取代目前的16位微控制器是可以确定的趋势。
一、课程设计目的
在规定的时间内,用C语言完成程序的编写,然后把程序载入到Butterfly实验板进行调试,最终实现由微控制器控制的风扇的转动。
二、设计过程
2.1MotorSpeedControl工作原理
微程序控制器的工作原理:
是依据读来的机器指令的操作码找到与之对应的一段微程序的入口地址,并按由指令具体功能所确定的次序,逐条从控制存储器中读出微指令,以“驱动”计算机各功能部件正确运行。
微程序控制的基本思想,就是仿照通常的解题程序的方法,把操作控制信号编成所谓的“微指令”,存放到一个只读存储器里.当机器运行时,一条又一条地读出这些微指令,从而产生全机所需要的各种操作控制信号,使相应部件执行所规定的操作。
2.2结构分析
电动机基座由泡沫板和胶带做成来支持电动机,电动机基座正左下角被使用来支持槽型光耦,这个抠图将用于下一个项目
车轮模式位于书本“CProgrogrammingforMicrocontrollers”附录6.把它打印出来,把它贴了一块坚固的薄硬纸板。
我把一些电工胶带,在电机轴的径向削减相同的中心,在车轮上。
它工作。
这个抠图将用于下一个项目
槽型光耦及其电路图
一个9V的电动机,一个9V的电池,一个9V的电池连接器,一个4N28光隔离器,一个TIP115功率晶体管,一个150Ohm电阻,还有一个2.2k的电阻。
马达可以用泡沫芯板切割下来组成和黏贴来作为底部,左边直立部分用于下一个工程来做光导体。
风扇部分类似于车轮的模式在课本的附录6,剪下来贴在一张比较坚实的薄硬纸板上,用电胶带贴在轴上,使得轮子中心部分沿着径向是可滑动的,工作的。
用一个光隔离器来隔离电机功率电路从而帮助减少在蝴蝶效应中产生爆炸的可能性。
光绝缘体是一个类似于光隔离器的装置,它有一个空中通道在IR灯发光二极管和IR检测晶体管之间。
她这个不透明的对象通过二极管和检测器导致晶体管熄灭因此电流“中断”。
我们可以把晶体管联结到蝴蝶效应的引脚和检测器的中断上。
如果你拼凑电机基地,使车轮通过在光导体槽旋转时,每次开放通行证。
晶体管的开启和关闭时回槽已经过去。
2.3实训步骤
(1)启动运行programmers软件做相应设计,如图:
(2)打开控制程序pc_comm.c和makefile文件,按相应步骤进行编译.
(3)编译无误后,打开AVRstudio4软件,如图:
(4)在上图中打开pc_comm.cof文件,装入给定程序模板,运行演示;
(5)运行成功
三、运行结果
如图所示,风扇转动,按复位键后风扇停止转动.
四、源程序代码
4.1Demonstrator.c程序
//Demonstrator.cMotorSpeedControlversion
#include"PC_Comm.h"
#include"Demonstrator.h"
unsignedcharmilliseconds=0;
unsignedintsecond=0;//countto1000andtriggeronesecondevent
unsignedintspeed=0;//IRdetectorcountpersecond
unsignedintlastspeed=0;//IRdetectorcountpersecond
voidinitializer()
{
//Calibratetheoscillator:
OSCCAL_calibration();
//InitializetheUSART
USARTinit();
//SetforpinchangeonPINB0
DDRB=(1< PORTB=(1< PCMSK0=(1< EIFR=(1<<7);//flagforPCINT15-8 EIMSK=(1<<7);//maskforPCINT15-8 DDRB=0X00;//setPORTBforinput PORTB=0xFF;//enablepulluponforinput //setPORTDforoutput DDRD=(1< PORTD=(1< milliSecInit(127);//50%dutycycle1kHzsignal //sayhello sendString("\rPC_Comm.creadytocommunicate.\r"); //identifyyourselfspecifically sendString("YouaretalkingtotheMotorSpeedControldemo.\r"); sendString("setxxxtosetspeed\r"); } voidparseInput(chars[]) { //parsefirstcharacter switch(s[0]) { case's': if((s[1]=='e')&&(s[2]=='t')) parse_set(s); break; case'd': if((s[1]=='e')&&(s[2]=='m')&&(s[3]=='o')&&(s[4]=='? ')) sendString("YouaretalkingtotheMotorSpeedControldemo.\r"); break; default: sendString("\rYousent: '"); sendChar(s[0]); sendString("'-Idon'tunderstand.\r"); break; } s[0]='\0'; } intparse_set(chars[]) { charset[11]; unsignedchari=3,j=0; while((s[i]! ='\0')&&(j<=11)) { if((s[i]>='0')&&(s[i]<='9')) { set[j++]=s[i++]; } else { sendString("Error-Parse_setreceivedanoninteger: "); sendChar(s[i]); sendChar('\r'); return0; } } set[j]='\0'; if(j>4)//mustbe<256 { sendString("Error-Parse_setnumbertoolarge"); return0; } else { set_speed(atoi(set)); } return1; } voidset_speed(intcount) { charspeed[11]; sendString("SettingtheCompareTimerCountto: "); itoa(count,speed,10); sendString(speed); sendChar('\r'); milliSecInit(count); } /* TheUSARTinitsetthesystemoscillatorto2mHz.WesettheTimer0prescaler toclk/8whichgivesa250kHzinputtothetimer/counter.Acompareof250throws aninterrupteverymillisecond. */ voidmilliSecInit(unsignedcharcount) { //Enabletimer0compareinterrupt TIMSK0=(1< //Setsthecomparevalue setOCR0A(count); //SetPWMPhaseCorrectmode,CLK/8prescaler TCCR0A=(0< } voidsetOCR0A(unsignedcharcount) { //Setsthecomparevalue OCR0A=count; } //InterruptoccurstwiceperMillisec,timedforPWM SIGNAL(SIG_OUTPUT_COMPARE0) { //TogglePORtDpin0 if(PORTD&=1)cbi(PORTD,0); elsesbi(PORTD,0); } 4.2PC_COMM.C程序 //PC_Comm.c #include"Demonstrator.h" #include"PC_Comm.h" intmain(void) { charstring[64]; unsignedcharcount=0; //runtheinitializationroutines initializer(); //BeginforeverchattingwiththePC for(;;) { //Checktoseeifacharacteriswaiting if(isCharAvailable()==1) { //Ifanewcharacterisreceived,getit string[count++]=receiveChar(); //receiveapacketupto64byteslong if(string[count-1]=='\n')//Hyperterminalstringendswith\r\n { string[count-2]='\0';//converttoastring parseInput(string); string[0]='\0'; count=0; } elseif(count>64) { count=0; string[0]='\0'; sendString("Error-received>64characters"); } } } return0; } charisCharAvailable() { //DoestheRX0bitoftheUSARTStatusandControlRegister //indicateacharhasbeenreceived? if((UCSR0A&(0x80)))return1; elsereturn0; } charreceiveChar() { //ReturnthecharintheUDR0register returnUDR0; } voidsendChar(chardata) { inti=0; //TosenddatawiththeUSARTputthedataintheUSARTdataregister UDR0=data; //Checktoseeiftheglobalinterruptsareenabled if(SREG&0x80) { //Waituntilthebyteissentorwecountout while(! (UCSR0A&0x40)&&(i<10000)) { i++; } } else//Waituntilthebyteissent while(! (UCSR0A&0x40)); //CleartheTXCflag UCSR0A=UCSR0A|0x40; } voidsendString(chars[]) { inti=0; while(i<64)//don'tgetstuckifitisabadstring { if(s[i]=='\0')break;//quitonstringterminator sendChar(s[i++]); } } voidUSARTinit() { //Increasetheoscillatorto2Mhzforthe19200baudrate: CLKPR=(1< //setprescaler=4,InterRC8Mhz/4=2Mhz CLKPR=(1< //SettheUSARTbaudrateregistersfor19200 UBRR0H=0;//(unsignedchar)(baudrate>>8); UBRR0L=12;//(unsignedchar)baudrate; //Enable2xspeedchange UCSR0A=(1< //Enablereceiverandtransmitter UCSR0B=(1< //SettheUSARTtoasynchronousat8bitsnoparityand1stopbit UCSR0C=(0< //Enableinterrupts sei(); //Setuptheinterruptmaskandflags PCMSK1=(1< EIFR=(1< EIMSK=(1< } //CalibratetheinternalOSCCALbyte,usingtheexternal //32,768kHzcrystalasreference voidOSCCAL_calibration(void) { unsignedcharcalibrate=0;//FALSE; inttemp; unsignedchartempL; CLKPR=(1< //setprescaler=8,InterRC8Mhz/8=1Mhz CLKPR=(1< TIMSK2=0;//disableOCIE2AandTOIE2 ASSR=(1< OCR2A=200;//settimer2comparevalue TIMSK0=0;//deleteanyinterruptsources TCCR1B=(1< TCCR2A=(1< while((ASSR&0x01)|(ASSR&0x04));//waitforTCN2UBandTCR2UBtobecleared //waitforexternalcrystaltostabilise for(inti=0;i<10;i++) _delay_loop_2(30000); while(! calibrate) { cli();//mt__disable_interrupt();//disableglobalinterrupt TIFR1=0xFF;//deleteTIFR1flags TIFR2=0xFF;//deleteTIFR2flags TCNT1H=0;//cleartimer1counter TCNT1L=0; TCNT2=0;//cleartimer2counter while(! (TIFR2&&(1< TCCR1B=0;//stoptimer1 sei();//__enable_interrupt();//enableglobalinterrupt if((TIFR1&&(1< { temp=0xFFFF;//iftimer1overflows,setthetempto0xFFFF } else {//readoutthetimer1countervalue tempL=TCNT1L; temp=TCNT1H; temp=(temp<<8); temp+=tempL; } if(temp>6250) { OSCCAL--;//theinternRCoscillatorrunstofast,decreasetheOSCCAL } elseif(temp<6120) { OSCCAL++;//theinternRCoscillatorrunstoslow,increasetheOSCCAL } else calibrate=1;//TRUE;//theinterRCiscorrect TCCR1B=(1< } } 五、心得体会 经历了这次课程设计使我更好的将课本上理论知识与实际应用中的知识更好的结合起来,在在这次课程设计之前我以为这个过程会很简单,但
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 控制器 应用 课程设计