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

七彩灯综合C程序(我第一个案子)

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

/*此程序是一款普通的彩灯,它的功能主要有四种模式:
第一种模式:开机四种颜色以0.5秒速度循环1次,然后
在白颜色上停止循环,即显示白光
第二种模式:按下功
能键后,它以1秒速度四种颜色不停的循环
第三种模式:
当按键按下后,它会记住第二种模式的颜色,比如第二种
模式现在亮得是绿色,你按下按键时,它会先闪一下,然
后在绿颜色上停下来
第四模式:当你再按下开关时,它
自动回到模式一下,(当然还可以写出三种颜色)
 本程序是第一个版本,第二版功能更强大参见:
http://www.51hei.com/mcu/1531.html  */

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit RJ=P2^5;//红灯IO口
sbit GJ=P2^6;//绿灯IO口
sbit BJ=P2^7;//兰灯IO口
sbit key=P1^4;//按键IO口
uchar ding3,yin,x;//分别为定时器变量,标志位变量,以及颜色标志位变量
bit a=1,b,c;//分别为模式1.2.3标志位
/*******************************/
/***********延时子程序***********/
/*******************************/
void delay(uint z)
{
 uint x,y;
 for(x=100;x>0;x--)
 for(y=z;y>0;y--);
}
/*******************************/
/********按键处理子程序********/
/*******************************/
void sk()
{
 switch(yin)//执行一键多功能程序
 {
  case 0:if(key==0)//如果0与yin比较相等,则执行break前的所有内容
  {
   delay(100);//延时
   if(key==0)//再次确认是否有按下
   {
    yin++;//将变量加1,此句很重要,作用是以使下次按下时好执行下一开关语句
    a=0;//将a变为0
    c=0;
    b=1;//将b变为1,即打开按键程序中的第二段程序
    x=0;//清掉颜色计数变量,以便它从红色开始循环
    while(!key);//按键放开了吗?
   }
  }
  break;//退出开关语句
  case 1: if(key==0)//如果1与yin比较相等,则执行大括号内容
  {
   delay(100);//延时
   if(key==0)//再次确认是否有按下
   {
    yin++;//将变量加1,此句很重要,作用是以使下次按下时好执行下一开关语句
    b=0;
    c=1;//打开第三种模式标志位,即锁定状态
    a=0;
    x=0;//清掉颜色计数变量,以便它从红色开始循环
    while(!key);//按键放开了吗?
   }
  }
  break;//退出开关语句
  case 2: if(key==0)//如果2与yin比较相等,则执行大括号内容
  {
   delay(100);//延时
   if(key==0)//再次确认是否有按下
   {
    b=0;//将b变为0,即关闭上一次功能
    c=0;//关闭上前面的功能
    a=1;//打开第1次功能,即0.5秒循环闪烁
    yin=0;
    x=0;//清掉颜色计数变量,以便它从红色开始循环
    while(!key);//按键放开了吗?
   } 
  }
  break;//退出开关语句
 }
}
/*******************************/
/*******三种模式显示子程序******/
/*******************************/
void xian()
{
 uchar m;//模式3变量
 if(a!=0)//第一种模式以0.5秒速度循环闪烁一次,然后在白光处停下来
 {
  if(ding3>=10)//定时器到了0.5秒吗?
  {
   ding3=0;
   x++;//将标志位加1,以便进入下一种颜色
   switch(x)
   {
    case 1:RJ=1;GJ=0;BJ=0;//亮红光  
    break;
    case 2:RJ=0;GJ=1;BJ=0;//亮绿光  
    break;
    case 3:RJ=0;GJ=0;BJ=1;//亮兰光  
    break;
    case 4:RJ=1;GJ=1;BJ=1;a=0;//亮白光,//将标志位a清0,以便再次循环  
    break;
   }

  }
 }
 if(b!=0)//第二种模式以1秒速度一直循环闪烁。
 {
  if(ding3>=20)
  {
   ding3=0;
   x++;
   switch(x)
   {
    case 1:RJ=1;GJ=0;BJ=0;m=x;//将x变量内给m保存起来,以便进入模式三时能准确的锁定一种状态
    break;
    case 2:RJ=0;GJ=1;BJ=0;m=x;
    break;
    case 3:RJ=0;GJ=0;BJ=1;m=x;
    break;
    case 4:RJ=1;GJ=1;BJ=1;m=x;x=0;
    break;
   }
  }
 }
 if(c!=0)//第三种模式记住模式二时按键按下的颜色,然后锁定。
 {
  RJ=0;GJ=0;BJ=0;
  delay(550);
  switch(m)//判断上一次模式三的状态,然后确定显示哪种颜色
  {
   case 1:RJ=1;GJ=0;BJ=0;
   break;
   case 2:RJ=0;GJ=1;BJ=0;
   break;
   case 3:RJ=0;GJ=0;BJ=1;
   break;
   case 4:RJ=1;GJ=1;BJ=1;
   break;
  }
  c=0;//将标志位清0,以便再次循环
 }
}
/*******************************/
/*************主程序************/
/*******************************/
void main()
{
 RJ=0;//将R LED关闭
 GJ=0;//将G LED关闭
 BJ=0;//将B LED关闭
 TMOD=0X01;//寄存器工作方式
 EA=1;//开总中断
 TR0=1;//开定时器
 ET0=1;//开定时器中断
 TH0=(65536-50000)/256;//赋值给高位
 TL0=(65536-50000)%256;//赋值给低位
 while(1)
 {
  sk();//调用按键子程序
  xian();//调用显示子程序
 }   
}
void zhong() interrupt 1//T1中断服务程序
{
 TH0=(65536-50000)/256;//赋值给高位
 TL0=(65536-50000)%256;//赋值给低位
 ding3++;//将按键计数器加1
}

关闭窗口

相关文章