• 赞助网站
  • 您的位置:  首页 >> 技术交流区 >> MCU技术 >> 高手帮我看看错在哪里
    高手帮我看看错在哪里
    2016年06月10日 点击: 编辑: 数码爱好者

    #include <reg52.h>


    typedef unsigned char u8;
    typedef unsigned short int u16;
    typedef unsigned long int u32;


    sbit RELAY = P1^4;  //定义继电器使用的IO口
    sbit K1    = P0^0;  //定义按键使用的IO口


    //定时器1重载值:10毫秒@11.0592MHz
    #define TL1_ReloadValue 0x00
    #define TH1_ReloadValue 0xDC
    void Timer1Init(void)        
    {
        AUXR &= 0xBF;        //定时器时钟12T模式
        TMOD &= 0x0F;        //设置定时器模式
        TMOD |= 0x10;        //设置定时器模式
        TL1 = TL1_ReloadValue;    //设置定时初值
        TH1 = TH1_ReloadValue;    //设置定时初值
        TF1 = 0;        //清除TF1标志
        TR1 = 1;        //定时器1开始计时/
    }


    void Timer1_Handler(void) interrupt 3 //定时器1中断服务程序
    {
        //重装定时1:
        TL1 = TL1_ReloadValue;    
        TH1 = TH1_ReloadValue;
        TF1=0;//清除定时器1中断标记
        cnt10ms++;//累加1个10ms计数器,供主程序使用
    }


    void main()
    {
        u8 step=0;//状态机
        Timer1Init();//10毫秒@11.0592MHz
        ET1=1;    //允许定时器1中断
        EA=1;     //允许总中断


        cnt10ms=0;//10ms计数器清零
        while(1)//大循环
        {
            //处理按键和继电器状态机:
            switch(step)
            {
                case 0://等待按键启动
                {
                    if(K1 == 0)//如果按键按下,则启动一个继电器动作
                    {
                        RELAY = 0; //打开继电器
                        cnt10ms=0;//10ms计数器清零
                        step = 1;//下一步:继电器动作,并保持设定的时间
                    }
                    else
                    {
                        RELAY = 1; //关闭继电器
                    }
                    break;
                }
                case 1://继电器动作,并保持设定的时间
                {
                    if(cnt10ms < (3600*100))//还没到1小时
                    {
                        RELAY = 0; //打开继电器
                    }
                    else//超过1小时
                    {
                        RELAY = 1; //关闭继电器
                        step = 0;//回到等待按键启动状态
                    }
                    break;
                }
                default://错误状态,只要硬件不出错,永远不会执行到这里
                {
                    step = 0;//回到等待按键启动状态
                    break;
                }
            }
        }
    }
    赞助网站 | 关于我们 | 版权声明 | 站点导航 | 收藏本站 | 设为首页