控制步进电机LCD显示.docx
《控制步进电机LCD显示.docx》由会员分享,可在线阅读,更多相关《控制步进电机LCD显示.docx(19页珍藏版)》请在冰豆网上搜索。
![控制步进电机LCD显示.docx](https://file1.bdocx.com/fileroot1/2023-3/29/664c46bf-7504-414b-9e34-08b2c85f9c94/664c46bf-7504-414b-9e34-08b2c85f9c941.gif)
控制步进电机LCD显示
2011-2012学年第1学期
学生课程实习报告
环节名称
计算机控制技术课程实习
所属课程
计算机控制技术
学生姓名
冼燎刚
学号
200811631128
所在班级
电气1081
成绩
评语
指导教师签名
一、设计题目:
控制步进电机LCD显示
二、设计要求:
设计一个单片机三相步进电机控制系统,要求系统具有以下功能。
(1)用K0-K2作为通电方式选择键,K0为单三拍,K1为双三拍,K2为三相六拍。
(2)K3-K4作为启动和方向控制。
(3)正转时红色指示灯亮,反转时黄色指示灯亮,不转时绿灯亮。
(4)可通过键盘设定步进电机步数给定值。
(5)用三位LED数码管显示剩余工作步数
三、系统总体框图与原理说明
系统的整体框图
四、硬件电路图
五、程序流程图
六、仿真说明
输入一个三位数
按下DIRECTION选择方向相应的灯会亮
选择不同的工作方式
按下START按钮,倒数开始,电机按剩余步数转动。
倒数完毕,显示OVER,绿灯亮。
七、心得体会
通过自己几天的辛勤努力并查阅诸多资料,终于完成了本次课程设计。
从系统框图到程序,自己逐一完成。
程序虽然很长,但通过分成不同的H文件,有序地把它们分割成几部分。
不仅对于自己,还对查看程序的人有不少的帮助。
设计的思路按照对于仿真的步骤编程。
从按下第一个按键开始,就已经进入到设计者的程序当中。
程序有较强的逻辑性,这些都依赖于平时的练习及老师的教导。
附录:
程序清单
//***************************程序的总体文件*************************//
#include
#include
#include
#include
voidinitial();
uni,motor_step=0,time_control=0;
uckeyscan();
ucloop1[2][4]={{0x01,0x02,0x04,0x08},{0x08,0x04,0x02,0x01}};//ABCD
ucloop2[2][4]={{0x03,0x06,0x0C,0x09},{0x09,0x0C,0x06,0x03}};//ABBCCDDA
ucloop3[2][8]={{0x01,0x03,0x02,0x06,0x04,0x0C,0x08,0x0A},{0x0A,0x08,0x0C,0x04,0x06,0x02,0x03,0x01}};//AABBBCCCDDDA
voidinitial_show();//函数申明
voidclr();
voidwirte_com(uccom);
voidwirte_data(ucdate);
voiddelay(unsignedintz);
voidinput_keycode();
voidoutput_key();
voidcount();
voidswith();
voidtest();
voidmain()//主函数
{
initial();//初始化
initial_show();
clr();
while
(1)
{
input_keycode();
output_key();
TMOD=0x01;//fangshiyi
TL1=0xB0;
TH1=0x3C;
ET0=1;//yunxuTOzhongduan
TR0=1;
EA=1;
while
(1);
}
}
/*************中断服务函数***********/
voidT0_time()interrupt1//
{TL1=0xB0;
TH1=0x3C;
time_control++;
if(a>0)
{
if(time_control==2)
{
swith();}
}
else
{red=1;green=0;yellow=1;
wirte_com(0xc0+10);
for(i=0;i<4;i++)//over
{
wirte_data(table6[i]);
}
}
}
voidcount()
{
t=a/100;
f=a%100/10;
g=a%10;
wirte_com(0xC0+10);//rewritestep
wirte_data(table[t]);
wirte_data(table[f]);
wirte_data(table[g]);
}
voidswith()
{
switch(motor1)
{
case0:
{
if(motor_step<4)
{
P3=loop1[fanzhuan][motor_step];
}
else
{
motor_step=0;
P3=loop1[fanzhuan][motor_step];
}
motor_step++;
break;
}
case1:
{
if(motor_step<4)
{
P3=loop2[fanzhuan][motor_step];
}
else
{
motor_step=0;
P3=loop2[fanzhuan][motor_step];
}
motor_step++;
break;
}
case2:
{
if(motor_step<8)
{
P3=loop3[fanzhuan][motor_step];
}
else
{
motor_step=0;
P3=loop3[fanzhuan][motor_step];
}
motor_step++;
break;
}
}
count();
time_control=0;
a--;//zongbushu
}
///*************************键盘扫描电路********************************//
uctemp,ge,shi,bb,num;
uckeyscan()//键盘扫描子程序
{
while
(1)
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P1;//重新赋值
bb=P1;//保留值
temp=temp&0xf0;//去抖动
if(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xee:
num=0;break;
case0xde:
num=1;break;
case0xbe:
num=2;break;
case0x7e:
num=3;break;
default:
break;
}
while(P1==bb);//等待放手
delay(10);
while(P1==bb);
}
}
P1=0xfd;
temp=P1;
bb=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xed:
num=4;break;
case0xdd:
num=5;break;
case0xbd:
num=6;break;
case0x7d:
num=7;break;
default:
break;
}
while(P1==bb);
delay(10);
while(P1==bb);
}
}
P1=0xfb;
temp=P1;
bb=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xeb:
num=8;break;
case0xdb:
num=9;break;
case0xbb:
num=10;break;
case0x7b:
num=11;break;
default:
break;
}
while(P1==bb);
delay(10);
while(P1==bb);
}
}
P1=0xf7;
temp=P1;
bb=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
delay(10);
temp=P1;
temp=temp&0xf0;
if(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xe7:
num=12;break;
case0xd7:
num=13;break;
case0xb7:
num=14;break;
case0x77:
num=15;break;
default:
break;
}
while(P1==bb);
delay(10);
while(P1==bb);
}
}
if(num!
=99)return(num);
}
}
//********************LCD显示电路*****************************//
#defineucunsignedchar
#defineununsignedint
unsignedinti;
sbitrs=P2^0;//位申明
sbitrw=P2^1;
sbite=P2^2;
uccodetable2[]="designedbyxlg";
uccodetable3[]="setting:
";
uccodetable4[]="remaining:
";
uccodetable5[]="";
uccodetable6[]="over:
";
voidwirte_com(uccom);
voidwirte_data(ucdate);
voiddelay(unz);
voidinitial()//初始化子函数
{
rs=1;
rw=1;
e=1;
wirte_com(0x01);//显示清零
delay(10);
wirte_com(0x38);//16*2显示;5*7点阵;八位数据接口
delay(10);
wirte_com(0x0f);//1开显示,有光标光标闪手(111)
delay(10);
wirte_com(0x06);//000001NS(N=1时右移)(S=0时整屏不移动)
delay(10);
wirte_com(0x80);//初始化指针
delay(10);
}
voidinitial_show()
{
for(i=0;i<16;i++)
{
wirte_data(table2[i]);
}
delay(100);
wirte_com(0x01);
wirte_com(0x80);
for(i=0;i<8;i++)
{
wirte_data(table3[i]);
}
wirte_com(0xC0);
for(i=0;i<10;i++)
{
wirte_data(table4[i]);
}
}
voidclr()
{
wirte_com(0x80+10);
for(i=0;i<3;i++)
{
wirte_data(table5[i]);
}
wirte_com(0x80+10);
}
voidwirte_com(uccom)//液晶写指令
{
P0=com;
rs=0;
rw=0;
e=0;//上升沿
delay(10);
e=1;
}
voidwirte_data(ucdate)//液晶写数据
{
P0=date;
rs=1;
rw=0;
e=0;//上升沿
delay(100);
e=1;
}
voiddelay(unz)//延时子程序
{
unx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//**********************键盘电路读取**********************************//
sbitstart=P2^3;
sbitred=P2^4;
sbitgreen=P2^5;
sbityellow=P2^6;
una,b,c,d,t,f,g,fanzhuan=1,motor1=0,output_type;
uccodetable[]="0123456789ABCDEF";//定义表格
voidinput_keycode()
{
num=99;
keyscan();
while(table[num]!
='A')
{
while(table[num]>='0'&&table[num]<='9')
{
wirte_com(0x80+10);
t=table[num];
wirte_data(t);//bai位数abctfg
a=table[num]-48;
num=99;//shi位数
keyscan();
b=table[num]-48;
a=a*10+b;
f=table[num];
wirte_data(f);
num=99;//ge位数输入的数据存在A
keyscan();
c=table[num]-48;
a=a*10+c;
g=table[num];
wirte_data(g);
wirte_com(0x0c);
wirte_com(0x80+10);
num=99;
keyscan();
}
while(table[num]=='C')
{
wirte_com(0x80+15);
if(fanzhuan==1)
{
fanzhuan=0;
wirte_data('a');
red=0;green=1;yellow=1;
}
else
{
fanzhuan=1;
wirte_data('b');
red=1;green=1;yellow=0;
}
wirte_com(0x80+15);
num=99;
keyscan();}
while(table[num]=='D'||table[num]=='E'||table[num]=='F')
{
switch(table[num])
{
case'D':
{
motor1=0;
wirte_com(0xC0+15);
wirte_data('1');//类型a/b
wirte_com(0xC0+15);
break;
}
case'E':
{motor1=1;
wirte_com(0xC0+15);
wirte_data('2');//类型a/b
wirte_com(0xC0+15);
break;}
case'F':
{motor1=2;
wirte_com(0xC0+15);
wirte_data('3');//类型a/b
wirte_com(0xC0+15);
break;}
}
num=99;
keyscan();
}
if(table[num]=='B')
{clr();
num=99;
keyscan();
}
}
}
voidoutput_key()
{wirte_com(0xC0+10);
wirte_data(t);
wirte_data(f);
wirte_data(g);
wirte_com(0xC0+10);
}