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

📄 数控电源.c

📁 经过四天的努力
💻 C
字号:
#include <reg52.h>
#include<intrins.h>

#define uchar unsigned char //定义一下方便使用
#define uint unsigned int

/******************-0----1----2----3----4----5----6----7----8---9---全选-**/		  
uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};	
		  
/******************-1----2----3----4----5----6----7----8---全选-***********/
uchar code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xff};

uchar k[9]={0,0,0,0,0,0,0,0,10};

uchar j; 

sbit k1=P1^0;				 //加按键
sbit k2=P1^1;				 //减按键
sbit k3=P1^2;				 //功能键

sbit SCL=P1^7;               //24c02时钟信号
sbit SDA=P1^6;               //24c02数据端

sbit  SCK= P2^0;			 //移位时钟	
sbit  RCK= P2^1;			 //锁存时钟
sbit  SER= P2^2;			 //数据输入


/***************************************************************************************
****************************************************************************************
****                                      24c02声明									****											   
****************************************************************************************
***************************************************************************************/
																					 
/************************************
              延时程序
*************************************/
void delay()
{
	uchar i;
	for(i=248;i>0;i--);
}

/************************************
              开始总线
*************************************/
void start()
{
	SDA=1;
	SCL=1;
	SDA=0;
	SCL=0;
}

/*************************************
              结束总线
**************************************/
void stop()
{
	SCL=0;
	SDA=0;
	SCL=1;
	SDA=1;
}

/*************************************
               发ack0
**************************************/
void noack()
{
	SDA=1;
	SCL=1;
	SCL=0;
}

/*************************************
             应答子函数
**************************************/
bit ack()
{
	bit e;
	SDA=1;
	SCL=1;
	e=SDA;
	SCL=0;
	return(e);
}

/**************************************
            写8个bit到24C02
			为写字节作准备
**************************************/
void wb(uchar input)
{
	uchar j;
	for(j=8;j>0;j--)
	{
		SDA=(bit)(input&0x80);
		SCL=1;
		SCL=0;
		input=input<<1;
	}
}

/***************************************
           写一个字节到24c02
****************************************/
void w(uchar d,uchar a)
{
	start();

	wb(0xa0);    //写入指令0xa0,该指令表示准备对24c02进行写操作
    ack();

	wb(a);		 //先写要存数据的地址
	ack();

	wb(d);		 //再写要存数据
    ack();

	stop();
	delay();
}


/**************************************
          从24C02中读8个bit
		   为读字节作准备
***************************************/
uchar rb()
{
	uchar j,rb=0;
	for(j=8;j>0;j--)
	{
		SCL=1;
	    rb=rb<<1;
	    rb=rb|((uchar)(SDA));
	    SCL=0;
	}
	return(rb);
}

/****************************************
          从24c02中读一个字节
*****************************************/
uchar r(uchar a)
{
	uchar d;		  //读操作得到的数据

	start();
	wb(0xa0);	      //写入指令0xa0,该指令表示准备对24c02进行写操作
	ack();
	wb(a);			  //写入要读数据的地址a
	ack();

	start();
	wb(0xa1);		  //写入指令0xa1,该指令表示准备对24c02进行读操作
	ack();
	d=rb();			  //从地址a中读出数据
	noack();
	stop();

	return(d);		  // 返回得到的数据
}
																					  
/***************************************************************************************
****************************************************************************************
****                                   24c02声明结束								****											   
****************************************************************************************
***************************************************************************************/



 
  
 
 
/****************************************
             595显示函数
*****************************************/
void In595(uchar m,uchar n)
{ 
  uchar i,temp;
  temp=duan[m];       //先传段
  if(n==1)			  //加小数点
  temp=temp&0x7f;
  for(i=0;i<8;i++)
  { 
   
  	SCK=0;
    SER=temp&0x80;
	temp<<=1;
    SCK=1;
   } 
  temp=wei[n];        //再传位
  for(i=0;i<8;i++)
  { 
  	SCK=0;
    SER=temp&0x80;
	temp<<=1;
    SCK=1;
   }

   RCK=0;			 
   RCK=1;			 //锁存
}

/****************************************************
                      主函数
****************************************************/
void main(void)
{
	bit t=0;
	uchar temp;

	TMOD=0x01;		  //定时器T0的计时方式为1;
	TH0=0xec;
	TL0=0x78;		  //5ms定时
	TR0=1;			  //启动T0
	ET0=1;			  //容许定时器T0中断
	EA=1;			  //CPU开中断
    P3=0x3c;
	P3=r(0x02);		  //从0x02中读出值

	while(1)
	{
	    if(k3==0) t=~t;		 //功能键
		while(k3==0);

        if(k1==0) 			 //加键
        { 
		  if(t==0) P3++;
		  if(t==1) P3=P3+10;
		  while(k1==0);
		  if(P3>0x78)
		  P3=0x3c;
		 }	
	

		 if(k2==0)			   //减键
		{
		  if(t==0) P3--;
		  if(t==1) P3=P3-10;
		  while(k2==0);
		  if((P3<0x00)|(P3>0xf5))
		  P3=0x3c;
	    }


		
		temp=P3;
		w(temp,0x02);        //写temp到地址0x02

    	k[0]=temp%10;
    	k[1]=temp/10%10;
	    k[2]=temp/100%10;
   //   k[3]=vot/1000%10;
   //	k[4]=vot/10000%10;
   //	k[5]=vot/100000%10;
   //	k[6]=vot/1000000%10;
   //	k[7]=vot/10000000;	
       
       
	}
}

			
/***********************************************
                 5m显示一次
************************************************/		   
void t0() interrupt 1 
{
  
    TH0=0xec;
	TL0=0x78;


  	for(j=0;j<9;j++) 
	{  
	   In595(k[j],j);
	} 
}	           

⌨️ 快捷键说明

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