前言:作者想要帮助一些童鞋和爱好者进行项目构建,但自知能力有限,不喜可论,创作不易,勿喷。
系统采用stc89c51芯片进行的单片机控制步进电机,能够实现控制步进电机转动角度。上代码。
项目包含主要器件stc89c51 lcd1602 步进电机 矩阵按键
项目包含程序 原理图 PCB
main.c
#include <REG51.H>
#include <1602.c>
//#include <display.c>
unsigned int cp1,ds,mode,mode1;
bit flash;
#include <key.c>
#include <display.c>
void motor_z(uint xx)
{
int i;
for(i = 0; i <= xx;i++)
{
P1 = 0xfe;
delay(10);
P1 = 0xfd;
delay(10);
P1 = 0xfb;
delay(10);
P1 = 0xf7;
delay(10);
}
}
void timer0_isr() interrupt 1
{
TH0 = (65535 - 1000) / 255;
TL0 = (65535 - 1000) % 255;
if(mode1 == 0)cp1++;
if(cp1 >= 60)
{
mode1 = 1;
cp1 = 0;
}
}
void timer0_init()
{
TMOD = 0x01;
TH0 = (65535 - 1000) / 256;
TL0 = (65535 - 1000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main()
{
uint xx;
uint key_state = 0;
uchar ara_index = 0;
uchar ara_key[3] = {0};
// uchar aa[3];
F1602_init();
F1602_clear();
timer0_init();
while(1)
{
key_state = key();
if(key_state != 88)
{
if(ara_index != 3)
{
ara_key[ara_index] = key_state;
gotoxy(2,0);
display_num(key_state);
if(ara_index == 0)motor_z(key_state*1.42);
if(ara_index == 1)motor_z(key_state*14.2);
if(ara_index == 2)motor_z(key_state*142);
ara_index++;
}
}
if(ara_index == 3)
{
if(mode == 0)
{
mode = 1;
}
ara_index = 0;
//
}
gotoxy(1,0);
display_num(ara_index);
}
}
key.c
code uchar key1[]={0xdf,0xbf,0x7f};
code uchar key2[]={
0xcf,0xaf,0x6f,\
0xd7,0xb7,0x77,\
0xdb,0xbb,0x7b,
} ;
uchar key()
{
int i,j;
for(i=0;i<3;i++)
{
P3 = key1[i];
if(P3 != key1[i])
{
delay(300);
if(P3 != key1[i])
{
for(j=0;j<9;j++)
{
if(P3 == key2[j])
return(j+1);
}
}
}
}
return (88);
}
lcd1602.c
#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^5;
sbit RW = P2^6;
sbit E = P2^7;
//sbit LED0 = P1^2;
//sbit LED1 = P1^3;
char code num[]="0123456789";
void delay(unsigned int n)
{
unsigned int j=0;
for(;n>0;n--)
{
for(j=0;j<125;j++);
}
}
void write_command(uchar command)
{
RW = 0;
RS = 0;
E = 1;
P0 = command;
delay(1);
E = 0;
RW = 1;
}
void write_data(uchar date)
{
RW = 0;
RS = 1;
E = 1;
P0 = date;
delay(1);
E = 0;
RW = 1;
}
void display_string(uchar *p)
{
while(*p)
{
write_data(*p);
p++;
}
}
void display_num(uint mun)
{
// write_data(num[mun / 1000 % 10]);
write_data(num[mun / 100 % 10]);
write_data(num[mun / 10 % 10]);
write_data(num[mun % 10]);
}
void gotoxy(unsigned y,unsigned x)
{
if(y == 1)
write_command(0x80+x);
else if(y == 2)
write_command(0x80+0x40+x);
}
void F1602_init(void)
{
write_command(0x38); // 两行,每行16字符,每个字符5*7点阵
write_command(0x0C); // CURSOR_OFF
write_command(0x06C); // CURSOR_RIGHT
}
void F1602_clear()
{
write_command(0x01);
write_command(0x02);
}
原理图
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/156062.html