打印
[51单片机]

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

[复制链接]
1787|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
舒斯特尔|  楼主 | 2015-8-27 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//.........................................
//内控自走程序
//CPU:STC12C2052
//主频:18.432MHZ(外部晶振144),内部晶振5MHZ
//日期:2008/11/30
//.........................................
#include <reg52.H>
#include <intrins.h>
#include <absacc.h>
#include <string.h>
#include<stdlib.h>                //产生随机数SAND();

#define        uchar   unsigned char
#define  uint    unsigned int
#define  T0_DAH  160;
#define  T0_DAL  160;
#define        Speed_Data        0x2;

void        delay(uint);
void        Out_Put (void);
void    Read_Pro1(void);
void    Read_Pro2(void);
void        Pwm_Out (void);
void        Read_Pro_R(uchar QW_Data1);
///////////////////////////////
//////////IO口定义/////////////
///////////////////////////////
sbit        ExPort1=P1^0;
sbit    ExPort8=P1^1;//2
sbit        ExPort7=P1^2;//8
sbit        ExPort6=P1^3;//7
sbit    ExPort5=P1^4;//6
sbit        ExPort4=P1^5;//5
sbit    ExPort3=P1^6;//4
sbit        ExPort2=P1^7;//3
sbit        Export9=P3^0;//
sbit        Export10=P3^1;//

//定义RAM

sfr           P1M0=0x91;
sfr                P1M1=0x92;
sfr           P3M0=0xB1;
sfr           P3M1=0xB2;
sfr                WDT_CONTR=0xe1;
sfr     ISP_TRIG=0xe6;
sfr     SPSTAT=0x84;
sfr                PCA_PWM0=0xf2;
sfr                unm1=0xf3;
sfr     unm2=0xf4;
sfr                unm3=0xf5;
sfr     unm4=0xf6;
sfr                unm5=0xf7;
sfr     unm6=0xf8;
bit     Time0_Flag;
       

uchar   Speed,Time0_Dec,Latch,Add_speed;
uchar   delay_X,Run_S,Run_S1;
uint    delay_z;
uchar        Display_Data[10];
/////////////////////////////////
//////////共十六等级/////////////
/////////////////////////////////
void        timer_0(void) interrupt 1                //共十六等级
                {       
                        Time0_Flag=1;
                        Time0_Dec--;
                }
//*************************************************//
//                  主函数功能                     //
//                主要产生花样数据                 //
//*************************************************//
void        main(void)
                {       
                  
/////////////////////////////////////////////////////
/////////////////IO口初始化//////////////////////////
/////////////////////////////////////////////////////
/*************************读入ID号******************/
                        P3M0=0x00;
                        P3M1=0x03;
                   memset(Display_Data,0x00,sizeof(Display_Data));
//产生一个随机字符型数据
                        TMOD=0x12;
                        TR1=1;
                delay_z = ((TH1<<8)|TL1)|((SBUF<<8)|ISP_TRIG)|((SPSTAT<<8)|PCA_PWM0);
                        rand();
                    srand(delay_z);
                        Run_S1=rand()/10;                                                                        //得到一个数据为25-35做为停留时间
                        Run_S=(uchar)Run_S1%10*2+15;
                        TMOD=0x02;                                                                                    //系统初始化
                        TH0=T0_DAH;
                        TL0=T0_DAH;
                        ET0=1;
                        EA=1;
                        TR0=1;
                        Time0_Flag=0;                                                                            //定时器0初始化
                        Speed=Speed_Data;
                        Time0_Dec=64;                       
                        while(1)
                        {       
                        Read_Pro1();
                        delay_z = ((TH1<<8)|TL1)|((SBUF<<8)|ISP_TRIG)|((SPSTAT<<8)|PCA_PWM0);
                    srand(delay_z);
                        rand();
                        Run_S=(uchar)((rand()%10)*2)+15;
                        }
                }
