步进电机实验报告

时间:2024.4.20

 

单片机实验

           课程名称:步进电机表实验

授课班级:20##级自动化三班

任课教师:文远熔

计划学时:32学时

实验组员:张藤耀   赵福亮  王聪慧

         秦菱蔚   梁钦     郑欢       

       


   

摘要…………………………………………………………………………

第一章             概述………………………………………………………………………………………….

1.1实验目的…………………………………………………………………………

   1.2实验要求…………………………………………………………………………

1.3步进电机的介绍……………………………………………………………………

1.4 研究思路…………………………………………………………………………

第二章  硬件设计…………………………………………………………..

   2.1 51单片机介绍……………………………………………………………………

   2.2 UIN2003A……………………………………………………………………………

2.3 ZLG7290……………………………………………………………………………

  2.3.1 7290工作原理…………………………………………………………………

  2.3.2 7290引脚图……………………………………………………………………

第三章相关图像……………………………………………………………….

   3.1 总电路图………………………………………………………………………

   3.2 7290控制数码管………………………………………………………………………

   3.3 程序流程图…………………………………………………………………………

     3.3.1 控制框图…………………………………………………………………………

     3.3.2 流程图…………………………………………………………………………

第四章调试………………………………………………………………………

第五章心得体会…………………………………………………………………

  

附录【一】系统程序……………………………………………………………

附录【二】参考文献…………………………………………………………….
【摘要】:

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

本课程设计的内容是利用51单片机,达到控制步进电机的启动、停止、正转、反转、点动和状态显示的目的,使步进电机控制更加灵活。步进电机驱动芯片采用UIN2003,具有大电流、高电压,外电路简单等优点。利用四位数码管(ZLG7290)增设电机状态显示功能,各项数据更直观。实测结果表明,该控制系统达到了设计的要求。

【关键词】:单片机 步进电机 UIN2003 ZLG7290 数码管

第一章 概述

1.1实验目的

1、单片机对步进电机控制可以熟悉步进电机的原理和应用。

2、单片机对步进电机控制可以熟悉单哦就功能已经原理、构造。

3、通过这次实验能运用所学基本理论知识、专业技能来对问题进行分析,思考,解决,提高对专业知识的掌握以及锻炼逻辑思维能力。

1.2实验要求

实现步进电机按规定的速度正转、反转,转过指定的角度,要有点动功能。所有命令通过键盘输入,步进电机在运行过程中要有状态和数据指示。

1.3步进电机的介绍

  步进电机是一种感应电机,它的工作原理是利用电子电路,将直流电变成分时供电的,多相时序控制电流,用这种电流为步进电机供电,步进电机才能正常工作,驱动器就是为步进电机分时供电的,多相时序控制器

  虽然步进电机已被广泛地应用,但步进电机并不能像普通的直流电机,交流电机 在常规下使用。它必须由双环形脉冲信号、功率 驱动电路等组成控制系统方可使用。因此用好步进 电机 却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。

  步进电机作为 执行元件 ,是机电一体化的关键产品之一,广泛应用在各种自动化控制系统中。随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。

步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(即步进角)。您可以通过控制脉冲个数来控制角位移量,从而达到准确定位的 目的 ;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

图1 步进电机剖面图

1.4研究思路

1、了解单片机本身内部应有的资源,如:中断、定时器、计数器、I\O的使用。

2、了解步进电机的工作原理和作用。

3、根据步进电机的原理,分析并分配单片机内部资源,并根据单片机的资源,来实现硬件电路的设计以及软件程序的编写。

4.、对于自己不熟悉的东西,查阅资料。

5、在设计好单片机步进电机时,要学会分析电路中出现的问题,并好好总结。

第二章  硬件设计

2.1 单片机的简介

单片机是续计算机出现之后,并随着电器时代大到来,人们借助电气技术想实现了自动控制机械,自动生 产线甚至自动工厂,但依靠计算机去完成每一个自动的过程,反而有些复杂以及资源的乱费;所以用更方便,更微小,更智能的微型处理器来处理工业现场的测控领域,控制领域,有着重大意义;更何况目前,彩电,冰箱,空调,录像机,VCD,遥 控器,游戏机,电饭煲等无处不见单片机的影子,所以单片机将会更满足我们的生活,会更取代大型的计算机。

现在单片机主要按用途,大体上可分为两大类: 1--通用型单片机 2--专用型单片机

