标题: 51单片机1602改变模式 程序问题请教 [打印本页]

作者: 许许许    时间: 2020-3-20 15:42
标题: 51单片机1602改变模式 程序问题请教
外部按键按“选择”时,光标跳到mode那里,可以切换模式,1~20。对应pon从50ms到1000ms。通过按模式+模式-来切换,用此来控制继电器上电时间。请问各位大神可以帮忙弄完整程序吗,50到1000ms递进我写在下面,可是切换模式太多错误了实在搞不懂,请大神帮忙



50~1000ms递进延时继电器,按键与定时器互锁。继电器延时期间锁按键

单片机源程序如下:

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char

sbit key=P1^0;
sbit OUT=P1^7;

uchar num=0;//键值变量
uchar flag=0;//中断标志

/***********定时器初始化****************/
void Timer0Init()                //50毫秒@12.000MHz
{
        TMOD |= 0x01;                //设置定时器模式
        TH0 = 0x3C;                        //设置定时初值
        TL0 = 0xB0;                        //设置定时初值
        TF0 = 0;                                //清除TF0标志
//        TR0 = 1;                                //定时器0开始计时
        EA = 1;                                //开总中断
        ET0 = 1;                                //开T0中断
}
/***********按键扫描程序****************/
void keyscan()        
{
        static uchar count=0;                //消抖计数变量                        
        static bit sign=0;                        //按键自锁标志
        if(key==0)                                                //检测键按下
        {                                       
                if(++count>=100 && sign==0 && TR0==0)//消抖/自锁/与定时器互锁
                {                        
                        sign=1;
                        num++;
                        if(num>20)
                                num=0;
                        if(num!=0)
                        {
                                TR0=1;//开定时器
                                OUT=0;//闭合继电器
                        }
                }
        }
        else //松手
        {
                count=0;                                        //消抖计数变量清0
                sign=0;                                        //按键自锁标志清0
        }
}
/***********主函数****************/
void main()
{
        Timer0Init();
        while(1)
        {
                keyscan();
        }
}
/***********中断服务程序****************/
void Timer0Interrupt() interrupt 1
{
        TH0 = 0x3C;
        TL0 = 0xB0;
        flag++;
        if(flag>=num)//50~1000ms递进
        {
                flag=0;
                OUT=1;//断开继电器
                TR0=0;//关定时器
        }
}
作者: 许许许    时间: 2020-3-20 15:43
继电器上电后再掉电,然后再上电。每个模式都会进行三次




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1