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

📄 adc.bak

📁 2008年山东省大学生电子设计大赛 c题 多功能电子计价秤 单片机用的 c8051f005
💻 BAK
字号:
#include "include.h"

unsigned char H_AD=0; //H_AD 用于存储高八位A/D转换结果 
unsigned char L_AD=0; //L_AD 用于存储低八位A/D转换结构 
bit SystemError=0; // 从机错误标志位
extern uchar ad_tare_k;
float ad_tare;

/*--------------------------
计算当前重量 返回重量 
最大99.999KG
----------------------------*/

float convs_weight()
{
	uchar i;
	float ad=0;
	float weight=0;
	for(i=0;i<100;i++)
	{
		READ_ADS100();
		ad+=(((H_AD<<8)+L_AD));
	 	delay_ms(10);
	}
	ad/=100;
	if(ad_tare_k)			//如果按下了初值键 采集ad初值
	{
		ad_tare_k=0;
		ad_tare=ad;
	}
	else
	{
		weight=(ad-ad_tare)/1.854;
	}
//	delay_ms(1000);
	return weight/1000;
}

//-------------------------------------------------------------------------------------------------- 
// 函数名称: iic_start() 
// 函数功能: 启动I2C总线子程序 
//-------------------------------------------------------------------------------------------------- 
void iic_start(void)
{
	EA=0; //时钟保持高,数据线从高到低一次跳变,I2C通信开始 
	SDA = 1; 
	SCL = 1; 
	delay_us(7); // 延时5us 
	SDA = 0; 
	delay_us(7); 
	SCL = 0; 
} 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: iic_stop() 
// 函数功能: 停止I2C总线数据传送子程序 
//-------------------------------------------------------------------------------------------------- 
void iic_stop(void) 
{
	SDA = 0; //时钟保持高,数据线从低到高一次跳变,I2C通信停止 
	SCL = 1; 
	delay_us(7); 
	SDA = 1; 
	delay_us(7);
	SCL = 0; 
} 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: slave_ACK 
// 函数功能: 从机发送应答位子程序 
//-------------------------------------------------------------------------------------------------- 
void slave_ACK(void) 
{ 
	SDA = 0; 
	SCL = 1; 
	delay_us(7); 
	SCL = 0;
	SDA = 1;
} 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: slave_NOACK 
// 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束 
//-------------------------------------------------------------------------------------------------- 
void slave_NOACK(void) 
{ 
	SDA = 1; 
	SCL = 1; 
	delay_us(7); 
	SCL = 0;
	SDA = 0;  
} 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: check_ACK 
// 函数功能: 主机应答位检查子程序,迫使数据传输过程结束 
//-------------------------------------------------------------------------------------------------- 
void check_ACK(void) 
{ 
	SDA = 1; // 将p1.0设置成输入,必须先向端口写1 
	SCL = 1; 
	F0 = 0;
    delay_us(7);
	if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志F0 
		F0 = 1; 
	SCL = 0;
} 

//-------------------------------------------------------------------------------------------------- 
// 函数名称: IICSendByte 
// 入口参数: ch 
// 函数功能: 发送一个字节 
//-------------------------------------------------------------------------------------------------- 
void IICSendByte(unsigned char ch) 
{ 
	unsigned char n=8; // 向SDA上发送一位数据字节,共八位 
	while(n--) 
	{ 
		if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1 
		{ 
			SDA = 1; // 传送位1 
			SCL = 1; 
			delay_us(7);
			SCL = 0;
			SDA = 0;			 
		} 
		else 
		{ 
			SDA = 0; // 否则传送位0 
			SCL = 1; 
			delay_us(7); 
			SCL = 0; 
		} 
		ch = ch<<1; // 数据左移一位
		delay_us(7);
	} 
} 
//-------------------------------------------------------------------------------------------------- 
// 函数名称: IICreceiveByte 
// 返回接收的数据 
// 函数功能: 接收一字节子程序 
//-------------------------------------------------------------------------------------------------- 
unsigned char IICreceiveByte(void) 
{ 
	unsigned char idata n=8; // 从SDA线上读取一上数据字节,共八位 
	unsigned char tdata; 
	while(n--) 
	{ 
		SDA = 1; 
		SCL = 1;
 	    delay_us(7);
		tdata = tdata<<1; // 左移一位,或_crol_(temp,1) 
		if(SDA == 1) 
			tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1 
		else 
			tdata = tdata&0xfe; // 否则数据的最后一位置0 
		SCL=0;
	} 
	return(tdata); 
} 
//-------------------------------------------------------------------------------------------------- 
// 函数名称:setting_ADS100 
// 用户调用自程序 
// 函数功能: 设置配置寄存器 
//-------------------------------------------------------------------------------------------------- 
void setting_ADS100(unsigned char setting_data) //写器件地址和配置字 
{ 
	iic_start(); //开始写 
	IICSendByte(0x90); //写器件地址(写) 
	check_ACK(); // 检查应答位 
	if(F0 == 1) 
	{ 
		SystemError = 1; 
		return; // 若非应答表明器件错误或已坏,置错误标志位SystemError 
	} 
	IICSendByte(setting_data); 
	check_ACK(); // 检查应答位 
	if (F0 == 1) 
	{ 
		SystemError=1; 
		return; // 若非应答表明器件错误或已坏,置错误标志位SystemError 
	} 
	iic_stop(); // 全部发完则停止 
} 
//-------------------------------------------------------------------------------------------------- 
// 函数名称:READ_ADS100 
// 用户调用自程序 
// 函数功能: 读A/D转换结果 
//-------------------------------------------------------------------------------------------------- 
void READ_ADS100(void) //从ADS1100中读出数据 
{ 
	iic_start(); 
	IICSendByte(0x91); 
	check_ACK(); 
	if(F0 == 1) 
	{ 
		SystemError = 1; 
		return; 
	} 
	H_AD=IICreceiveByte(); 
	slave_ACK(); // 收到一个字节后发送一个应答位 
	L_AD=IICreceiveByte(); 
	slave_NOACK(); // 收到最后一个字节后发送一个非应答位 
	iic_stop(); 
} 

⌨️ 快捷键说明

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