仿真版本:Proteus8.6及以上版本
程序编译:Keil5 C51
编程语言:C语言
设计编号:【B02】
1. 简介
本文介绍一种用AT89C51作为核心部件进行逻辑控制及信号产生的单片机技术和C语言编程设计的步进电机控制系统,本控制系统采用单片机控制,通过人为按动开关实现步进电机的正反转、加速、减速、启停。具有灵活方便、适用范围广的特点,基本能够满足实践需求。
2. 主要功能
a.支持按键设计正转、反转、启停、加速、减速。
b.支持数码管显示正反转:“0”是正转,“1”是反转。
c.支持数码管显示档位:“0”到“10”。
d.支持ULN2003驱动步进电机转动。
3. 源程序(Keil5)
本设计采用keil5 C51软件(内附安装包)实现程序设计。如需用keil4打开程序,可自行通过.c和.h文件新建工程即可。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define led P0//数码管段选
#define haha P2
sbit s1 = P3^0;
sbit s2 = P3^1;
sbit s3 = P3^2;
sbit s4 = P3^3;
sbit s5 = P3^4;//按键定义,s1正转,s2反转,s3加1,s4减1
sbit wei3 = P2^3;sbit wei2 = P2^2;sbit wei1 = P2^1;sbit wei0 = P2^0;//数码管位选定义
sbit a = P1^0;sbit b = P1^1;sbit c = P1^2;sbit d = P1^3;//脉冲信号输入端定义
uchar code tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//共阳数码管驱动信号0---9,不显示
uchar code time_counter[10][2]={{0xda,0x1c},{0xde,0xe4},{0xe1,0xec},{0xe5,0xd4},{0xe9,0xbc}, //9.7 ----1ms
{0xed,0xa4},{0xf1,0x8c},{0xf5,0x74},{0xf9,0x5c},{0xfc,0x18}};
uchar code qudong[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};
uchar num1 = 0;//控制取励磁信号变量
uchar num2 = 8;
char k=0;//加减档位控制,1为最小档
char pause=1;//暂停时保存之前的转速,开机默认1
bit flag1 = 0;//初始正转,正反转标志
uchar buf[4]={0,10,0,0};//数码管显示缓存,正转,不显示,不显示,显示1档位,高----低
//================================定时器0/1初始化函数================================
void T0_T1_init()
{
TMOD = 0x11;//定时器0/1均工作于方式1,16位计时方式
TH1 = time_counter[10-k][0];
TL1 = time_counter[10-k][1];//定时器1,定时10ms用于步进电机转速控制
TR1 = 0;
ET1= 1;//开定时器中断
EA = 1;//开总中断
}
//================================ms级延时函数=======================================
void delay1m(uint x)
{
uint i,j;
for(i=0;i<x;i++) //连数x次,约 x ms
for(j=0;j<10;j++); //数120 次,约1 ms
}
void display()
{
wei3=1;wei2=1;wei1=1;wei0=0;led = tab[buf[3]];delay1m(1);led=0xff;
wei3=1;wei2=1;wei1=0;wei0=1;led = tab[buf[2]];delay1m(1);led=0xff;
wei3=1;wei2=0;wei1=1;wei0=1;led = tab[buf[1]];delay1m(1);led=0xff;
wei3=0;wei2=1;wei1=1;wei0=1;led = tab[buf[0]];delay1m(1);led=0xff;
}
//================================主函数=============================================
void main()
{
T0_T1_init();
buf[1] = 10;//不显示
while(1)
{
display();
if(s1 == 0)
{
delay1m(3);
if(s1 == 0)
{
flag1 = 0;//正转
buf[0] = 0;//最高位显示0
// haha = 0x00;//停止
}
while(!s1) display();
}
if(s2 == 0 )
{
delay1m(3);
if(s2 == 0)
{
flag1 = 1;//反转
buf[0] = 1;//最高位显示1
// haha = 0x00;//停止
}
while(!s2) display();
}
if(s3 == 0) //速度加1档
{
delay1m(3);
if(s3 == 0)
{
k++;
TR1=1;
if(k > 10 )
{
k = 1;
}
buf[2]= k/10;
buf[3]= k%10;
}
while(!s3) display();
}
if(s4 == 0) //速度减1档
{
delay1m(3);
if(s4 == 0)
{
k--;
TR1=1;
if(k <= 0)
{
k = 10;
}
buf[2]= k/10;
buf[3]= k%10;
}
while(!s4) display();
}
if(s5==0)
{
delay1m(3);
if(s5==0)
{
if(TR1==1)
{
pause=k;
k=0;
TR1=0;
a=b=c=d=0;
}
else if(TR1==0)
{
k=pause;
TR1=1;
}
buf[2]= k/10;
buf[3]= k%10;
while(!s5) display();
}
}
}
}
4. 仿真proteus8.6
本设计采用proteus8.6软件(内附安装包)实现仿真设计,如下图所示。proteus软件一般存在高低版本兼容问题,该仿真是通过proteus8.6导出的,所以请尽量使用proteus8.6打开文件,低于proteus8.6的版本不能够正常使用,高于proteus8.6的版本除了proteus8.8/8.9理论上可以正常使用。
正转:
反转:
停止:
5. 设计报告
设计报告主要包括硬件电路、软件设计、仿真调试等等,仅供参考。
6. 资料清单
设计资料主要包括C程序+仿真+设计报告+使用说明+元件清单+操作视频等。
7. 资料获取链接
百度网盘下载链接:【B02】百度网盘下载链接
更多单片机仿真设计合集:单片机仿真设计合集