51单片机的AD转换.docx

上传人:b****5 文档编号:8314511 上传时间:2023-01-30 格式:DOCX 页数:13 大小:17.01KB
下载 相关 举报
51单片机的AD转换.docx_第1页
第1页 / 共13页
51单片机的AD转换.docx_第2页
第2页 / 共13页
51单片机的AD转换.docx_第3页
第3页 / 共13页
51单片机的AD转换.docx_第4页
第4页 / 共13页
51单片机的AD转换.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

51单片机的AD转换.docx

《51单片机的AD转换.docx》由会员分享,可在线阅读,更多相关《51单片机的AD转换.docx(13页珍藏版)》请在冰豆网上搜索。

51单片机的AD转换.docx

51单片机的AD转换

/*****************************************************************/

/**/

/*名称:

AD转换+LCD12864显示程序*/

/*功能:

1AD转换,二进制转换成十进制*/

/*2显示英文,数字,符号,图片。

*/

/*难度等级:

高*/

/*****************************************************************/

#include

#include

#defineucharunsignedchar

/**********引脚定义*********/

sbitlck=P3^5;//锁存信号

sbitaddr0=P1^4;

sbitaddr1=P1^5;

sbitaddr2=P1^6;

sbitcs138=P1^7;

/********常用命令及参数定义********/

#defineDISPON0x3f

#defineDISPOFF0x3e

#defineDISPFIRST0xc0

#defineSETX0x40

#defineSETY0xb8

#defineLCDBUZY0x80

#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

}

/***********主程序***************/

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+'0';//小数部分低位

intvolt=intvolt/0x0a;

k=intvolt%0x0a+'0';//小数部分高位

vWrite8x16Character(&char_Table['V'-0x20][0],3,112,0);//显示电压单位

vWrite8x16Character(&char_Table[j-0x20][0],3,104,0);//显示小数低位

vWrite8x16Character(&char_Table[k-0x20][0],3,96,0);//显示小数高位

vWrite8x16Character(&char_Table['.'-0x20][0],3,88,0);//显示小数点

vWrite8x16Character(&char_Table[i-0x20][0],3,80,0);//显示整数位

delay(5000);

}

}

/*******************0804转换程序********************/

ucharADC0804()

{ucharadc0804value;

addr0=1;

addr1=1;

addr2=0;//输出AD0804片选地址。

cs138=1;

P0=0xff;//向ADC0804发任何数据,0804开始转换

WR=0;

WR=1;

delay(1000);

delay(1000);//等待转换完成

RD=0;

adc0804value=P0;//读取转换后的值

RD=1;

cs138=0;

return(adc0804value);

}

//***********初始化LCD*******************/

voidLcminit(void)

{

cbyte=DISPOFF;

WrL(cbyte);

WrR(cbyte);

cbyte=DISPON;

WrL(cbyte);

WrR(cbyte);

cbyte=DISPFIRST;

WrL(cbyte);

WrR(cbyte);

Lcmcls();

Locatexy(0,0);

}

/***************LCD清屏********************/

voidLcmcls(void)

