《C程序控制风扇转动(共20页).doc》由会员分享,可在线阅读,更多相关《C程序控制风扇转动(共20页).doc(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上课程设计说明书 名称 院 系 班 级 姓 名 系主任 教研室主任 指导教师 课程设计任务书 课程名称: 起讫时间: 院 系: 班级: 指导教师: 系 主 任: 目 录一、需求分析. .3微控制器应用Motor Speed Control程序设计. 3二、设计过程. 4三、运行结果. 71.实验板的布局图. 72.实训步骤.83.运行结果展示.9四、程序代码.101Demonstrator.c程序102PC_Comm.c程序.13五、心得体会. 18六、参考文献. 19一需求分析本程序由5人共同设计,用以实现以下程序:微控制器应用Motor Speed Control程
2、序设计打开Programmers Notepad 用C语言完成程序的编写,再打开AVR studio,把程序载入到Butterfly实验板进行调试,最终实现由微控制器控制的风扇的转动。过程中,要求有实际的程序,并保证程序的正确性与可操作性,运行可执行程序,得到运行结果,风扇转动,对结果进行分析,结果是否合理,不合理要对实验程序进行重新调试,通过PC机对程序进行故障排查。二设计过程实验器件:一个9V的电动机,一个9V的电池,一个9V的电池连接器,一个4N28光隔离器,一个TIP115功率晶体管,一个150Ohm 电阻,还有一个2.2k的电阻。我已经包括了简单原理的光导体,它帮助减少我们在修改这一
3、电路的状态,以致我们将破坏这个微控制器。我实际上设法将光导体和大功率的晶体管燃烧,当以开玩笑的言行做这个设计。至少对我来说,这不是太夸张了。因为这不是一个电子文本,我们不需要学习关于电流是怎么工作的。对应插图,我们就不会有任何的问题。画出原理图打开Programmers Notepad软件设计出实验程序打开AVR studio把程序载入到Butterfly实验板进行调试。具体过程:1 马达可以用泡沫芯板切割下来组成和黏贴来作为底部,左边直立部分用于下一个工程来做光导体。2 风扇部分类似于车轮的模式在课本的附录6,剪下来贴在一张比较坚实的薄硬纸板上,用电胶带贴在轴上,使得轮子中心部分沿着径向是可
4、滑动的,工作的。如图的抠图图象用于下一个工程。我们用一个光隔离器来隔离电机功率电路从而帮助减少在蝴蝶效应中产生爆炸的可能性。光绝缘体是一个类似于光隔离器的装置,它有一个空中通道在IR 灯发光二极管和IR检测晶体管之间,如图。这个不透明的对象通过二极管和检测器导致晶体管熄灭因此电流“中断”。我们可以把晶体管联结到蝴蝶效应的引脚和检测器的中断上。你有没有注意到在图中的轮子的开关? 如果拼凑好电机基础部分,使车轮通过在光导体槽旋转时,每次正常运行。当槽通过时,晶体管开启和关闭。写好软件程序,以便于附着在光导体引脚电压变化引起的蝴蝶中断的效应,如果指望正好一秒,有多少次每秒旋转的车轮,这是在HZ.CO
5、OL转速!接一根长的电线到光隔离器上,然后添加电工胶带以防止短路。接下来小心的用胶水贴到在一个电机位置上,通过它旋转风轮。确保风轮平衡,稳定,要完全封锁和解除封在风轮光隔离器插槽转动时。.光导体的引脚1对应3V光导体的引脚2 对应一个200ohm 的电阻200ohm 的电阻对应电池的接地。光导体的引脚3对应PORTB 引脚4。光导体引脚4对应电池的接地。我意识我已经学会了机械工程技术运用于这个工程在初始阶段。尽管初学者作做的比我更有吸引力,但是目的达到了,它工作了。三运行结果实训步骤(1) 启动运行programmers软件做相应设计,如图:(2) 打开控制程序pc_comm.c和makefi
6、le文件,按相应步骤进行编译.(3) 编译无误后,打开AVR studio 4软件,如图:(4) 在上图中打开pc_comm.cof文件,装入给定程序模板,运行演示;(5) 运行成功编译程序效果图:四程序代码第一个程序Demonstrator.c/ Demonstrator.c Motor Speed Control version#include PC_Comm.h#include Demonstrator.hunsigned char milliseconds = 0;unsigned int second = 0; / count to 1000 and trigger one seco
7、nd eventunsigned int speed = 0; / IR detector count per secondunsigned int lastspeed = 0; / IR detector count per secondvoid initializer()/ Calibrate the oscillator: OSCCAL_calibration(); / Initialize the USARTUSARTinit();/ Set for pin change on PINB0DDRB = (1 PINB0); / set pin 0 to outputPORTB = (1
8、 PINB0); / set pin 0 to enable pullupPCMSK0 = (1 PINB0); / EIFR = (1 7); / flag for PCINT15-8EIMSK = (1 7); / mask for PCINT15-8DDRB = 0X00; / set PORTB for input PORTB = 0xFF; / enable pullup on for input/ set PORTD for outputDDRD = (1 PIND0); / set pin 0 to outputPORTD = (1 PIND0); / set pin 0 to
9、enable pullupmilliSecInit(127); / 50% duty cycle 1kHz signal/ say hellosendString(rPC_Comm.c ready to communicate.r); / identify yourself specificallysendString(You are talking to the Motor Speed Control demo.r);sendString(setxxx to set speedr);void parseInput(char s)/ parse first characterswitch (s
10、0)case s:if( (s1 = e) & (s2 = t)parse_set(s);break;case d:if( (s1 = e) & (s2 = m) & (s3 = o) & (s4 = ?) )sendString(You are talking to the Motor Speed Control demo.r);break;default:sendString(rYou sent: );sendChar(s0);sendString( - I dont understand.r);break;s0 = 0;int parse_set(char s)char set11;un
11、signed char i = 3, j = 0;while( (si != 0) & (j = 0) & (si 4)/ must be 256sendString(Error - Parse_set number too large);return 0;elseset_speed(atoi(set);return 1;void set_speed(int count)char speed11;sendString(Setting the Compare Timer Count to: );itoa(count,speed,10);sendString(speed);sendChar(r);
12、milliSecInit(count);/*The USART init set the system oscillator to 2 mHz. We set the Timer0 prescalerto clk/8 which gives a 250 kHz input to the timer/counter. A compare of 250 throwsan interrupt every millisecond.*/void milliSecInit(unsigned char count) / Enable timer0 compare interruptTIMSK0 = (1OC
13、IE0A);/ Sets the compare valuesetOCR0A(count);/ Set PWM Phase Correct mode, CLK/8 prescalerTCCR0A = (0FOC0A)|(0WGM01)|(1WGM00)|(1 64)count = 0;string0 = 0;sendString(Error - received 64 characters); return 0;char isCharAvailable()/ Does the RX0 bit of the USART Status and Control Register/ indicate
14、a char has been received?if ( (UCSR0A & (0x80) ) return 1;else return 0;char receiveChar()/ Return the char in the UDR0 registerreturn UDR0;void sendChar(char data) int i = 0; / To send data with the USART put the data in the USART data register UDR0 = data; / Check to see if the global interrupts a
15、re enabled if(SREG & 0x80) / Wait until the byte is sent or we count outwhile ( !(UCSR0A&0x40) & (i10000) )i+; else / Wait until the byte is sent while( !(UCSR0A&0x40) ); / Clear the TXCflag UCSR0A=UCSR0A|0x40; void sendString(char s)int i = 0;while(i 64) / dont get stuck if it is a bad stringif( si
16、 = 0 ) break; / quit on string terminatorsendChar(si+);void USARTinit() / Increase the oscillator to 2 Mhz for the 19200 baudrate: CLKPR = (1CLKPCE); / set Clock Prescaler Change Enable / set prescaler = 4, Inter RC 8Mhz / 4 = 2Mhz CLKPR = (18); UBRR0L = 12;/(unsigned char)baudrate; / Enable 2x spee
17、d change UCSR0A = (1U2X0); / Enable receiver and transmitter UCSR0B = (1RXEN0)|(1TXEN0)|(0RXCIE0)|(0UDRIE0); / Set the USART to asynchronous at 8 bits no parity and 1 stop bit UCSR0C = (0UMSEL0)|(0UPM00)|(0USBS0)|(3UCSZ00)|(0UCPOL0); / Enable interrupts sei(); / Setup the interrupt mask and flagsPCM
18、SK1 = (1PINB6) | (1PINB4); / set pin-change interrupt mask EIFR = (1PCIF1); / clear external intterupt flag 1EIMSK = (1PCIE1); / enable external interrupt 1 /Calibrate the internal OSCCAL byte, using the external /32,768 kHz crystal as referencevoid OSCCAL_calibration(void) unsigned char calibrate =
19、 0;/FALSE; int temp; unsigned char tempL; CLKPR = (1CLKPCE); / set Clock Prescaler Change Enable / set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz CLKPR = (1CLKPS1) | (1CLKPS0); TIMSK2 = 0; /disable OCIE2A and TOIE2 ASSR = (1AS2); /select asynchronous operation of timer2 (32,768kHz) OCR2A = 200; / set t
20、imer2 compare value TIMSK0 = 0; / delete any interrupt sources TCCR1B = (1CS10); / start timer1 with no prescaling TCCR2A = (1CS20); / start timer2 with no prescaling while(ASSR & 0x01) | (ASSR & 0x04); /wait for TCN2UB and TCR2UB to be cleared / wait for external crystal to stabilisefor(int i = 0;
21、i 10; i+)_delay_loop_2(30000); while(!calibrate) cli(); / mt _disable_interrupt(); / disable global interrupt TIFR1 = 0xFF; / delete TIFR1 flags TIFR2 = 0xFF; / delete TIFR2 flags TCNT1H = 0; / clear timer1 counter TCNT1L = 0; TCNT2 = 0; / clear timer2 counter while ( !(TIFR2 & (1OCF2A) ); / wait fo
22、r timer2 compareflag TCCR1B = 0; / stop timer1 sei(); / _enable_interrupt(); / enable global interrupt if ( (TIFR1 & (1TOV1) ) temp = 0xFFFF; / if timer1 overflows, set the temp to 0xFFFF else / read out the timer1 counter value tempL = TCNT1L; temp = TCNT1H; temp = (temp 6250) OSCCAL-; / the intern
23、RC oscillator runs to fast, decrease the OSCCAL else if (temp 6120) OSCCAL+; / the internRC oscillator runs to slow, increase the OSCCAL else calibrate = 1;/TRUE; / the interRC is correct TCCR1B = (1CS10); / start timer1 五心得体会作为一名应用电子技术专业的大二学生,我觉得做微控制器的设计是十分有意义的,而且是十分必要的。在已度过的大学时间里,我们大多数接触的是专业课。我们在课
24、堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的课程设计就为我们提供了良好的实践平台。在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。我们是在做课程设计,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:CAD制图、汇编语言、模拟和数字电路知识等。虽然过去从未独立应用过它们
25、,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。最后,要做好一个课程设计,就必须做到:在设计程序之前,对所用软件和硬件的内部结构有一个系统的了解,有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。另外,这次课程设计让我感到了团队合作的重要性。在团队中,我们互帮互助,对整个课程设计来说,这是至关重要的,缺少每一个人都会对我们的设计产生影响。还有要感谢指导老师在我们遇到困难时,给予我们的建议与鼓励。1周的课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。六参考文献李金祥 顾小晶实用C语言程序设计教程 中国电力出版社于春凡 C语言程序设计 南开大学出版社 陈宝贤 C语言程序设计实验指导 人民邮电出版社专心-专注-专业