专用型单片机是指用途比较专一,出厂时程序已经一次性固化好, 不能再修该的单片机。例如电子表里的单片机就是其中的一种。 其生产成本很低。
    通用型单片机的用途很广泛,使用不同的接口电路及编制不同的应 用程序就可完成不同的功能。小到家用电器仪器仪表,大到机器设 备和整套生产线都可用单片机来实现自动化控制。
2.2 UIN2003

本文选用ULN2003构成步进电机的驱动电路,下面但见介绍下ULN2003的结构和特点:

ULN2003 是高耐压、大电流达林顿陈列,由七个硅NPN 达林顿管组成。

该电路的特点如下:

ULN2003 的每一对达林顿都串联一个2.7K 的基极电阻,在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。

ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V 的电压,输出还可以在高负载电流并行运行。

ULN2003方框图如图2所示。

3ca596c8e7544f0984c7fc121f697f07#	#嵌入式对象1

图2 ULN2003内部方框图

利用ULN2003以及AT89C54RD设计的步进电机驱动电路如图3所示。

2.3 ZLG7290

2.3.1 7290工作原理

ZLG7290的核心是一块ZLG7290B芯片,它采用I2C接口,能直接驱动8位共阴式数码管,同时可扫描管理多达64只按键,实现人机对话的功能资源十分丰富。除具有自动消除抖动功能外,它还具有段闪烁、段点亮、段熄灭、功能键、连击键计数等强大功能,并可提供10种数字和21种字母的译码显示功能,用户可以直接向显示缓存写入显示数据,而且无需外接元件即可直接驱动数码管,还可扩展驱动电压和电流。此外,ZLG7290B的电路简单,使用也很方便。用户按下某个键时,ZLG7290的INT引脚会产生一个低电平的中断请求信号,读取键值后,中断信号就会自动撤销。正常情况下,微控制器只需要判断INT引脚就可以得到键盘输入的信息。微控制器可通过两种方式得到用户的键盘输入信息。其一是中断方式,该方式的优点是抗干扰能力强,缺点是要占用微控制器的一个外部中断源。其二是查询方式,即通过不断查询INT引脚来判断是否有键按下,该方式可以节省微控制器的一根I/O口线,但是代价是I2C总线处于频繁的活动状态,消耗电流多并且不利于抗干扰。

2.3.2 7290引脚图

        

3 7290引脚图

第三章相关图像

3.1 总体电路图

3.2 7290控制数码管

3.3 程序流程图

3.3.1控制框图

3.3.2 流程图

第四章 调试   

1、 按照实验原理图连接好电路图。

2、 根据原理图编写程序。

3、 电路上电,调试程序,观察并控制电机使其按照预期的行为工作。

4、 当电机可以通过按键控制其正转加减速、反转加减速程序、点动后,调试结束。

5、 优化程序,整理实验结果。   

     总的来说,过程比较顺利,只是粗心之下,连线出现了错误,对于此,我进行了深刻的自我检讨和批评。在经过老师的知道后,我们终于实现了实验要求的功能,能实现正反转,快慢变化及点动等。

第五章 收获体会

首先是关于课题的选择,开始是准备做一个万年历,经过查看资料后发现计算机的过程实现比较的复杂,而这次的课程设计时间比较短,故放弃了这个想法。经过各种筛选,最后决定做步进电机的相关设计,起初看着指导书上的内容觉得实现步进电机是比较的简单的,但当我真正开始设计之后才发现并没有想像中那么的简单。

这学期的微机课和单片机课没怎么学好,故感觉在做这个设计时有点困难,比如汇编程序。后来决定用c来编写程序,这样稍微轻松点,在设计程序中涉及到了中断程序的编写,发现已学的理论知识完全用不上来,也许这就是理论脱离时间的结果,在期间恶补了单片机的中断知识及其相应的程序编写。

通过这次课程设计实验,我对步进电机调速控制系统有了实际的了解和认识,提高了动手能力。本次实验把书本上、课堂上学到的知识灵活地运用到实际的实物上,感觉是对学以致用的一种锻炼和考验提高了用所学知识解决实际问题的能力,加深和巩固的对知识的理解和掌握。控制电路、驱动电路、测速反馈电路、步进电机几个模块的整合,也实际中提高了自己对系统的认识,有了些整体的概念和思维观。 实验是团队合作完成的,从设计电路到设计软件,然后仿真到做硬件做出符合要求的控制系统,不仅从实际中锻炼了动手能力而且学会了团队合作,互相学习,提高自己。

