程序文件:
文件顺序依次: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)!='\0') 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实验室的老师和学长们的帮助,谢谢~