设为首页 收藏本站
开启辅助访问 切换到宽版

  找回密码
  立即注册

QQ登录

只需一步,快速开始

快捷导航
  • 论坛
  • 问答区
  • 单片机教程
  • 单片机DIY
  • 电子DIY
  • 帮助

热门: 51单片机 | 24小时必答区 | 单片机教程 | 单片机DIY制作 | STM32 | Cortex M3 | 模数电子 | 电子DIY制作 | 音响/功放 | 拆机乐园 | Arduino | 嵌入式OS | 程序设计

搜索
» 论坛 嵌入式/单片机论坛 24小时必答区 51单片机1602改变模式 程序问题请教
返回列表 发新帖
查看: 1045|回复: 1
收起左侧

51单片机1602改变模式 程序问题请教

[复制链接]
ID:693676 发表于 2020-3-20 15:42 来自手机 | 显示全部楼层 | 阅读模式
外部按键按“选择”时,光标跳到mode那里,可以切换模式,1~20。对应pon从50ms到1000ms。通过按模式+模式-来切换,用此来控制继电器上电时间。请问各位大神可以帮忙弄完整程序吗,50到1000ms递进我写在下面,可是切换模式太多错误了实在搞不懂,请大神帮忙

IMG_20200320_152826.jpg

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;//关定时器
        }
}
回复

使用道具 举报

ID:693676 发表于 2020-3-20 15:43 来自手机 | 显示全部楼层
继电器上电后再掉电,然后再上电。每个模式都会进行三次
回复

使用道具 举报

返回列表 发新帖
高级模式
B Color Image Link Quote Code Smilies
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版| 小黑屋| 51黑电子论坛 | 51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表