|
发表于 2008-12-28 13:59:33
|
显示全部楼层
以前写的程序,好久没看也不知道里面写的什么代码
要准备考试没时间整理,-------希望对你有帮助!!!
/******************************************************
*文件名:ads1110.C
*功能:ADS1110,16位AD转换,毫伏输出
*说明:标记量可能不正确,自己根据情况校验
**************************************************/
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define SLA_W 0x90//读/写地址
#define SLA_R 0X91
#define I2cIdle_yes Flag|=0x02
#define I2cIdle_no Flag&=~0x02
#define I2cIdle (Flag&0x02)
#define ADInputNew_yes Flag|=0x08
#define ADInputNew_no Flag&=~0x08
#define ADInputNew ( Flag&0x08)
#define I2CCONFIG 0x0c //连续转换,15sps
//-----结构体变量-----
struct i2cdata
{unsigned char s;
int ReceiveData;
}I2cData;
uint Voltage; //要显示的电压值
uchar Flag; //标记量
/******************************************************************
*名称:i2c_init()
*功能:初始化I2C接口
*入口参数:无
*出口参数:无
*******************************************************************/
void i2c_init()
{TWCR=0X00; //TWI中断禁止
TWBR=0x0B; //设置波特率
TWSR=0x00; //设置预分频值
}
/******************************************************************
*名称:ADS1110_init()
*功能:初始化ADS1110
*入口参数:无
*出口参数:无
*******************************************************************/
void ADS1110_init()
{
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
if((TWSR&0XF8)!=0X08) Voltage=0001;//START信号已发出,否则出错处理
TWDR=SLA_W; //写SLA_W
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
if((TWSR&0XF8)!=0X18) Voltage=0002;//SLA_W已发出,并收到ACK;否则出错处理
TWDR=I2CCONFIG; //连续转换,15sps
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR&(1<<TWINT)));
if((TWSR&0XF8)!=0X28) Voltage=0003;//DATA已发出,并收到ACK;否则出错处理
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
/******************************************************************
*名称:timer_1_init()
*功能:初始化定时器1,CTC模式,比较匹配中断允许,定时70ms(稍大于AD转换时间)
在中断程序种启动I2C
*入口参数:无
*出口参数:无
*******************************************************************/
void timer_1_init()
{TCCR1B = 0x00; //stop
TCNT1H = 0xDD; //setup
TCNT1L = 0xD4;
OCR1AH = 0x22;
OCR1AL = 0x2C;
ICR1H = 0x22;
ICR1L = 0x2C;
TCCR1A = 0x00;
TCCR1B = 0x0B; //start Time
}
/******************************************************************
*名称:StartI2c()
*功能:启动I2C,ADS1110开始转换
*入口参数:无
*出口参数:无
*******************************************************************/
void StartI2c()
{TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)|(1<<TWIE);
I2cData.s=1;
I2cIdle_no; //置I2C忙标志
}
/******************************************************************
*名称:timer1_compa_isr()
*功能:T/C1比较匹配中断子程序,在中断程序中,启动I2C.
*入口参数:无
*出口参数:无
*******************************************************************/
#pragma interrupt_handler timer1_compa_isr:7
void timer1_compa_isr(void)
{
StartI2c();
}
/*****************************************************************
*名称:timer1_compa_isr()
*功能:T/C1比较匹配中断子程序,在中断程序中,启动I2C.
*入口参数:无
*出口参数:无
*******************************************************************/
#pragma interrupt_handler timer1_compa_isr:7
void timer1_compa_isr(void)
{
if(I2cIdle)//I2C闲,启动I2C
StartI2c();
}
/******************************************************************
*名称:twi_isr()
*功能:TWI中断服务子程序,在中断中,读取电压值
*入口参数:无
*出口参数:无
*******************************************************************/
#pragma interrupt_handler twi_isr:18
void twi_isr(void)
{switch(I2cData.s)
{case 0:StartI2c();
break;
case 1:if((TWSR&0xf8)!=0x08) Voltage=6666;//START信号已发出,否则出错处理
TWDR=SLA_R; //写SLA_R
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE);
I2cData.s++;
break;
case 2: if((TWSR&0xf8)!=0x40) Voltage=6666; //SLA+R已发出,并收到ACK ;否则
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE)|(1<<TWEA); //出错处理
I2cData.s++;
break;
case 3:if((TWSR&0xf8)!=0x50) Voltage=6666; //DATA已收到,ACK已发出;否则
I2cData.ReceiveData=TWDR; //读高八位 //出错处理
I2cData.ReceiveData=I2cData.ReceiveData*256;
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE);
I2cData.s++;
break;
case 4:if((TWSR&0xf8)!=0x58) Voltage=6666; //DATA已收到,NACK已发出;否则出错处理
I2cData.ReceiveData=TWDR+I2cData.ReceiveData;//读底八位后与高八位
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //停止
I2cData.s=0;
ADInputNew_yes;//AD新数据到
I2cIdle_yes;//I2C空间
break;
default :I2cData.s=0;
break;
}
} |
|