2012-05-08 01:34 #2016年高质量新标准全面升级!# 提问者采纳

步进电机控制程序(c语言+51单片机)

#include

#define uint  unsigned int

#define uchar unsigned char

#define ms *77

// f = 12 M

#define LEDLen 4

#define Dj_star() {IE=0x81; pri_dj=0; }

#define Dj_stop() {IE=0x00; pri_dj=1; P1=0xff; shache="0"; delay(800ms); delay(800ms);delay(400ms); shache = 1; }

#define Chilun_Num 8

/* 齿轮数 8 个*/

#define set_display_num() { LEDBuf[0] = tmp / 1000;     LEDBuf[1] = tmp / 100 % 10;  \

LEDBuf[2] = tmp / 10 % 10;  LEDBuf[3] = tmp % 10;        }

uchar LEDBuf[LEDLen] = {0,0,0,0};

void  read_num ();                /* 读播码盘 到 set_round_num  * 8 */

void  display  ();

void  delay(uint  delay_time) { uint  i; for (i=0; i < delay_time ; i++) ; }

void  run ();

void  fx_run();

uint  round_num     = 0;           /* 记录已转的 齿轮数 , 中断1次 加 1*/

uint  set_round_num = 0;           /* 播码盘设置 圈数 */

uint  set_pwm_width = 0;           /* 播码盘设置 步进电机 正向速度 */

bit   one_round_flg = 0;

sbit  led_1000      = P0^7;        //use for display

sbit  led_100       = P0^6;        //use for display

sbit  led_10        = P0^5;        //use for display

sbit  led_1         = P0^4;        //use for display

sbit  key_start     = P3^0;

sbit  key_puse      = P3^0;

sbit  key_clear     = P3^1;

/*  P3^2 接齿轮传感器 中断  */

sbit  bujin_zx_stop = P3^3;        /* 接步进电机 ,正向到位传感器 ,为 0 停机 */

sbit  bujin_fx_stop = P3^4;        /* 接步进电机 ,反向到位传感器 ,为 0 停机 */

sbit  shache        = P3^5;        /* 接刹车控制继电器   0 电位有效 */

sbit  pri_dj        = P3^6;        /* 接主电机控制继电器 0 电位有效 */

void main(){

TCON = 0x01;

display();

while(1) {

IE="0x00";

round_num = 0;

display();

if ( bujin_fx_stop ) fx_run();

while ( key_start );

delay ( 8ms );

if(!key_start){

read_num();

//set_round_num  = 8;

while ( !key_start );

run ();

fx_run();

}

}

}

void run () {

#define Delay_time   180

/* 转一圈 50 次循环,每循环 4 步 ,50 * 4 = 200 , 200 * 1。8 = 360 */

uchar i ;

P1 = 0xff;

set_pwm_width = 15 + set_pwm_width / 10;

while ( 1 ) {

while( !shache | !key_start );

Dj_star();

for ( i="0" ; bujin_zx_stop & !pri_dj;i++ ){

P1 =  0xf9;

delay ( Delay_time  );        // bujin_zx_stop = P3^3;

P1 =  0xfc;                   // bujin_fx_stop = P3^4;

delay ( Delay_time);          // key_puse      = P3^0;

P1 =  0xf6;                   // key_clear     = P3^1;

delay ( Delay_time  );        // shache        = P3^5;

P1 =  0xf3;                   // pri_dj        = P3^6;

delay ( Delay_time );

if( i == set_pwm_width ) { P1 = 0xff; i = 0; one_round_flg = 0; while ( !one_round_flg & key_puse );}

if(!key_puse) { delay(4ms);  if(!key_puse) break;  }

}

P1 = 0xff;

if ( pri_dj )  break;

if ( !key_puse ) {

delay ( 8ms );

if ( !key_puse  ) {

Dj_stop();

while ( !key_puse );

// next pree key

while( !shache );

while(1){

while (  key_puse &  key_clear );

delay ( 8ms );

if ( !key_clear )  { round_num = 0; display(); }

if ( !key_puse  )  break;

}

while( !key_puse );

delay(8ms);

while( !key_puse );

}

}

}

}

