重庆理工大学毕业设计 三相步进电机驱动电源软件设计
4.3键盘设计
在本设计中外部按键所实现的功能是对单片机输入指令,对步进电机的运行步数和运行速度进行给定,同时包括电机的正反转控制,所以采用4×4的矩阵键盘。在具体的端口连接上,行端口分别接 P1.0~P1.3,列端口分别接到P1.4~P1.7键盘具体的按键设置如下表格: *号键是方向切换 #号键是启动/停止键 A 是设定转速功能,按 下后直接输入数字。 B是设定圈数功能键,按
1 4 7 2 5 8 3 6 9 A B C * 0 # D 下后直接输入数字。 C键是退出调整键
在程序设计中按键的扫描设计流程图如下: 有键按下 判断行有无按下 是 行输入低电平,列输入高电平 是 行输出高电平,列输出低电平 延时 否 第二次读取行值 判断是否只有一列按下 否 判断两次行读取值是否相同 是 21
否 否 返回 0 否 判断两次行读取值是否相同 返回0 第一次读取行值 返回0 返回0 是 根据行列值计算出键值 图4-3 按键扫描设计流程图 重庆理工大学毕业设计 三相步进电机驱动电源软件设计
在键盘的设定中,加入了延时防抖动的子程序,还有防止同时按到两个键的错误输入,能有效的提高指令的精确度。在本设计中P1口外接4×4按键, 常用的读出键值的方法有“查表法”和“反转法”。查表法的程序最为简短,但是稍多占用一点存储空间;反转法的程序执行速度最快,只是要求接口是双向的。 下面给出键盘扫描的子程序。 uchar Key_Tab(void) {
uchar code K_Tab[4][4] = {0xee, 0xde, 0xbe, 0x7e, 0xed, 0xdd, 0xbd, 0x7d, 0xeb, 0xdb, 0xbb, 0x7b, 0xe7, 0xd7, 0xb7, 0x77}; uchar temp1 = 0xfe, temp2, i, j;
for(i = 0; i < 4; i++) { //扫描低四位 P1 = temp1; //输出一行0 temp2 = P1; //马上就读入 if((temp2 & 0xf0) != 0xf0) { //如果有键按下 for(j = 0; j < 4; j++) //就扫描高四位 if(temp2 == K_Tab[i][j]) //查表
return i * 4 + j; //查到了就返回按键的数值 }
else temp1 = _crol_(temp1, 1); }
return 16;
从上面流程图可以知道步数的设定和速度的设定是分步进行,接通电源后,先输入电机的运行步数,确认后输入预定的转动频率。再对电机的工作方式进行选择,是正转还是反转。从而达到对电机的控制。
4.4 LCD显示模块
在本设计中采用的LCD型号是1602,能分两行显示步进电机的运行状态。第一行显示键盘输入的步数,第二行显示电机的速度。下面具体说明1602的引脚连接。Rs接P2.0口,做寄存器选择,当输入为低电平的时候作为指令寄存器,
22
重庆理工大学毕业设计 三相步进电机驱动电源软件设计
当输入为高电平的时候为数据寄存器。RW接P2.1,为读写信号。E端接P2.2,为使能端。D0--D7分别按顺序连接到P1.0—P1.7IO口,做数据线。 LCD初始化及显示判断程序
在具体程序设计中,我们首先要对LCD进行初始化设置,并对LCD初始化函数进行定义,同时,还需要对编制LCD的显示判断程序,如:判断忙子程序、写数据代码子程序、写指令代码子程序、开显示子程序。
4.4.1 LCD初始化函数定义主程序
void iniLCD(void)//初始化 {CS2=1;CSl=1 wcode(0x38);
wcode(0x0f);//开显示设置
wcode(0xc0);//设置显示启动为第一行 wcode(0x01);//清屏
wcode(0x06);/画面不动,光标右移 }
4.4.2 LCD判断忙子程序
void chkbusy(void)//测LCD忙状态 {
E=1;//使能LCD RS=0;//读写指令 RW=1;//读
P2=0xff;//读操作前先进行一次空读操作,接下来能读到数据 while(! Busy);//等待,不忙退出 }
23
重庆理工大学毕业设计 三相步进电机驱动电源软件设计
4.4.3 LCD写指令代码子程序
void wcode(uc cd)//写指令代码 {
chkbusy();//写等待 P2=0xff RW=0;//读禁止 RS=0;//输出设置 P2=cd;//写数据代码 E=1;//以下两句产生下降沿
E=0; }
4.4.4 LCD写数据代码子程序
void wdata(uc dat)//写显示数据 {
chkbusy();//写等待 P2=Oxff; RW=0; //读禁止 RS=1: //输出设置 P2=dat;//写数据代码 E=1;//以下两句产生下降沿 E=0; }
4.4.5 LCD开显示子程序
void disrow(uc page,uc col,uc *temp)
24