zoukankan      html  css  js  c++  java
  • 基于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实验室的老师和学长们的帮助,谢谢~

  • 相关阅读:
    shell脚本杀掉指定进程下所有子进程(包括子进程的子进程)
    XDebug调试
    PHP基础入门
    猴子补丁(Monkey Patching)
    编写python高质量python代码的59个有效方法
    ubuntu中不能使用终端的情况
    一些个人有用的网站
    Ubuntu将自带的python3升级
    [Vue warn]: You may have an infinite update loop in a component render function.
    OO第四单元总结&期末总结
  • 原文地址:https://www.cnblogs.com/uestc-mm/p/5161668.html
Copyright © 2011-2022 走看看