前言:作者想要帮助一些童鞋和爱好者进行项目构建,但自知能力有限,不喜可论,创作不易,勿喷。
系统采用stc89c51芯片进行的单片机控制步进电机,能够实现控制步进电机转动角度。上代码。
项目包含主要器件stc89c51 lcd1602 步进电机 矩阵按键
项目包含程序 原理图 PCB
main.c
#include#include <1602.c> //#include unsigned int cp1,ds,mode,mode1; bit flash; #include #include 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#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); }
原理图
PCB
资源区会上传相关资源,积分下载



