/*******************************
工程名:基于HT46RU232的AD转换
作 者:唐明飞
日 期:2010.05.03
难 点:HT46RU232不支持float、double型数据,其只支持整型
所以为了将AD转换的数字量转化为实际电压值,必须采取相应的
算法,已获得对应的整型数据,由观察可得:4095 --5 0---0;
为了获得双精度数据,对模拟值扩大100倍,即4095--500,计算的其
斜率为8.2,为了得到整型数据,取斜率为8,可得整型可转换数据
date=((ad_h<<4)|(ad_l>>4))/8
**********************************/
#include "HT46RU232.h"
#define uchar unsigned char
#define uint unsigned int
#define lcd_en _pc4
#define lcd_rs _pc2
#define lcd_cs _pc3
#define lcd_rw _pd1
#define lcd_lst _pd0
#define lcd_date _pa
#define lcd_dir _pac
/*****************************
函数名:delay
功 能:ms----延时
******************************/
void delay(uint t)
{
uint ms;
while(t--)
{
for(ms=500;ms>0;ms--);
}
}
/*****************************
函数名:delay_us
功 能:us--延时
******************************/
void delay_us(uchar us)
{
while(us--)
{
#asm
NOP
#endasm
}
}
/****************************
函数名:IO_Init
功 能:IO初始化
*****************************/
void IO_Init()
{
_pcc2=0;
_pdc1=0;
_pdc0=0;
_pcc3=0;
_pcc4=0;
_pac=0x00;
}
//******************************
//函数名:lcd_write_com
//功 能:lcd写命令
//参 数:com---命令
//******************************
void lcd_write_com(uchar com)
{
lcd_rs=0;
lcd_date=com;
delay(2);
lcd_en=1;
delay(2);
lcd_en=0;
}
//*************************************
//函数名:lcd_write_date
//功 能:lcd写数据
//参 数:date--数据
//*************************************
void lcd_write_date(uchar date)
{
lcd_rs=1;
lcd_date=date;
delay(2);
lcd_en=1;
delay(2);
lcd_en=0;
}
//*************************************
//函数名:lcd_position
//功 能:lcd定位
//参 数:x行位置,y列位置
//*************************************
void lcd_position(uchar x,uchar y)
{
uchar temp;
temp=y&0x0f;
x&=0x01;
if(x)
temp|=0x40;
lcd_write_com(temp|0x80);
}
//*************************************
//函数名:lcd_display
//功能:数据显示
//*************************************
void lcd_display(uchar x,uchar y,uchar dat)
{
uchar temp;
temp=y&0x0f;
x&=0x01;
if(x)
temp|=0x40;
lcd_write_com(temp|0x80);
lcd_write_date(dat);
}
//*************************************
//函数名:lcd_init
//功 能:lcd定位
//参 数:x行位置,y列位置
//*************************************
void lcd_init()
{
uchar i=0;
uchar table[]="www.tmfetu.com";
lcd_write_com(0x38);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
lcd_position(0,0);
while(table[i]!='\0')
{
lcd_write_date(table[i]);
i++;
}
}
/*************************************
函数名:AD_Init
功 能:AD初始化
参 数:无
**************************************/
void AD_Init()
{
_acsr=0x02; //设置AD转换时钟CLOCK/8
_adcr=0x08; //配置PB0
}
/**************************************
函数名:AD_Transfer
功 能:AD转换
返回值:ad_d
***************************************/
unsigned long AD_Transfer()
{
uchar i;
unsigned long ad_h,ad_l,ad;
_start=0;
_start=1;
_start=0;
while(_eocb);
ad_l=_adrl;
ad_h=_adrh;
ad=(ad_h<<4)+(ad_l>>4);
return ad;
}
/**************************************
函数名:ad_display
功 能:AD数据显示
***************************************/
void ad_display(unsigned long average)
{
unsigned long dat1,dat2,dat3,dat4;
dat1=average/1000 ;
dat2=(average-dat1*1000)/100 ;
dat3=(average-dat1*1000-dat2*100)/10 ;
dat4=(average-dat1*1000-dat2*100-dat3*10);
lcd_display(1,1,dat1|0x30);
lcd_display(1,2,dat2|0x30);
lcd_display(1,3,dat3|0x30);
lcd_display(1,4,dat4|0x30);
}
/**************************************
函数名:ad_true_dd
功 能:实际电压值显示
***************************************/
void ad_true_dd(unsigned long average)
{
unsigned long d1,d2,d3,d4,date;
date=average/8;
lcd_display(1,11,date/100|0x30);
lcd_display(1,12,0x2e);
lcd_display(1,13,date%100/10|0x30);
lcd_display(1,14,date%100%10|0x30);
}
void main()
{
_pcc=0;
_pc3=0;
IO_Init();
lcd_init();
AD_Init();
while(1)
{
ad_true_dd(AD_Transfer());
ad_display(AD_Transfer());
}
}