这次的课程设计总的感觉就是很累,但在不断的学习机实践当中学到了很多东西,知识的提高那是最基础的,中断,电路工作及相关的知识都是得到了提升;然后就是个人处理问题能力的提高,虽然说这次的设计不算一个大的项目,但也算是小的雏形,课题的选择,前期的准备,理论的实践,知识的提高,处理实际问题及后期的总结归纳。

付出去收获往往是成正比的,这次的课程设计中得到了充分的体现。

总的来说,这次设计的步进电机控制电路还是比较成功的在设计中遇到了很多问题,最后在自己的思考下,宿舍大家一起经过激烈的探讨下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的。不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识。同时,对未来有了更多的信心。最后,对文老师表示忠心的感谢,老师,你辛苦了。


附录【一】系统程序

主程序:

/************************************************************************

                   基于51单片机的异步电机控制程序

************************************************************************/

#include<reg51.h>

#include "VIIC_C51.H"

#include "ZLG7290.h"

#define uchar unsigned char

#define uint unsigned int

/*四相步进电动机单、双八拍运行状态表

11111110     0FEH    A

11111100     0FCH    AB

11111101     0FDH    B

11111001     0F9H     BC

11111011     0FBH    C

11110011     0F3H     CD

11110111     0F7H     D

11110110     0F6H     DA

*/

sbit PA=P1^0;  //P1控制电机

sbit PB=P1^1;

sbit PC=P1^2;

sbit PD=P1^3;

sbit RST=P1^4;

sbit KEY_INT=P3^2; //看是否更改为P3^2

sbit SCL=P1^6;

sbit SDA=P1^7;

uchar code step_tab[9]={0xff,0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6};

uint code delaytime[4] = {60,40,20,10};//延时时间列表

//变量的定义

uchar direction;          //状态变量   0-正向,1-反向

uchar continuous;           //状态变量  0-指定步数运行,1-连续速度运行

uchar run;                 //状态变量       0-电机未运行,1-电机运行中

uchar speed_num;          //连续速度运行标号1-4

uchar cur_step;            //八拍运行状态

uchar step_num;          //指定运行的步数,范围0-99

//键值定义

#define Key_dir  1         //方向键

#define Key_Run      2         //启动键

#define Key_stop 3       //停止键

#define Ket_Step 4        //单步运行键

#define Key_step_add 5  //步数加键

#define Key_step_sub 6   //步数减键

#define Key_speed_add 7       //速度加键

#define Key_speed_sub 8 //速度减键

#define Key_Con_Set      9     //连续运行与指定步数运行切换键。

//定义键盘中断标志,FlagINT0=1 表示有键按下

volatile bit FlagINT0 = 0;

void KeyProsess( uchar key );

/************************************************************************

函数:INT0_SVC()

功能:ZLG7290 键盘中断服务程序

说明:中断触发方式选择负边沿触发,因此不必等待中断请求信号恢复为高电平

************************************************************************/

void INT0_SVC() interrupt 0

{

       unsigned char KeyValue;

       //读取键值

       KeyValue=ZLG7290_GetKey();

       //处理键值

       KeyProsess(KeyValue);

}

/************************************************************************

函数:Delay()

功能:定时器实现延时tms

************************************************************************/

void Delay(unsigned int t)

{

       do

       {     //TH=64536

              TH1 = 0xFC;

              TL1 = 0x18;

              TR1 = 1;           //启动定时器T1并等待中断

              while ( !TF1 );

              TF1 = 0;     //中断请求标致清零

              TR1 = 0;           //停止T1定时器

       } while (--t);

}

/************************************************************************

函数:DispDir()

功能:显示方向子程序

说明:dat  0  正向,1反向

************************************************************************/

void DispDir(uchar dat)

{

       if(dat == 0)

       {

              ZLG7290_SendCmd(0x60+7,0x0f); //"F" 表示正转

       }

       else

       {

              ZLG7290_SendCmd(0x60+7,0x0b);  //"B"表示反转

       }

}

/************************************************************************

函数:DispSpeed()

功能:显示速度号子程序

说明:dat  1~4   代表四种不同的速度

************************************************************************/

void DispSpeed(uchar dat)

{

       ZLG7290_SendCmd(0x60+5,dat);

}

/************************************************************************

函数:DispStepNum()

功能:显示运行步数号程序

说明:间接实现转过指定角度=步距角*步数

************************************************************************/

void DispStepNum(uchar dat)

