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

📄 chengxu.c

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

实现功能:此版配套测试程序
使用芯片:STC12C2052AD
晶振:11.0592MHZ
波特率:9600
编译环境:Keil
作者:yang
QQ:790244909
网站:www.ourhc.cn
淘宝店:汇诚科技 华龙电子直销:http://hlelectrony.taobao.com
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!     
/********************************************************************

********************************************************************/
#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口控制位
/********************************************************************
                            初始定义
*********************************************************************/
//数码管显示段码 
code uchar seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};
//数码管显示位码 
sbit wei1=P1^0;		       //位的控制端
sbit wei2=P1^1;
sbit wei3=P1^2;
sbit wei4=P1^3;
                             
uchar numb[4];	      //定义字符串用于数值转换
//按键
sbit key2=P3^2;
sbit key1=P3^3;
//模拟量输入端
sbit A1=P1^5;
sbit A2=P1^6;
//输入控制端
sbit IN1=P3^7;
sbit IN2=P1^7;
//输出控制端
sbit  OUT1=P3^4;
sbit  OUT2=P3^5;
//全局变量和标着位变量
uchar timesnum;
uchar setnum;
uchar setnum1;
uint xstimes=180;
bit flag=0;
bit zfflag=0;
bit xsflag=0;
bit changeflag=0;
/********************************************************************
                            延时函数
*********************************************************************/
void delay(uchar x)  //延时程序 0.002秒
{
	uchar m,n,s;
	for(m=x;m>0;m--)
	for(n=20;n>0;n--)
	for(s=248;s>0;s--);
}	
/********************************************************************
                            求值函数
*********************************************************************/
void t_to_dis(uchar num)
{
    uint x;
    x=num*4;
	numb[0]=0;	                //显示千位
	numb[1]=x/100;	        //显示百位
	numb[2]=x%100/10;		    //显示十位
	numb[3]=x%10;             //显示个位
}

/********************************************************************
                            显示函数
*********************************************************************/        
void display()                  //显示函数
{
      WEI&=0XF0;
	  DUAN=seg7code[numb[0]];
	  wei1=1;
	  delay(2);

	  WEI&=0XF0;  
      DUAN=seg7code[numb[1]];
	  wei2=1;
	  delay(2);

	  WEI&=0XF0;  
   	  DUAN=seg7code[numb[2]];
	  wei3=1;
	  delay(2);

	  WEI&=0XF0;  
      DUAN=seg7code[numb[3]];
	  wei4=1;
	  delay(2);
	  WEI&=0XF0;
}   
/********************************************************************
                           IO口初始化函数
*********************************************************************/    
void init_all(void)
{		
    P2M1=0;
	P2M0=0xff;
	P1M1=0x80;
	P1M0=0x0f;
	P3M1|=0x80;
	P3M0&=0x7f;
} 
/********************************************************************
                           按键扫描函数
*********************************************************************/    
void key_scan(void)
{
	 if(xsflag==1) 
	     t_to_dis(setnum);		        //数值变换
	  else
	     t_to_dis(timesnum);

     if(key1==0)		         //增加次数
		{
		  delay(5);
		  if(key1==0)
		   {
		     while(!key1);
			 xsflag=1;
			 setnum++;		     //keynum=0为模式0,继电器吸合300ms ,keynum=1继电器吸合12s
			 if(setnum>=100)
			     setnum=100;
		     IapEraseSector(0);  //擦除扇区
			 IapProgramByte(5,setnum);
			 xstimes=0;
			 changeflag=1;
		   }
		}
	   if(key2==0)		         //按键扫描,key2按下模式变化一次
		{
		  delay(5);
		  if(key2==0)
		   {
		     while(!key2);
			 xsflag=1;
			 setnum--;		     //减小次数
			 if(setnum==0||setnum>=120)
			   setnum=0;
			 IapEraseSector(0);  //擦除扇区
			 IapProgramByte(5,setnum);
			  xstimes=0;
			  changeflag=1;
		   }
		}
}
/********************************************************************
                           定时器T0初始化*********************************************************************/
void timer0init(void)
{ 
	 TMOD=0X01;                  //定义定时器工作方式
	 TH0=(65536-25000)/256;
	 TL0=(65536-25000)%256;
	 ET0=1;
	 TR0=1;
	 EA=1;
 }
/********************************************************************
                            主函数
*********************************************************************/
void main()
{	    
	init_all();	                //初始化IO
	timer0init();				//定时器初始化
	setnum1=setnum=IapReadByte(5); 
	while(1)
	{ 
	 

	  key_scan();				//键盘扫描

	  if(xstimes>=180)
	     xsflag=0;


	  if(IN2==0&&flag==0)       //寻找位置
	  {
		  delay(10);		    
		  if(IN2==0)
		  {
		     delay(2);
		     //while(!IN1);
			 OUT1=!OUT1;
			
			 flag=1;
		  }
	  }


	 if(flag==1&&IN1==0)   //flag=1上电不计数,找到位置开始计数
	 {
	    delay(5);
	  if(IN1==0)
	  { 
	     delay(5);
	     while(!IN1);

		 if(zfflag==0&&timesnum<(setnum1+1))	 
	         timesnum++;
		 else
			 timesnum--;

		 if(timesnum>=(setnum1+1))
		 {
		   delay(60);
		   zfflag=1;
		   OUT1=!OUT1;  
		 }

		 if(timesnum==0)
		 {
		   delay(5);
		  if(timesnum==0)
		   {
		    
			  t_to_dis(timesnum);
		      zfflag=0;
		     if(changeflag==1)
		     {
		   	  changeflag=0;
			  setnum1=setnum;
		     }
		      while(IN2);
		      OUT1=!OUT1; 
		   }
		   }

	   }
	  }
    }
}
/********************************************************************
                           定时器T1中断函数
*********************************************************************/
void timer0(void)interrupt 1  using 1
{ 
 TH0=(65536-25000)/256;
 TL0=(65536-25000)%256;
    xstimes++;
 	display();		     //显示函数 
	
}
/********************************************************************
                              结束
*********************************************************************/

⌨️ 快捷键说明

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