×
单片机 > 单片机程序设计 > 详情

51单片机 漩涡流水点阵

发布时间:2020-06-15 发布时间:
|
  1. #include   

  2.   

  3. typedef unsigned char uchar;  

  4. typedef unsigned int uint;  

  5. typedef unsigned long ulong;  

  6.   

  7. sbit ADDR0 = P1^0;  

  8. sbit ADDR1 = P1^1;  

  9. sbit ADDR2 = P1^2;  

  10. sbit ADDR3 = P1^3;  

  11. sbit ENLED = P1^4;  

  12.   

  13. uchar image[8] = {  

  14.     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF  

  15. };  

  16. uchar T0RH, T0RL;  

  17. uint rate;  

  18.   

  19. void LEDScan();  

  20. void resetImage();  

  21. void configTmr0(uint ms1, uchar ms2);  

  22.   

  23. void main() {  

  24.     EA = 1;  

  25.     ADDR3 = 0;  

  26.     ENLED = 0;  

  27.     configTmr0(50, 2);  

  28.     while (1) ;  

  29. }  

  30.   

  31. void configTmr0(uint ms1, uchar ms2) {  

  32.     ulong tmp;  

  33.   

  34.     rate = ms1 / ms2;  

  35.   

  36.     tmp = 11059200 / 12;      //定时器计数频率  

  37.     tmp = (tmp * ms2) / 1000;  //计算所需的计数值  

  38.     tmp = 65536 - tmp;        //计算定时器重载值  

  39.     tmp = tmp + 12;           //补偿中断响应延时造成的误差  

  40.     T0RH = tmp >> 8;  //定时器重载值拆分为高低字节  

  41.     T0RL = tmp;  

  42.   

  43.     TMOD &= 0xF0;  

  44.     TMOD |= 0x01;     

  45.     TH0 = T0RH;       

  46.     TL0 = T0RL;  

  47.     ET0 = 1;          

  48.     TR0 = 1;         

  49. }  

  50.   

  51. #define LEDScan(); {    \  

  52.     static uchar i = 0;     \  

  53.     P0 = 0xFF;              \  

  54.     P1 = (P1 & 0xF8) | i;   \  

  55.     P0 = image[i];          \  

  56.     i = ++i & 0x07;         \  

  57. }  

  58.   

  59. void resetImage() {           

  60.     static uchar x = 0, y = 0;    

  61.                                   

  62.     image[y] ^= (0x80 >> x);    

  63.     if (x == 3 && y == 4) {       

  64.         x = 0;  

  65.         y = 0;  

  66.     }  

  67.     else if (y <= x + 1 && x + y 

  68.         x++;  

  69.     }  

  70.     else if (x + y >= 7 && y 

  71.         y++;  

  72.     }  

  73.     else if (y >= x && x + y > 7) {  

  74.         x--;  

  75.     }  

  76.     else  

  77.         y--;  

  78. }  

  79.   

  80. void interruptTmr0() interrupt 1 {  

  81.     static uint i = 0;  

  82.   

  83.     TH0 = T0RH;  

  84.     TL0 = T0RL;  

  85.     LEDScan();  

  86.     if (i == rate) {  

  87.         resetImage();  

  88.         i = 0;  

  89.     }  

  90.     else  

  91.         i++;  

  92. }  

双向流水:


  1. #include   

  2.   

  3. typedef unsigned char uchar;  

  4. typedef unsigned int uint;  

  5. typedef unsigned long ulong;  

  6.   

  7. sbit ADDR0 = P1^0;  

  8. sbit ADDR1 = P1^1;  

  9. sbit ADDR2 = P1^2;  

  10. sbit ADDR3 = P1^3;  

  11. sbit ENLED = P1^4;  

  12.   

  13. uchar image[8] = {  

  14.     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF  

  15. };  

  16. uchar T0RH, T0RL;  

  17. uint rate;  

  18.   

  19. void LEDScan();  

  20. void resetImage();  

  21. void configTmr0(uint ms1, uchar ms2);  

  22.   

  23. void main() {  

  24.     EA = 1;  

  25.     ADDR3 = 0;  

  26.     ENLED = 0;  

  27.     configTmr0(50, 2);  

  28.     while (1) ;  

  29. }  

  30.   

  31. void configTmr0(uint ms1, uchar ms2) {  

  32.     ulong tmp;  

  33.   

  34.     rate = ms1 / ms2;  

  35.   

  36.     tmp = 11059200 / 12;      //定时器计数频率  

  37.     tmp = (tmp * ms2) / 1000;  //计算所需的计数值  

  38.     tmp = 65536 - tmp;        //计算定时器重载值  

  39.     tmp = tmp + 12;           //补偿中断响应延时造成的误差  

  40.     T0RH = tmp >> 8;  //定时器重载值拆分为高低字节  

  41.     T0RL = tmp;  

  42.   

  43.     TMOD &= 0xF0;  

  44.     TMOD |= 0x01;     

  45.     TH0 = T0RH;       

  46.     TL0 = T0RL;  

  47.     ET0 = 1;          

  48.     TR0 = 1;         

  49. }  

  50.   

  51. #define LEDScan(); {    \  

  52.     static uchar i = 0;     \  

  53.     P0 = 0xFF;              \  

  54.     P1 = (P1 & 0xF8) | i;   \  

  55.     P0 = image[i];          \  

  56.     i = ++i & 0x07;         \  

  57. }  

  58.   

  59. void resetImage() {           

  60.     static uchar x = 0, y = 0;    

  61.                                   

  62.     image[y] ^= (0x80 >> x);  

  63.     image[7-y] ^= (0x01 <

  64.     if (x == 3 && y == 4) {  

  65.         x = 0;  

  66.         y = 0;  

  67.     }  

  68.     else if (y <= x+1 && x + y 

  69.         x++;  

  70.     else if (x + y >= 7 && y 

  71.         y++;  

  72.     else if (y >= x-1 && x + y > 7)  

  73.         x--;  

  74.     else  

  75.         y--;  

  76. }  

  77.   

  78. void interruptTmr0() interrupt 1 {  

  79.     static uint i = 0;  

  80.   

  81.     TH0 = T0RH;  

  82.     TL0 = T0RL;  

  83.     LEDScan();  

  84.     if (i == rate) {  

  85.         resetImage();  

  86.         i = 0;  

  87.     }  

  88.     else  

  89.         i++;  

  90. }  


关键字:51单片机  漩涡流水点阵 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