{

       unsigned char d;

       d = dat / 10;

       ZLG7290_SendCmd(0x60+1,d);

       d = dat - d * 10;

       ZLG7290_SendCmd(0x60+0,d);

}

/************************************************************************

函数:DispContinuous()

功能:显示运行状态,连续还是指定步数

说明:0-指定步数运行,1-连续速度运行

************************************************************************/

void DispContinuous(uchar dat)

{

       if(dat == 0)

       {

              ZLG7290_SendCmd(0x60+3,0x0d); //'d'表示指定步数运行状态

       }

       else

       {

              ZLG7290_SendCmd(0x60+3,0x0c); //'C'表示连续速度运行

       }

}

/************************************************************************

函数:OnStep()

功能:实现单步运行

************************************************************************/

void OneStep()

{

       if(direction == 0)

       {//正向

              if(cur_step == 8)

              {

                     cur_step = 1;

              }else

              {

                     cur_step ++;

              }

              P1 = step_tab[cur_step]; //输出

       }

       else

       {

              if(cur_step <= 1)

              {

                     cur_step = 8;

              }else

              {

                     cur_step --;

              }

              P1 = step_tab[cur_step]; //输出

       }

}

/***************************************************************************

函数:OnContinue()

功能:连续运行

***************************************************************************/

void OnContinue()

{

       if(continuous != 0)

       {//连续运行

              while(run!=0)

              {

                     OneStep();

                     Delay(delaytime[speed_num-1]);//延迟 目的改变转速

              }

       }

       else

       {//指定步数运行

              if(step_num != 0)

              {

                     OneStep();

                     Delay(50);             //50ms 延迟

                     step_num--;

                     DispStepNum(step_num); //更新显示步数 即显示剩下没有执行的步数

                     if(run == 0) return;   //若停止键按下,则停止

              }

              else

              {

                     run = 0;  //停止

                     return;

              }

       }

}

/****************************************************************************

函数:KeyProsess()

功能:键值处理程序

****************************************************************************/

void KeyProsess( uchar key )

{

       switch(key)

       {

       case Key_dir       :      //方向键

              if(run==0)

              {

                     if(direction == 0)

                            direction =1;

                     else

                            direction = 0;

                     DispDir(direction);

              }

              break;

       case Key_Run     :      //启动键

              if(run ==0)

              {

                     run =1;

              }

              break;

       case Key_stop:    //停止键

              if(run !=0)

              {

                     run =0;

              }

              break;

       case Ket_Step:    //单步运行键 实现点动功能

              if(run ==0)

              {

                     run =1;

                     OneStep();

                     run =0;

              }

              break;

       case Key_step_add:   //步数加键   n=(步距角*60)/(360*t*0.001) 单位r/min

              if(run ==0)

              {

                     if(step_num == 99)

                     {

                            step_num = 0;

                     }else

                     {

                            step_num ++;

                     }

                     DispStepNum(step_num);

              }

              break;

       case Key_step_sub:    //步数减键

              if(run ==0)

              {

                     if(step_num == 0)

                     {

                            step_num = 99;

                     }else

                     {

                            step_num --;

                     }

                     DispStepNum(step_num);

              }

              break;

       case Key_speed_add:       //速度加键

              if(run ==0)

              {

                     if(speed_num == 4)

                     {

                            speed_num = 1;

                     }else

                     {

                            speed_num ++;

                     }

                     DispSpeed(speed_num);

              }

              break;

       case Key_speed_sub: //速度减键

              if(run ==0)

              {

                     if(speed_num == 1)

                     {

                            speed_num = 4;

                     }else

                     {

                            speed_num --;

                     }

                     DispSpeed(speed_num);

              }

              break;

       case Key_Con_Set     :      //连续运行与指定步数运行切换键。

              if(run ==0)

              {

                     if(continuous == 0)

                     {

                            continuous = 1;

                     }else

                     {

                            continuous = 0;

                     }

                     DispContinuous(continuous);

              }

              break;

              default:

              break;

       }

}

/**********************************************************************************

函数:SystemInit()

功能:系统初始化

**********************************************************************************/

void SystemInit()