{uchari,j;

for(i=0;i<8;i++){

delay(6);

for(j=0;j

delay(6);

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,表示忙,则循环

lck=0;

P1=0x00;//ELCD=0,R/W=0(读),CSB=0,CSA=0

lck=1;

P0=x;//数据送到P0口

lck=0;

P1=0x22;//ELCD=1,RW=0(写),CSB=1,CSA=0

lck=1;

lck=0;

P1=0x00;//ELCD=0,RW=0(写),CSB=0,CSA=0

lck=1;

}

/**************写右区**************/

voidWrR(uchardatax)

{

P0=0xFF;//P0口送FF,准备读

lck=0;

P1=0x29;//ELCD=1,R/W=1(读),CSB=0,CSA=1

lck=1;

while(P0&LCDBUZY);//最高位为1,表示忙,则循环

lck=0;

P1=0x00;//ELCD=0,R/W=0(读),CSB=0,CSA=1

lck=1;

P0=x;//数据送到P0口

lck=0;

P1=0x21;//ELCD=1,RW=0(写),CSB=0,CSA=1

lck=1;

lck=0;

P1=0x00;//ELCD=0,RW=0(写),CSB=0,CSA=0

lck=1;

}

/*************定位*****************/

voidLocatexy(ucharrow,ucharcol)

{

ucharx,y,right;

switch(col&0xc0)

{

case0:

{

P0=0xFF;//P0口送FF,准备读

lck=0;

P1=0x29;//ELCD=1,R/W=1(读),CSB=0,CSA=1

lck=1;

while(P0&LCDBUZY);//最高位为1,表示忙,则循环

lck=0;

P1=0x00;

lck=1;

right=1;break;}//置右半屏标志

case0x40:

{

P0=0xFF;//P0口送FF,准备读

lck=0;

P1=0x2a;//ELCD=1,R/W=1(读),CSB=1,CSA=0

lck=1;

while(P0&LCDBUZY);//最高位为1,表示忙,则循环

lck=0;

P1=0x00;//ELCD=0,R/W=0(读)CSB=0,CSA=0

lck=1;

right=0;break;}//置左半屏标志

}

x=col&0x3f|SETX;//把列数据变成行命令

y=row&0x07|SETY;//把行数据变成行命令

/**********************************/

lck=0;

if(right)

P1=0x29;

else

P1=0x2a;

lck=1;

while(P0&LCDBUZY);//最高位为1,表示忙,则循环

lck=0;

P1=0x00;

lck=1;

/*********以上为判断忙标志********/

/*********************************/

P0=y;

lck=0;

if(right)

P1=0x21;

else

P1=0x22;

lck=1;

lck=0;

P1=0x00;

lck=1;

/**********以上为送行命令***********/

P0=0xFF;

lck=0;

if(right)

P1=0x29;

else

P1=0x2a;

lck=1;

while(P0&LCDBUZY);//最高位为1,表示忙,则循环

lck=0;

P1=0x00;

lck=1;

/*********以上为判断忙标志********/

P0=x;

lck=0;

if(right)

P1=0x21;

else

P1=0x22;

lck=1;

lck=0;

P1=0x00;

lck=1;

/**********以上为送列命令***********/

if(right)

statu=1;

else

statu=0;//置左又半区标志

}

/**************数据写输出***************/

voidWrdata(ucharx,ucharrow,ucharcol)

{

Locatexy(row,col);//定位显示位置

lck=0;

if(statu)

P1=0x05;//ELCD=0R/W=0(写),D/I=1,CSB=0,CSA=1

else

P1=0x06;//ELCD=0,R/W=0(写),D/I=1,CSB=1,CSA=0

lck=1;

P0=x;

lck=0;

if(statu)

P1=0x25;//ELCD=1,R/W=0(写),D/I=1,CSB=0,CSA=1

else

P1=0x26;//ELCD=1,R/W=0(写),D/I=1,CSB=1,CSA=0

lck=1;

lck=0;

P1=0x00;

lck=1;

}

/****************图形输出******************/

voidPutpicture()

{

unsignedchari,j,row,col;

unsignedintx;

row=0;col=0;

for(j=0;j<128;j++){

x=j*0x08;

for(i=0;i<8;i++)

{

cbyte=picture[x++];

Wrdata(cbyte,row,col);

row++;

}

row=0;

col++;

}

}

/***************半角数据点阵输出*******************/

voidPuthalf(uchar*strch,ucharrow,ucharcol)

{

uchari,bakerx;

bakerx=row;

for(i=0;i<16;i++)//上半字输出

{

cbyte=strch[i];

Wrdata(cbyte,bakerx,col);

cbyte=strch[i+1];

Wrdata(cbyte,bakerx+1,col);

col++;

i++;

}

}

/************汉字输出******************/

/*voidPuthz(uchar*str,ucharrow,ucharcol)

{

uchari,bakerx;

bakerx=row;

for(i=0;i<32;i++)

{

cbyte=str[i];

Wrdata(cbyte,row,col);//上半字节输出

i++;

row=bakerx+1;

cbyte=str[i];

Wrdata(cbyte,row,col);//下半字节输出

row=bakerx;

col=col+1;

}

}

*/

/***********************字符型点阵行--》列转换********************/

voidVtoH8x16change(uchar*hzbuf)

{uchari,j,k,cash[16];

ucharnewbyte,savebit[8];

for(k=0;k<16;k++){

newbyte=0;

for(i=0;i<8;i++){

savebit[i]=hzbuf[i]&0x80;

}

for(j=0;j<8;j++){

savebit[j]=savebit[j]>>(7-j);

newbyte=newbyte|savebit[j];

}

cash[k]=newbyte;

newbyte=0;

for(i=8;i<16;i++){

savebit[i-8]=hzbuf[i]&0x80;

}

for(j=0;j<8;j++){

savebit[j]=savebit[j]>>(7-j);

newbyte=newbyte|savebit[j];

}

cash[k+1]=newbyte;

for(j=0;j<16;j++){

hzbuf[j]=hzbuf[j]<<1;

}

k++;

}

for(i=0;i<16;i++)

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;i<16;i++)

ucXArray[i]=ch[i];

}

VtoH8x16change(ucXArray);

Puthalf(ucXArray,row,col);

}

/*****************************结束************************/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 判决书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1