找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1510|回复: 5
收起左侧

请教单片机1-9小时定时程序怎样加启动和停止?

[复制链接]
ID:891876 发表于 2023-9-20 11:53 | 显示全部楼层 |阅读模式
试着写了单片机程序,但不知如何加人启动和停止,定时器TR0为什么不能被其它函数调用呢?

js.JPG
#include <REGX52.H>
#include<intrins.h>
#include"Delay.h" //延时函数申明
unsigned char tem_key=0; //按键+次数
unsigned char tem_min;//1分
unsigned char tem; //中间变量
unsigned char        timing_time; //定时时间
sbit key=P1^0; //按键定义
sbit LED=P1^1; //定时工作指示

unsigned char smgxs[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管编码

void Key()  //按键函数
{
        if(key==0)
         {
                 Delay(20);
                 while(key==0);
                 Delay(20);
                 tem_key++;
               
         if(tem_key>=10)  //0-9值循环
                {
                        tem_key=0;
                }
                 tem=tem_key;
                 timing_time=(tem*60); //显示值*60分钟
        }
}
void T0Init(void)                //50毫秒@11.0592MHz
{
        TMOD=0x01;                //设置定时器模式
        TL0 = 0x00;                //设置定时初始值
        TH0 = 0x4C;                //设置定时初始值
        TF0 = 0;        //清除TF0标志
        ET0=1;
        EA=1;
        TR0 = 1;                //T0开始计时
}
void Timer0_Rountiue() interrupt 1 //中断程序
{
        unsigned char tem_ms;
        unsigned int tem_s; //1秒
        TL0 = 0x00;                //重装初始值
        TH0 = 0x4C;                //重装初始值
        tem_ms++;
        if(tem_ms==20)
        {
                tem_s++; //秒
                tem_ms=0;
                LED=~LED;
        }
        if(tem_s==3600)
        {
                tem_min++;  //分
                tem_s=0;
        }
}
void main()
{
        T0Init(); //T0初始化
        while(1)
        {
                Key();
                P0=smgxs[tem_key]; //显示送P0
                if(timing_time==tem_min) //时间到
                {
                        tem_min=0; //时间到清零
                        //执行程序。。。
                }
        }
}

75行加上定时器没起作用,开机就执行程序了,是什么原因?

3.JPG






回复

使用道具 举报

ID:140644 发表于 2023-9-20 12:08 | 显示全部楼层
比较啊==  >=  <=
回复

使用道具 举报

ID:123289 发表于 2023-9-21 09:14 | 显示全部楼层
先画个逻辑框图,理理思路,而后再写程序。
回复

使用道具 举报

ID:642276 发表于 2023-9-27 12:10 | 显示全部楼层
/*
uint8        time10ms_count = 0;
uint8        time1s_count = 0;
bit                time10ms_flag = 0;
bit                time1s_flag = 0;
定时中断函数  //1ms进入一次
{
        if(++time10ms_count>10)
        {
                time10ms_count = 0;
                time10ms_flag = 1;                //10ms标志
                if(++time1s_count>100)
                {
                        time1s_count = 0;
                        time1s_flag = 1;        //1s标志
                }
        }
}
uint8        key_value = 0;
uint8        key_count = 0;
bit         key_flag = 0;
按键判断函数  //10ms跑一次
{
        if(!key)
        {
                if(key_count<100)
                {
                        if(++key_count>100)
                        {
                                key_count = 100;
                                key_flag = !key_flag;                //长按启动 暂停标志
                        }                       
                }
        }
        else
        {
                if(key_count>2&&key_count<50)                //按下时间大于20ms小于500ms判断为点击
                {
                        if(++key_value>9)                //键值加加
                                key_value = 0;
                }
                key_count = 0;               
        }
}
uint8 time = 0;
uint16 time_count = 0;
uint8        time_s = 0;
定时时间函数  //1s跑一次
{
        if(key_value==time)
        {
                ;
        }
        else
        {
                time_s = 0;                //重新计时
                time = key_value;        //赋值定时
        }
        if(time>0)               
        {
                if(++time_count>3600)
                {
                        time_count = 0;
                        if(++time_s>=time)
                        {
                                time_s = 0;        //定时时间到

                        }
                }
        }
}

void main()
{
        while(1)
        {
                if(time10ms_flag)
                {
                        time10ms_flag = 0;
                        按键判断函数 ; //10ms跑一次
                }
                if(time1s_flag)
                {
                        time1s_flag = 0;
                        if(key_flag)                //启动
                                定时时间函数 ; //1s跑一次
                        else  //停止
                        //可以清除定时之类的
                }
        }
}

*/
回复

使用道具 举报

ID:213173 发表于 2023-9-27 20:25 | 显示全部楼层
此2变量要加关键字static 为静态或声明全局变量,否则会乱套。
void Timer0_Rountiue() interrupt 1 //中断程序
{
        static unsigned char tem_ms;
        static unsigned int tem_s; //1秒
回复

使用道具 举报

ID:195496 发表于 2023-9-28 08:33 | 显示全部楼层
很简单,按键控制一个变量,再去判断是否启动定时,关定时后,重按启动,清除原来的计时值,重启定时器,不难
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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