

免费预览已结束,剩余27页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机创新设计报告设计题目: 基于单片机的电机测速及显示 学 院: 机电工程学院 专 业: 测控技术与仪器 班级学号: 071 23 姓 名: 同组人员: 指导教师: 设计时间: 2010、10、10-2010、10、30 单片机简介21.1单片机历史21.2 at89c51的主要特性31.3管脚说明41.4振荡器特性71.5芯片擦除7二、硬件电路的设计82.1 at89c51下载器部分82.2电机驱动部分11三、程序设计163.1 下载器程序163.2电机测速程序24四、总结37五、参考文献38单片机简介单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器cpu随机存储器ram、只读存储器rom、多种i/o口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、a/d转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。1.1单片机历史单片机诞生于20世纪70年代末,经历了scm、mcu、soc三大阶段。(1)scm即单片微型计算机(single chip microcomputer)阶段,主要是寻求最佳的单片形态嵌入式系统的最佳体系结构。“创新模式”获得成功,奠定了scm与通用计算机完全不同的发展道路。在开创嵌入式系统独立发展道路上,intel公司功不可没。 micro controller unit(2)mcu即微控制器(micro controller unit)阶段,主要的技术发展方向是:不断扩展满足嵌入式应用时,对象系统要求的各种外围电路与接口电路,突显其对象的智能化控制能力。它所涉及的领域都与对象系统相关,因此,发展mcu的重任不可避免地落在电气、电子技术厂家。从这一角度来看,intel逐渐淡出mcu的发展也有其客观因素。在发展mcu方面,最著名的厂家当数philips公司。 philips公司以其在嵌入式应用方面的巨大优势,将mcs-51从单片微型计算机迅速发展到微控制器。因此,当我们回顾嵌入式系统发展道路时,不要忘记intel和philips的历史功绩。1.2 at89c51的主要特性与mcs-51 兼容 4k字节可编程闪烁存储器 寿命:1000写/擦循环数据保留时间:10年全静态工作:0hz-24hz三级程序存储器锁定128*8位内部ram32可编程i/o线两个16位定时器/计数器5个中断源 可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路1.3管脚说明vcc:供电电压。gnd:接地。p0口:p0口为一个8位漏级开路双向i/o口,每脚可吸收8ttl门电流。当p1口的管脚第一次写1时,被定义为高阻输入。p0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在fiash编程时,p0 口作为原码输入口,当fiash进行校验时,p0输出原码,此时p0外部必须被拉高。p1口:p1口是一个内部提供上拉电阻的8位双向i/o口,p1口缓冲器能接收输出4ttl门电流。p1口管脚写入1后,被内部上拉为高,可用作输入,p1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在flash编程和校验时,p1口作为第八位地址接收。 p2口:p2口为一个内部上拉电阻的8位双向i/o口,p2口缓冲器可接收,输出4个ttl门电流,当p2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,p2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。p2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,p2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,p2口输出其特殊功能寄存器的内容。p2口在flash编程和校验时接收高八位地址信号和控制信号。p3口:p3口管脚是8个带内部上拉电阻的双向i/o口,可接收输出4个ttl门电流。当p3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,p3口将输出电流(ill)这是由于上拉的缘故。p3口也可作为at89c51的一些特殊功能口,如下表所示: p3.0 rxd(串行输入口) p3.1 txd(串行输出口) p3.2 /int0(外部中断0) p3.3 /int1(外部中断1) p3.4 t0(记时器0外部输入) p3.5 t1(记时器1外部输入) p3.6 /wr(外部数据存储器写选通) p3.7 /rd(外部数据存储器读选通) p3口同时为闪烁编程和编程校验接收一些控制信号。rst:复位输入。当振荡器复位器件时,要保持rst脚两个机器周期的高电平时间。ale/prog:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在flash编程期间,此引脚用于输入编程脉冲。在平时,ale端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ale脉冲。如想禁止ale的输出可在sfr8eh地址上置0。此时, ale只有在执行movx,movc指令是ale才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ale禁止,置位无效。/psen:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/psen有效。但在访问外部数据存储器时,这两次有效的/psen信号将不出现。/ea/vpp:当/ea保持低电平时,则在此期间外部程序存储器(0000h-ffffh),不管是否有内部程序存储器。注意加密方式1时,/ea将内部锁定为reset;当/ea端保持高电平时,此间内部程序存储器。在flash编程期间,此引脚也用于施加12v编程电源(vpp)。xtal1:反向振荡放大器的输入及内部时钟工作电路的输入。xtal2:来自反向振荡器的输出。1.4振荡器特性xtal1和xtal2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,xtal2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。1.5芯片擦除整个perom阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ale管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。 此外,at89c51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,cpu停止工作。但ram,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存ram的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。二、硬件电路的设计2.1 at89c51下载器部分sp-51pro(即easy51pro)编程器可以烧录atmel公司系列单片机芯片,具有性能稳定,烧录速度快,性价比高等优点。产品性能介绍如下:支持的芯片支持目前最为经典和市场占有量最大的atmel公司生产的at89c51、c52、c55和最新的s51、s52;at89c1051、2051、4051等芯片。产品特点1.使用串口通讯,芯片自动判别,编程过程中的擦除、烧写、校验各种操作完全由编程器上的监控芯片89c51控制,不受pc配置及其主频的影响,因此烧写成功率高可以达到100,烧写速度很快并且烧写速度和微机的档次无关。2.采用57600高速波特率进行数据传送,编程速度可以和一般并行编程器相媲美,经测试,烧写一片4k rom的at89c51仅需要9.5s,而读取和校验仅需要3.5s。3.体积小巧,省去笨重的外接电源适配器,直接使用usb端口5v电源, 携带方便,非常初学者学习51单片机的要求。4.软件界面友好,菜单、工具栏、快捷键齐全,全中文操作,提供加密功能,可以保护您的创作产权。可以说是麻雀虽小,五脏俱全!5.功能完善,具有编程、读取、校验、空检查、擦除、加密等系列功能;6.40pin和20pin锁紧插座,所有器件全部以第一脚对齐,无附加跳线,对于dip封装芯片无需任何适配器;7.采用优质万用锁紧插座,和接触不良等问题彻底说再见,可烧写40脚单片机芯片和20脚单片机芯片8.改进的烧写深度确保每一片c51系列芯片的反复烧写次数都能达到1000以上!内部数据至少保存10年。9.因为采用了9针传口通讯,这样一来就不会再和打印机抢一个打印口,随时随地想烧就烧,让芯片编程成为一种快乐!(3)硬件连接 1.通讯电缆与编程器连接好,2.将串口插头插入电脑串口,3.usb插头插入电脑任一个usb口,此时编程器上led点亮,表明电源接通。4.接着安装软件,本软件支持win9x/me/2000/nt,标准window操作界面。本软件属于绿色软件,不需要安装,直接把相关的软件拷贝到硬盘中,运行其中的easy 51pro 2_0程序即可。 软件使用 程序启动后,会自动检测硬件及连接,状态框中显示“就绪”字样,表示编程器连接和设置均正常。否则请检查硬件连接和端口设置。 把单片机芯片正确地放到编程器的相应插座上,注意,芯片的缺口要朝向插座的把手方向。芯片放好后,就可以对芯片进行读写操作了,读写操作按下面的步骤进行: 1、程序运行,请先选择器件(点下选框)2、用“打开文件”选择打开要编写的.hex 和 .bin 文件3、用“保存文件”可以保存读出来的文件4、用“擦除器件”擦除芯片5、用“写器件”编程6、用“读器件”读取芯片中的程序,加密的读不出来7、用“校验数据”检查编程的正确与否8、用“自动完成”自动执行以上各步骤9、用“加密”选择加密的级数2.12电机驱动部分2.2电机驱动部分图4-3中所示为一个典型的直流电机控制电路。电路得名于“h桥驱动电路”是因为它的形状酷似字母h。4个三极管组成h的4条垂直腿,而电机就是h中的横杠(注意:图4.12及随后的两个图都只是示意图,而不是完整的电路图,其中三极管的驱动电路没有画出来)。如图所示,h桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。 图4-3 h桥简易驱动电路要使电机运转,必须使对角线上的一对三极管导通。例如,如图4-4所示,当q1管和q4管导通时,电流就从电源正极经q1从左至右穿过电机,然后再经q4回到电源负极。按图中电流箭头所示,该流向的电流将驱动电机顺时针转动。当三极管q1和q4导通时,电流将从左至右流过电机,从而驱动电机按特定方向转动(电机周围的箭头指示为顺时针方向)。 图4-4 h桥电路驱动电机顺时针转动图4-5所示为另一对三极管q2和q3导通的情况,电流将从右至左流过电机。当三极管q2和q3导通时,电流将从右至左流过电机,从而驱动电机沿另一方向转动(电机周围的箭头表示为逆时针方向)。 图4-5 h桥驱动电机逆时针转动 驱动电机时,保证h桥上两个同侧的三极管不会同时导通非常重要。如果三极管q1和q2同时导通,那么电流就会从正极穿过两个三极管直接回到负极。此时,电路中除了三极管外没有其他任何负载,因此电路上的电流就可能达到最大值(该电流仅受电源性能限制),甚至烧坏三极管。基于上述原因,在实际驱动电路中通常要用硬件电路方便地控制三极管的开关。图4-6 所示就是基于这种考虑的改进电路,它在基本h桥电路的基础上增加了4个与门和2个非门。4个与门同一个“使能”导通信号相接,这样,用这一个信号就能控制整个电路的开关。而2个非门通过提供一种方向输人,可以保证任何时候在h桥的同侧腿上都只有一个三极管能导通。(与本节前面的示意图一样,图4.15所示也不是一个完整的电路图,特别是图中与门和三极管直接连接是不能正常工作的。) 图4-6 具有使能控制和方向逻辑的h桥电路采用以上方法,电机的运转就只需要用三个信号控制:两个方向信号和一个使能信号。如果dirl信号为0,dirr信号为1,并且使能信号是1,那么三极管q1和q4导通,电流从左至右流经电机(如图4.-7所示);如果dirl信号变为1,而dirr信号变为0,那么q2和q3将导通,电流则反向流过电机。 图4-7 使能信号与方向信号的使用 实际使用的时候,用分立元件制作h桥是很麻烦的,好在现在市面上有很多封装好的h桥集成电路,接上电源、电机和控制信号就可以使用了,在额定的电压和电流内使用非常方便可靠。比如常用的l293d、l298n、ta7257p、sn754410等。三、程序设计3.1 下载器程序#include byte combuf18; uint naddress; uint ntimeout;prowork pw;void delay_us(byte nus) th0=0;tl0=0;tr0=1;while(tl0nus)tr0=0;void delay_ms(uint nms) uint n=0;tr0=1;while(nnms)th0=0;tl0=20;while(th04)n+;tr0=0; bool waitcomm()/等待上位机的命令,18字节byte n=0;ri=0;while(!ri)/combufn=sbuf;ri=0;n+;for(n;n10000)return 0;combufn=sbuf;ri=0;return 1;bool waitresp()ntimeout=0;ri=0;while(!ri)ntimeout+;if(ntimeout50000) return 0;ri=0;combuf0=sbuf;return 1;bool waitdata()byte n;ri=0;for(n=0;n10000)return 0;ri=0;combufn=sbuf;return 1;void senddata()/发送数据或回应操作完成,18字节byte n=0;for(n;n=17;n+)ti=0;sbuf=combufn;while(!ti)ti=0;void sendresp()ti=0;sbuf=combuf0;while(!ti)ti=0;void setvpp5v()/设置vpp为5vp3_4=0;p3_3=0;void setvpp0v()/设置vpp为0vp3_3=0;p3_4=1;void setvpp12v()/设置vpp为12vp3_4=0;p3_3=1;void rstpro()pw.fpproover();senddata();void readsign()/读特征字pw.fpreadsign();senddata();void erase()pw.fperase();senddata();void write(byte n;pw.fpinitpro();senddata();while(1)if(waitdata()if(combuf0=0x07)for(n=2;n=17;n+)if(!pw.fpwrite(combufn)pw.fpproover();combuf0=0xff;sendresp();waitdata();return;naddress+;/下一个单元combuf0=1;/回应上位机一个字节,表示数据块顺利完成,请求继续sendresp();else if(combuf0=0x00)/写器件结束break;else/可能是通讯出错了pw.fpproover();return;else/等待数据失败pw.fpproover();return;pw.fpproover();delay_ms(50);combuf0=0;senddata();void read()/byte n;pw.fpinitpro();senddata();while(1)if(waitresp()/if(combuf0=0)break;else if(combuf0=0xff)/0xff表示重发naddress=naddress-0x0010;for(n=2;n=17;n+)combufn=pw.fpread();naddress+;/下一个单元combuf0=6;/向上位机发送读出的数据块senddata();elsebreak;/等待回应失败pw.fpproover();/操作结束设置为运行状态combuf0=0;/通知上位机编程器进入就绪状态senddata();void lock()/写锁定位pw.fplock();senddata();extern void preparepro00();extern void preparepro01();extern void preparepro02();/fid=02:at89s51编程器void main()sp=0x60;setvpp5v();/先初始化vpp为5vscon=0x00;tcon=0x00;/pcon=0x00;/波特率*2ie=0x00;/tmod: gate|c/!t|m1|m0|gate|c/!t|m1|m0/ 0 0 1 0 0 0 0 1tmod=0x21;/t0用于延时程序th1=0xff;tl1=0xff;/波特率28800*2,注意pcon/scon: sm0|sm1|sm2|ren|tb8|rb8|ti|ri / 0 1 0 1 0 0 0 0scon=0x50;tr1=1;delay_ms(1000);/延时1秒后编程器自举combuf0=0;senddata(); while(1)/串口通讯采用查询方式if(!waitcomm()/如果超时,通讯出错delay_ms(500);combuf0=0;/让编程器复位,使编程器就绪switch(combuf1)/根据fid设置(prowork)pw中的函数指针case 0:/at89c51编程器preparepro00();break;case 1:/at89c2051编程器preparepro01();break;case 2:/at89s51编程器preparepro02();break;/case 3:支持新器件时,请继续向下添加/break;/case 4:/break;default:combuf0=0xff;combuf1=0xff;/表示无效的操作break;switch(combuf0)/根据操作id跳到不同的操作函数case 0x00:rstpro();/编程器复位break;case 0x01:readsign();/读特征字break;case 0x02:erase();/擦除器件break;case 0x03:write();/写器件break;case 0x04:read();/读器件break;case 0x05:lock();/写锁定位break;default:senddata();break;3.2电机测速程序/*led.c12864 led驱动程序头文件*/#ifndef led_h_#define led_h_#include/定义背光控制信号sbit led_bl=p14;/点亮背光灯void ledlighton();/熄灭背光灯void ledlightoff();/清屏void ledclear();/初始化void ledinit();/显示asc码void ledputchar(unsigned char c);/显示字符串void ledputs(unsigned char*s);#endif /led_h_/*led.c12864 led驱动程序*/#include #include /#include led.h/定义屏幕光标(取值063,光标本身不可见)unsigned char ledcursor;int i,j;/*函数:ledlighton()功能:点亮背光灯*/void ledlighton()led_bl = 1;/*函数:ledlightoff()功能:熄灭背光灯*/void ledlightoff()led_bl = 0;/*函数:ledgetbf()功能:读出状态位bf返回:bf=1,表示忙,不可进行任何操作bf=0,表示不忙,可以进行正常操作*/bit ledgetbf()unsigned char dat;dat = xbyte0xd002;/xbyte的定义见return (bit)(dat & 0x80);/*函数:ledwritecmd()功能:向led发送命令参数:cmd:命令字,详见器件的数据手册*/void ledwritecmd(unsigned char cmd)while ( ledgetbf() );xbyte0xd000 = cmd;/*函数:ledwritedat()功能:向led写入数据参数:dat,要写入的数据说明:目标地址由地址计数器ac隐含指定,写完后ac自动加1*/void ledwritedat(unsigned char dat)while ( ledgetbf() );xbyte0xd001 = dat;/*函数:ledreaddat()功能:从led读出数据返回:读出的数据*/*unsigned char ledreaddat()volatile unsigned char dat;while ( ledgetbf() );dat = xbyte0xd003;dat = xbyte0xd003;/需要连续执行两次才能够读出真正的数据return dat;*/*函数:ledsetac()功能:设置ddram(显示数据ram)的ac(地址计数器)值参数:ac:地址计数器值,范围063*/void ledsetac(unsigned char ac)ac &= 0x3f;ac |= 0x80;ledwritecmd(ac);/*函数:ledclear()功能:led清屏,并使光标回到0*/void ledclear()ledwritecmd(0x01);/清屏命令ledcursor = 0;/*函数:leddelay()功能:延时(t*100)个机器周期*/void leddelay(unsigned char t)unsigned char n;don = 49;while ( -n != 0 ); while ( -t != 0 );/*函数:ledinit()功能:led初始化*/void ledinit()ledwritecmd(0x30);leddelay(3);ledwritecmd(0x30);leddelay(1);ledwritecmd(0x0c);leddelay(3);ledclear();/清屏leddelay(250);ledwritecmd(0x06);leddelay(10);void ledcheckac()switch ( ledcursor )case 16:ledsetac(16);break;case 32:ledsetac(8);break;case 48:ledsetac(24);break;case 64:ledcursor = 0;ledsetac(0);break;default:break;void ledputchar(unsigned char c)ledwritedat(c);ledcursor+;ledcheckac();void ledputhz(unsigned char ch, unsigned char cl)if ( ledcursor & 0x01 )ledputchar( );ledwritedat(ch);ledwritedat(cl);ledcursor += 2;ledcheckac();/*函数:ledputs()功能:显示字符串参数:*s:要显示的字符串(可同时包含ascii码和汉字)*/void ledputs(unsigned char *s)unsigned char ch, cl;for (;)ch = *s+;if ( ch = 0 ) break;if ( ch 0x80 )ledputchar(ch);elsecl = *s+;ledputhz(ch,cl);/*显示主程序*/#includeled.h#include/#include delay.h /* 包含延时函数的头部文件delay_us();delay_ms(); */ /*函数:delay()延时1ms 65.53st0时,延时(t*0.001)st=0时。延时65.53sunsigned char sd4=1,2,3,4;/速度设定unsigned char fk4=2,2,3,4;/速度反馈int d=0;/方向控制中间变量unsigned int pwm=0;/速度产生中间变量 unsigned int p=0; unsigned int value=0; unsigned int pwm_value=0; unsigned int m; /unsigned int a,b,c,d;sbit key1=p20;sbit key2=p21;sbit key3=p22;sbit motora=p16;sbit motorb=p17;bit swtr;bit swtf;unsigned int swtv; #define pwm_max 255void delay(unsigned int t)swtv=t;swtr=1;while(!swtf);swtr=0;swtf=0;void key()if(key1=0)value=value+1;if(key2=0)value=value-1;if(value255) value=255;if(valuepwm_max)t=0;if(t=pwm_value) pwm=1;else pwm=0;if(d=0)motora=0;motorb=pwm;elsemotora=pwm;motorb=0; void show_value(unsigned char ch) int i; for(i=0;ivalue) pwm_value=p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 田径普修理论期末考试题及答案
- 土壤水势与气候变化关系-洞察及研究
- 职业装耐久性评价模型-洞察及研究
- 2025年公需科目大数据考试所有测试题及答案
- 2025年高危儿培训试题及答案
- 2025年高级维修电工理论知识题库及答案
- 2025年高级会计师之高级会计实务通关题库附带答案
- 交安考试考试题库及答案
- 专职营销人员管理办法
- 中央防洪物资管理办法
- 设备保养计划方案(3篇)
- 甲醛治理招标方案(3篇)
- 呼吸机管路设计与应用
- 2025-2030年中国黑胶唱片行业市场现状供需分析及投资评估规划分析研究报告
- 台海形势课件
- 云南大学管理制度
- 采石场人员管理制度
- 2025医疗机构劳动合同模板
- 牛的健康问题图像识别诊断-洞察阐释
- 浙江甬岭数控刀具有限公司年产600万只U钻、50万套镗刀技改项目环评报告
- DB31/ 653-2012通信基站空调能效限定值
评论
0/150
提交评论