找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2719|回复: 10
收起左侧

帮忙加一个定时器功能进程序送上我全部黑币

[复制链接]
ID:106553 发表于 2016-8-7 17:08 | 显示全部楼层 |阅读模式
258黑币
请帮忙加一个定时器功能进程序,就是单片机程序里定时器设好一个时间后(比如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;
                   }
            }
      }
}

最佳答案

查看完整内容

#include 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 ...
回复

使用道具 举报

ID:121156 发表于 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里面,上电的时候再读取就行了


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



回复

使用道具 举报

ID:9352 发表于 2016-8-9 09:07 | 显示全部楼层
可以给你做
回复

使用道具 举报

ID:97438 发表于 2016-8-9 10:36 | 显示全部楼层
联系我~~~~
回复

使用道具 举报

ID:97438 发表于 2016-8-9 20:17 来自手机 | 显示全部楼层
这个芯片自带eeprom的,所以不需要用到24c02
回复

使用道具 举报

ID:106553 发表于 2016-8-9 23:05 | 显示全部楼层

uchar IapReadByte(unsigned int addr);   //这句不能通过
回复

使用道具 举报

ID:97438 发表于 2016-8-10 08:37 | 显示全部楼层
w3158 发表于 2016-8-9 23:05
uchar IapReadByte(unsigned int addr);   //这句不能通过

~~~~~~使用内部eeprom吧
回复

使用道具 举报

ID:106553 发表于 2016-8-10 22:15 | 显示全部楼层

可以再帮忙改改好吗?谢谢了!
回复

使用道具 举报

ID:136575 发表于 2016-8-12 14:26 | 显示全部楼层
弄个延时再加个次数循环就ok了
回复

使用道具 举报

ID:121156 发表于 2016-8-12 17:18 | 显示全部楼层
w3158 发表于 2016-8-10 22:15
可以再帮忙改改好吗?谢谢了!

unsigned char IapReadByte(unsigned int addr);






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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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