一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 2835|回复: 4
收起左侧

[其他综合] 简易定时器程序求助

[复制链接]
发表于 2011-1-7 20:49 | 显示全部楼层 |阅读模式
找到一个低功耗厨房用圆盘式LED定时器,http://www.cdle.net/web/alldata/CDLE/cdle090001.htm照原样做了一个。它开机默认的时间是5分钟,想改成20分钟的,可是不知道在哪里改。请各位高手帮帮忙!
#include <AT89X051.h>
#define KEY P3_5
#define POW P3_7
#define SON P3_4
static bit State_b;     //此值为1时说明定时开始了
static unsigned int StateT_i;   //此标识值为设置后按键松开的时标
static unsigned char Time_c;    //定时目标值 每单位5分种
static unsigned int TimeCountS_i;  //当前秒值 每单位20MS
static unsigned char TimeCountM_c; //当前分值 每5分清0
static unsigned char TimeCountCM_c; //现走时,每单位5分
static unsigned char Flash_c;         //闪烁计时
static unsigned char Cyc_c;  //圆周显示计时
static unsigned char CycN_c;
void DelayNms(unsigned int MS_i);
void InitMCU(void);
void Display(unsigned char LED_c);
void main(void)
{
P1 = 0x00; //开机全LED亮2秒
P3 = 0xF0;
DelayNms(2000);
InitMCU();
while(1);
}
void InitMCU(void)
{
EA = 1;     //允许CPU中断
ET0 = 1;     //定时器0中断打开
TMOD = 0x1;   //设定时器0为模式1,16位模式
TH0=0xB1;
TL0=0xDF;    //设定时值为20000us(20ms)
TR0 = 1;    //开始定时
State_b = 0;
Time_c = 1;   //开机定时值为5分钟
TimeCountS_i = 0;
TimeCountM_c = 0;
TimeCountCM_c = 0;
Flash_c = 0;
CycN_c = 0;
  Cyc_c = 0;
}
void Time0(void) interrupt 1
{
unsigned int Temp;
TH0=0xB2;     //已修正35us
TL0=0x02;    //设定时值为20000us(20ms)
Flash_c++;
if (Flash_c > 100)
  Flash_c = 0;
Cyc_c++;
if (Cyc_c > 25)
  Cyc_c = 0;
if (State_b==0)
  StateT_i++;    //设置时标计数
else
  TimeCountS_i++;  //走时时标计数
if (TimeCountS_i > 3000)
  {
   TimeCountM_c++;   //分值进1
   TimeCountS_i = 0;  //毫秒值清零
  }
if (TimeCountM_c == 5)
  {
   TimeCountCM_c++;   //5分值进1
   TimeCountM_c = 0;  //分值清零
  }
if (Time_c == TimeCountCM_c) //时间到
  {
   SON = 0; //响铃20秒
   for(Temp=0; Temp<200; Temp++)
    {
     DelayNms(100);
     if (KEY == 0)
      Temp = 300; //当有按键时退出 无防抖必要
    }
   
   POW = 0;  //控制电路断电
  }
if (StateT_i == 200) //定时值设定后4秒或开机4秒,自动转入走时
  State_b = 1;
if (KEY == 0)
  {         
   DelayNms(30);  //延时30ms
   if (KEY == 0) //按键生效
    {
     if (State_b)  //当前状态在走时中
      {
       POW = 0;  //控制电路断电
       while(1); //这里电路已失电停止动作了
      }
     else
      {
       //当前状态是设置状态时
       Time_c++;     //定时值加1
       if (Time_c > 12)
        Time_c = 1;
       StateT_i = 0;  //清除计数标识
      }  
    }
   DelayNms(300);  //延时300ms
  }
if (State_b)
  {
   if (CycN_c == 12)
    CycN_c = 0;  //一圈
     
   if (Cyc_c == 0)
    CycN_c++;
   
   Display(CycN_c);
   if (Flash_c > 50) //闪烁,当前走时处理
    Display(TimeCountCM_c);
  }
Display(Time_c);   //目标定时值显示

DelayNms(4);
  P1 = 0xFF;
P3 = P3 | 0x0F; //关显示
}
void DelayNms(unsigned int MS_i)
{
unsigned char Temp_i;
for(; MS_i > 0; MS_i--)
for(Temp_i = 0; Temp_i < 255; Temp_i++);
}
void Display(unsigned char LED_c)
{
switch (LED_c)
  {
   case 1: P1_1 = 0;
    break;
   case 2: P1_2 = 0;
    break;
   case 3: P1_3 = 0;
    break;
   case 4: P1_4 = 0;
    break;
   case 5: P1_5 = 0;
    break;
   case 6: P1_6 = 0;
    break;
   case 7: P1_7 = 0;
    break;
   case 8: P3_0 = 0;
    break;
   case 9: P3_1 = 0;
    break;
   case 10: P3_2 = 0;
    break;
   case 11: P3_3 = 0;
    break;
   case 12: P1_0 = 0;
    break;
   case 0: P1_0 = 0;
    break;
  }
}
发表于 2011-1-19 20:49 | 显示全部楼层
Time_c = 1;   //开机定时值为5分钟
可能是这个。把1改为4看看
 楼主| 发表于 2011-1-19 20:55 | 显示全部楼层
先谢谢了!不过我试了一下,运行时没有一点变化!和原来一样的!
发表于 2011-1-19 21:36 | 显示全部楼层
if (TimeCountM_c == 5)
{   TimeCountCM_c++;   //5分值进1  
TimeCountM_c = 0;  //分值清零
  }
TimeCountM_c == 20 看看
客官来玩啊。
 楼主| 发表于 2011-1-23 19:31 | 显示全部楼层
由于东西已经送人了,所以暂时无法试验。我会尽量抽时间搭一个电路试试!
再次感谢两位朋友的帮助!!

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-19 23:53 , Processed in 0.052144 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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