找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1794|回复: 12
打印 上一主题 下一主题
收起左侧

这单片机程序不按按键的情况下,怎么修改时间?

[复制链接]
跳转到指定楼层
楼主
ID:849826 发表于 2020-11-30 13:59 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
他这个程序是5分钟循环定时,这个5分钟是怎么设定的?如果不按按键,想改一下他这个5分钟设定的时间,应该改程序的那几句?改成10分钟或者其他时间,程序的复制别人的

//用定时器T0的中断实现长时间定时
#include<reg51.h> // 包含51单片机寄存器定义的头文件
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit K1=P3^5; //按一下,减5分钟--(原5分钟)
sbit K2=P3^4;//按一下,加5分钟--(原5分钟)
sbit D1=P3^2; //将D1位定义为P3.2引脚
sbit LED1=P3^3; //秒闪指示灯
unsigned char Countor,miao,min,shi,j; //设置全局变量,储存定时器T0中断次数

//延时
void DelayMS(uint ms)
{
uchar t;
while(ms--)for(t=0;t<120;t++);

}

/**************************************************************
函数功能:主函数
**************************************************************/
void main(void)
{
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x01; //使用定时器T0的模式2
TH0=(65536-50000)/256; //定时器T0的高8位赋初值
TL0=(65536-50000)%256; //定时器T0的高8位赋初值
TR0=1; //启动定时器T0
Countor=0; //从0开始累计中断次数
min=0;
j=0;
D1=1;
while(1)//无限循环等待中断
{

    if(K1==0)
    {
     while(K1==0);
     if(j>1)
     {
     j--;
     }
     if(j==0)
     {
         j=1;
     }
     DelayMS(200);
    }
   
    if(K2==0)
    {
     while(K2==0);
     if(j<99)
     {
     j++;
        if(j==99)
        {
        min=0;
        }
     }
     DelayMS(200);
    }


}
}
/**************************************************************
函数功能:定时器T0的中断服务程序
**************************************************************/
void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
Countor++; //中断次数自加1
if(Countor==20) //若累计满20次,即计时满1s
{
Countor=0; //将Countor清0,重新从0开始计数
LED1=~    LED1;
miao++;
if(miao==60)
{
    min++;
    if(min>=j)
    {
    D1=~D1;
    min=0;
    }
   
}



}
TH0=(65536-50000)/256; //定时器T0的高8位重新赋初值
TL0=(65536-50000)%256; //定时器T0的高8位重新赋初值
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:827243 发表于 2020-11-30 16:57 | 只看该作者
这不是5分钟的吧,看程序如果不按任何键,应该1分钟D1反转一次,按Kj1可以减小间隔,按K2增加间隔, j=0,1,2,3。。。 你直接在把 红框里j=0 改成 j=10 就是 10分钟了

回复

使用道具 举报

板凳
ID:849826 发表于 2020-11-30 19:50 来自手机 | 只看该作者
测试了一下,第一次上电1分零几秒D1输出低电平,然后大约4分多钟,状态反转一次,以后都是每隔4分多钟状态反转
回复

使用道具 举报

地板
ID:849826 发表于 2020-11-30 20:08 来自手机 | 只看该作者
加了按键提示音和状态反转提示音,就是时间还不对,上电大约1分零几秒状态第一次反转,然后都是每隔4分30几秒反转一次。为什么上电第一次是一分钟后状态反转,然后都是4分多钟反转一次呢?单片机型号STC15F104W
回复

使用道具 举报

5#
ID:849826 发表于 2020-11-30 20:10 来自手机 | 只看该作者
                                                 //用定时器T0的中断实现长时间定时
#include<reg52.h> // 包含51单片机寄存器定义的头文件
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit K1=P3^5; //按一下,减5分钟--(原5分钟)
sbit K2=P3^4;  //按一下,加5分钟--(原5分钟)
sbit D1=P3^2; //将D1位定义为P3.2引脚
sbit LED1=P3^3; //秒闪指示灯
sbit fm=P3^1;        //按键提示音+状态翻转提示音、
unsigned char Countor,miao,min,shi,j; //设置全局变量,储存定时器T0中断次数

//延时
void DelayMS(uint ms)
{
uchar t;
while(ms--)for(t=0;t<120;t++);

}

