基于avr单片机的放气阀时间控制及牛头刨床凸轮机构的设计及运动分析_第1页
基于avr单片机的放气阀时间控制及牛头刨床凸轮机构的设计及运动分析_第2页
基于avr单片机的放气阀时间控制及牛头刨床凸轮机构的设计及运动分析_第3页
基于avr单片机的放气阀时间控制及牛头刨床凸轮机构的设计及运动分析_第4页
基于avr单片机的放气阀时间控制及牛头刨床凸轮机构的设计及运动分析_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

生产实习案例分析报告班级:自控北京化工大学生产实习报告专业:自动化班级:自控学生:指导教师:目录一、摘要 3二、设计综诉 31、AVR128简介 3(1)高速、低耗、保密 3(2)I/O口功能强,具有A/D转换等电路 3(3)有功能强大的定时器/计数器及通讯接口 4(4)片内EEPROM 42、程序简述 4三、结论 51、结论简述 5(1)实现的功能: 5(2)创新点: 5(3)缺点: 6四、附录 61、原理图 62、PCB板 63、主程序 7(1)跑马灯 7(2)60s定时 9(3)放气阀控制 10基于AVR单片机的放气阀时间控制(BasedonthesinglechipmicrocomputerAVR'sairbleedercontroloftime)摘要我们小组根据标准的AVR单片机原理图在protel99se软件画出SCH原理图和PCB电路板图,接着是焊接AVR单片机,然后基于icc编程平台进行AVR单片机放气阀时间控制程序的编写。二、设计综诉1、AVR128简介单片机又称单片微控制器,它是把一个计算机系统集成到一个芯片上,概括的讲:一块芯片就成了一台计算机。单片机技术是计算机技术的一个分支,是简易机器人的核心元件。1997年,由ATMEL公司挪威设计中心的A先生与V先生利用ATMEL公司的Flash新技术,共同研发出RISC精简指令集的高速8位单片机,简称AVR。相对于出现较早也较为成熟的51系列单片机,AVR系列单片机片内资源更为丰富,接口也更为强大,同时由于其价格低等优势,在很多场合可以替代51系列单片机。AVR单片机有很多的优势:(1)高速、低耗、保密首先,AVR单片机是高速嵌入式单片机:1、AVR单片机具有预取指令功能,即在执行一条指令时,预先把下一条指令取进来,使得指令可以在一个时钟周期内执行。2、多累加器型,数据处理速度快。AVR单片机具有32个通用工作寄存器,相当于有32条立交桥,可以快速通行。3、中断响应速度快。AVR单片机有多个固定中断向量入口地址,可快速响应中断。其次,AVR单片机耗能低。对于典型功耗情况,WDT关闭时为100nA,更适用于电池供电的应用设备。有的器件最低1.8V即可工作。再次,AVR单片机保密性能好。它具有不可破解的位加密锁LockBit技术,保密位单元深藏于芯片内部,无法用电子显微镜看到。(2)I/O口功能强,具有A/D转换等电路1.AVR单片机的I/O口是真正的I/O口,能正确反映I/O口输入/输出的真实情况。工业级产品,具有大电流(灌电流)10~40mA,可直接驱动可控硅SCR或继电器,节省了外围驱动器件。2.AVR单片机内带模拟比较器,I/O口可用作A/D转换,可组成廉价的A/D转换器。ATmega48/8/16等器件具有8路10位A/D。3.部分AVR单片机可组成零外设元件单片机系统,使该类单片机无外加元器件即可工作,简单方便,成本又低。4.AVR单片机可重设启动复位,以提高单片机工作的可靠性。有看门狗定时器实行安全保护,可防止程序走乱(飞),提高了产品的抗干扰能力。(3)有功能强大的定时器/计数器及通讯接口定时/计数器T/C有8位和16位,可用作比较器。计数器外部中断和PWM(也可用作D/A)用于控制输出,某些型号的AVR单片机有3~4个PWM,是作电机无级调速的理想器件。AVR单片机有串行异步通讯UART接口,不占用定时器和SPI同步传输功能,因其具有高速特性,故可以工作在一般标准整数频率下,而波特率可达576K。(4)片内EEPROMEEPROM数据存储器。它是作为一个独立的数据空间而存在的,可以按字节读写。EEPROM的寿命至少为100,000次擦除周期。EEPROM的访问由地址寄存器、数据寄存器和控制寄存器决定。通过SPI和JTAG及并行电缆下载EEPROM数据的操作。2、程序简述我们组主要采用的是C语言编程,在编写放气阀控制程序的过程中,我首先编写了三个延时的子程序,一个是延时1s用来数码管显示的,一个是延时20ms用来做键盘消抖的,另外一个是用来在自动运行的时候控制时间的,这个延时的值可以自行设定。接下来开始编写主程序,这一块首先要定义初始状况,比如说要定义PA、PC、PD、PF口的方向寄存器,并且还要定义它们的初始值。接下来最为重要的就是编写键盘扫描。用的是if语句,首先进入两个死循环,一个用于键盘扫描,一个用于循环执行键盘扫描后的子程序。在键盘扫描的循环中,将PIND的值赋给key,通过检测key的值来判断是否有键按下,如果无键按下,就用break跳出循环,否则将key的值与初始宏定义的KEY1——KEY8分别检测,如果有相同,则跳到相应的子程序上去。子程序的编写中,将设定的时间值作为一个全局变量,这样方便在子程序和主程序中去修改它的值。自动加一和自动减一是通过函数和指针来实现对设定值的修改。结论1、结论简述烧入程序后自动进入自动运行,这时可通过按手开或手关跳出自动运行。接下来的操作均可通过键盘实现:1键进入自动运行,显示AU,并开始在设定值的基础上倒计时;2键手动开启放气阀,并显示OP;3键手动关闭放气阀,并显示CL;4键显示设定值;5键设定值加一,每按一下加一;6键自动减一,每按一下减一;7键保存修改后的设定值;8键退出到自动运行。(1)实现的功能:上电自动运行后开始检测键盘值;手动开启放气阀;手动关闭放气阀;显示设定值;设定值自动加一;设定值自动减一;保存修改后的设定值;退出并进入到自动运行状态(2)创新点:自动运行状态可以跳出到手开或手关是通过在自动运行的子程序中设置了键盘扫描,如果有键按下会跳出自动运行,进行手动开启或手动关闭,这是保证了工业生产过程中的手动开启和关闭的优先级自动运行结束一段时间继续自动运行在主程序中,可以设置自动运行的周期T,和中间间歇的SETTIME的延时时间,自动运行后,先显示AL,然后检测是否有键按下,有键按下则跳出,无键按下则在SETTIME的延时后再次进入自动运行。(3)缺点:程序过于冗长,可以把键盘扫描编写为一个子程序,通过调用它来实现键盘扫描可提高代码执行的效率由于采用查询的方法,在自动运行结束后的等待时间里,不能实现随时按键就能跳出等待附录原理图PCB板3、主程序(1)跑马灯流程图:初始化开PA、PC口输出状态PA、PC口置1,数码管全灭for初始化开PA、PC口输出状态PA、PC口置1,数码管全灭for循环使数码管以流水灯方式一次点亮后熄灭while(1)程序:#include<iom128v.h>#include<macros.h>unsignedcharconsttable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//跑马灯的不同编码inti,j;voiddelay_1()//延时500ms函数{ for(i=0;i<25;i++) { for(j=0;j<1000;j++); };}voidmain()//主函数{unsignedinti,j;while(1)//无限循环{DDRA=0xff;//定义A口为输入口 PORTA=0x00;//第一个数码管显示8 PORTC=0xff;//第二个数码管全灭 for(i=0;i<8;i++)//数码管分为8段分别显示 { PORTA=table[i];//第一个数码管显示 delay_1();//延时500ms };PORTA=0xff;//第一个数码管全灭DDRC=0xff;//定义C口为输入口PORTC=0x00;//第二个数码管显示8 for(j=0;j<8;j++) { PORTC=table[j];//第二个数码管显示 delay_1();//延时500ms };};}(2)60s定时流程图:初始化开PA、PC口输出状态PA、PC口置1,数码管全灭while用for初始化开PA、PC口输出状态PA、PC口置1,数码管全灭while用for循环使PA、PC口数码管一次以1s延时从00显示到59数码管显示60程序:#include<iom128v.h>#include<macros.h>unsignedcharconsttable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管0~9的编码Voiddelay_1(void)//延时1s的函数{unsignedinti,j; for(i=0;i<550;i++) { for(j=0;j<300;j++); };}Voidmain(){inti,jDDRA=0xff;//定义A口为输入口 DDRC=0xff;//定义B口为输入口 PORTA=0x00;//第一个数码管显示0 PORTC=0x00;//第二个数码管显示0while(1)//无限循环{ for(i=0;i<7;i++)//第一个数码管最大数字为6 { PORTA=table[i];//显示第一个数码管的数字 if(i!=6) { for(j=0;j<10;j++)//第二个数码管的数字范围为0~10 { PORTC=table[j];//显示第二个数码管的数字 delay_1();//延时1s }; } else//当第一个数字为6时 { PORTC=table[0];//第二个数码管显示0 delay_1();//延时1s }; };};}放气阀控制流程图:while(1)1开启按键查询while(1)1开启按键查询按键查询有按键查询无自动运行自动运行结束是按键1手动运行是按键2手动运行手动关闭是按键3手动关闭结束显示设定值结束是按键4显示设定值自动加一结束是按键5自动加一自动减一结束是按键6自动减一接上页保存修改值保存修改值结束是按键7退出(进入自动)是按键8退出(进入自动)结束程序:#include<iom128v.h>#include<macros.h>#defineKEY10xfe//宏定义键盘1~8#defineKEY20xfd#defineKEY30xfb#defineKEY40xf7#defineKEY50xef#defineKEY60xdf#defineKEY70xbf#defineKEY80x7funsignedcharconsttable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义共阳极数码管0~9的数字显示的编码表unsignedinti,j;//定义i,junsignedchartime=15;//定好自动初始时间为15sunsignedchardata;voidEEPROM_write(unsignedintuiAddress,unsignedcharucData){while(EECR&(1<<EEWE));EEAR=uiAddress;EEDR=ucData;EECR|=(1<<EEMWE);EECR|=(1<<EEWE);}unsignedcharEEPROM_read(unsignedintuiAddress){while(EECR&(1<<EEWE)); EEAR=uiAddress; EECR|=(1<<EERE); returnEEDR;}voiddelay_1(void)//延时1s程序 {inti,j; for(i=0;i<200;i++) { for(j=0;j<300;j++); };}voiddelay_20(void)//延时20ms消抖程序{inti,j; for(i=0;i<20;i++) { for(j=0;j<550;j++); };}voidSETTIME(void)//自动运行完后的延时程序{inti,j,k; for(i=0;i<(time/3);i++) { for(j=0;j<200;j++) for(k=0;k<300;k++); };}voidA(void)//自动运行状态函数{inta,b,c,key,t;intflag; PORTF=0x00;//端口F作为输出口 PORTA=0x88;//端口A数码管1显示A PORTC=0xc1;//端口C数码管2显示U delay_1();//延时1s显示数码管上显示AU a=time/10; b=time%10;for(i=0;i<=b;i++){ for(flag=0,t=10000;t>0;t--) {key=PIND;//取按键的值 if(key!=0xff)//判断有无按键按下 { delay_20();//键盘延时消抖 key=PIND; if(key!=0xff) {if(key==KEY2)//若按下第二键则退出自动运行状态进行手动状态 { M(); flag=1; break; } elseif(key==KEY3)//若按下第三键则退出自动运行状态进行手动结束 { MC(); flag=1; break; } } elsebreak;//若无键盘按下,则跳出程序 } } if(flag==1) {break; }PORTA=table[a];//显示倒计时的时间PORTC=table[b-i];delay_1();//延时1s}if(a>=1){ a=a-1;for(j=0;j<=a;j++){ if(flag==1) {break; } for(flag=0,t=10000;t>0;t--) {key=PIND; if(key!=0xff)//判断有无按键按下 { delay_20(); key=PIND; if(key!=0xff) {if(key==KEY2)//若按下第二键则退出自动运行状态进行手动状态 { M(); flag=1; break; } elseif(key==KEY3)//若按下第三键则退出自动运行状态进行手动结束 { MC(); flag=1; break; } } elsebreak;//若无键盘按下,则跳出程序 } } if(flag==1) {break; }PORTA=table[a-j];//显示倒计时第一个数码管上的时间for(c=0;c<10;c++){ for(flag=0,t=10000;t>0;t--) {key=PIND;//取键盘值 if(key!=0xff)//判断有无按键按下 { delay_20();//键盘延时消抖 key=PIND; if(key!=0xff) {if(key==KEY2)//若按下第二键则退出自动运行状态进行手动状态 { M(); flag=1; break; } elseif(key==KEY3)//若按下第三键则退出自动运行状态进行手动结束 { MC(); flag=1; break; } } elsebreak;//若无键盘按下,则跳出程序 } } if(flag==1) {break; }PORTC=table[9-c];//显示倒计时第二个数码管上的时间delay_1();//延时1s}}}}voidM(void)//手动运行状态函数{ PORTF=0x00;//定义F端口为输出口 PORTA=0xc0; // 第一个数码管显示0 PORTC=0x8c;//第二个数码管显示P delay_1();}voidMC(void)//手动结束函数{ PORTF=0x01; PORTA=0xc6;//第一个数码管显示C PORTC=0xc7;//第二个数码管显示L delay_1(); }voidSET(void)//阀门控制时间设置函数{ PORTA=table[time/10]; PORTC=table[time%10]; delay_20();//延时消抖 }voidAADD(int*a)//阀门控制时间自动加1函数{*a=*a+1; PORTA=table[*a/10]; PORTC=table[*a%10]; delay_20();//延时消抖}voidADEC(int*a)//阀门控制时间自动减1函数{*a=*a-1; PORTA=table[*a/10]; PORTC=table[*a%10]; delay_20();//延时消抖}voidSAVE(int*a)//阀门控制时间保存函数{time=*a;EEPROM_write(0x01,time); PORTA=table[time/10]; PORTC=table[time%10]; delay_20();//延时消抖}voidQUIT(void)//阀门控制时间设定退出函数{ A();}voidmain()//主函数{inti,flag,t,key,T=1; inth=time; DDRA=0xff;//定义A口为输入口 DDRC=0xff;//定义C口为输入口 DDRD=0x00;//定义D口为输出口 DDRF=0x01; PORTA=0x00; PORTC=0x00; PORTD=0xff; PORTF=0x01;data=EEPROM_read(0x01); if(data>=0&&data<=99) { time=data; for(i=2;i>=0;i--) { PORTA=0x88;//第一个数码管显示A PORTC=0xc1;//第二个数码管显示Udelay_1();//延时1SPORTA=0xff;//第一个数码管显示0 PORTC=0xff;//第二个数码管显示0 delay_1();//延时1S } A();//调用自动运行函数 } else{ for(i=2;i>=0;i--) { PORTA=0x88;//第一个数码管显示A PORTC=0xc1;//第二个数码管显示Udelay_1();//延时1SPORTA=0xff;//第一个数码管显示0 PORTC=0xff;//第二个数码管显示0 delay_1();//延时1S } A();//调用自动运行函数 }; while(1) { PORTD=0xff; while(1) { key=PIND; if(key!=0xff)//判断是否有键按下 { delay_20();//键盘延时消抖 key=PIND;//取键盘值 if(key!=0xff) break; } }; if(key==KEY1)//若第一个键按下则进行自动运行状态 { A(); PORTA=0x88; PORTC=0xC6; delay_1(); for(flag=0,t=1000000;t>0;t--) {key=PIND; if(key!=0xff) { delay_20(); key=PIND; if(key!=0xff) {if(key==KEY2)//若第二个键按下,则进行手动状态 {flag=1; M(); break; } elseif(key==KEY3)//若第三个键按下,则进行手动结束状态 {flag=1; MC(); break; } elseif(key==KEY4)//若第四个键按下,则进行设置状态 {flag=1; SET(); break; } elseif(key==KEY5)//若第五个键按下,控制时间加1 {flag=1; AADD(&h); break; } elseif(key==KEY6)//若第六个键按下,控制时间减1 {flag=1; ADEC(&h); break; } elseif(key==KEY7)//若第七个键按下,保存设定时间 {flag=1; SAVE(&h); break; } elseif(key==KEY8)//若第八个键按下,退出设定 {flag=1; QUIT(); break; } } } elsebreak;//若没有按键按下则退出 } for(i=T;i>0;i--) { if(flag==1) {break; } PORTA=0x88; PORTC=0xC6; SETTIME(); for(flag=0,t=1000000;t>0;t--) {key=PIND; if(key!=0xff)//判断是否有键按下 { delay_20();//键盘延时消抖 key=PIND;//取键盘值 if(key!=0xff) {if(key==KEY2)//判断是否有第二个键按下 {flag=1; M(); break; } elseif(key==KEY3)//判断是否有第三个键按下 {flag=1; MC(); break; } elseif(key==KEY4)//判断是否有第四个键按下 {flag=1; SET(); break; } elseif(key==KEY5)//判断是否有第五个键按下 {flag=1; AADD(&h); break; } elseif(key==KEY6)//判断是否有第六个键按下 {flag=1; ADEC(&h); break; } elseif(key==KEY7)//判断是否有第七个键按下 {flag=1; SAVE(&h); break; } elseif(key==KEY8)//判断是否有第八个键按下 {flag=1; QUIT(); break; } } } elsebreak;//若无键按下则退出 } } A();//调用自动运行状态函数 } elseif(key==KEY2)//若第二个键按下,则进行手动状态 M(); elseif(key==KEY3)//若第三个键按下,则进行手动结束状态 MC(); elseif(key==KEY4)//若第四个键按下,则进行设置状态 SET(); elseif(key==KEY5)//若第五个键按下,控制时间加1 AADD(&h); elseif(key==KEY6)//若第六个键按下,控制时间减1 ADEC(&h); elseif(key==KEY7)//若第七个键按下,保存设定时间 SAVE(&h); elseif(key==KEY8)//若第八个键按下,退出设定 QUIT();//退出程序 };}机械原理课程设计编程说明书设计题目:牛头刨床凸轮机构的设计及运动分析指导教师:设计者:学号:班级:目录计任务及要求数学模型的建立程序框程序中符号说明程序清单及运行结果课程设计总结参考文献凸轮机构的设计基本条件与要求已知:从动件的最大摆角许用压力角,从动件的长度,推程运动角,远休止角,回程运动角从动件见运动规律为等加、等减速运动,凸轮与曲柄共轴。要求:1)计算从动件位移、速度、加速度并绘制线图,也可做动态显示。确定凸轮机构的基本尺寸,选取滚子半径,画出凸轮实际轮廓线,并按比例绘出机构运动简图,以上内容作在2号图纸上。编写说明书二、根据运动分析写出与运动方程式设从动件起始角2.1)升程加速区,其运动方程为:2)属于升程减速区,其运动方程为:3),属于远休止区,其运动方程为:4)属于回程加速区,其运动方程为:5),属于回程减速区,其运动方程为:6),于近休止区,其运动方程为三流程图四、源程序#include<math.h>#include<dos.h>#include<graphics.h>#include<conio.h>#include<stdio.h>#defineI130.0#defineAa42#definerb50#definerr10#defineK(3.1415926/180)#definedt0.25floatQmax,Q1,Q2,Q3;floatQ_a;doubleL,pr;floate[1500],f[1500],g[1500];voidCal(floatQ,doubleQ_Q[3]){Qmax=15,Q1=75,Q2=10,Q3=65;if(Q>=0&&Q<=Q1/2){Q_Q[0]=K*(2*Qmax*Q*Q/(Q1*Q1));Q_Q[1]=4*Qmax*Q/(Q1*Q1);Q_Q[2]=4*Qmax/(Q1*Q1);}if(Q>Q1/2&&Q<=Q1){Q_Q[0]=K*(Qmax-2*Qmax*(Q-Q1)*(Q-Q1)/(Q1*Q1));Q_Q[1]=4*Qmax*(Q1-Q)/(Q1*Q1);Q_Q[2]=-4*Qmax/(Q1*Q1);}if(Q>=Q1&&Q<=Q1+Q2){Q_Q[0]=K*Qmax;Q_Q[1]=0;Q_Q[2]=0;}if(Q>Q1+Q2&&Q<=Q1+Q2+Q3/2){Q_Q[0]=K*(Qmax-2*Qmax*(Q-Q1-Q2)*(Q-Q1-Q2)/(Q3*Q3));Q_Q[1]=-4*Qmax*(Q-Q1-Q2)/(Q3*Q3);Q_Q[2]=-4*Qmax/(Q3*Q3);}if(Q>Q1+Q2+Q3/2&&Q<Q1+Q2+Q3){Q_Q[0]=K*(2*Qmax*(Q3-Q+Q1+Q2)*(Q3-Q+Q1+Q2)/(Q3*Q3));Q_Q[1]=-4*Qmax*(Q3-Q+Q1+Q2)/(Q3*Q3);Q_Q[2]=4*Qmax/(Q3*Q3);}if(Q>Q1+Q1+Q3&&Q<=360){Q_Q[0]=K*0;Q_Q[1]=0;Q_Q[2]=0;}}voidDraw(floatQ_m){floattt,x,y,x1,y1,x2,y2,x3,x4,y3,y4,dx,dy;doubleQQ[3];circle(240,240,5);circle(240+L*sin(60*K),240-L*cos(60*K),5);moveto(240,240);lineto(240+20*cos(240*K),240-20*sin(240*K));lineto(260+20*cos(240*K),240-20*sin(240*K));lineto(240,240);moveto(240+L*sin(60*K),240-L*cos(60*K));lineto(240+L*sin(60*K)+20*cos(240*K),240-L*cos(60*K)-20*sin(240*K));lineto(240+L*sin(60*K)+20*cos(60*K),240-L*cos(60*K)-20*sin(240*K));lineto(240+L*sin(60*K),240-L*cos(60*K));for(tt=0;tt<=720;tt=tt+2){Cal(tt,QQ);/*tulunlunkuoxian*/x1=L*cos(tt*K-30*K)-I*cos(Q_a+QQ[0]+tt*K-30*K);y1=I*sin(Q_a+QQ[0]+tt*K-30*K)-L*sin(tt*K-30*K);x2=x1*cos(Q_m*K)-y1*sin(Q_m*K);y2=x1*sin(Q_m*K)+y1*cos(Q_m*K);putpixel(x2+240,240-y2,2);dx=(QQ[1]+1)*I*sin(Q_a+QQ[0]+tt*K-30*K)-L*sin(tt*K-30*K);dy=(QQ[1]+1)*I*cos(Q_a+QQ[0]+tt*K-30*K)-L*cos(tt*K-30*K);x3=x1+rr*dy/sqrt(dx*dx+dy*dy);y3=y1-rr*dx/sqrt(dx*dx+dy*dy);x4=x3*cos(Q_m*K)-y3*si

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论