51单片机的AD转换Word格式.docx
《51单片机的AD转换Word格式.docx》由会员分享,可在线阅读,更多相关《51单片机的AD转换Word格式.docx(13页珍藏版)》请在冰豆网上搜索。
#defineL0x00
#defineR0x40
#defineLIMIT0x80
/**********全局变量************/
ucharcbyte;
uchardatastatu;
bitxy;
/**************函数******************/
voidWrL(ucharx);
voidWrR(ucharx);
voidLcmcls(void);
voidLcminit(void);
voidPutpicture();
voiddelay(unsignedinttime);
voidVtoH8x16change(uchar*hzbuf);
voidPuthalf(uchar*strch,ucharrow,ucharcol);
voidWrdata(ucharx,ucharrow,ucharcol);
voidLocatexy(ucharrow,ucharcol);
voidvWrite8x16Character(uchar*ch,ucharrow,ucharcol,bitflag);
ucharADC0804();
externucharcodechar_Table[95][16];
externunsignedcharcodepicture[];
/***************微秒级延时*****************/
voiddelay(unsignedinttime)
{unsignedinti;
for(i=0;
i<
time;
i++);
}
/***********主程序***************/
voidmain(void)
{uchari,j,k;
floatvoltage,decimal;
unsignedintintvolt,tofloat;
addr0=1;
addr1=0;
addr2=1;
//ULN2003片选地址
P0=0x00;
//断开继电器A,B
cs138=1;
cs138=0;
//数据锁存到U18(74HC574)
Lcminit();
//LCD初始化
Putpicture();
//显示界面图片
while
(1)
{
voltage=ADC0804();
voltage=voltage*0.0391;
//将二进制字节数据变成实际电压值10/256=0.0196
intvolt=voltage;
//取整数部分
tofloat=intvolt;
decimal=voltage-tofloat;
//取小数部分
decimal=decimal*100;
//小数部分取两位
i=intvolt%0x0a+'
0'
;
//整数部分个位
intvolt=decimal;
j=intvolt%0x0a+'
//小数部分低位
intvolt=intvolt/0x0a;
k=intvolt%0x0a+'
//小数部分高位
vWrite8x16Character(&
char_Table['
V'
-0x20][0],3,112,0);
//显示电压单位
char_Table[j-0x20][0],3,104,0);
//显示小数低位
char_Table[k-0x20][0],3,96,0);
//显示小数高位
.'
-0x20][0],3,88,0);
//显示小数点
char_Table[i-0x20][0],3,80,0);
//显示整数位
delay(5000);
}
/*******************0804转换程序********************/
ucharADC0804()
{ucharadc0804value;
addr1=1;
addr2=0;
//输出AD0804片选地址。
P0=0xff;
//向ADC0804发任何数据,0804开始转换
WR=0;
WR=1;
delay(1000);
//等待转换完成
RD=0;
adc0804value=P0;
//读取转换后的值
RD=1;
return(adc0804value);
//***********初始化LCD*******************/
voidLcminit(void)
{
cbyte=DISPOFF;
WrL(cbyte);
WrR(cbyte);
cbyte=DISPON;
cbyte=DISPFIRST;
Lcmcls();
Locatexy(0,0);
/***************LCD清屏********************/
voidLcmcls(void)
{uchari,j;
8;
i++){
delay(6);
for(j=0;
j<
LIMIT;
j++){
Wrdata(0x0,i,j);
/**************写左区***************/
voidWrL(ucharx)
{
P0=0xFF;
//P0口送FF,准备读
lck=0;
P1=0x2a;
//ELCD=1/W=1(读),CSB=1,CSA=0
lck=1;
while(P0&
LCDBUZY);
//最高位为1,表示忙,则循环
P1=0x00;
//ELCD=0,R/W=0(读),CSB=0,CSA=0
P0=x;
//数据送到P0口
P1=0x22;
//ELCD=1,RW=0(写),CSB=1,CSA=0
//ELCD=0,RW=0(写),CSB=0,CSA=0
/**************写右区**************/
voidWrR(uchardatax)
P1=0x29;
//ELCD=1,R/W=1(读),CSB=0,CSA=1
//ELCD=0,R/W=0(读),CSB=0,CSA=1
P0=x;
P1=0x21;
//ELCD=1,RW=0(写),CSB=0,CSA=1
/*************定位*****************/
voidLocatexy(ucharrow,ucharcol)
ucharx,y,right;
switch(col&
0xc0)
{
case0:
//最高位为1,表示忙,则循环
right=1;
break;
}//置右半屏标志
case0x40:
//ELCD=1,R/W=1(读),CSB=1,CSA=0
//ELCD=0,R/W=0(读)CSB=0,CSA=0
right=0;
}//置左半屏标志
x=col&
0x3f|SETX;
//把列数据变成行命令
y=row&
0x07|SETY;
//把行数据变成行命令
/**********************************/
if(right)
else
/*********以上为判断忙标志********/
/*********************************/
P0=y;
/**********以上为送行命令***********/
/**********以上为送列命令***********/
statu=1;
statu=0;
//置左又半区标志
/**************数据写输出***************/
voidWrdata(ucharx,ucharrow,ucharcol)
Locatexy(row,col);
//定位显示位置
if(statu)
P1=0x05;
//ELCD=0R/W=0(写),D/I=1,CSB=0,CSA=1
P1=0x06;
//ELCD=0,R/W=0(写),D/I=1,CSB=1,CSA=0
P1=0x25;
//ELCD=1,R/W=0(写),D/I=1,CSB=0,CSA=1
P1=0x26;
//ELCD=1,R/W=0(写),D/I=1,CSB=1,CSA=0
/****************图形输出******************/
voidPutpicture()
unsignedchari,j,row,col;
unsignedintx;
row=0;
col=0;
128;
x=j*0x08;
i++)
cbyte=picture[x++];
Wrdata(cbyte,row,col);
row++;
}
row=0;
col++;
/***************半角数据点阵输出*******************/
voidPuthalf(uchar*strch,ucharrow,ucharcol)
uchari,bakerx;
bakerx=row;
16;
i++)//上半字输出
cbyte=strch[i];
Wrdata(cbyte,bakerx,col);
cbyte=strch[i+1];
Wrdata(cbyte,bakerx+1,col);
i++;
/************汉字输出******************/
/*voidPuthz(uchar*str,ucharrow,ucharcol)
bakerx=row;
32;
cbyte=str[i];
//上半字节输出
row=bakerx+1;
//下半字节输出
row=bakerx;
col=col+1;
*/
/***********************字符型点阵行--》列转换********************/
voidVtoH8x16change(uchar*hzbuf)
{uchari,j,k,cash[16];
ucharnewbyte,savebit[8];
for(k=0;
k<
k++){
newbyte=0;
savebit[i]=hzbuf[i]&
0x80;
savebit[j]=savebit[j]>
>
(7-j);
newbyte=newbyte|savebit[j];
cash[k]=newbyte;
for(i=8;
savebit[i-8]=hzbuf[i]&
newbyte=newbyte|savebit[j];
cash[k+1]=newbyte;
hzbuf[j]=hzbuf[j]<
<
1;
k++;
hzbuf[i]=cash[i];
/************************显示英文和符号字符********************/
voidvWrite8x16Character(uchar*ch,ucharrow,ucharcol,bitflag)
ucharucXArray[16],i;
if(flag){//反白显示英文
for(i=0;
i<
16;
i++)
ucXArray[i]=~ch[i];
}else{
for(i=0;
ucXArray[i]=ch[i];
VtoH8x16change(ucXArray);
Puthalf(ucXArray,row,col);
/*****************************结束************************/