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

📄 main.c

📁 单路带数码管可编程可调节延时模块
💻 C
字号:
/********************************************************************
                            汇诚科技

实现功能:继电器通、断时间都可调控制程序(eeprom)
使用芯片:STC12C5204AD
晶振:11.0592MHZ
编译环境:Keil
硬件环境:四位数显两路输入三按键
作者:yang
QQ:790244909
网站:www.ourhc.cn
物联网测试网站:http://hualongelectron.eicp.net/
日期:2013-05-08
淘宝店:
      华龙电子直销:http://hlelectrony.taobao.com 
      电子开发直销:http://shop63233873.taobao.com 
	  汇诚科技网路购物:http://shop36330473.taobao.com
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!     
/********************************************************************    
/********************************************************************
功能说明:继电器循环通断控制程序
继电器通、断时间可调,
key1功能键:调节模式与实时显示模式转换
keynum=0:实时显示计时模式
keynum=1:调整继电器设定闭合秒
keynum=2:调整继电器设定闭合分
keynum=3:调整继电器设定断开秒
keynum=4:调整继电器设定断开分
以上四个设定值设定好后都存入eeprom,掉电可记忆
上电时,继电器吸合,数显开始计时,到达设定闭合时间后断开;数显清零,
                    数显开始计时,到设定时间,继电器闭合,数显清零。。。
					循环下去。。

设定断开时间最大是10分59秒
设定闭合时间最大是10分59秒
********************************************************************/
#include<STC12C5A60S2.H>  	       //库文件
#include <intrins.h>
#include"eprom.h"
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int  //宏定义无符号整型

#define DUAN P2	  //P0口控制段
#define WEI  P1	  //P2口控制位
sbit jdq= P3^7;
sbit key1=P3^2;	//功能按键
sbit key2=P3^3;	//增加
sbit key3=P3^4;	//减小
/********************************************************************
                            初始定义
*********************************************************************/
code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟
uchar wei[4]={0X01,0X02,0X04,0X08};                                 //位的控制端
uchar numb[4];	      //定义字符串
uchar cnt,keynum;
uchar setfen,setmiao;
uchar setdf,setdm;
uchar miao,fen;
void IapEraseSector(uint addr);
void IapProgramByte(uint addr,uchar dat);
uchar IapReadByte(uint addr);
bit flag=1;	//闭合断开标志位
/********************************************************************
                            延时函数
*********************************************************************/
void delay(uchar x)    //延时程序 0.1秒
{
	uchar m,n,s;
	for(m=x;m>0;m--)
	for(n=20;n>0;n--)
	for(s=248;s>0;s--);
}
/********************************************************************
                            显示函数
*********************************************************************/        
void display(uchar a ,uchar b)   //显示函数
{
      WEI&=0XF0;
	  DUAN=seg7code[a/10];
	  WEI=wei[0];
	  delay(2);

	  WEI&=0XF0;  
      DUAN=seg7code[a%10]&0x7f;
	  WEI=wei[1];
	  delay(2);

	  WEI&=0XF0;  
   	  DUAN=seg7code[b/10];
	  WEI=wei[2];
	  delay(2);

	  WEI&=0XF0;  
      DUAN=seg7code[b%10];
	  WEI=wei[3];
	  delay(2);
	   
	  WEI&=0XF0;
}
/********************************************************************
                            按键扫描
*********************************************************************/
void keyscan(void)
{
 if(key1==0)
 {  delay(1);
    if(key1==0)
    {
	   while(!key1);
	   keynum++;
	   TR0=0;
	   jdq=0;
	   if(keynum>=5)
	   { 
	     keynum=0;
		 miao=fen=0;
		 TR0=1;
		 jdq=1;
	  }
    }
  }
  switch(keynum)
  {
    case 1: if(key2==0)
	        {
			  delay(5);
			  if(key2==0)
	          {
				  while(!key2)display(setfen,setmiao);
				  setmiao++;
				  if(setmiao>59)
				     setmiao=59;
				  IapEraseSector(0);
				  IapProgramByte(0,setmiao);  //写入函数
			  }
			 }
			if(key3==0) 
			{
			  delay(5);
			  if(key3==0)
	          {
			    while(!key3)display(setfen,setmiao);
			    setmiao--;
				if(setmiao==0||setmiao>=250)
				  setmiao=0;
			    IapEraseSector(0);
			    IapProgramByte(0,setmiao);  //写入函数
			  }
			}
	         display(setfen,setmiao);
			break;
     case 2: if(key2==0)
	         {
				  delay(5);
				  if(key2==0)
		          {
					  while(!key2)display(setfen,setmiao);
					  setfen++;
					  if(setfen>99)
				         setfen=99;
					  IapEraseSector(512);
					  IapProgramByte(512,setfen);  //写入函数
			  }
			 }
			 if(key3==0) 
			 {
				  delay(5);
				  if(key3==0)
		          {
				    while(!key3)display(setfen,setmiao);
				    setfen--;
				    if(setfen==0||setfen>=250)
				       setfen=0;
				    IapEraseSector(512);
				    IapProgramByte(512,setfen);  //写入函数
				  }
			}
		//	display(setfen,setmiao);
			break;
		case 3: 
		    if(key2==0)
	        {
			  delay(5);
			  if(key2==0)
	          {
				  while(!key2)display(setdf,setdm);
				  setdm++;
				  if(setdm>59)
				     setdm=59;
				  IapEraseSector(0);
				  IapProgramByte(0,setmiao);  //写设定闭合时间秒
				  IapProgramByte(1,setdm);  //写设定断开时间秒
			  }
			 }
			if(key3==0) 
			{
			  delay(5);
			  if(key3==0)
	          {
			    while(!key3)
				display(setdf,setdm);
			    setdm--;
				if(setdm==0||setdm>=250)
				  setdm=0;
			    IapEraseSector(0);
			    IapProgramByte(0,setmiao);  //写设定闭合时间秒
				IapProgramByte(1,setdm);  ////写设定断开时间秒
			  }
			}
			break;
		case 4:if(key2==0)
	         {
				  delay(5);
				  if(key2==0)
		          {
					  while(!key2)
					  display(setdf,setdm);;
					  setdf++;
					  if(setdf>10)
				         setdf=10;
					  IapEraseSector(512);
					  IapProgramByte(512,setfen);  //写设定闭合时间分
					  IapProgramByte(513,setdf);  //写设定断开时间秒
			  }
			 }
			 if(key3==0) 
			 {
				  delay(5);
				  if(key3==0)
		          {
				    while(!key3)
					display(setdf,setdm);
				    setdf--;
				    if(setdf==0||setdf>=250)
				       setdf=0;
				    IapEraseSector(512);
				    IapProgramByte(512,setfen);  //写设定闭合时间分
					IapProgramByte(513,setdf);  //写设定断开时间分
				  }
			}
		//	
			break;
	 default : break;
  }
}
/********************************************************************
                           定时器T0初始化*********************************************************************/
