/*********************************包含头文件********************************/
#include<iom128v.h>
#include<macros.h>
#include <math.h>
/***********************************宏定义**********************************/
#define fosc 16000000 //晶振16MHZ
#define baud 9600 //波特率
#define SLAW 0x18
#define ERR_SLAW 1
#define W_ADD_COM 0xe8
#define R_ADD_COM 0xe9
#define uchar unsigned char
#define uint unsigned int
uchar read_buff[8];
uchar ge,shi,bai,qian;
uchar syserr;
uint dis_data;
/*************************************************************************
** 函数名称: twi_init(void)
** 功能描述: i2c通信初始化
** 输 入:
** 输出 :
** 全局变量: 无
** 调用模块:
** 说明:
** 注意:
**************************************************************************/
void twi_init(void)
{
TWCR= 0x00; //disable twi
TWBR= (1<<6) | (1<<5) | (1<<2); //set bit rate
TWSR= 0x00; //set prescale
TWAR= 0x00; //set slave address
TWCR= (1<<TWEN); //enable twi
}
/*************************************************************************
** 函数名称: i2cstart(void)
** 功能描述: i2c通信开始
** 输 入:
** 输出 :
** 全局变量: 无
** 调用模块:
** 说明:
** 注意:
**************************************************************************/
void i2cstart(void)
{
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
}
/*************************************************************************
** 函数名称: unsigned char i2cwt(unsigned char data)
** 功能描述: i2c写数据,返回TWI状态
** 输 入:
** 输 出: TWI状态
** 全局变量: 无
** 调用模块:
** 说明:
** 注意:
**************************************************************************/
uchar i2cwt(uchar data)
{
TWDR = data;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
_NOP();
return(TWSR&0xf8);
}
/*************************************************************************
** 函数名称: unsigned char i2crd(void)
** 功能描述: i2c读数据
** 输 入:
** 输出 : 读取的数据
** 全局变量: 无
** 调用模块:
** 说明:
** 注意:
**************************************************************************/
uchar i2crd(void)
{
TWCR= (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
return(TWDR);
}
/*************************************************************************
** 函数名称: i2cstop(void)
** 功能描述: i2c停止
** 输 入:
** 输出 :
** 全局变量: 无
** 调用模块:
** 说明:
** 注意:
**************************************************************************/
void i2cstop(void)
{
TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
}
/*************************************************************************
** 函数名称: PCF8536_wt(unsigned int add,unsigned char data)
** 功能描述: 向PCF8563指定地址写入一条数据
** 输 入: unsigned int add :高八位为器件地址,低八位为内部寄存器地址
unsigned char data :需要写入的数据
** 输出 :
** 全局变量:
** 调用模块:
** 说明:
** 注意:
**************************************************************************/
void IIC_wt(uchar add,uchar data)
{
i2cstart();
if(i2cwt(W_ADD_COM)==SLAW)
{
i2cwt(add);
i2cwt(data);
}
else syserr=ERR_SLAW;
i2cstop();
}
/*************************************************************************
** 函数名称: PCF8536_rd(unsigned int add,unsigned char *p,unsigned char num)
** 功能描述: 读PCF8563
** 输 入: unsigned int add :高八位为器件地址,低八位为内部寄存器地址
unsigned char *p :读出的数据存放地址的起始地址
unsigned char num :读出数据的个数
** 输出 :
** 全局变量:
** 调用模块:
** 说明:
** 注意:
**************************************************************************/
void IIC_rd(uchar add,uchar *p,uchar num)
{
uchar cnt;
i2cstart();
if(i2cwt(W_ADD_COM)==SLAW)
{
i2cwt(add);
}
else syserr=ERR_SLAW;
i2cstart();
if(i2cwt(R_ADD_COM)==SLAW)
{
i2cwt(add);
}
else syserr=ERR_SLAW;
for(cnt=num;cnt>0;cnt--)
{
*p=i2crd();
p++;
}
}
//*********************************************************
void conversion(uint temp_data)
{
uchar ge_data,shi_data,bai_data ,qian_data;
qian_data=temp_data/1000 ;
temp_data=temp_data%1000; //取余运算
bai_data=temp_data/100 ;
temp_data=temp_data%100; //取余运算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余运算
ge_data=temp_data;
qian= qian_data;
bai = bai_data;
shi = shi_data;
ge = ge_data ;
}
//*********************************************************
uchar HEX_TO_ASCII(uchar HEX_data)
{
uchar ASCII_data;
switch(HEX_data){
case 0x00:ASCII_data=0x30;break;
case 0x01:ASCII_data=0x31;break;
case 0x02:ASCII_data=0x32;break;
case 0x03:ASCII_data=0x33;break;
case 0x04:ASCII_data=0x34;break;
case 0x05:ASCII_data=0x35;break;
case 0x06:ASCII_data=0x36;break;
case 0x07:ASCII_data=0x37;break;
case 0x08:ASCII_data=0x38;break;
case 0x09:ASCII_data=0x39;break;
case 0x0a:ASCII_data=0x41;break;
case 0x0b:ASCII_data=0x42;break;
case 0x0c:ASCII_data=0x43;break;
case 0x0d:ASCII_data=0x44;break;
case 0x0e:ASCII_data=0x45;break;
case 0x0f:ASCII_data=0x46;break;
}
return(ASCII_data);
}
void read_cmp(void)
{
dis_data=0;
dis_data=read_buff[1];
dis_data<<=8;
dis_data|=read_buff[2];
conversion(dis_data);
}
void delay_1ms(void) //1ms延时函数
{
uint i;
for (i=0;i<1140;i++);
}
void delay_nms(uint n) //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}
/****************************************************************************
函数功能:uart初始化程序
入口参数:
出口参数:
****************************************************************************/
void uart_init(void)
{
UCSR0B = 0x00;
UCSR0A = 0x00;
UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);//8位
UBRR0L=(fosc/16/baud-1)%256;
UBRR0H=(fosc/16/baud-1)/256;
UCSR0B =(1<<RXEN0)|(1<<TXEN0); //发送使能,接收使能
}
/****************************************************************************
函数功能:uart发送单字节数据
入口参数:c
出口参数:
****************************************************************************/
void putchar(unsigned int c)
{
while (!(UCSR0A&(1<<UDRE0)));//检测数据存储器是否为空
UDR0=c;
}
/****************************************************************************
函数功能:uart接收单字节数据
入口参数:
出口参数:
****************************************************************************/
unsigned char getchar(void)
{
while(!(UCSR0A& (1<<RXC0)));//检测接收是否结束
return UDR0;
}
/****************************************************************************
函数功能:uart发送字符串数据
入口参数:*s
出口参数:
****************************************************************************/
void puts(char *s)
{
while (*s)
{
putchar(*s);
s++;
putchar(0x0a);
putchar(0x0d);
}
}
/****************************************************************************
函数功能:主程序
入口参数:
出口参数:
****************************************************************************/
void main(void)
{
unsigned char i;
uart_init();
while(1)
{
twi_init();
IIC_wt(0x00,0x31);
IIC_rd(0x00,read_buff,8);
read_cmp();
ge=HEX_TO_ASCII(ge);
shi=HEX_TO_ASCII(shi);
bai=HEX_TO_ASCII(bai);
qian=HEX_TO_ASCII(qian);
putchar(qian);
putchar(bai);
putchar(shi);
puts(".");
putchar(ge);
putchar(0x0a);
putchar(0x0d);
puts("\n");
delay_nms(3000);
}
}