基于51单片机+42步进电机的简易猫砂盆

程序文件:

文件顺序依次:5110.c  5110.h  delay.c  delay.h  KeyRead.c  KeyRead.h  main.c  StepMotor.c  StepMotor.h

诺基亚5110的显示驱动程序的source文件:

  1 #include <reg52.h>
  2 #include "5110.h"
  3 #include "delay.h"
  4 sbit CE=P0^1;
  5 sbit DC=P0^2;
  6 sbit SCLK=P0^4;
  7 sbit DIN=P0^3;
  8 sbit REST=P0^0;
  9 code unsigned char font6x8[][6]={//code指令的作用在于将不变化的数组变量或者固定值存放在ROM区域以节省RAM的空间(51单片机的RAM不够用,所以一定要用code指令)    
 10     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },   
 11     { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 },   
 12     { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 },   
 13     { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 },   
 14     { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 },   
 15     { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 },   
 16     { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 },   
 17     { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 },   
 18     { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 },   
 19     { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 },   
 20     { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 },   
 21     { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 },   
 22     { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 },   
 23     { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 },   
 24     { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 },   
 25     { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 },   
 26     { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E },   
 27     { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 },   
 28     { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 },   
 29     { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 },   
 30     { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 },   
 31     { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 },   
 32     { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 },   
 33     { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 },   
 34     { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 },   
 35     { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E },   
 36     { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 },   
 37     { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 },  
 38     { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 },   
 39     { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 },   
 40     { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 },   
 41     { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 },   
 42     { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E },   
 43     { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C },   
 44     { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 },   
 45     { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 },   
 46     { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C },   
 47     { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 },  
 48     { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 },   
 49     { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A },   
 50     { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F },   
 51     { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 },   
 52     { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 },   
 53     { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 },   
 54     { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 },   
 55     { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F },   
 56     { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F },   
 57     { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E },   
 58     { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 },   
 59     { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E },   
 60     { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 },   
 61     { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 },   
 62     { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 },   
 63     { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F },   
 64     { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F },   
 65     { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F },   
 66     { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 },   
 67     { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 },   
 68     { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 },   
 69     { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 },   
 70     { 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55 },   
 71     { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 },   
 72     { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 },   
 73     { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 },   
 74     { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 },   
 75     { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 },  
 76     { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 },  
 77     { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 },   
 78     { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F },   
 79     { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 },   
 80     { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 },  
 81     { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C },   
 82     { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 },   
 83     { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 },   
 84     { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 },  
 85     { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 },   
 86     { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 },   
 87     { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 },   
 88     { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 },   
 89     { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 },   
 90     { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 },   
 91     { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC },   
 92     { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 },   
 93     { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 },   
 94     { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 },  
 95     { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C },  
 96     { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C },   
 97     { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C },   
 98     { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 },  
 99     { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C },   
100     { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 },   
101     { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 },
102 };
103 void N5110_WriteData(unsigned char D)
104 {
105  int i=0;
106  CE=0;
107  DC=1; NOP();
108  for(i=0;i<8;i++)
109  {
110   SCLK=0; NOP();
111   if(D&0x80) DIN=1; else DIN=0;
112   SCLK=1; NOP();
113   D<<=1;
114  }
115  DC=1;
116  CE=1;
117 }
118 void N5110_WriteCom(unsigned char C)
119 {
120  int i=0;
121  CE=0;
122  DC=0; NOP();
123  for(i=0;i<8;i++)
124  {
125   SCLK=0; NOP();
126   if(C&0x80) DIN=1; else DIN=0;
127   SCLK=1; NOP();
128   C<<=1;
129  }
130  DC=1;
131  CE=1;
132 }
133 void N5110_SetPos(unsigned char x,unsigned char y)
134 {
135  N5110_WriteCom(0x40|y);
136  N5110_WriteCom(0x80|x);
137 }
138 void N5110_Clear(void)
139 {
140  int j=0,i=0;
141  N5110_SetPos(0,0);
142  for(i=0;i<6;i++)
143  {
144   for(j=0;j<84;j++)
145   {
146    N5110_WriteData(0x00);
147   }
148  }
149 }
150 void N5110_Init(void)
151 {
152  REST=0; delay(2); REST=1;
153  CE=0; delay(2); CE=1;
154  N5110_WriteCom(0x21);
155  N5110_WriteCom(0xc8);
156  N5110_WriteCom(0x06);
157  N5110_WriteCom(0x13);
158  N5110_WriteCom(0x20);
159  N5110_Clear();
160  N5110_WriteCom(0x0C);
161  CE=0;
162 }
163 void N5110_ShowChar(unsigned char x,unsigned char y,unsigned char c)
164 {
165  unsigned char i;  
166  c-=32;
167  N5110_SetPos(x,y);
168  for(i=0; i<6;i++) 
169   N5110_WriteData(font6x8[c][i]); 
170 }
171 void N5110_ShowString(unsigned char x,unsigned char y,unsigned char *string)
172 {
173  unsigned char i=0;
174  while(*(string+i)!='')
175  {
176   N5110_ShowChar(x,y,*(string+i));
177   if(x>83) {x=0;y++;}
178   x=x+6;
179   i++;
180  }
181 }
182 void N5110_ShowNum(unsigned char x,unsigned char y,unsigned int num)
183 {
184   unsigned int nu[3]={0};
185   nu[0]=num/100;
186   nu[1]=(num-nu[0]*100)/10;
187   nu[2]=num-nu[0]*100-nu[1]*10;
188   N5110_ShowChar(x,y,nu[0]+48);
189   N5110_ShowChar(x+6,y,nu[1]+48);
190   N5110_ShowChar(x+12,y,nu[2]+48);
191 }