//*************************************************//
//               花样1:白间七彩右移渐变            //
//                对10MS到进行处理                 //
//*************************************************//
void   Read_Pro1(void)       
                {uchar j,i,B_W;
                Add_speed=1;
                memset(Display_Data,0x00,sizeof(Display_Data));
                for(i=4;i>0;i--)                          //1短
                        {if(i==4)B_W=64;
                        if(i==3)B_W=35;
                        if(i==2)B_W=10;
                        if(i==1)B_W=1;
                        Read_Pro_R(B_W);
                        }
                for(i=Run_S;i>0;i--)
                        {Read_Pro_R(0);
                        }

                for(j=0;j<2;j++)
                        {for(i=7;i>0;i--)                        //2长
                           {
                                if(i==7)B_W=64;
                                if(i==6)B_W=63;
                                if(i==5)B_W=62;
                                if(i==4)B_W=60;
                                if(i==3)B_W=55;
                                if(i==2)B_W=40;
                                if(i==1)B_W=15;
                                Read_Pro_R(B_W);
                                }
                        for(i=Run_S;i>0;i--)
                                {Read_Pro_R(0);
                                }
                        }
                for(j=0;j<2;j++)
                        {for(i=5;i>0;i--)                        //2中
                           {
                                if(i==5)B_W=64;
                                if(i==4)B_W=63;
                                if(i==3)B_W=55;
                                if(i==2)B_W=40;
                                if(i==1)B_W=15;
                                Read_Pro_R(B_W);
                                }
                        for(i=Run_S;i>0;i--)
                                {Read_Pro_R(0);
                                }
                        }
        }
//*************************************************//
void        Read_Pro_R(uchar QW_Data1)
                {   
                        Display_Data[9]=Display_Data[8];
                        Display_Data[8]=Display_Data[7];
                        Display_Data[7]=Display_Data[6];
                        Display_Data[6]=Display_Data[5];
                   Display_Data[5]=Display_Data[4];
                        Display_Data[4]=Display_Data[3];
                        Display_Data[3]=Display_Data[2];
                        Display_Data[2]=Display_Data[1];
                        Display_Data[1]=Display_Data[0];
                        Display_Data[0]=QW_Data1;
                        Out_Put();
                        Out_Put();
                        Out_Put();
                        Out_Put();
                        Out_Put();
                        Out_Put();
                }
//*************************************************//
//                 花样输出功能                    //
//                对10MS到进行处理                 //
//*************************************************//
void   Out_Put(void)
                {uchar S;
                bit Time0_Zear;
                for(S=0;S<Speed*Add_speed;S++)
                        {
                        Time0_Zear=1;
                        Time0_Flag=0;
                    while(Time0_Zear)
                            {
                             if(Time0_Flag)                                                                //中斷時間到,灰度輸出
                                    {
                                     Time0_Flag=0;
                                         WDT_CONTR=0x30;
                                     Pwm_Out();
                                    }
                             if(Time0_Dec==0)
                                    {EA=0;
                                     Time0_Zear=0;
                      Time0_Dec=64;
                                         TH0=T0_DAH;
                                         TL0=T0_DAH;
                                         EA=1;
                                    }
                            }
                }
           }
//***********
//*************************************************//
//                 PWM输出功能                     //
//    将Display_Data[]数组内数据与16等级进行比较   //
//*************************************************//
void        Pwm_Out ()
                {
                Latch=Time0_Dec;
                if(Display_Data[0]>Latch)    ExPort1=1;  else    ExPort1=0;
                if(Display_Data[1]>Latch)    ExPort2=1;  else    ExPort2=0;
                if(Display_Data[2]>Latch)    ExPort3=1;  else    ExPort3=0;
                if(Display_Data[3]>Latch)    ExPort4=1;  else    ExPort4=0;
                if(Display_Data[4]>Latch)    ExPort5=1;  else    ExPort5=0;
                if(Display_Data[5]>Latch)    ExPort6=1;  else    ExPort6=0;
                if(Display_Data[6]>Latch)    ExPort7=1;  else    ExPort7=0;
                if(Display_Data[7]>Latch)    ExPort8=1;  else    ExPort8=0;
                if(Display_Data[8]>Latch)    Export9=1;  else    Export9=0;
                if(Display_Data[9]>Latch)    Export10=1; else    Export10=0;
                }


相关帖子

沙发
追逐浪花| | 2015-8-28 09:05 | 只看该作者
流星灯和跑马灯还是有区别的吧

使用特权

评论回复
板凳
芙蓉洞| | 2015-8-29 15:01 | 只看该作者
做好了可以给孩子玩玩

使用特权

评论回复
地板
追逐浪花| | 2015-8-30 16:05 | 只看该作者
程序写的挺规范的啊

使用特权

评论回复
5
cowboy2014| | 2015-8-31 11:22 | 只看该作者
流星灯是不是随机闪烁的?

使用特权

评论回复
6
xia00| | 2015-8-31 19:37 | 只看该作者
程序确实挺规范的,要是有电路图和实物展示图就更好了。

使用特权

评论回复
7
lovecat2015| | 2015-8-31 20:19 | 只看该作者
自动的闪烁的并且是随机的吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

277

帖子

1

粉丝