yao1 发表于 2011-10-21 17:54:55

1按键多功能

//1按键多功能
//第1次按下:红黄绿全亮    第2次按下:红黄绿依次间隔1S点亮第3次按下:红黄绿间隔4秒依次渐亮渐暗变化
//记忆上面3状态 关机重启能读出上次掉电时的状态

#include<reg51.h>
#include"24c02.h"
#define uchar unsigned char
#define uintunsigned int
sbit led_k=P1^4;
sbit a1=P1^0;
sbit a2=P1^1;
sbit a3=P1^2;
sbit a4=P1^3;
sbit led_red   =P0^0;   
sbit led_yellow=P0^1;   
sbit led_green =P0^2;   
sbit k=P3^3;

unsigned int t1=0;
unsigned char t=0,num,num1,count=0;
void keycount();

void delay1ms(unsigned int z)
{      
    unsigned int x,y;
       for(x=z;x>0;x--)
                for(y=120;y>0;y--);       
}

main()
{   
   init();               //i2c初始化
   count=read_add(2);   //首次上电读出记忆的状态
   TMOD=0X11;
   TH0=(65536-10000)/256;
   TL0=(65536-10000)%256;
   TH1=(65536-10000)/256;
   TL1=(65536-10000)%256;
   EA=1;
   ET0=1;
   ET1=1;   
   led_k=1;/*打开6个led的总开关*/
   a1=a2=a3=a4=0;/*关闭数码管,否则数码管会拉低P0口电平,导致流水灯不亮*/
   P0=0;
   
   while(1)
   {         
          keycount();            
   }
}

void keycount()
{
   if(k==0)
   {
         delay1ms(10);
         if(k==0)
         {
               count++;
               if(count>=4)
               {
                     count=1;
               }
               write_add(2,count);//按键状态记忆         
         }
         while(k==0);
   }
   switch(count)
   {
          case 1:{ TR0=0;TR1=0; led_red=led_yellow=led_green=1; } break;
          case 2:{ TR0=1;TR1=0; } break;
          case 3:{ TR0=0;TR1=1; } break;
   }

}

void t_0() interrupt 1
{
       TH0=(65536-10000)/256;
       TL0=(65536-10000)%256;
       num++;      
       if(num>=100)
       {
             num=0;
             t++;
       }
       if(t<1)
       {
             led_red=1; led_yellow=0;led_green=0;
       }
       else if((t>=1)&&(t<2))
       {
             led_red=0; led_yellow=1;led_green=0;
       }
       else if((t>=2)&&(t<3))
       {
             led_red=0; led_yellow=0;led_green=1;               
       }
       else if(t>=3)
       {
             t=0;            
       }                                          
}            

void t_1() interrupt 3
{   
   //定义亮度变化范围为0~99(100等分).即最亮的时候其灰度等级为99,为0的时候最暗,也就是熄灭了。   
      static PWM = 0;   //PWM初始为0
      static Direction = 0 ;//LED方向控制 (0:渐亮 )   (1:渐灭)
      static PWMCounter= 0 ; //LED占空比计数(0~99变化)
      TH1=(65536-200)/256;//计数寄存器高8位重新载入
          TL1=(65536-200)%256; //计数寄存器低8位重新载入       200us
      num1++;
      if(num1>=100)      //每20ms调整一下LED的占空比
      {
            num1=0;
            t1++;      
            if((PWMCounter <=99) &&(Direction==0))//如果是渐亮方向变化,则占空比递增(2S时间100等分)
            {                                    //20MS * 100 = 2S的时间内LED从暗逐渐变亮
                  PWMCounter++;
                  if(PWMCounter > 99)
                  {
                        Direction = 1 ;
                        PWMCounter= 99 ;               
                  }            
            }      
            if( (PWMCounter >= 0) &&(Direction==1) ) //如果是渐暗方向变化,则占空比递减
            {                                       //20MS * 100 = 2S的时间内LED从亮逐渐变暗
                  PWMCounter-- ;
                  if(PWMCounter < 0)
                  {
                        Direction = 0 ;
                        PWMCounter= 0 ;               
                  }   
            }
            PWM = PWMCounter ;//获取LED的占空比            
                                       
      }
      if(t1<200)      //0~4秒红变化
      {
            if(PWM > 0) //占空比大于0,则点亮LED,否则熄灭LED
            {
                  led_red=1; led_yellow=0;led_green=0;
                  PWM-- ;
            }
            else   P0=0;   
      }
      else if((t1>=200)&&(t1<400))   //4~8秒黄变化
      {
             if(PWM > 0) //占空比大于0,则点亮LED,否则熄灭LED
             {
                  led_red=0; led_yellow=1;led_green=0;
                  PWM-- ;
             }
             else   P0=0;   
      }
      else if((t1>=400)&&(t1<600))      //8~12秒绿变化
      {
            if(PWM > 0) //占空比大于0,则点亮LED,否则熄灭LED
            {
                   led_red=0; led_yellow=0;led_green=1;
                   PWM-- ;
            }
            else   P0=0;                  
      }
      else if(t1>=600)      //大于12秒清零
      {
         t1=0;
         Direction = 0 ; //渐亮方向变化
         PWMCounter= 0; //占空比清零      
      }               
                                 
}

