仿真版本:Proteus8.6及以上版本
程序编译:Keil5 C51
编程语言:C语言
设计编号:【B04】
1. 简介
本文介绍一种用AT89C51作为核心部件进行逻辑控制及信号产生的单片机技术和C语言编程设计的步进电机控制系统,本控制系统采用单片机控制,通过人为按动开关实现步进电机的正反转、加速、减速、停止。具有灵活方便、适用范围广的特点,基本能够满足实践需求。
2. 主要功能
a.支持按键设置正转、反转、停止、加速、减速。
b.支持LCD12864显示电机转动信息。
c.支持ULN2003驱动步进电机转动。
3. 源程序(Keil5)
本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit AA=P3^4;//电机
sbit BB=P3^5;
sbit CC=P3^6;
sbit DD=P3^7;
sbit k1=P1^0;//按钮
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit RS =P2^4;//显示器引脚
sbit RW =P2^3;
sbit EN =P2^2;
sbit CS1=P2^0;
sbit CS2=P2^1;
uchar start=0;//开启
uchar speed=10,time=0;//速度
uchar fang=0,flag=0;//方向
void lcd_r_busy()
{
P0 = 0x00;
RS = 0;
RW = 1;
EN = 1;
while (P0 & 0x80); // 最高位DB7==1,则busy
EN = 0;
}
/************* LCD写命令函数 *************/
void lcd_w_cmd(uchar value)
{
lcd_r_busy(); // 每次读写操作前都要忙判断
RS = 0;
RW = 0;
P0 = value;
EN = 1; // 下降沿锁存写入的数据/命令
_nop_();
_nop_();
EN = 0;
}
/************* LCD写数据 **************/
void lcd_w_data(uchar value)
{
lcd_r_busy();
RS = 1;
RW = 0;
P0 = value;
EN = 1; // 下降沿锁存写入的数据/命令
_nop_();
_nop_();
EN = 0;
}
/***************页设置:显示在哪一页******************/
/*************共8页,一页是8行像素点*****************/
void lcd_set_page(uchar page)
{
page = 0xb8 | page; // 页的首地址为0xb8:page或上0xb8=选择page页
lcd_w_cmd(page);
}
/************行设置:起始在哪一行********************/
/**********每页共8行,一般从0行开始******************/
void lcd_set_line(uchar sline)
{
sline = 0xc0 | sline; // 起始行地址为0xc0:sline或上0xc0=选择行
lcd_w_cmd(sline);
}
/*************起始列设置+像素点选择********************/
/***********每半片共64列,列值不得大于63***************/
void lcd_set_column(uchar column)
{
column = 0x3f & column; // 与上列的最大值63:0x3f 可得所选列值<63
column = 0x40 | column; // 得列的首地址
lcd_w_cmd(column);
}
/*************设置显示的开关********************/
/**********0为关闭显示;1为 开启显示************/
void lcd_on_off(uchar set)
{
set = 0x3e | set; // =0011 111x----0x3e为关闭显示;0x3f为开启显示
lcd_w_cmd(set);
}
/*************选择左右半屏显示********************/
/********0-全屏显示;1-左;2-右********************/
/************cs片选端低电平有效********************/
void lcd_cs(uchar sel)
{
switch (sel)
{
case 0:CS1 = 0; CS2 = 0; break; // 全屏显示
case 1:CS1 = 0; CS2 = 1; break; // 左显示
case 2:CS1 = 1; CS2 = 0; break; // 右显示
default:break;
}
}
/*************清屏:选择半屏********************/
/********0-清全屏;1-清左;2-清右***************/
void lcd_clear(uchar sel)
{
uchar i, j;
lcd_cs(sel);
for (i = 0; i < 8; i++)
{
lcd_set_page(i);
lcd_set_column(0);
for (j = 0; j < 64; j++)
{
lcd_w_data(0x00); // 每列全部写0,列地址指针自动+1
}
}
}
4. 仿真proteus8.6
本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。
正转:
反转:
停止:
5. 设计报告
设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考。
6. 资料清单
设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。
7. 资料获取链接
百度网盘下载链接:【B04】百度网盘下载链接
更多单片机仿真设计合集:单片机仿真设计合集