




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机课设报告一:课设目的1:了解步进电机控制的基本原理2:掌控步进电机的转动的编程方法3:了解单片机控制外部设备的常用电路二:设计要求用8255扩展端口控制步进电机,编写程序输出脉冲序列到8255的PA口,控制步进电机正转、反转、加速、减速。三:设备1:LAB6000微控制器实验系统2:PC机一台3:实验导线四:参考电路及连线 连线连线孔 1连线孔 218255-csCS02PA0步进电机A3PA1步进电机B4PA2步进电机C5PA3步进电机D五:说明、步进电机驱动原理是通过对每组线圈中的电流的顺序切换来使步进电机旋转。切换是通过单片机输出脉冲来实现的。所以调节脉冲信号的频率便可以改变步进电
2、机的转速改变各相脉冲的先后顺序可以改变电机的旋转方向。步进电机的转速应由慢到快逐步加速。电机驱动方式可以采用双四拍(AB-BC-CD-DA-AB)方式,也可以采用单四拍(A-B-C-D-A)方式,或单、双八拍(A-AB-B-BC-C-CD-D-DA-A)方式。各种工作方式的时序图如下:单四拍 八拍 单、双四拍六、程序框图七:原始程序#include<reg51.h>#include"absacc.h"#define PA XBYTE0x7FFC#define PB XBYTE0x7FFD#define PC XBYTE0x7FFE#define con XBYT
3、E0x7FFF#define uchar unsigned char#define uint unsigned intuchar code move=0x01,0x02,0x04,0x08;sbit A=P0;sbit C=P3; int flag=0;int speed=10;void delay(uint z);void move();void main()switch(C)case 0x00: move(speed);break;case 0x01: flag=!flag;move();break;case 0x02: speed=speed+10;move(speed);break;c
4、ase 0x03: speed=speed-10;move(speed);break;void move() int i;if(flag=1) for(i=0;i<4;i+)A=0XFF;A=0x90;PA=movei;delay(speed); else for(i=4;i>0;i-) A=0XFF;A=0x90;PA=movei;delay(speed); void delay(uint z)uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);八:现程序/*- 名称:步进电机 -*/#include <reg52.h>#i
5、nclude <absacc.h>#define IN XBYTE0X08001 /键盘输入口#define OUTBIT XBYTE0X08002 /位控制口sbit A1=P10; /定义步进电机连接端口sbit B1=P11;sbit C1=P12;sbit D1=P13;#define Coil_AB1 A1=1;B1=1;C1=0;D1=0;/AB相通电,其他相断电#define Coil_BC1 A1=0;B1=1;C1=1;D1=0;/BC相通电,其他相断电#define Coil_CD1 A1=0;B1=0;C1=1;D1=1;/CD相通电,其他相断电#define
6、 Coil_DA1 A1=1;B1=0;C1=0;D1=1;/DA相通电,其他相断电#define Coil_A1 A1=1;B1=0;C1=0;D1=0;/A相通电,其他相断电#define Coil_B1 A1=0;B1=1;C1=0;D1=0;/B相通电,其他相断电#define Coil_C1 A1=0;B1=0;C1=1;D1=0;/C相通电,其他相断电#define Coil_D1 A1=0;B1=0;C1=0;D1=1;/D相通电,其他相断电#define Coil_OFF A1=0;B1=0;C1=0;D1=0;/全部断电unsigned char Speed; /速度变量bi
7、t StopFlag; /停止标志bit flag; /正反转标志void Init_Timer0(void);unsigned char keytest(void);/*- uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS -*/void DelayUs2x(unsigned char t) while(-t);/*- mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是
8、定义无符号字符变量,其值的范围是 0255 这里使用晶振12M,精确延时请使用汇编-*/void DelayMs(unsigned char t) /大致延时1mS while(t-) DelayUs2x(245); DelayUs2x(245); /*- 主函数-*/main() unsigned char num,set,j; Init_Timer0(); /定时器初始化 Coil_OFF while(1) /正向 num=keytest(); /循环调用按键扫描 if(num=1) /速度等级增加 if(Speed<18) Speed+; else if(num=2) /速度等级减
9、小 if(Speed>1) Speed-; else if(num=3) /电机停止 Coil_OFF StopFlag=1; else if(num=4) /电机启动 StopFlag=0; else if(num=5) /电机正转 flag=1; else if(num=6) /电机反转 flag=0; else if(num=7)/第一档慢速 set=1; if(Speed>=set) for(j = Speed; j >set ; j-)DelayMs(500);Speed = j; elsefor(j=Speed;j<set;j+)DelayMs(500);S
10、peed = j; else if(num=8)/第二档中速 set=10; if(Speed>=set) for(j = Speed; j >set ; j-)DelayMs(500);Speed = j; elsefor(j=Speed;j<set;j+) DelayMs(500); Speed = j; else if(num=9) /第三档快速 set=18; if(Speed>=set) for(j = Speed; j >set ; j-)DelayMs(500);Speed = j; elsefor(j=Speed;j<set;j+)Delay
11、Ms(500);Speed = j; /*- 定时器初始化子程序-*/void Init_Timer0(void) TMOD |= 0x01; /使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响 /TH0=0x00; /给定初值 /TL0=0x00; EA=1; /总中断打开 ET0=1; /定时器中断打开 TR0=1; /定时器开关打开 PT0=1; /优先级打开/*- 定时器中断子程序-*/void Timer0_isr(void) interrupt 1 static unsigned char times,i; TH0=(65536-500)/
12、256; /重新赋值 0.5ms TL0=(65536-500)%256; if(!StopFlag) if(flag=1) /正转 if(times=(20-Speed)/最大值18,所以最小间隔值20-18=2 times=0; switch(i) case 0:Coil_A1;i+;break;case 1:Coil_AB1;i+;break;case 2:Coil_B1;i+;break;case 3:Coil_BC1;i+;break;case 4:Coil_C1;i+;break;case 5:Coil_CD1;i+;break;case 6:Coil_D1;i+;break;ca
13、se 7:Coil_DA1;i+;break;case 8:i=0;break; default:break; times+; else /反转 if(times=(20-Speed)/最大值18,所以最小间隔值20-18=2 times=0; switch(i) case 0:Coil_A1;i+;break; case 1:Coil_DA1;i+;break;case 2:Coil_D1;i+;break;case 3:Coil_CD1;i+;break;case 4:Coil_C1;i+;break;case 5:Coil_BC1;i+;break;case 6:Coil_B1;i+;b
14、reak;case 7:Coil_AB1;i+;break;case 8:i=0;break;default:break; times+; /*-按键扫描函数,返回扫描键值逐列输入点电频,再逐行扫描按键,返回键值无键按下返回0-*/unsigned char keytest(void)/*输出线置1101 1111第一列输入低电平 */unsigned char num,temp;OUTBIT=0XDF; temp=IN; /读入键状态temp=temp&0X0F;/高四位不用if(temp!=0x0F)DelayMs(10);/延时去抖temp=IN;temp=temp&0x
15、0F;while(temp!=0x0F) temp=IN;switch(temp) /逐行扫描 case 0x0E:num=0;break;case 0x0D:num=1;break;case 0x0B:num=4;break;case 0x07:num=7;break;while(temp!=0X0F) /松手检测temp=IN;temp=temp&0x0F; else num=0; /无键按下返回0/*输出线置1110 1111第二列输入低电平 */OUTBIT=0XEF; temp=IN;temp=temp&0X0F;if(temp!=0x0F)DelayMs(10);t
16、emp=IN;temp=temp&0x0F;while(temp!=0x0F)temp=IN;switch(temp)case 0x0E:num=1;break;case 0x0D:num=2;break;case 0x0B:num=5;break;case 0x07:num=8;break; while(temp!=0X0F) temp=IN;temp=temp&0x0F; /*输出线置1111 0111第三列输入低电平 */OUTBIT=0xf7; temp=IN;temp=temp&0X0F;if(temp!=0x0F)DelayMs(10);temp=IN;te
17、mp=temp&0x0F;while(temp!=0x0F)temp=IN;switch(temp) case 0x0E:num=14;break;case 0x0D:num=3;break; case 0x0B:num=6;break;case 0x07:num=9;break; while(temp!=0X0F)temp=IN;temp=temp&0x0F; /*输出线置1111 1011第四列输入低电平 */OUTBIT=0Xfb; temp=IN;temp=temp&0X0F;if(temp!=0x0F) DelayMs(10); temp=IN; temp=t
18、emp&0x0F; while(temp!=0x0F) temp=IN; switch(temp) case 0x0E:num=13;break; case 0x0D:num=12;break; case 0x0B:num=11;break; case 0x07:num=10;break; while(temp!=0X0F) temp=IN; temp=temp&0x0F; return num;九:实验过程实习中遇到的困难解决方法与途径1关于C语言方面的一些问题:好多的C语言方面的知识都忘记了。比如变量的表示、switch语句的应用 C语言是程序的基础,所以解决这个问题十分的
19、重要,在程序设计的刚开始,我便将C语言又复习了一遍。2步进电机的控制:由于还没有学过,所以并不了解他的具体的控制过程。手先我是看了一下书,书上虽然说了他的一些基本的控制原理,但是还是有点不懂。于是上网查找了一些相关的资料,终于有点懂了。后来又看了一些别人写过的关于步进电机控制的程序,最终明白了他的控制的原理。3单片机外部寄存器的读写在以前单片机的学习中,大多数的都是用的汇编语言来写。对于一些片外的地址都是直接来写,这次主要是用C语言来写的,所欲对于这些还是有点不太熟练。通过看书,我又将这些方面的知识又从新的学习了一遍,了解了片外地址读写的一般格式。在最终的程序中也有用到。4矩阵键盘的编程刚开始
20、我的程序上面的都是独立键盘的扫描程序,而这次的实验用到的实验器材是一个矩阵键盘,所以程序就要进行一些修改。我先看了一下单片机书上关于矩阵键盘的一些知识,但只是讲了一些基本的原理,对于如何来写程序还是没有头绪。于是又看了郭天祥单片机教程的关于矩阵的视频,基本上是懂了,也知道了程序的写法。但是他的矩阵键盘是直接连在单片机的IO口上的,而试验箱上的键盘是用单片机的片外寻址的方式来实现的。这是我的本次试验中遇到的最大的难题,经过老师的指点,我打开了实验指导书,翻到了实验十四:键盘扫描程序实验。将实验说明关于矩阵键盘的认真的研读了一遍,也将矩阵键盘的汇编实验认真的读了一遍,终于知道了如何来写这一段程序。
21、熬夜加班将他写了出来,第二天仿真一次成功。5控制程序的修改刚开始预习的实验程序,用的是单四拍的方式控制的步进电机,电机加速过程正会出现抖动比较严重的现象,后来再看了同学的关于步进电机的学习资料之后,使用了单、双八拍的控制方式,抖动效果少了很多。而且还学习到了用中断来进行控制,这样可以更加的高效实现,程序也更加的简明。 6主程序的修改主程序主要控制电机的不同的运行方式比如加速减速、正转反转、停止运行等。在写三挡不同的速度的时候遇到了问题: 这三挡速度如何在加减速之后得到。于是我用了一个for语句,但是还是一下子就变成了最终的速度。经过一翻思考,我在for语句里加了延时程序,这样终于实现了加减速的
22、功能。7其他的注释开始的程序都是自己根据以前学习C语言留下的习惯,并没有必要的注释。经过学习之后,我知道了对于一个程序而言一定要有必要的注释,这样使得程序更加的清晰明了。不仅自己看的方便,而且别人看了也是十易懂。十:各元件的作用1:8031,是最常见的mcs51系列单片机,是inter公司早期的成熟的单片机产品。在这次课设中用来扫描矩阵键盘,并分析信息来控制步进电机。2:ULN2003是大电流驱动阵列,1、2、3、4、5、6、7、8为输入对应的是18、17、16、15、14、13、12、11是集电极开路的输出,9脚接0V,10脚接正电源。5V电压可以工作,最大吸纳电流500mmA。这次课设用来驱动步进电机。3:74LS245是常用的芯片,它是8路同相三态双向总线收发器,可双向传输数据。此次课设中用来驱动矩阵键盘,接收矩阵键盘的行电平信息,并传送给单片机的0X08001单元中。4:74ls374是八D触发器(三态)。一个封装有八个D触发器供选用,置数全并行存取,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 武汉市德才中学招聘初中教师3人考试参考试题及答案解析
- 2025贵州六盘水市水城区教育局银龄讲学计划教师招募50人备考考试题库附答案解析
- 2026上海申万宏源集团及证券秋季校园招聘备考考试题库附答案解析
- 成都市盐道街小学得胜分校公开招聘员额教师备考考试题库附答案解析
- 2025中国建筑一局(集团)有限公司基础设施分院水利设计岗招聘1人备考练习试题及答案解析
- 2025年蚌埠八中编外临聘教师招聘(第六批)备考考试题库附答案解析
- 掌握大学生活
- 防疫科普知识宣传
- 工厂安全培训心得课件
- 咨询服务供应链绿色化-洞察及研究
- 医院装修项目中的安全措施与难点处理
- 销售合规风险管理制度
- 药房员工销售培训
- 警校联动方案
- 让剪影动起来(教学设计)-2024-2025学年人教版(2012)美术六年级上册
- MBA硕士论文案例研究范文分享
- 五轴联动加工中心操作与基础编程 第2版 课件 1.1.1多轴机床与多轴加工类别
- 10 ai ei ui 教学设计-2024-2025学年语文一年级上册统编版
- 体育单招核心-1700-单词
- 《医院感染控制与医护人员个人防护》课件
- 2024六年级英语上册 Unit 2 Ways to go to school课时2 Let's learn-Write and say说课稿 人教PEP
评论
0/150
提交评论