诺基亚5110的Head头文件:

1 void N5110_WriteData(unsigned char D);
2 void N5110_WriteCom(unsigned char C);
3 void N5110_Init(void);
4 void N5110_SetPos(unsigned char x,unsigned char y);
5 void N5110_ShowChar(unsigned char x,unsigned char y,unsigned char c);
6 void N5110_ShowString(unsigned char x,unsigned char y,unsigned char *string);
7 void N5110_ShowNum(unsigned char x,unsigned char y,unsigned int num);
8 void N5110_Clear(void);

延时函数source文件:

1 void delay(unsigned int r)
2 {
3  unsigned int i,j;
4  for(i=r;i>0;i--)
5   for(j=110;j>0;j--);
6 }

延时函数Head文件:

1 #include <intrins.h>
2 void delay(unsigned int r);
3 #define NOP() _nop_()

按键检测的source文件:

 1 #include <reg52.h>
 2 #include "KeyRead.h"
 3 sbit LSB=P1^2;//Begin
 4 sbit LSE=P1^3;//End
 5 sbit User=P1^4;//User Begin
 6 char User_read(void)
 7 {
 8  char U=0;
 9  if(User==1) {U=0;}
10  else {U=1;}
11  return U;
12 }
13 char LSB_read(void)
14 {
15  char LB=1;
16  if(LSB==1) {LB=0;}
17  else {LB=1;}
18  return LB;
19 }
20 char LSE_read(void)
21 {
22  char LE=1;
23  if(LSE==1) {LE=0;}
24  else {LE=1;}
25  return LE;
26 }

按键检测的HEAD头文件:

1 char User_read(void);
2 char LSB_read(void);
3 char LSE_read(void);

主函数的source程序:

 1 #include <reg52.h>
 2 #include "5110.h"
 3 #include "delay.h"
 4 #include "StepMotor.h"
 5 #include "KeyRead.h"
 6 sbit output=P2^7;
 7 void Servo_Init(void);
 8 void Servo_0Degree(void);
 9 void Servo_45Degree(void);
10 unsigned int i,flag,a,b,m,n;
11 void main(void)
12 {
13  char Cap=1;
14  N5110_Init();//所有的都要初始化
15  StepMotor_Init();
16  Servo_Init();
17  N5110_ShowString(1,1,"MyCat");
18  N5110_ShowString(1,3,"Edition0.1");
19  while(1)
20  {
21   while(User_read())
22   {
23    Cap=LSB_read();
24    while(Cap==1)//若没被按下去,则限位开关为低电平,返回1
25    {
26     N5110_ShowString(1,4,"Back");
27     Cap=LSB_read();
28     StartMotor(1);//电机向回退
29    }
30    StopMotor();
31    delay(500);
32    Cap=LSE_read();
33    while(Cap==1)//若没被按下去,则限位开关为低电平,返回1
34    {
35     N5110_ShowString(1,4,"Goto");
36     Cap=LSE_read();
37     StartMotor(0);//电机向前走
38    }
39    StopMotor();
40    delay(500);
41 
42    Servo_0Degree();
43    delay(1000);
44    Servo_45Degree();
45    delay(1000);
46    TR0=0;//舵机的运行时间
47 
48    Cap=LSB_read();
49    while(Cap==1)//若没被按下去,则限位开关为低电平,返回1
50    {
51     N5110_ShowString(1,4,"Back");
52     Cap=LSB_read();
53     StartMotor(1);//电机向回退
54    }
55    StopMotor();
56   }
57  }
58 }
59 void Servo_Init(void)
60 {
61  TMOD=0X02;
62  TH0=(256-100);//100us
63  TL0=(256-100);
64  ET0=1;
65  EA=1;
66  TR0=0;
67  output=1;
68  flag=0;
69  i=0;
70 }           
71 void Servo_0Degree(void)
72 {
73  TR0=1;
74  a=16;
75  b=200-a; 
76 }
77 void Servo_45Degree(void)
78 {
79  TR0=1;
80  a=11;
81  b=200-a;
82 }
83 void time0() interrupt 1
84 {
85  i++;
86  if(i==a&&flag==1)
87  {
88   output=0;
89   i=0;
90   flag=0;
91  }
92  if(i==b&&flag==0)
93  {
94   output=1;
95   i=0;
96   flag=1;
97  }        
98 }

步进电机的驱动程序source文件:

 1 #include <reg52.h>
 2 #include "StepMotor.h"
 3 sbit DIR_M=P1^6;
 4 sbit CPC_M=P1^7;
 5 void StepMotor_Init(void)
 6 {
 7  StopMotor();
 8 }
 9 void StartMotor(char DIR)//锁定让其悬空即可让其保持锁定,节约IO口资源
10 {
11  DIR_M=DIR;//0-正转?1-反转?
12  CPC_M=1;//Start
13 }
14 void StopMotor(void)
15 {
16  CPC_M=0;//Stop
17 }

步进电机的HEAD文件:

1 void StepMotor_Init(void);
2 void StartMotor(char DIR);
3 void StopMotor(void);

下面是系统的整体结构的设计(材料使用的是亚克力板子):

直接使用AutoCAD做就可以了,简单的平面制作!!

下面就是元器件的清单了~主要是亚克力的定制有点贵了~~

好的,全部就这些了~在这里感谢GISPALAB实验室的老师和学长们的帮助,谢谢~

原文地址:https://www.cnblogs.com/uestc-mm/p/5161668.html