/**************************************************************
函数功能:主函数
**************************************************************/
void main(void)
{
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TMOD=0x01; //使用定时器T0的模式2
TH0=(65536-50000)/256; //定时器T0的高8位赋初值
TL0=(65536-50000)%256; //定时器T0的高8位赋初值
TR0=1; //启动定时器T0
Countor=0; //从0开始累计中断次数
min=0;
j=0;
D1=1;
while(1)//无限循环等待中断
{

        if(K1==0)
        {
           while(K1==0);
                   fm=0;   // 按键提示音
                   DelayMS(1000);
                   fm=1;
           if(j>1)
           {
           j--;
           }
           if(j==0)
           {
                   j=1;
           }
           DelayMS(200);
        }
      
        if(K2==0)
        {
           while(K2==0);
                         fm=0;        //按键提示音
                   DelayMS(1000);
                   fm=1;
           if(j<99)
           {
           j++;
                if(j==99)
                {
                  min=0;
                }
           }
           DelayMS(200);
        }


}
}
/**************************************************************
函数功能:定时器T0的中断服务程序
**************************************************************/
void Time0(void) interrupt 1 using 0 //“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
Countor++; //中断次数自加1
if(Countor==20) //若累计满20次,即计时满1s
{
Countor=0; //将Countor清0,重新从0开始计数
LED1=~        LED1;
miao++;
if(miao==60)
{
        min++;
        if(min>=j)
        {
          D1=~D1;
                   fm=0;  //状态翻转提示音,滴滴三声
                   DelayMS(1500);
                   fm=1;
                   DelayMS(2000);
                   fm=0;
                   DelayMS(1500);
                   fm=1;
                   DelayMS(2000);
                   fm=0;
                   DelayMS(3000);
                   fm=1;
                   DelayMS(1000);
                                    

          min=0;
        }
      
}



}
TH0=(65536-50000)/256; //定时器T0的高8位重新赋初值
TL0=(65536-50000)%256; //定时器T0的高8位重新赋初值
}
回复

使用道具 举报

6#
ID:849826 发表于 2020-11-30 20:11 来自手机 | 只看该作者
加了按键提示音,状态提示音
回复

使用道具 举报

7#
ID:849826 发表于 2020-11-30 20:27 来自手机 | 只看该作者
daemondong 发表于 2020-11-30 16:57
这不是5分钟的吧,看程序如果不按任何键,应该1分钟D1反转一次,按Kj1可以减小间隔,按K2增加间隔, j=0,1 ...

第一次是一分钟后状态输出,然后是每隔4分多钟翻转一次,怎么会这样呢?
回复

使用道具 举报

8#
ID:827243 发表于 2020-11-30 20:58 | 只看该作者
测试的很好,问题在于miao没清零,加 miao=0 在下面里

回复

使用道具 举报

9#
ID:849826 发表于 2020-11-30 22:55 来自手机 | 只看该作者
daemondong 发表于 2020-11-30 20:58
测试的很好,问题在于miao没清零,加 miao=0 在下面里

我再试试看
回复

使用道具 举报

10#
ID:771213 发表于 2020-12-1 08:09 | 只看该作者
把j=0 改成 j=10 就是 10分钟了
回复

使用道具 举报

11#
ID:849826 发表于 2020-12-1 10:00 来自手机 | 只看该作者
if(miao<59){miao=0;        添加这句就可以了,一分钟循环定时
回复

使用道具 举报

12#
ID:849826 发表于 2020-12-1 10:02 来自手机 | 只看该作者
daemondong 发表于 2020-11-30 20:58
测试的很好,问题在于miao没清零,加 miao=0 在下面里

按照你说的,秒清零就好了,试过了,一分钟循环定时,谢谢
回复

使用道具 举报

13#
ID:863028 发表于 2020-12-18 20:33 | 只看该作者
这个bai时间存储在单片机内du部,掉电不丢zhi失,是完全可以,STC89C52有内dao部EEPROM,就保存这zhuan里,根本就不需shu要什么外部器件。 只要定义一个变量,根本时间长短,定义成8位,或16位数。 按加和减按键时,就增加或减少这个变量,每次调节后就保存一次这个变量,即保存在EEPROM中,STC技术资料中有EEPROM读写例子程序。 然后开机后先读出保存在EEPROM中的数。 外部中断查询这个时间也没问题,其实就是由这个变量决定中断的次数吧,从面改变延时的时间长短吗。再用一个变量,对中断计数,当这个计数值等于保存的变量值就是延时到。这样,保存的变量值是可以调节的,也就调节了延时的时间了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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