{     //初始化单片机

       TMOD = 0x11;   //定时器设置,T0,T1方式1:16位定时器

       Delay(300);        //延时300ms等待ZLG7290 复位完毕

       EA = 0;

       IT0 = 1;        //INT0,负边沿触发中断

       EX0 = 1;        //允许外部中断INT0

       FlagINT0 =0;

       EA = 1;

       //初始化步进电机控制器

       direction = 0;       //状态变量   0-正向,1-反向

       continuous =0;    //状态变量   0-指定步数运行,1-连续速度运行

       run = 1;  //     状态变量     0-电机未运行,1-电机运行中

       speed_num =1;    //            连续速度运行标号1-4

       cur_step =0; //            八拍运行状态

       step_num = 0;     //            指定运行的步数,范围0-99

       DispContinuous(continuous);

       DispStepNum( step_num);

       DispSpeed(speed_num );

       DispDir(direction );

       P1 = step_tab[cur_step]; //输出

}

/*********************************************************************************

                                主函数main()

**********************************************************************************/

void main(void)

{

       SystemInit(); //系统初始化

       while(1)      //循环检测按键状态

       {

              if(run ==1)

              {

                     OnContinue();

              }

       }

}

库函数程序:

/********************************************************************

                       VIIC_C51.C

  此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据

及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的

与用户程序连接并扩展..... 

 

    注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作

一定的修改....(本例是1us机器周期,即晶振频率要小于12MHZ)

********************************************************************/

 

 

             

#include <reg52.h>          /*头文件的包含*/

#include <intrins.h>

#define  uchar unsigned char /*宏定义*/

#define  uint  unsigned int

#define  _Nop()  _nop_()        /*定义空指令*/

/* 常,变量定义区 */

                                                 /*端口位定义*/

sbit SDA=P1^7;            /*模拟I2C数据传送位*/

sbit SCL=P1^6;            /*模拟I2C时钟控制位*/

                                                 /*状态标志*/

bit ack;           /*应答标志位*/

  

/*******************************************************************

                     起动总线函数              

函数原型: void  Start_I2c(); 

功能:       启动I2C总线,即发送I2C起始条件.

 

********************************************************************/

void Start_I2c()

{

  SDA=1;   /*发送起始条件的数据信号*/

  _Nop();

  SCL=1;

  _Nop();    /*起始条件建立时间大于4.7us,延时*/

  _Nop();

  _Nop();

  _Nop();

  _Nop();   

  SDA=0;   /*发送起始信号*/

  _Nop();    /* 起始条件锁定时间大于4μs*/

  _Nop();

  _Nop();

  _Nop();

  _Nop();      

  SCL=0;   /*钳住I2C总线,准备发送或接收数据 */

  _Nop();

  _Nop();

}

/*******************************************************************

                      结束总线函数              

函数原型: void  Stop_I2c(); 

功能:       结束I2C总线,即发送I2C结束条件.

 

********************************************************************/

void Stop_I2c()

{

  SDA=0;  /*发送结束条件的数据信号*/

  _Nop();   /*发送结束条件的时钟信号*/

  SCL=1;  /*结束条件建立时间大于4μs*/

  _Nop();

  _Nop();

  _Nop();

  _Nop();

  _Nop();

  SDA=1;  /*发送I2C总线结束信号*/

  _Nop();

  _Nop();

  _Nop();

  _Nop();

}

/*******************************************************************

                 字节数据传送函数              

函数原型: void  SendByte(uchar c);

功能:  将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对

     此状态位进行操作.(不应答或非应答都使ack=0 假)    

     发送数据正常,ack=1; ack=0表示被控器无应答或损坏。

********************************************************************/

void  SendByte(uchar c)

{

 uchar BitCnt;

 for(BitCnt=0;BitCnt<8;BitCnt++)  /*要传送的数据长度为8位*/

    {

     if((c<<BitCnt)&0x80)SDA=1;   /*判断发送位*/

       else  SDA=0;               

     _Nop();

     SCL=1;               /*置时钟线为高,通知被控器开始接收数据位*/

      _Nop();

      _Nop();               /*保证时钟高电平周期大于4μs*/

      _Nop();

      _Nop();

      _Nop();        

     SCL=0;

    }

   

    _Nop();

    _Nop();

    SDA=1;               /*8位发送完后释放数据线,准备接收应答位*/

    _Nop();

    _Nop();  

    SCL=1;

    _Nop();

    _Nop();

    _Nop();

    if(SDA==1)ack=0;    

       else ack=1;        /*判断是否接收到应答信号*/

    SCL=0;

    _Nop();

    _Nop();

}

/*******************************************************************

                 字节数据传送函数              

函数原型: uchar  RcvByte();

功能:  用来接收从器件传来的数据,并判断总线错误(不发应答信号),

     发完后请用应答函数。 

********************************************************************/  

uchar  RcvByte()

