专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

手动可调变速的流水灯程序

作者:佚名   来源:本站原创   点击数:  更新时间:2014年03月15日   【字体:

/*********** 2011.7 JQ--V0.1 宏晶公司STC单片机开发板 ************

$ 程序作用:手动可调变速的流水灯的效果

$ 程序作者: JQ(QQ:489555226  Email:489555226@qq.com)

$ 程序版本: JQ--V0.1

$ 编制日期: 2011-07-01

$ 编译器:Keil C uVision2

$ 所用芯片:STC89C52,11.0592M晶振

$ 程序开发板:JQ--V0.1版本

$ 程序通俗易懂  注释详细  结构化模块是51单片机初学爱好者的理想选择

******************** JQ--V0.1 宏晶公司STC单片机开发板 **********************/

#include<reg52.h>      //52单片机头文件定义

#define uchar unsigned char    //数据类型uchar的宏定义
#define uint  unsigned int   //数据类型uint的宏定义

#define led P0          //P0口宏定义
void init();
uchar count,speed,num;  //全局变量定义

sbit key =P3^2;

void delay(uint k);

uchar code huayang[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,};//0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0x55,0x55,0x00};   //花样跑马灯数组定义  随便改变数组里面的值就可以改变花样(该数组有27个数值)
void main(void)   //主函数
{
 uchar i;
 init();
 while(1)         //while死循环
 {
  for(i=0;i<8;i++)     //0-26共27次循环依次取出数组中的数(i小于多少由数组中的数决定)
  {
   led=huayang[i];   //把取出的数以总线的方式赋给led即P0口
  }
 }
}

 

void init()   //初始化
{
 speed=0;
 TMOD=0x01;   //定时器T0的应用   后面会详细讲
 TH0=(65536-speed)/256;
 TL0=(65536-speed)%256;
 EA=1;
 ET0=1;
 TR0=1;
}


void timer0() interrupt 1   //定时器T0中断   后面会详细讲
{
  TH0=(65536-speed)/256;
  TL0=(65536-speed)%256;
  count++;
  if(count==5000)
  {
   count=0;

   if(key==0)      //按键消抖
   { delay(5);
    if(key==0)
     num++;
     while(!key);   //松手检测  只要当key==1时才会退出这个while循环!

     if(num==1)
     {
      speed=50;  //速度调节(也就是改变定时器的初值!)
     }

     if(num==2)
     {
      speed=100;
     }

     if(num==3)
     {
      speed=150;
     }
    

     if(num==4)
     {
      speed=200;
     }
   }
  }
 if(num==5)  num=0;
 
}

 
void delay(uint k)   //延时子函数
{
   while(--k);
}


//这过程序用到了定时器  后面会跟大家详细讲解的! 谢谢大家!!!
//对于调速函数可以进行修改,使其变得更加的简洁,speed=num*50;if(num==6)  num=0;//防止程序出错,所以进行了限制!

关闭窗口

相关文章