void cshh()
{ 
	 TMOD|=0X01; //定义定时器工作方式
	 TH0=0Xa6;
	 TL0=0X01;
	 ET0=1;
	 TR0=1;      //开定时器
	 EA=1;       //开中断
 }
/********************************************************************
                            初始化函数
*********************************************************************/
void init_all(void)    
{
	P2M1=0;
	P2M0=0xff;
	P1M1=0;
	P1M0=0x0f;
	P3M1&=0x7f;
	P3M0|=0x80;
	P3=0xff;	
}		   
/********************************************************************
                            主函数
*********************************************************************/
void main()
{	 
	init_all();
	setfen=IapReadByte(512);           //读设定闭合秒
	setdf= IapReadByte(513);		   //读设定断开秒
	setmiao=IapReadByte(0);			  //读设定闭合分
	setdm=IapReadByte(1);			  //读设定断开秒
	cshh();                          //定时器初始化
	while(1)
	{  
	   if(keynum==0)   //实时计时模式
	   {
	     display(fen,miao);
	   }
	   if(keynum>0&&keynum<3) //设定闭合分和秒模式
	     display(setfen,setmiao);
	   if(keynum>=3&&keynum<5) //设定断开分和秒模式
	     display(setdf,setdm);
       keyscan();
	   }
}
/********************************************************************
                           定时器中断函数
*********************************************************************/
void timer1(void)interrupt 1  
{ 
   TH0=0Xa6; //定时初值
   TL0=0X01; //定时初值
   cnt++;
   if(cnt>=40)
   {
	 cnt=0;
	 miao++;
	 if(miao>=60)
	 {
	   miao=0;
	   fen++;
	 }
    }
	if((fen>=setfen)&&(miao>=setmiao)&&flag)	 
    { 
	    flag=0;
        jdq=0;
		miao=0;
		fen=0;
    }
	if((fen>=setdf)&&(miao>=setdm)&&(flag==0))	 
    { 
        jdq=1;
		miao=0;
		fen=0;
		flag=1;
    }
}

⌨️ 快捷键说明

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