标题: 帮忙加一个定时器功能进程序送上我全部黑币 [打印本页]

作者: w3158    时间: 2016-8-7 17:08
标题: 帮忙加一个定时器功能进程序送上我全部黑币
请帮忙加一个定时器功能进程序,就是单片机程序里定时器设好一个时间后(比如1个小时或1000个小时)单片机程序就不能正常用了,如到期之前断过电就从新计时,一旦到期锁定后再断电也不能正常用只能从新输入一次之前的程序。可以的话请帮忙加进下面的程序里。用的是STC15F104W
#include<reg52.h>
sbit k1 =P3^4;        //按键
sbit led1 =P1^0;        //1
sbit led2 =P1^1;        //2
sbit led3 =P1^2;        //3
unsigned char n=0;
void delay(unsigned int t)     //延时子程序
{ while(t--);   }                //延时子程序
void main(void)        //主程序
{
           while(1)  //扫描按键
      {
                if(k1==0)        //按键按下
        {     
                       if(n==0)
                 {
                        led1 = 0;     //1
                   delay(60000);       //延时
         
                          led2 = 0;           //2
                    
                      delay(60000);      //延时
                            led1 = 1;            //1
                                   n=1;
                     }   
         }      
               
                if(k1==1)        //按键弹起
           {
                       if(n==1)
              {
                          led2 = 1; //2
                                                  
                    led3 = 0; //3               
               delay(60000);       //延时               
                    led3 = 1;                      //3
                     n=0;
                   }
            }
      }
}


作者: PK250    时间: 2016-8-7 17:08
本帖最后由 PK250 于 2016-8-9 20:59 编辑

#include<reg52.h>


sfr AUXR        =   0x8e;
sfr IAP_DATA    =   0xC2;           //IAP数据寄存器
sfr IAP_ADDRH   =   0xC3;           //IAP地址寄存器高字节
sfr IAP_ADDRL   =   0xC4;           //IAP地址寄存器低字节
sfr IAP_CMD     =   0xC5;           //IAP命令寄存器
sfr IAP_TRIG    =   0xC6;           //IAP命令触发寄存器
sfr IAP_CONTR   =   0xC7;           //IAP控制寄存器  

#define CMD_IDLE    0               //空闲模式
#define CMD_READ    1               //IAP字节读命令
#define CMD_PROGRAM 2               //IAP字节编程命令
#define CMD_ERASE   3               //IAP扇区擦除命令
#define ENABLE_IAP  0x82            //if SYSCLK<20MHz
#define IAP_ADDRESS 0x0000
sbit k1 =P3^4;        //按键
sbit led1 =P1^0;        //灯1
sbit led2 =P1^1;        //灯2
sbit led3 =P1^2;        //灯3
unsigned char n=0;
unsigned int i;
uchar IapReadByte(unsigned int addr);
void IapProgramByte(unsigned int addr, unsigned char dat);
void IapEraseSector(unsigned int addr);
void InitTimer0(void);
void Delay10ms(unsigned int c);   //误差 0us
void delay(unsigned int t)     //延时子程序
{ while(t--);   }                //延时子程序
void main(void)        //主程序
{
          InitTimer0();
          i = IapReadByte(2);
           while(1)  //扫描按键
      {
                if(i<9000)//此处设置到期时间,单位:分钟
               {
                if(k1==0)        //按键按下
        {     
                       if(n==0)
                 {
                        led1 = 0;     //灯1亮
                   delay(60000);       //延时

                          led2 = 0;           //灯2亮

                      delay(60000);      //延时
                            led1 = 1;            //灯1灭
                                   n=1;
                     }   
         }      

                if(k1==1)        //按键弹起
           {
                       if(n==1)
              {
                          led2 = 1; //灯2灭

                    led3 = 0; //灯3亮               
               delay(60000);       //延时               
                    led3 = 1;                      //灯3灭
                     n=0;
                   }
            }
      }
      }


}

void InitTimer0(void)//60秒定时
{
    TMOD = 0x01;
    TH0 = 0x15;
    TL0 = 0x0A0;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

void Timer0Interrupt(void) interrupt 1
{
    TH0 = 0x15;//60秒定时
    TL0 = 0x0A0;
     i++;
     IapEraseSector(2);
     IapProgramByte(2,i);
}
/*----------------------------
从ISP/IAP/EEPROM区域sddr读取一字节
----------------------------*/
unsigned char IapReadByte(unsigned int addr)
{
    unsigned char dat;                       //数据缓冲区
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_READ;             //设置IAP命令
    IAP_ADDRL = addr;               //设置IAP低地址
    IAP_ADDRH = addr >> 8;          //设置IAP高地址
    IAP_TRIG = 0x5a;                //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                //写触发命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    dat = IAP_DATA;                 //读ISP/IAP/EEPROM数据

/*   IapIdle();                                            /*加上这行后EEPROM操作无效*/

    return dat;                     //返回
}
/*----------------------------
写一字节数据到ISP/IAP/EEPROM区域
addr:要写入的地址
dat:要写入的数据
----------------------------*/
void IapProgramByte(unsigned int addr, unsigned char dat)
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_PROGRAM;          //设置IAP命令
    IAP_ADDRL = addr;               //设置IAP低地址
    IAP_ADDRH = addr >> 8;          //设置IAP高地址
    IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据
    IAP_TRIG = 0x5a;                //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                //写触发命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成

/*   IapIdle();                                            /*加上这行后EEPROM操作无效*/
}
/*----------------------------
扇区擦除 某一地址addr的数据
----------------------------*/
void IapEraseSector(unsigned int addr)
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_ERASE;            //设置IAP命令
    IAP_ADDRL = addr;               //设置IAP低地址
    IAP_ADDRH = addr >> 8;          //设置IAP高地址
    IAP_TRIG = 0x5a;                //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                //写触发命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
                                                               
/*    IapIdle();                                        /*加上这行后EEPROM操作无效*/
}








//这种方法误差比较大,单片机的定时中断最多可以定时65535微秒
//如果需要断电按上次计时处开始计时,那么需要用eeprom,把i值放在eeprom里面,上电的时候再读取就行了


//已经改好了,带掉电记忆功能




作者: idlucy    时间: 2016-8-9 09:07
可以给你做
作者: luoluoluo136    时间: 2016-8-9 10:36
联系我~~~~
作者: luoluoluo136    时间: 2016-8-9 20:17
这个芯片自带eeprom的,所以不需要用到24c02
作者: w3158    时间: 2016-8-9 23:05
PK250 发表于 2016-8-9 11:57
#include

uchar IapReadByte(unsigned int addr);   //这句不能通过
作者: luoluoluo136    时间: 2016-8-10 08:37
w3158 发表于 2016-8-9 23:05
uchar IapReadByte(unsigned int addr);   //这句不能通过

~~~~~~使用内部eeprom吧
作者: w3158    时间: 2016-8-10 22:15
PK250 发表于 2016-8-9 11:57
#include

可以再帮忙改改好吗?谢谢了!
作者: hpq110628    时间: 2016-8-12 14:26
弄个延时再加个次数循环就ok了
作者: PK250    时间: 2016-8-12 17:18
w3158 发表于 2016-8-10 22:15
可以再帮忙改改好吗?谢谢了!

unsigned char IapReadByte(unsigned int addr);






不好意思没仔细检查,有什么问题可以加我q直接问我,最近比较少待论坛





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1