标题:
请教单片机1-9小时定时程序怎样加启动和停止?
[打印本页]
作者:
芙蓉焊料
时间:
2023-9-20 11:53
标题:
请教单片机1-9小时定时程序怎样加启动和停止?
试着写了单片机程序,但不知如何加人启动和停止,定时器TR0为什么不能被其它函数调用呢?
js.JPG
(105.75 KB, 下载次数: 29)
下载附件
2023-9-20 11:49 上传
#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
(30.8 KB, 下载次数: 29)
下载附件
2023-9-20 14:07 上传
作者:
czhaii
时间:
2023-9-20 12:08
比较啊== >= <=
作者:
yzwzfyz
时间:
2023-9-21 09:14
先画个逻辑框图,理理思路,而后再写程序。
作者:
白白白白.白
时间:
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 //停止
//可以清除定时之类的
}
}
}
*/
作者:
wulin
时间:
2023-9-27 20:25
此2变量要加关键字static 为静态或声明全局变量,否则会乱套。
void Timer0_Rountiue() interrupt 1 //中断程序
{
static unsigned char tem_ms;
static unsigned int tem_s; //1秒
作者:
大漠落日
时间:
2023-9-28 08:33
很简单,按键控制一个变量,再去判断是否启动定时,关定时后,重按启动,清除原来的计时值,重启定时器,不难
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1