{

  uchar retc;

  uchar BitCnt;

 

  retc=0;

  SDA=1;             /*置数据线为输入方式*/

  for(BitCnt=0;BitCnt<8;BitCnt++)

      {

        _Nop();          

        SCL=0;       /*置时钟线为低,准备接收数据位*/

        _Nop();

        _Nop();         /*时钟低电平周期大于4.7μs*/

        _Nop();

        _Nop();

        _Nop();

        SCL=1;       /*置时钟线为高使数据线上数据有效*/

        _Nop();

        _Nop();

        retc=retc<<1;

        if(SDA==1)retc=retc+1; /*读数据位,接收的数据位放入retc中 */

        _Nop();

        _Nop();

      }

  SCL=0;   

  _Nop();

  _Nop();

  return(retc);

}

/********************************************************************

                     应答子函数

原型:  void Ack_I2c(bit a);

功能:主控器进行应答信号,(可以是应答或非应答信号)

********************************************************************/

void Ack_I2c(bit a)

{

 

  if(a==0)SDA=0;     /*在此发出应答或非应答信号 */

        else SDA=1;

  _Nop();

  _Nop();

  _Nop();     

  SCL=1;

    _Nop();

    _Nop();              /*时钟低电平周期大于4μs*/

    _Nop();

    _Nop();

    _Nop(); 

 SCL=0;                /*清时钟线,钳住I2C总线以便继续接收*/

    _Nop();

    _Nop();   

}

/*******************************************************************

                    向无子地址器件发送字节数据函数              

函数原型: bit  ISendByte(uchar sla,ucahr c); 

功能:     从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla.

           如果返回1表示操作成功,否则操作有误。

注意:    使用前必须已结束总线。

********************************************************************/

bit ISendByte(uchar sla,uchar c)

{

   Start_I2c();               /*启动总线*/

   SendByte(sla);            /*发送器件地址*/

     if(ack==0)return(0);

   SendByte(c);               /*发送数据*/

     if(ack==0)return(0);

  Stop_I2c();                 /*结束总线*/

  return(1);

}

/*******************************************************************

                    向有子地址器件发送多字节数据函数              

函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 

功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件

          地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。

           如果返回1表示操作成功,否则操作有误。

注意:    使用前必须已结束总线。

********************************************************************/

bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)

{

   uchar i;

   Start_I2c();               /*启动总线*/

   SendByte(sla);            /*发送器件地址*/

     if(ack==0)return(0);

   SendByte(suba);            /*发送器件子地址*/

     if(ack==0)return(0);

   for(i=0;i<no;i++)

    {  

     SendByte(*s);               /*发送数据*/

       if(ack==0)return(0);

     s++;

    }

 Stop_I2c();                 /*结束总线*/

  return(1);

}

/*******************************************************************

                    向无子地址器件读字节数据函数              

函数原型: bit  IRcvByte(uchar sla,ucahr *c); 

功能:     从启动总线到发送地址,读数据,结束总线的全过程,从器件地

          址sla,返回值在c.

           如果返回1表示操作成功,否则操作有误。

注意:    使用前必须已结束总线。

********************************************************************/

bit IRcvByte(uchar sla,uchar *c)

{

   Start_I2c();                /*启动总线*/

   SendByte(sla+1);           /*发送器件地址*/

     if(ack==0)return(0);

   *c=RcvByte();               /*读取数据*/

     Ack_I2c(1);               /*发送非就答位*/

  Stop_I2c();                  /*结束总线*/

  return(1);

}

/*******************************************************************

                    向有子地址器件读取多字节数据函数              

函数原型: bit  ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 

功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件

          地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。

           如果返回1表示操作成功,否则操作有误。

注意:    使用前必须已结束总线。

********************************************************************/

bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)

{

   uchar i;

   Start_I2c();               /*启动总线*/

   SendByte(sla);            /*发送器件地址*/

     if(ack==0)return(0);

   SendByte(suba);            /*发送器件子地址*/

     if(ack==0)return(0);

   Start_I2c();

   SendByte(sla+1);

      if(ack==0)return(0);

   for(i=0;i<no-1;i++)

    {  

     *s=RcvByte();               /*发送数据*/

      Ack_I2c(0);                /*发送就答位*/ 

     s++;

    }

   *s=RcvByte();

    Ack_I2c(1);                 /*发送非应位*/

 Stop_I2c();                    /*结束总线*/

  return(1);

}

                        /*    完毕      */

