[51单片机] 51单片机流星灯c语言源程序

[复制链接]
2319|6
 楼主| 舒斯特尔 发表于 2015-8-27 15:58 | 显示全部楼层 |阅读模式
  1. //.........................................
  2. //内控自走程序
  3. //CPU:STC12C2052
  4. //主频:18.432MHZ(外部晶振144),内部晶振5MHZ
  5. //日期:2008/11/30
  6. //.........................................
  7. #include <reg52.H>
  8. #include <intrins.h>
  9. #include <absacc.h>
  10. #include <string.h>
  11. #include<stdlib.h>                //产生随机数SAND();

  12. #define        uchar   unsigned char
  13. #define  uint    unsigned int
  14. #define  T0_DAH  160;
  15. #define  T0_DAL  160;
  16. #define        Speed_Data        0x2;

  17. void        delay(uint);
  18. void        Out_Put (void);
  19. void    Read_Pro1(void);
  20. void    Read_Pro2(void);
  21. void        Pwm_Out (void);
  22. void        Read_Pro_R(uchar QW_Data1);
  23. ///////////////////////////////
  24. //////////IO口定义/////////////
  25. ///////////////////////////////
  26. sbit        ExPort1=P1^0;
  27. sbit    ExPort8=P1^1;//2
  28. sbit        ExPort7=P1^2;//8
  29. sbit        ExPort6=P1^3;//7
  30. sbit    ExPort5=P1^4;//6
  31. sbit        ExPort4=P1^5;//5
  32. sbit    ExPort3=P1^6;//4
  33. sbit        ExPort2=P1^7;//3
  34. sbit        Export9=P3^0;//
  35. sbit        Export10=P3^1;//

  36. //定义RAM

  37. sfr           P1M0=0x91;
  38. sfr                P1M1=0x92;
  39. sfr           P3M0=0xB1;
  40. sfr           P3M1=0xB2;
  41. sfr                WDT_CONTR=0xe1;
  42. sfr     ISP_TRIG=0xe6;
  43. sfr     SPSTAT=0x84;
  44. sfr                PCA_PWM0=0xf2;
  45. sfr                unm1=0xf3;
  46. sfr     unm2=0xf4;
  47. sfr                unm3=0xf5;
  48. sfr     unm4=0xf6;
  49. sfr                unm5=0xf7;
  50. sfr     unm6=0xf8;
  51. bit     Time0_Flag;
  52.        

  53. uchar   Speed,Time0_Dec,Latch,Add_speed;
  54. uchar   delay_X,Run_S,Run_S1;
  55. uint    delay_z;
  56. uchar        Display_Data[10];
  57. /////////////////////////////////
  58. //////////共十六等级/////////////
  59. /////////////////////////////////
  60. void        timer_0(void) interrupt 1                //共十六等级
  61.                 {       
  62.                         Time0_Flag=1;
  63.                         Time0_Dec--;
  64.                 }
  65. //*************************************************//
  66. //                  主函数功能                     //
  67. //                主要产生花样数据                 //
  68. //*************************************************//
  69. void        main(void)
  70.                 {       
  71.                   
  72. /////////////////////////////////////////////////////
  73. /////////////////IO口初始化//////////////////////////
  74. /////////////////////////////////////////////////////
  75. /*************************读入ID号******************/
  76.                         P3M0=0x00;
  77.                         P3M1=0x03;
  78.                    memset(Display_Data,0x00,sizeof(Display_Data));
  79. //产生一个随机字符型数据
  80.                         TMOD=0x12;
  81.                         TR1=1;
  82.                 delay_z = ((TH1<<8)|TL1)|((SBUF<<8)|ISP_TRIG)|((SPSTAT<<8)|PCA_PWM0);
  83.                         rand();
  84.                     srand(delay_z);
  85.                         Run_S1=rand()/10;                                                                        //得到一个数据为25-35做为停留时间
  86.                         Run_S=(uchar)Run_S1%10*2+15;
  87.                         TMOD=0x02;                                                                                    //系统初始化
  88.                         TH0=T0_DAH;
  89.                         TL0=T0_DAH;
  90.                         ET0=1;
  91.                         EA=1;
  92.                         TR0=1;
  93.                         Time0_Flag=0;                                                                            //定时器0初始化
  94.                         Speed=Speed_Data;
  95.                         Time0_Dec=64;                       
  96.                         while(1)
  97.                         {       
  98.                         Read_Pro1();
  99.                         delay_z = ((TH1<<8)|TL1)|((SBUF<<8)|ISP_TRIG)|((SPSTAT<<8)|PCA_PWM0);
  100.                     srand(delay_z);
  101.                         rand();
  102.                         Run_S=(uchar)((rand()%10)*2)+15;
  103.                         }
  104.                 }
  105. //*************************************************//
  106. //               花样1:白间七彩右移渐变            //
  107. //                对10MS到进行处理                 //
  108. //*************************************************//
  109. void   Read_Pro1(void)       
  110.                 {uchar j,i,B_W;
  111.                 Add_speed=1;
  112.                 memset(Display_Data,0x00,sizeof(Display_Data));
  113.                 for(i=4;i>0;i--)                          //1短
  114.                         {if(i==4)B_W=64;
  115.                         if(i==3)B_W=35;
  116.                         if(i==2)B_W=10;
  117.                         if(i==1)B_W=1;
  118.                         Read_Pro_R(B_W);
  119.                         }
  120.                 for(i=Run_S;i>0;i--)
  121.                         {Read_Pro_R(0);
  122.                         }

  123.                 for(j=0;j<2;j++)
  124.                         {for(i=7;i>0;i--)                        //2长
  125.                            {
  126.                                 if(i==7)B_W=64;
  127.                                 if(i==6)B_W=63;
  128.                                 if(i==5)B_W=62;
  129.                                 if(i==4)B_W=60;
  130.                                 if(i==3)B_W=55;
  131.                                 if(i==2)B_W=40;
  132.                                 if(i==1)B_W=15;
  133.                                 Read_Pro_R(B_W);
  134.                                 }
  135.                         for(i=Run_S;i>0;i--)
  136.                                 {Read_Pro_R(0);
  137.                                 }
  138.                         }
  139.                 for(j=0;j<2;j++)
  140.                         {for(i=5;i>0;i--)                        //2中
  141.                            {
  142.                                 if(i==5)B_W=64;
  143.                                 if(i==4)B_W=63;
  144.                                 if(i==3)B_W=55;
  145.                                 if(i==2)B_W=40;
  146.                                 if(i==1)B_W=15;
  147.                                 Read_Pro_R(B_W);
  148.                                 }
  149.                         for(i=Run_S;i>0;i--)
  150.                                 {Read_Pro_R(0);
  151.                                 }
  152.                         }
  153.         }
  154. //*************************************************//
  155. void        Read_Pro_R(uchar QW_Data1)
  156.                 {   
  157.                         Display_Data[9]=Display_Data[8];
  158.                         Display_Data[8]=Display_Data[7];
  159.                         Display_Data[7]=Display_Data[6];
  160.                         Display_Data[6]=Display_Data[5];
  161.                    Display_Data[5]=Display_Data[4];
  162.                         Display_Data[4]=Display_Data[3];
  163.                         Display_Data[3]=Display_Data[2];
  164.                         Display_Data[2]=Display_Data[1];
  165.                         Display_Data[1]=Display_Data[0];
  166.                         Display_Data[0]=QW_Data1;
  167.                         Out_Put();
  168.                         Out_Put();
  169.                         Out_Put();
  170.                         Out_Put();
  171.                         Out_Put();
  172.                         Out_Put();
  173.                 }
  174. //*************************************************//
  175. //                 花样输出功能                    //
  176. //                对10MS到进行处理                 //
  177. //*************************************************//
  178. void   Out_Put(void)
  179.                 {uchar S;
  180.                 bit Time0_Zear;
  181.                 for(S=0;S<Speed*Add_speed;S++)
  182.                         {
  183.                         Time0_Zear=1;
  184.                         Time0_Flag=0;
  185.                     while(Time0_Zear)
  186.                             {
  187.                              if(Time0_Flag)                                                                //中斷時間到,灰度輸出
  188.                                     {
  189.                                      Time0_Flag=0;
  190.                                          WDT_CONTR=0x30;
  191.                                      Pwm_Out();
  192.                                     }
  193.                              if(Time0_Dec==0)
  194.                                     {EA=0;
  195.                                      Time0_Zear=0;
  196.                       Time0_Dec=64;
  197.                                          TH0=T0_DAH;
  198.                                          TL0=T0_DAH;
  199.                                          EA=1;
  200.                                     }
  201.                             }
  202.                 }
  203.            }
  204. //***********
  205. //*************************************************//
  206. //                 PWM输出功能                     //
  207. //    将Display_Data[]数组内数据与16等级进行比较   //
  208. //*************************************************//
  209. void        Pwm_Out ()
  210.                 {
  211.                 Latch=Time0_Dec;
  212.                 if(Display_Data[0]>Latch)    ExPort1=1;  else    ExPort1=0;
  213.                 if(Display_Data[1]>Latch)    ExPort2=1;  else    ExPort2=0;
  214.                 if(Display_Data[2]>Latch)    ExPort3=1;  else    ExPort3=0;
  215.                 if(Display_Data[3]>Latch)    ExPort4=1;  else    ExPort4=0;
  216.                 if(Display_Data[4]>Latch)    ExPort5=1;  else    ExPort5=0;
  217.                 if(Display_Data[5]>Latch)    ExPort6=1;  else    ExPort6=0;
  218.                 if(Display_Data[6]>Latch)    ExPort7=1;  else    ExPort7=0;
  219.                 if(Display_Data[7]>Latch)    ExPort8=1;  else    ExPort8=0;
  220.                 if(Display_Data[8]>Latch)    Export9=1;  else    Export9=0;
  221.                 if(Display_Data[9]>Latch)    Export10=1; else    Export10=0;
  222.                 }


追逐浪花 发表于 2015-8-28 09:05 | 显示全部楼层
流星灯和跑马灯还是有区别的吧
芙蓉洞 发表于 2015-8-29 15:01 | 显示全部楼层
做好了可以给孩子玩玩
追逐浪花 发表于 2015-8-30 16:05 | 显示全部楼层
程序写的挺规范的啊
cowboy2014 发表于 2015-8-31 11:22 | 显示全部楼层
流星灯是不是随机闪烁的?
xia00 发表于 2015-8-31 19:37 来自手机 | 显示全部楼层
程序确实挺规范的,要是有电路图和实物展示图就更好了。
lovecat2015 发表于 2015-8-31 20:19 | 显示全部楼层
自动的闪烁的并且是随机的吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

277

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部