AD-DA——51

本文介绍了IIC通信协议的基本实现方法,包括启动、停止信号的发送以及字节数据的发送过程。通过具体的C语言代码示例,展示了如何使用SDA和SCL信号线来控制IIC总线的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#define ERR 1
#define SUCC 0

bit ack = 0;			//bit定义的变量仅有0和1


void iic_start()
{
	SDA = 1;
	SCL = 1;
	delay_us(1);
	SDA = 0;
	delay_us(1);
		
	SCL = 0;			//钳住总线
}

void iic_stop()
{
	SDA = 0;
	SCL = 1;
	delay_us(1);
	SDA = 1;
	delay_us(1);
		
	SCL = 0;
}

bit iic_send_byte(unsigned char byte)
{
	unsigned char i ;
	for(i = 0; i < 8; i++)
	{
				
		SDA = byte & 0x80;    //非0值,SDA = 1; 0,SDA = 0;
		SCL = 1;
		delay_us(1);
		SCL = 0;
		byte <<= 1;
	}
	SCL = 1;
	SDA = 1;
	delay_us(1);
	if(0 == SDA)
	{
		ack = 1;
	}
	else
	{
		ack = 0;
	}
		
	SCL = 0;
		
	return 0;
}

unsigned char iic_rec_byte()
{
	unsigned char i;
	unsigned char temp = 0;
	unsigned char a;
	SDA = 1;
	for(i = 0; i < 8; i++)
	{
		SCL = 0;
		delay_us(1);
		SCL = 1;
		if(SDA)
		{
			a = 0x01;
		}
		else
		{
			a = 0;
		}
		temp |= (a << (7 - i));
		delay_us(1);
	}
		
	SCL = 0;
	return temp;
}

void iic_ack()
{
	SDA = 0;
	SCL = 1;
	delay_us(1);
		
	SCL = 0;
}

void iic_noack()
{
	SDA = 1;
	SCL = 1;
	delay_us(1);
		
	SCL = 0;
}

unsigned char DA_write(unsigned char num)
{
	iic_start();
	iic_send_byte(0x90);
	if(0 == ack) return ERR;
	iic_send_byte(0x40);
	if(0 == ack) return ERR;
	iic_send_byte(num);
	if(0 == ack) return ERR;
	iic_stop();
	return SUCC;
}

unsigned char AD_Read()
{
	unsigned char temp;
		
	iic_start();
	iic_send_byte(0x90);
	if(0 == ack) return ERR;
	iic_send_byte(0x40);
		if(0 == ack) return ERR;
	
	iic_start();
	iic_send_byte(0x90 + 1);
	if(0 == ack) return ERR;
	temp = iic_rec_byte();
	iic_noack();
	iic_stop();
		
	return temp;
}

void DA_light()
{
	unsigned char num = 0;
	DA_write(num);
	num++;
}

void AD_per_electric()
{
	unsigned char temp = 0;
	delay_ms(20);
	temp = AD_Read();
	lcd_write_byte(0,0,temp * 100 / 255 * 5 / 100 % 10 + 0x30);
	lcd_write_byte(1,0,'.');
	lcd_write_byte(2,0,temp * 100 / 255 * 5 / 10 % 10 + 0x30);
	lcd_write_byte(3,0,temp * 100 / 255 * 5 / 1 % 10 + 0x30);
	lcd_write_byte(4,0,'V');
	if(255 == temp)
	{
		lcd_write_byte(1,1,temp * 100 / 255 / 100 % 10 + 0x30);
	}
	else
	{
		lcd_write(0x48,LCD_WRITE_COM);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
					
		lcd_write(0x80 + 1,LCD_WRITE_COM);
		lcd_write(0x1,LCD_WRITE_DATA);	
	}
				
	if((0 == temp * 100 / 255 / 100 % 10) && (0 == temp * 100 / 255 / 10 % 10))
	{							
		lcd_write(0x50,LCD_WRITE_COM);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
		lcd_write(0x0,LCD_WRITE_DATA);
						
		lcd_write(0x80 + 2,LCD_WRITE_COM);
		lcd_write(0x2,LCD_WRITE_DATA);					
	}
	else
	{
		lcd_write_byte(2,1,temp * 100 / 255 / 10 % 10 + 0x30);
	}
	lcd_write_byte(3,1,temp * 100 / 255 / 1 % 10 + 0x30);
	lcd_write_byte(4,1,'%');
				
	lcd_dis_electric();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值