7290控制数码管程序:

/****************************************Copyright (c)**************************************************

**                               广州周立功单片机发展有限公司

**                                     研    究    所

**                                        产品一部

**

**                                 http://www.zlgmcu.com

**

**--------------文件信息--------------------------------------------------------------------------------

**文   件   名: ZLG7290.C

**创   建   人: 叶皓贲

**最后修改日期:  20##-3-4

**描        述: ZLG7290库函数程序

**

**--------------历史版本信息----------------------------------------------------------------------------

** 创建人: 叶皓贲

** 版  本: 0.01

** 日 期: 20##-3-4

** 描 述: ZLG7290库函数程序

**

**------------------------------------------------------------------------------------------------------

** 修改人:

** 版  本:

** 日 期:

** 描 述:

**

**--------------当前版本修订------------------------------------------------------------------------------

** 修改人:

** 日 期:

** 描 述:

**

**------------------------------------------------------------------------------------------------------

********************************************************************************************************/

#include "REG52.h"

#include "viic_c51.h"

#define zlg7290 0x70 //ZLG7290的IIC地址

#define SubKey  0x01

#define SubCmdBuf 0x07

#define SubDpRam 0x10

/*********************************************************************************************************

** 函数名称:    DelayNS

** 功能描述:    长软件延时

** 输 入: i :     延时参数,值越大时延时越久

**        

** 输 出: 无

** 全局变量:     无

** 调用模块:    无

**

** 作 者: 叶皓贲

** 日 期: 20##-3-4

**-------------------------------------------------------------------------------------------------------

** 修改人:

** 日 期:

**------------------------------------------------------------------------------------------------------

********************************************************************************************************/

void delayMS(unsigned char i)

{

       unsigned char j,k;

       for(k=0;k<i;k++)

              for(j=0;j<60;j++);

}

/*********************************************************************************************************

** 函数名称:    ZLG7290_SendData

** 功能描述:    发送数据

** 输 入:SubAdd : 输入数据

**       DATA     :      输入值

**        

** 输 出: 0 : Fail

**        1 :  OK

** 全局变量:     无

** 调用模块:    delayMS

**

** 作 者: 叶皓贲

** 日 期: 20##-3-4

**-------------------------------------------------------------------------------------------------------

** 修改人:

** 日 期:

**------------------------------------------------------------------------------------------------------

********************************************************************************************************/

unsigned char ZLG7290_SendData(unsigned char SubAdd,unsigned char Data)

{

       if(SubAdd>0x17)

              return 0;

       ISendStr(zlg7290,SubAdd,&Data,1);

       delayMS(10);

       return 1;

}

/*********************************************************************************************************

** 函数名称:    ZLG7290_SendCmd

** 功能描述:    发送命令(对子地址7、8)

** 输 入:DATA1  :     命令1

**       DATA2   :      命令2

**        

** 输 出: 0 : Fail

**        1 :  OK

** 全局变量:     无

** 调用模块:    ISendStr、delayMS

**

** 作 者: 叶皓贲

** 日 期: 20##-3-4

**-------------------------------------------------------------------------------------------------------

** 修改人:

** 日 期:

**------------------------------------------------------------------------------------------------------

********************************************************************************************************/

unsigned char ZLG7290_SendCmd(unsigned char Data1,unsigned char Data2)