void ext_int0(void) interrupt 0  {   /* 主电机 齿轮 中断 */

uint tmp;

EA = 0;

if( !pri_dj ){

round_num ++;

if (round_num % Chilun_Num == 0 ){

one_round_flg = 1;

tmp = round_num  / Chilun_Num ;

set_display_num();

P0 = 0xf0;

P0 = P0 | LEDBuf[0] ;

led_1000  = 0;

P0 |= 0xf0;

P0 = 0xf0;

P0 = P0 | LEDBuf[1] ;

led_100   = 0;

P0 |= 0xf0;

P0 = 0xf0;

P0 = P0 | LEDBuf[2] ;

led_10    = 0;

P0 |= 0xf0;

P0 = 0xf0;

P0 = P0 | LEDBuf[3] ;

led_1     = 0;

P0 |= 0xf0;

P0 = 0xf0;

}

if ( round_num >= set_round_num  ) Dj_stop();

}

EA = 0x81;

}

void display(){

uchar i;

uint tmp = 0;

tmp = round_num  / Chilun_Num ;

set_display_num();

for(i = 0; i < LEDLen ; i ++){

P0 = 0xf0;

P0 = P0 | LEDBuf[i] ;

if(i==0) led_1000  = 0;        //P0^4

if(i==1) led_100   = 0;        //P0^5

if(i==2) led_10    = 0;        //P0^6

if(i==3) led_1     = 0;        //P0^7

P0 |= 0xf0;

}

P0 = 0xf0;

}

void read_num(){

/* 读播码盘 到 set_round_num  ,set_pwm_width  */

uchar tmp;

P2 =  0xFF;

P2 =  0xEF;    // 1110 1111

delay ( 1ms  );

tmp =   ~(P2  | 0xF0);

P2 =  0xDF;    // 1101 1111

delay ( 1ms  );

tmp = (~(P2 | 0xF0 )) * 10   + tmp;

set_round_num = tmp;

P2 =  0xBF;    // 1011 1111

delay ( 1ms  );

tmp = (~(P2 | 0xF0));

P2 =  0x7F;    // 0111 1111

delay ( 1ms  );

tmp = (~(P2 | 0xF0)) * 10 + tmp;

set_round_num = set_round_num  + tmp * 100;

set_round_num = set_round_num  * Chilun_Num;

P2 =  0xFF;

P1 =  0xbF;    // 0111 1111

delay ( 1ms );

tmp =   ~(P2  | 0xF0) ;

P1  =  0xFF;

P2  =  0xFF;

P1 &=  0x7F;    // 1011 1111

delay ( 1ms );

tmp = (~(P2 | 0xF0)) * 10 + tmp ;

set_pwm_width = tmp ;

P1  = 0xFF;

P2  = 0xFF;

}

