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

📄 main.c

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

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

设定最大时间是99分60秒
********************************************************************/
#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 miao,fen;
void IapEraseSector(uint addr);
void IapProgramByte(uint addr,uchar dat);
uchar IapReadByte(uint addr);
/********************************************************************
                            延时函数
*********************************************************************/
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++;
	   if(keynum>=3)
	   { 
	     keynum=0;
		 miao=fen=0;
		//jdq=0;
	  }
    }
  }

  switch(keynum)
  {
    case 1: if(key2==0)
	        {
			  delay(5);
			  if(key2==0)
	          {
				  while(!key2);
				  setmiao++;
				  if(setmiao>59)
				     setmiao=59;
				  IapEraseSector(0);
				  IapProgramByte(0,setmiao);  //写入函数
			  }
			 }
			if(key3==0) 
			{
			  delay(5);
			  if(key3==0)
	          {
			    while(!key3);
			    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);
					  setfen++;
					  if(setfen>99)
				         setfen=99;
					  IapEraseSector(512);
					  IapProgramByte(512,setfen);  //写入函数
			  }
			 }
			 if(key3==0) 
			 {
				  delay(5);
				  if(key3==0)
		          {
				    while(!key3);
				    setfen--;
				    if(setfen==0||setfen>=250)
				       setfen=0;
				    IapEraseSector(512);
				    IapProgramByte(512,setfen);  //写入函数
				  }
			}
			display(setfen,setmiao);
			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);           //读取函数
	setmiao=IapReadByte(0);
	cshh();                          //定时器初始化
	while(1)
	{  
	   if(keynum==0)
	   {
	     display(fen,miao);
	   }
       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))	 
    { 
        jdq=!jdq;
		miao=0;
		fen=0;
    }
}

⌨️ 快捷键说明

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