- 还记得刚来大一那会对电子产品研究特感兴趣,后来就加入了学院里面的大学生科技协会的课题部,紧接着改变了我的大学生活,从此我就开始了对这方面的研究................当然一开始我们学的是用51来写流水灯,还没上手的C语言的我们随之就先自己焊接了自己的第一块板子流水灯
- 后面又加进去了代码,虽然过程中遇到了许多的问题,比如虚焊,连错,但是后面还是成功的点亮了我的第一块单片机流水灯..............................
- 让我认识到了好多,最小51系统板,还有各引脚的功能,来分享给你们的流水灯吧,从一灯大师开始学单片机
心形花样LED 流水灯(带程序)
使用89C52做的,原理图如下:
总共有32个LED灯,4个I/O全部用上了。
我在这里不加有LED保护电阻,用200的也可以
晶振用12M的或11.0592M也行,C1,C2用30PF。
PCB图如下:
作品效果录像:http://www.tudou.com/programs/view/z0bjKg_3Cd4/
程序是用C语言写的;
如下:
1 #include<reg52.h> 2 #include <intrins.h> 3 #define uint unsigned int 4 #define uchar unsigned char 5 uchar code table[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; // 逐个点亮0~7 6 uchar code table1[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00}; // 逐个点亮7~0 7 uchar code table2[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff}; // 逐个灭0~7 8 uchar code table3[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; // 逐个灭7~0 9 10 /***********************************************************/ 11 void delay(uint t); //延时 12 void zg(uint t,uchar a);//两边逐个亮 13 void qs(uint t,uchar a);//全部闪烁 14 void zgxh(uint t,uchar a); // 逆时针逐个点亮 15 //void zgxh1(uint t,uchar a); // 顺时针逐个点亮 16 void djs(uint t,uchar a); //对角闪 17 void lbzgm(uint t,uchar a);//两边逐个灭 18 //void sszgm(uint t,uchar a); // 顺时针逐个灭 19 void nszgm(uint t,uchar a); // 逆时针逐个灭 20 void sztl(uint t,uchar a);//顺时逐个同步亮 21 void nztl(uint t,uchar a);//逆时逐个同步亮 22 void sztm(uint t,uchar a);//顺时逐个同步灭 23 void nztm(uint t,uchar a);//逆时逐个同步灭 24 void hwzjl(uint t,uchar a); //横往中间亮 25 void hwzjm(uint t,uchar a); //横往中间灭 26 //void swzjl(uint t,uchar a); //竖往中间亮 27 //void swzjm(uint t,uchar a); //竖往中间灭 28 void nzdl(uint t,uchar a); //逆时逐段亮 29 void nzdgl(uint t,uchar a); //逆时逐段一个点亮 30 void jgs(uint t,uchar a); //间隔闪 31 /**********************************************************/
下面是子函数代码部分
1 void zg(uint t,uchar a)//两边逐个亮 2 { 3 uchar i,j; 4 for(j=0;j<a;j++) 5 { 6 P0=P1=P2=P3=0xff; 7 P0=0x7f;delay(t); 8 for(i=0;i<7;i++) 9 { 10 P0=table1[i+1]; 11 P2=table1[i]; 12 delay(t); 13 } 14 P2=0x00;P1=0xfe; 15 delay(t); 16 17 for(i=0;i<7;i++) 18 { 19 P1=table[i+1]; 20 P3=table1[i]; 21 delay(t); 22 } 23 P3=0x00;delay(t); 24 } 25 } 26 27 28 void qs(uint t,uchar a) //全部闪烁 29 { 30 uchar j; 31 for(j=0;j<a;j++) 32 { 33 P0=P1=P2=P3=0xff; 34 delay(t); 35 P0=P1=P2=P3=0x00; 36 delay(t); 37 } 38 } 39 40 41 42 43 void zgxh(uint t,uchar a) // 逆时针逐个点亮 44 { 45 uchar i,j; 46 for (j=0;j<a;j++) 47 { 48 P0=P1=P2=P3=0xff; 49 for (i=0;i<8;i++) 50 { 51 P0=table1[i]; 52 delay(t); 53 } 54 for(i=0;i<8;i++) 55 { 56 P1=table[i]; 57 delay(t); 58 } 59 for(i=0;i<8;i++) 60 { 61 P3=table[i]; 62 delay(t); 63 } 64 for(i=0;i<8;i++) 65 { 66 P2=table[i]; 67 delay(t); 68 } 69 } 70 } 71 72 void nszgm(uint t,uchar a) // 逆时针逐个灭 73 { 74 uchar i,j; 75 for(j=0;j<a;j++) 76 { 77 P0=P1=P2=P3=0x00; 78 for (i=0;i<8;i++) 79 { 80 P0=table3[i];delay(t); 81 } 82 for (i=0;i<8;i++) 83 { 84 P1=table2[i];delay(t); 85 } 86 for (i=0;i<8;i++) 87 { 88 P3=table2[i];delay(t); 89 } 90 for (i=0;i<8;i++) 91 { 92 P2=table2[i];delay(t); 93 } 94 } 95 96 97 } 98 void djs(uint t,uchar a) //对角闪 99 { 100 uchar j; 101 for(j=0;j<a;j++) 102 { 103 P0=P1=P2=P3=0xff; 104 P0=P3=0x00; 105 delay(t); 106 P0=P1=P2=P3=0xff; 107 P1=P2=0x00; 108 delay(t); 109 } 110 111 } 112 113 114 void lbzgm(uint t,uchar a)//两边逐个灭 115 { 116 uchar i,j; 117 for (j=0;j<a;j++) 118 { 119 P0=P2=0x00; 120 P3=0x01;delay(t); 121 for(i=7;i>1;i--) 122 { 123 P1=table[i-1];P3=table1[i-2]; 124 delay(t); 125 } 126 P1=0xfe;P3=0xff;delay(t); 127 P1=0xff;P2=0x01;delay(t); 128 for(i=7;i>1;i--) 129 { 130 P0=table1[i-1]; 131 P2=table1[i-2]; 132 delay(t); 133 } 134 P0=0x7f;P2=0xff;delay(t); 135 P0=0xff;delay(t); 136 } 137 } 138 139 140 void sztl(uint t,uchar a)//顺时逐个同步亮 141 { 142 uchar i,j; 143 for(j=0;j<a;j++) 144 { 145 P0=P1=P2=P3=0xff; 146 for(i=0;i<8;i++) 147 { 148 P0=table[i]; 149 P1=P2=P3=table1[i]; 150 delay(t); 151 } 152 } 153 } 154 155 void nztl(uint t,uchar a)//逆时逐个同步亮 156 { 157 uchar i,j; 158 for(j=0;j<a;j++) 159 { 160 P0=P1=P2=P3=0xff; 161 for(i=0;i<8;i++) 162 { 163 P0=table1[i]; 164 P1=P2=P3=table[i]; 165 delay(t); 166 } 167 } 168 } 169 170 void sztm(uint t,uchar a)//顺时逐个同步灭 171 { 172 uchar i,j; 173 for(j=0;j<a;j++) 174 { 175 P0=P1=P2=P3=0x00; 176 for(i=0;i<8;i++) 177 { 178 P0=table2[i]; 179 P1=P2=P3=table3[i]; 180 delay(t); 181 } 182 } 183 } 184 185 186 void nztm(uint t,uchar a)//逆时逐个同步灭 187 { 188 uchar i,j; 189 for(j=0;j<a;j++) 190 { 191 P0=P1=P2=P3=0xff; 192 for(i=0;i<8;i++) 193 { 194 P0=table3[i]; 195 P1=P2=P3=table2[i]; 196 delay(t); 197 } 198 } 199 } 200 201 void hwzjl(uint t,uchar a) //横往中间亮 202 { 203 uchar i,j; 204 for (j=0;j<a;j++) 205 { 206 P0=P1=P2=P3=0xff; 207 for(i=0;i<8;i++) 208 { 209 P0=P2=P1=table1[i]; 210 P3=table[i];delay(t); 211 } 212 } 213 } 214 215 void hwzjm(uint t,uchar a) //横往中间灭 216 { 217 uchar i,j; 218 for (j=0;j<a;j++) 219 { 220 P0=P1=P2=P3=0x00; 221 for(i=0;i<8;i++) 222 { 223 P0=P2=P1=table3[i]; 224 P3=table2[i];delay(t); 225 } 226 } 227 } 228 void nzdl(uint t,uchar a) //逆时逐段亮 229 { 230 uchar i,j; 231 for (j=0;j<a;j++) 232 { 233 P0=P1=P2=P3=0xff; 234 for(i=0;i<8;i++) 235 { 236 P0=table1[i]; 237 delay(t); 238 } 239 P0=0xff; 240 for(i=0;i<8;i++) 241 { 242 P1=table[i]; 243 delay(t); 244 } 245 P1=0xff; 246 for(i=0;i<8;i++) 247 { 248 P3=table[i]; 249 delay(t); 250 } 251 P3=0xff; 252 for(i=0;i<8;i++) 253 { 254 P2=table[i]; 255 delay(t); 256 } 257 P2=0xff; 258 } 259 } 260 261 262 void nzdgl(uint t,uchar a) //逆时逐段一个点亮 263 { 264 uchar i,j,k,l; 265 for (j=0;j<a;j++) 266 { 267 k=table1[0]; 268 P0=k;l=table[0]; 269 P1=P2=P3=l;delay(t); 270 for(i=0;i<8;i++) 271 { 272 k=_crol_(k,-1); 273 P0=k; 274 l=_crol_(l,1); 275 P1=P2=P3=l; 276 delay(t); 277 } 278 } 279 } 280 281 282 void jgs(uint t,uchar a) //间隔闪 283 { 284 uchar j; 285 for (j=0;j<a;j++) 286 { 287 P0=0x55;P1=P2=P3=0xaa; 288 delay(t); 289 P0=0xaa;P1=P2=P3=0x55; 290 delay(t); 291 } 292 }
主函数代码部分
1 void main() 2 { 3 uchar i; 4 5 while(1) 6 { 7 zg(100,1); //两边逐个亮 8 lbzgm(100,1); //两边逐个灭 9 jgs(300,10); 10 djs(100,20); //对角闪 11 //// 12 P1=P2=P3=0xff; 13 for(i=0;i<3;i++) 14 { 15 P0=0x00;delay(800); 16 P0=0xff;delay(800); 17 } 18 P0=0x00; 19 for(i=0;i<3;i++) 20 { 21 P1=0x00;delay(800); 22 P1=0xff;delay(800); 23 } 24 P1=0x00; 25 for(i=0;i<3;i++) 26 { 27 P3=0x00;delay(800); 28 P3=0xff;delay(800); 29 } 30 P3=0x00; 31 for(i=0;i<3;i++) 32 { 33 P2=0x00;delay(800); 34 P2=0xff;delay(800); 35 } 36 qs(500,3); 37 38 39 40 / 41 42 for(i=0;i<6;i++) 43 { 44 zgxh(50,1); 45 nszgm(50,1); 46 } 47 djs(100,20); //对角闪 48 for(i=0;i<3;i++) 49 { 50 zg(100,1); //两边逐个亮 51 lbzgm(100,1); //两边逐个灭 52 } 53 54 qs(200,10);djs(100,50); 55 56 for(i=0;i<5;i++) 57 { 58 sztl(200,1); //顺时逐个同步亮 59 nztm(200,1); 60 nztl(200,1); 61 sztm(200,1); //顺时逐个同步灭 62 } 63 djs(300,10); //对角闪 64 nzdgl(300,10); //逆时逐段一个点亮 65 jgs(300,10); //间隔闪 66 for(i=0;i<3;i++) 67 { 68 zgxh(100,1); 69 nszgm(100,1); 70 } 71 nzdl(200,3); //逆时逐段亮 72 jgs(50,100); //间隔闪 73 nzdgl(50,40); //逆时逐段一个点亮 74 for(i=0;i<4;i++) 75 { 76 zg(100,1);qs(100,10); 77 lbzgm(100,1); 78 } 79 // djs(50,100); //对角闪 80 81 for(i=0;i<3;i++) 82 { 83 zgxh(100,1); 84 nszgm(100,1); 85 } 86 87 88 djs(1000,10); 89 for(i=0;i<10;i++) 90 { 91 hwzjl(200,1); //横往中间亮 92 hwzjm(200,1); //横往中间灭 93 } 94 djs(300,10); //对角闪 95 for(i=0;i<5;i++) 96 { 97 zgxh(100,1); 98 nszgm(100,1); 99 } 100 djs(100,20); //对角闪 101 zg(300,1); 102 lbzgm(300,1); 103 104 for(i=0;i<5;i++) 105 { 106 sztl(200,1); //顺时逐个同步亮 107 nztm(200,1); 108 nztl(200,1); 109 sztm(200,1); //顺时逐个同步灭 110 } 111 djs(500,20); //对角闪 112 djs(100,30); //对角闪 113 djs(50,50); //对角闪 114 // djs(10,100); //对角闪 115 delay(1000); 116 } 117 118 } 119 120 121 void delay(uint t) 122 { 123 uint x,y; 124 for (x=t;x>0;x--) 125 { 126 for (y=120;y>0;y--); 127 } 128 }
因为89C52的容量有限,所以还有几个方式注释掉了。