{

unsigned char Data[2];

       Data[0]=Data1;

       Data[1]=Data2;

       ISendStr(zlg7290,0x07,Data,2);

       delayMS(10);

       return 1;

/*********************************************************************************************************

** 函数名称:    ZLG7290_SendBuf

** 功能描述:    向显示缓冲区发送数据

** 输 入: * disp_buf  :      要发送数据的起始地址

**         num            :      发送个数

**        

** 输 出: 无

** 全局变量:     无

** 调用模块:    ZLG7290_SendCmd

**

** 作 者: 叶皓贲

** 日 期: 20##-3-4

**-------------------------------------------------------------------------------------------------------

** 修改人:

** 日 期:

**------------------------------------------------------------------------------------------------------

********************************************************************************************************/

void ZLG7290_SendBuf(unsigned char * disp_buf,unsigned char num)

{

       unsigned char i;

       for(i=0;i<num;i++)

       {    

              ZLG7290_SendCmd(0x60+i,*disp_buf);

              disp_buf++;

       }

}

/*********************************************************************************************************

** 函数名称:    ZLG7290_GetKey

** 功能描述:    读取键值

** 输 入: 无

**         

** 输 出: >0  键值

**        =0  无键按下

** 全局变量:     无

** 调用模块:    IRcvStr、delayMS

**

** 作 者: 叶皓贲

** 日 期: 20##-3-4

**-------------------------------------------------------------------------------------------------------

** 修改人:

** 日 期:

**------------------------------------------------------------------------------------------------------

********************************************************************************************************/

unsigned char      ZLG7290_GetKey()

{

unsigned char rece;

       rece=0;

       IRcvStr(zlg7290,1,&rece,1);

       delayMS(10);

       return rece;

}

附录【二】参考文献

[1] 段晨东 单片机原理及接口技术 [M].清华大学出版社 2008.7第1版

[2] 刘宝延、程树康,步进电动机及其驱动控制系统 [M].1997年11月第一版

[3] 王守中、聂元铭 51单片机开发入门与典型事例 [M].人民邮电出版社2009.10第二版

[4] 史敬灼, 步进电动机伺服控制技术[M] .20##年3月第2版

更多相关推荐:
步进电机课程设计实验报告

成绩汇编及接口技术课程设计题目步进电机控制系统班级100602学号100602122姓名张春东时间20xx12251目录1设计任务与要求11设计任务12设计要求2设计方案21设计思路22使用的芯片23芯片的作用...

单片机实验报告 步进电机

20xx301510064杨闯实验目的了解步进电机的工作原理掌握它的转动控制方式和调速方法实验设备及器件IBMPC机一台DP51PROC单片机综合仿真实验仪一台实验内容1编写程序通过单片机的P1口控制步进电机的...

步进电动机实验报告

课程名称实验项目实验地点专业班级学号学生姓名指导教师实验报告年月日一实验目的和要求1通过实验加深对步进电动机的驱动电源和电机工作情况的了解2掌握步进电机基本特征的测定方法二实验内容1空载突跳频率的测定2空载最高...

步进电机综合实验报告

一、实验目的:了解步进电机工作原理,掌握用单片机的步进电机控制系统的硬件设计方法,熟悉步进电机驱动程序的设计与调试,提高单片机应用系统设计和调试水平。二、实验内容:步进电机加减速及其正反转控制,转速显示。三、工…

控制步进电机调速系统实验报告

华北科技学院计算机系综合性实验实验报告课程名称微机原理及应用实验学期20xx至20xx学年第二学期学生所在系部电子信息工程学院年级20xx专业班级学生姓名学号任课教师实验成绩计算机系制华北科技学院计算机系综合性...

步进电机课程设计实验报告

指导教师评定成绩审定成绩重庆邮电大学自动化学院计算机控制技术课程设计报告设计题目步进电动机调速控制单位二级学院自动化学院学生姓名专业自动化班级0810903学号20xx212466指导教师陈勇设计时间20xx年...

步进电机实验报告

论文题目步进电机的控制课程名称计算机控制技术学院信息工程学院专业班级应用电子技术2班学号3109003108姓名卢广彬任课教师黄国宏20xx年4月16日实验名称步进电机的控制实验目的1复习步进电机的工作原理进一...

步进电机系统设计实验报告

专业课程设计题目一步进电机控制系统设计院系动化学院专业班级智能0801班小组成员指导教师王曙光日期20xx052320xx0603目录课程设计描述2112课程设计具体要求33主要元器件34基本原理阐述341步进...

步进电机实验报告

步进电机调速实验报告班级xx姓名xx学号xxx指导老师xx步进电机调速实验报告一实验目的及要求1熟悉步进电机的工作原理2熟悉51系列单片机的工作原理及调试方法3设计基于51系列单片机控制的步进电机调速原理图要求...

实验十 步进电机与直流电机控制实验

电子科技大学中山学院学生实验报告

实验五 步进电机单轴定位控制实验

实验五步进电机单轴定位控制实验一实验目的1学习和掌握步进电机及其驱动器的操作和使用方法2学习和掌握步进电机单轴定位控制方法3学习和掌握PLC单轴定位模块的基本使用方法二实验原理步进电动机是一种将电脉冲信号转换为...

三相异步电动机的拆装实验报告

1三相异步电动机相关理论知识回顾11三相异步电动机的结构基本结构定子定子铁心嵌放绕组提供磁路定子绕组产生旋转磁场转子转子铁心嵌放绕组提供磁路转子绕组感应出电势电流笼型气绕线型材料铁心均由硅钢片叠压而成12工作原...

步进电机实验报告(27篇)