void  fx_run(){

#define f_Delay_time 180

while ( bujin_fx_stop ) {   /* 反向 回车 直到 传感器 动作*/

P1 =  0xf3;                   //0011

delay ( f_Delay_time );

P1 =  0xf6;                   //0110

delay ( f_Delay_time );

P1 =  0xfc;                   //1100

delay ( f_Delay_time P1 =  0xf9;                   //1001

delay ( f_Delay_time );

}

P1 = 0xff;

}

51单片机步进电机c语言程序,51单片机的步进电机c语言驱动程序相关推荐

  1. 8255A红绿灯c语言程序,51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序).doc...

    51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序) 51单片机外接8255A做成的交通灯程序及PROTEUS仿真结果(附对应C语言程序)2010-04-21 22:0 ...

  2. 89c51c语言程序,89C51单片机计算器C语言程序.doc

    89C51单片机计算器C语言程序 89C51单片机[计算器]C语言程序 89C51单片机[计算器]C语言程序2010-12-15 16:54/*89C51单片机[计算器]C语言程序*/ /*P2位选P ...

  3. 时钟加闹钟c语言程序,求单片机数码时钟带闹铃的C程序?

    数码时钟的程序,应该说很简单,就是通过编程先建立一个时基源,继而获得1秒的时基信号,并累加获得分信号.时信号,至于显示控制,则根据电路原理进行控制即可:当时编写这段程序时,并未加入闹铃功能,原以为闹铃 ...

  4. c语言程序第一章编程,c语言程序的设计第一章 C语言编程入门.ppt

    c语言程序的设计第一章 C语言编程入门 第1章 C语言编程入门 本章是本书的入门篇,专为初学者熟悉编程过程.掌握程序结构而准备的. 本章学习目标 ? 1)? 能够通过模仿与改变来构造带有测试函数的C语 ...

  5. 统计字符 c语言程序,统计字符个数的C语言程序.doc

    统计字符个数的C语言程序.doc 下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览.不比对内容而直接下载带来的问题本站不予受理. 2.下载的文档,不会出现我们的网址水印. 3.该文 ...

  6. 单片机汉字点阵c语言程序,51单片机C语言多种点阵屏驱动程序(开发软件为keil C...

    51单片机C语言多种点阵屏驱动程序(开发软件为keil C 2016-08-23 1 0 0 暂无评分 其他 1 积分下载 如何获取积分? 51单片机C语言多种点阵屏驱动程序(开发软件为keil C ...

  7. c语言单片机定时器的应用程序,51单片机定时器中断程序(C语言)

    51c程序 51单片机定时器中断程序(C语言) 用C语言实现的,先要定义好定时器的初值 不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期 机器周期=12/n(n指晶 ...

  8. 超声波c语言程序,51单片机超声波模块的C语言程序.doc

    51单片机超声波模块的C语言程序.doc 超声波模块程序 超声波模块程序 Trig P20 Echo P32 include define uchar unsigned char define uin ...

  9. 洗衣机洗涤部分c语言程序,51单片机洗衣机控制板及C语言程序

    51单片机洗衣机控制板及C语言程序,该控制板单片机采用AT89C51单片机,所设计全自动洗衣机功能有:标准洗衣.经济洗衣.单独洗衣以及排水四种洗衣等四种方式,有强洗.弱洗及运行/暂停.显示及报警功能, ...

  10. 单片机 中断秒表 c语言程序,51单片机c语言的秒表设计.doc

    51单片机c语言的秒表设计.doc 课程设计报告 基于AT89C51单片机的秒表设计 院 系 电子信息工程学院 专 业 电子信息工程 1 姓 名 摘 要 本设计是设计一个单片机控制的多功能秒表系统. ...

最新文章

  1. Linux下编译Boost
  2. C++ const char* 学习
  3. JavaScript中的this妙用
  4. 单片机串行收发电路制作记录
  5. LiveVideoStack公众号内容改版通知
  6. iOS 苹果app提交 ITC.apps.validation.prerelease_build_missing
  7. 双非计算机考研推荐学校传菜电梯,22考研双非院校排名Top100,前3名竟然是这几所!...
  8. telnet服务下载 Linux,linux telnet服务安装包
  9. [Math]添加了一个EulerProject标志
  10. 95-10-120-启动-GroupCoordinator
  11. c语言回调函数_【云里雾里】回调函数与钩子函数
  12. 富怡服装cad制图软件Super V8官方免费版 | 富怡服装cad制图软件下载 | 提供高清版富怡cad教程视频全集免费下载
  13. JDK API 1.60 中文版(Java 1.6 中文帮助文档) 中文版
  14. 在windows server 2008 r2上安装nokia pc 套件
  15. 手机怎么打开谷歌官网页服务器地址,google手机地图打不开了的解决方法
  16. php 科学计数法 运算,php弱语言特性-计算科学计数法
  17. PHP万能小偷程序源码
  18. 医保是不是只有住院才能在单位报销,什么样的病才能报销
  19. C语言实现9*9乘法口诀表
  20. xgboost.fit函数

热门文章

  1. 50 行代码,实现中英文翻译
  2. 机器学习——周志华(1)
  3. CAN详解--协议详解
  4. RHEL7修改命令行界面的分辨率
  5. 5个超实用的Excel数据透视表技巧
  6. python分解GIF图
  7. 目前比较流行的网站开发框架有哪些?
  8. playsound playsound.PlaysoundException: Error 263 for command: open ./dataSet/warn.wav 指定的设备未打开,或不被
  9. 北京2020积分落户名单
  10. 0基础,如何快速学习自媒体,详细教程