51单片机的AD转换

51单片机的AD转换
51单片机的AD转换

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

/* */

/*名称:AD转换+LCD12864显示程序*/ /*功能: 1 AD转换,二进制转换成十进制*/ /* 2 显示英文,数字,符号,图片。*/

/*难度等级:高*/

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

#include

#include

#define uchar unsigned char

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

sbit lck = P3^5;//锁存信号

sbit addr0 = P1^4;

sbit addr1 = P1^5;

sbit addr2 = P1^6;

sbit cs138 = P1^7;

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

#define DISPON 0x3f

#define DISPOFF 0x3e

#define DISPFIRST 0xc0

#define SETX 0x40

#define SETY 0xb8

#define LCDBUZY 0x80

#define L 0x00

#define R 0x40

#define LIMIT 0x80

/**********全局变量************/

uchar cbyte;

uchar data statu;

bit xy;

/**************函数******************/

void WrL(uchar x);

void WrR(uchar x);

void Lcmcls(void);

void Lcminit (void);

void Putpicture();

void delay(unsigned int time);

void VtoH8x16change(uchar *hzbuf);

void Puthalf(uchar *strch,uchar row,uchar col);

void Wrdata(uchar x,uchar row,uchar col);

void Locatexy(uchar row,uchar col);

void vWrite8x16Character(uchar *ch,uchar row,uchar col,bit flag);

uchar ADC0804();

extern uchar code char_Table[95][16];

extern unsigned char code picture[];

/***************微秒级延时*****************/

void delay(unsigned int time)

{ unsigned int i;

for(i=0;i

}

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

void main(void)

{ uchar i,j,k;

float voltage,decimal;

unsigned int intvolt,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转换程序********************/

uchar ADC0804()

{ uchar adc0804value;

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*******************/

void Lcminit (void)

{

cbyte=DISPOFF;

WrL(cbyte);

WrR(cbyte);

cbyte=DISPON;

WrL(cbyte);

WrR(cbyte);

cbyte=DISPFIRST;

WrL(cbyte);

WrR(cbyte);

Lcmcls();

Locatexy(0,0);

}

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

void Lcmcls(void)

{ uchar i,j;

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

delay(6);

for(j=0;j

delay(6);

Wrdata(0x0,i,j);

}

}

}

/**************写左区***************/

void WrL(uchar x)

{

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;

}

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

void WrR(uchar data x)

{

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;

}

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

void Locatexy(uchar row,uchar col)

{

uchar x, y, right;

switch(col&0xc0)

{

case 0:{

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;}//置右半屏标志

case 0x40:{

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;//置左又半区标志

}

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

void Wrdata(uchar x,uchar row,uchar col)

{

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

lck = 0;

if(statu)

P1 = 0x05;//ELCD=0 R/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;

}

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

void Putpicture()

{

unsigned char i,j,row, col ;

unsigned int x;

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++;

}

}

/***************半角数据点阵输出*******************/ void Puthalf(uchar *strch,uchar row,uchar col)

{

uchar i,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++;

}

}

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

/*void Puthz(uchar *str,uchar row,uchar col)

{

uchar i,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;

}

}

*/

/***********************字符型点阵行--》列转换********************/ void VtoH8x16change(uchar *hzbuf)

{ uchar i,j,k, cash[16];

uchar newbyte, 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];

}

/************************显示英文和符号字符********************/

void vWrite8x16Character(uchar *ch,uchar row,uchar col,bit flag)

{

uchar ucXArray[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);

}

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

相关主题
相关文档
最新文档