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

📄 text1.c

📁 基于51单片机的数控直流稳压源的源程序
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>
#include <absacc.h>

unsigned char dis_code[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char dot_dis_code[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned char lig_code[3]={0xf1,0xf2,0xf4};
unsigned char VOUT;

sbit KEY1=P2^4;
sbit KEY2=P2^5;
sbit KEY3=P2^6;
sbit KEY4=P2^7;
//sbit CS =P3^2;

void delay(unsigned int N)
{
	unsigned int i;
	for(i=0;i<N;i++);
}



//*********************** 
sbit SDA=P3^4;
sbit SCL=P3^5;
//************************

//************************

//************************


/****************************************************************************/
bit ack=0; //应答信号标志位。

//*********************************



//******************************
//发送开始信号
//I2C总线的起始信号的程序。
void I2C_START()
{
SCL=1;
SDA=1;
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
SCL=0;
}
//******************************


//******************************
//送八位数据
//主器件送从器件8位数据。
void I2C_SEND8BIT(unsigned char send_data)
{

unsigned char i,temp;
temp=send_data;
for(i=8;i>0;i--)
{

SDA=(temp&0x80);
SCL=1; _nop_(); SCL=0;
temp=temp<<1;
}

}
//******************************


//******************************
//接收八位数据
//主器件接收从器件指定地址的8位数据。

unsigned char I2C_RECEIVE8BIT()
{	
 unsigned char i;
 ACC=0;
 for(i=8;i>0;i--)
 {
 ACC=ACC<<1;
 SCL=1; _nop_();
 if(SDA==1) ACC=ACC|0x01;
 SCL=0;
 }

return(ACC);

}
//*********************************************


//******************************
//发送接收确认信号
void I2C_ACK()
{
SDA=1; SCL=1;
_nop_(); _nop_();
if(SDA==1)ack=1;
else ack=0;
SCL=0;
}
//*****************************


//*****************************
//发送结束信号
void I2C_STOP()
{
SDA=0;
_nop_();_nop_();
SCL=1;
_nop_();_nop_();
SDA=1;
}
//******************************


//*******************************
/*------------------------------------------------------

写一个字节       Address地址     I2CDatata写入的数据

------------------------------------------------------*/

void I2C_WRITE(unsigned char Address,unsigned char dat)
{
do{
I2C_START();
I2C_SEND8BIT(0xa0); //从器件地址位是000,并且对从器件进行写操作。
I2C_ACK();
}while(ack==1);     //=1,表示无确认,再次发送。 C为1转移。

I2C_SEND8BIT(Address);
I2C_ACK();


I2C_SEND8BIT(dat);
I2C_ACK();


I2C_STOP();

}
//******************************************************


//*******************************************
/*------------------------------------------------------

读一个字节       Address地址     Data读出的数据

------------------------------------------------------*/
unsigned char I2C_READ(unsigned char Address)
{
unsigned char I2CData;

do{
I2C_START();
I2C_SEND8BIT(0xa0); //从器件地址位是000,并且对从器件进行读操作。
I2C_ACK();
}while(ack==1);     //=1,表示无确认,再次发送。 C为1转移。

I2C_SEND8BIT(Address);
I2C_ACK();
do{
I2C_START();
I2C_SEND8BIT(0xa1);
I2C_ACK();
}while(ack==1);

I2CData=I2C_RECEIVE8BIT();
I2C_ACK();

I2C_STOP(); 
return I2CData;   

}
//***********************************************




void display(void)
{
	unsigned char value[3];
	unsigned char i;
	value[0]=VOUT/100;
	value[1]=VOUT%100/10;
	value[2]=VOUT%10;
	for(i=0;i<3;i++)
	{
	if(i==0 && value[0]==0) i+=1;
	if(i==1)P0=dot_dis_code[value[i]];
    else P0=dis_code[value[i]];
	P2=lig_code[i];
	delay(60);
	P2=0xf0;
	}
}

void ADD0_1(void)
{
	if(KEY1==0) if(VOUT<=149)VOUT+=1;
	while(KEY1==0)display();

}
 void ADD1(void)
{

	if(KEY2==0) if(VOUT<=140) VOUT+=10; 
	while(KEY2==0)display();

}

void DEC0_1(void)
{

	if(KEY3==0) if(VOUT>=1) VOUT-=1; 
    while(KEY3==0)display();


}

void DEC1(void)
{

	if(KEY4==0) if(VOUT>=10) VOUT-=10;
	while(KEY4==0)display();

}

void GetKey(void)
{
	if(KEY1==0)ADD0_1();
	if(KEY2==0)ADD1();
	if(KEY3==0)DEC0_1();
	if(KEY4==0)DEC1();

//	while ((P2&0xf0)^0xf0) display();       //等待按键释放
	
}



void main()
{

	P2=0xf0;
	VOUT=I2C_READ(0x01);
	while(1)
	{
	P1=VOUT;  WR=0;  WR=1; 
    display();
    GetKey();
	I2C_WRITE(0x01,VOUT);
	}

}

⌨️ 快捷键说明

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