基于51单片机的步进电机控制系统-单片机课程设计报告 下载本文

附件

一、 电路原理图

二、 电路PCB图

三、 电路实物图

四、 源程序

#include

#include //内部包含延时函数 _nop_();

#define uchar unsigned char #define uint unsigned int

#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};

uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //正转相序编码

uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};

sbit K1 = P3^0; //运行与停止 sbit K2 = P3^1; //设圈数 sbit K3 = P3^2; //方向转换 sbit K4 = P3^3; //转速加

sbit K5 = P3^4; //点动 sbit K6 = P3^5; sbit K7 = P3^6; sbit K8 = P3^7;

sbit LCD_RS = P2^0; sbit LCD_RW = P2^1; sbit LCD_EN = P2^2;

bit on_off=0,on_off1=0; //运行与停止标志 bit direction=1; //方向标志 bit rate_dr=1; //速率标志 bit snum_dr=1; //圈数标志

uchar code cdis1[ ] = {%uchar code cdis2[ ] = {%uchar code cdis3[ ] = {%uchar code cdis4[ ] = {%uchar code cdis5[ ] = {%uchar code cdis6[ ] = {\

uchar m,v=0,q=0,q1;

uint number=0,number1=0;

uchar snum=10,snum1=10,number2=0; //预设定圈数 uchar rate=2,rate_ctr; //预设定速率 uchar data_temp,data_temP1,data_temp2;

/********************************************************/ /* /* 延时t毫秒

/* 11.0592MHz时钟,延时约1ms /* /********************************************************/ void delay(uint t) //tms { uchar k; while(t--) {

for(k=0; k<125; k++) { } } }

/********************************************************/ void delayB(uchar x) //x*0.14MS {

uchar i; while(x--) {

for (i=0; i<13; i++) { } } }

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

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

/* /*检查LCD忙状态 /*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。

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

bit lcd_busy()

{ bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delayNOP();

result = (bit)(P0&0x80); LCD_EN = 0;

return(result); }

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

/* /*写指令数据到LCD /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 /* /********************************************************/

void lcd_wcmd(uchar cmd)

{ while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd; delayNOP(); LCD_EN = 1; delayNOP(); LCD_EN = 0; }

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

/* /*写显示数据到LCD /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 /* /********************************************************/

void lcd_wdat(uchar dat) { while(lcd_busy()); LCD_RS = 1; LCD_RW = 0; LCD_EN = 0; P0 = dat; delayNOP(); LCD_EN = 1; delayNOP();

LCD_EN = 0; }

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

/* /* LCD初始化设定 /* /********************************************************/

void lcd_init() {

delay(30);

lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据 delay(5);

lcd_wcmd(0x38); delay(5);

lcd_wcmd(0x38); delay(5);

lcd_wcmd(0x0c); //显示开,关光标 delay(5);

lcd_wcmd(0x06); //写入新数据后光标右移 delay(5);

lcd_wcmd(0x01); //清除LCD的显示内容 delay(5); }

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

/* /* 设定显示位置 /* /********************************************************/

void lcd_pos(uchar pos) {

lcd_wcmd(pos | 0x80); //数据指针=80+地址变量 }

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

/* LCD1602初始显示子程序 /* /********************************************************/ void LCD_init_DIS() {

delay(10); //延时

lcd_init(); //初始化LCD

lcd_pos(0); //设置显示位置为第一行的第1个字符

m = 0;

while(cdis1[m] != '\\0')

{ //显示字符 lcd_wdat(cdis1[m]); m++; }

lcd_pos(0x40); //设置显示位置为第二行第1