yao1 发表于 2011-10-21 17:58:57

回复【楼主位】yao1
-----------------------------------------------------------------------
//24CO2函数
#include<reg51.h>
#define uchar unsigned char
#define uintunsigned int
sbit sda=P1^6;
sbit scl=P1^5;

void delay0()
{ ;; }
void start()//开始信号
{       
        sda=1;
        delay0();
        scl=1;
        delay0();
        sda=0;
        delay0();
}

void stop()   //停止
{
        sda=0;
        delay0();
        scl=1;
        delay0();
        sda=1;
        delay0();
}

void respons()//应答
{
        uchar i;
        scl=1;
        delay0();
        while((sda==1)&&(i<250))i++;
        scl=0;
        delay0();
}

void init()
{
        sda=1;
        delay0();
        scl=1;
        delay0();
}

void write_byte(uchar date)
{
        uchar i,temp;
        temp=date;


        for(i=0;i<8;i++)
        {
                temp=temp<<1;
                scl=0;
          delay0();
                sda=CY;
                delay0();
                scl=1;
                delay0();
        }
        scl=0;
        delay0();
        sda=1;
        delay0();
}

uchar read_byte()
{
        uchar i,k;
        scl=0;
        delay0();
        sda=1;
        delay0();
        for(i=0;i<8;i++)
        {
                scl=1;
                delay0();       
                k=(k<<1)|sda;
                scl=0;
                delay0();       
        }
        return k;
}

void write_add(uchar address,uchar date)
{
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        write_byte(date);
        respons();
        stop();
}

uchar read_add(uchar address)
{
        uchar date;
        start();
        write_byte(0xa0);
        respons();
        write_byte(address);
        respons();
        start();
        write_byte(0xa1);
        respons();
        date=read_byte();
        stop();
        return date;
}

/*24c02.h文件
#ifndef _24C02_H_
#define _24C02_H_

extern void init() ;
extern unsigned char read_add(unsigned char address) ;
extern void write_add(unsigned char address,unsigned char date) ;

#endif
*/

LINER 发表于 2011-10-23 19:28:43

顶一下!

yangexiaosa 发表于 2011-10-23 21:03:10

顶一下,支持。。

yao1 发表于 2011-10-24 09:11:26

俺是菜鸟 学单片机才几个月 这个程序是我看到 电子工程师之家的大虾“红金龙吸味”写的
“从单片机初学者迈向单片机工程师”之LED主题讨论周第四章----渐明渐暗的灯
写的 论坛也有转帖 感谢! 所以程序这部分注释很详细 24C02是郭天祥的程序

cuikai12345 发表于 2011-10-24 09:46:19

mark

15170242253 发表于 2011-10-25 11:37:42

太长了我是初学者看不懂。。。。。。

xts 发表于 2012-9-28 12:09:26

顶上,下回拿个24C02试试
页: [1]
查看完整版本: 1按键多功能