⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chengxu.c

📁 可编程继电器模块
💻 C
字号:
/********************************************************************
                            汇诚科技

实现功能:定时定次催款应用程序
使用芯片:STC15F104E
晶振:12MHZ
编译环境:Keil
作者:zhangxinchunleo
网站:www.ourhc.cn
淘宝店:汇诚科技 http://shop36330473.taobao.com
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!     

*********************************************************************/
/********************************************************************/
#include "reg52.h" 
#include <intrins.H>
#define uchar unsigned char //宏定义字符型变量
#define uint  unsigned int	//宏定义整型变量
/********************************************************************
                            寄存器设置
*********************************************************************/ 
sfr IAP_DATA  =0xc2;	 //数据寄存器
sfr IAP_ADDRH =0xc3;	 //地址寄存器
sfr IAP_ADDRL =0xc4;	 //地址寄存器
sfr IAP_CMD   =0xc5;     //命令寄存器
sfr IAP_TRIG  =0xc6; 	 //触发寄存器
sfr IAP_CONTR =0xc7;     //擦除寄存器

sbit  P33=P3^3; 		 //定义继电器控制输出脚
/********************************************************************
                            命令定义
*********************************************************************/
#define CMD_IDLE     0	 //EEPROM无操作
#define CMD_READ     1	 //读取字节
#define CMD_PROGRAM  2	 //写入字节
#define CMD_ERASE    3	 //擦除字节
/********************************************************************
                       编程周期由晶振决定
*********************************************************************/
//#define ENABLE_IAP 0X80	 //编程周期由晶振决定(如果<30MHZ选用此项)
//#define ENABLE_IAP 0X81	 //编程周期由晶振决定(如果<24MHZ选用此项)
//#define ENABLE_IAP 0X82	 //编程周期由晶振决定(如果<20MHZ选用此项)
  #define ENABLE_IAP 0X83	 //编程周期由晶振决定(如果<12MHZ选用此项)
//#define ENABLE_IAP 0X84	 //编程周期由晶振决定(如果<6MHZ选用此项)
//#define ENABLE_IAP 0X85	 //编程周期由晶振决定(如果<3MHZ选用此项)
//#define ENABLE_IAP 0X86	 //编程周期由晶振决定(如果<2MHZ选用此项)
//#define ENABLE_IAP 0X87	 //编程周期由晶振决定(如果<1MHZ选用此项)

#define IAP_ADDRESS 0X0000	 //内部EEPROM地址
/********************************************************************
                            开机最大次数和最长时间定义
*********************************************************************/
#define C  10	 //开机最大次数(次)
#define T  1	 //开机最长时间(小时)
/********************************************************************
                            初始定义
*********************************************************************/
#define DUAN P0	  //P0口控制段
#define WEI  P2	  //P2口控制位
uchar Count,days;
uint fen,cnt;
sbit jdq=P3^3;
sbit key=P3^5;
/********************************************************************
                       函数初始化
*********************************************************************/
void IapIdle();				              //操作函数
uchar IapReadByte(uint addr);             //读取函数
void IapProgramByte(uint addr,uchar dat); //写入函数
void IapEraseSector(uint addr);	          //擦除函数
void cshh();
//============================================================
//延时程序
void delayms(unsigned int x)
{
    int i,j;                                                                                
    for(i=0;i<x;i++)                                                                    
       {
	     for(j=0;j<260;j++);
       }                                                                                     
}

/********************************************************************
                            主函数
*********************************************************************/
void main()
{		
	delayms(600); 
    Count=IapReadByte(0);		 	
	days=IapReadByte(1);		    
	Count++;				        
	IapEraseSector(0);              //擦除扇区	//34us
	IapProgramByte(0,Count);	    //写入数据//38us

    cshh();                         //定时器中断初始化
    if(Count<C)
	   TR0=1;

    if(Count>=C||days==T)
	{
	  TR0=0;
	  jdq=1;
	  IapEraseSector(0);            //擦除扇区
	  IapProgramByte(0,C+2);	    //写入数据
	} 
    while(1)
	{ if(key==0)
	 {
	  while(!key);
	  IapEraseSector(0);           //擦除扇区
	 }
	}

}

/********************************************************************
                            操作函数
*********************************************************************/
void IapIdle()
{
	IAP_CONTR=0;
	IAP_CMD=0;
	IAP_TRIG=0;
	IAP_ADDRH=0X80;
	IAP_ADDRL=0;
}
/********************************************************************
                            读取一个字节函数
*********************************************************************/
uchar IapReadByte(uint addr)
{
	uchar dat;  
	IAP_CONTR=ENABLE_IAP;
	IAP_CMD=CMD_READ;
	IAP_ADDRL=addr;
	IAP_ADDRH=addr>>8;
	IAP_TRIG=0X5A;
	IAP_TRIG=0XA5;
	_nop_();
	_nop_();
	_nop_();
	dat=IAP_DATA;
	IapIdle();
	return dat;
}

/********************************************************************
                            写入一个字节函数
*********************************************************************/
void IapProgramByte(uint addr,uchar dat)
{

	IAP_CONTR=ENABLE_IAP;
	IAP_CMD=CMD_PROGRAM;
	IAP_ADDRL=addr;
	IAP_ADDRH=addr>>8;
	IAP_DATA=dat;
	IAP_TRIG=0X5A;
	IAP_TRIG=0XA5;
	_nop_();
	_nop_();
	_nop_();
	IapIdle();
}
/********************************************************************
                            擦除一个字节函数
*********************************************************************/
void IapEraseSector(uint addr)
{
	IAP_CONTR=ENABLE_IAP;
	IAP_CMD=CMD_ERASE;
	IAP_ADDRL=addr;
	IAP_ADDRH=addr>>8;
	IAP_TRIG=0X5A;
	IAP_TRIG=0XA5;
	_nop_();
	_nop_();
	_nop_();
	IapIdle();
}

/********************************************************************
                           定时器中断初始化*********************************************************************/
void cshh()
{ 
	 TMOD|=0X01;//定义定时器工作方式
	 TH0=(65536-60000)/256;
	 TL0=(65536-60000)%256;
	 ET0=1;
	 EA=1;      //开中断
 }

/********************************************************************
                           定时器中断函数
*********************************************************************/
void timer1(void)interrupt 1
{ 
   TH0=(65536-60000)/256;  //60ms
   TL0=(65536-60000)%256;
   cnt++;
   if(cnt==1000)//1000次一分钟
    {
		 cnt=0;
		 fen++;
		 if(fen==60)                  //60次为一小时
		 { 
		   fen=0;
		   days++;
		   IapEraseSector(1);           //擦除扇区
	       IapProgramByte(1,Count);	    //写入数据
		  
		 }
		 if(days==T)
		 {
		   jdq=1;
		   TR0=0;
		 }
	}   
}
 
/********************************************************************
                            结束
*********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -