查看: 1998|回复: 4
打印 上一主题 下一主题

AD574 12位A/D转换 LCD1602 显示

[复制链接] qrcode

1

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
楼主
跳转到指定楼层
发表于 2015-8-23 10:06 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本程序由本人亲身调试已硬件实现,采用51单片机控制,lcd1602显示采集的数据,我的硬件是采集电压。
#include"absacc.h"
#include "reg52.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define ADCOM XBYTE[0xff7c] //启动 A0=0,CS=0;RC=0;
#define ADLO XBYTE[0xff7f] //读低四位 CS="0";A0=1;RC=1;
#define ADHI XBYTE[0xff7d] //读高四位 CS="0";A0=0;RC=1;
char code reserve[3]_at_ 0x3b; //保留0x3b开始的3个字节
//void AD_pro();
//void data_pro();
void display();
void beep();
void delay0(uchar x); //x*0.14MS
sbit LCD_RS = P3^0;
sbit LCD_RW = P3^1;
sbit LCD_EN = P3^2;

sbit STS="P3"^7; //转换标志位
uchar dis_buf; //显示缓存
uchar dis_buf1;
uchar dd="0",aa=0;
ulong bb,cc;
uchar code cdis1[ ] = {"OUT V: "};
uchar code cdis2[ ] = {"IN V: "};
uchar data cdis4[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};

//uint temp,temp1,temp3;
uint temp,temp1;
ulong sbuff;
uchar qian,bai,shi,ge;
uchar display_buf[3];
uint addate[7];
uint ad_team;
uchar s;
uint idata result;
uint temp="0";
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/*************************************************************/
/* */
/* 延时子程序 */
/* */
/*************************************************************/
void delay(uchar x)
{ uchar j;
while((x--)!=0)
{ for(j=0;j<125;j++)
{;}
}
}
/*************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 */
/* */
/*************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P2&0x80);
LCD_EN = 0;
return(result);
}
/************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P2 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/************************************************************/
/* */
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/* */
/************************************************************/
void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P2 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*************************************************************/
/* */
/* LCD初始化设定 */
/* */
/*************************************************************/
void lcd_init()
{
delay(15);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //显示开,关光标
delay(5);
lcd_wcmd(0x06); //移动光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*************************************************************/
/* */
/* 设定显示位置 */
/* */
/*************************************************************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/*************************************************************/
/* */
/* 延时 x*0.14ms */
/* */
/*************************************************************/
void delay0(uchar x)
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
/************************************************************
*转换读出AD数据
************************************************************/
uint ad574()
{
ADCOM=0;
while(STS==1);
return((uint)(ADHI<<4)+(ADLO&0xf0));
//return(4050);
}
void AD_pro()
//unsigned char AD_por()
{

for(s=0;s<8;s++) //AD采样8次
{
temp="0";
result=ad574();
addate[s]=result; //采样数据保存
delay(8);
}
for(s=0;s<8;s++) //8次AD相加后除8求平均AD值
{
ad_team=ad_team+addate[s];
}
temp=(uint)ad_team/8;
sbuff=(uint)(temp);
sbuff=(sbuff*948)/4095;

temp=(uint)sbuff;
ad_team=0;
}

/***********************************************************
*AD574数据处理及结果显示
***********************************************************/
/*void data_pro()
{
uchar n;
cdis4[3]=temp%10+0x30;
temp=temp/10;

cdis4[2]=temp%10+0x30;
temp=temp/10;

cdis4[1]=temp%10+0x30;
temp=temp/10;

cdis4[0]=temp+0x30;
lcd_pos(0x07); //设置显示位置为第一行

for (n = 3; n > 0; n--)
//高位为"0"不显示
{
if (cdis4[n] == 0x30)
cdis4[n] = 0x20;
else
break;
}
for(n=0;n<4;n++)
lcd_wdat(cdis4[n]);

}*/

void data_pro()
{
unsigned char n;
for (n = 0; n <=2; n++)
//数据转换
{
cdis4[n] = temp % 10+0x30;
temp = temp / 10;
}
cdis4[3] = temp + 0x30;
for (n = 3; n > 0; n--)
//高位为"0"不显示
{
if (cdis4[n] == 0x30)
cdis4[n] = 0x20;
else
break;
}
lcd_pos(0x07); //显示实际频率值
for(n=3;n!= 0xff;n--)
lcd_wdat(cdis4[n]);
}

/**********************************************************
*主函数
**********************************************************/
main()
{
uchar m;
lcd_init(); //初始化LCD

lcd_pos(0); //设置显示位置为第一行
for(m=0;m<16;m++)
lcd_wdat(cdis1[m]);
lcd_pos(0x40); //设置显示位置为第二行

for(m=0;m<16;m++)
lcd_wdat(cdis2[m]);

while(1)
{
AD_pro();
data_pro();
delay(10);
}
}





回复

使用道具 举报

0

主题

110

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
沙发
发表于 2015-8-28 04:03 AM | 只看该作者
AD574 12位A/D转换 LCD1602 显示                                                                                                                                                                       
回复 支持 反对

使用道具 举报

0

主题

1

帖子

4

积分

新手上路

Rank: 1

积分
4
板凳
发表于 2016-5-3 09:12 AM | 只看该作者
欢迎加入单片机超级热群 90850907

讨论单片机方面的技术问题

如加不进可进第二群86425564

或上http://www.eehome.cn/?a=include下载单片机方面的资料
回复 支持 反对

使用道具 举报

0

主题

110

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
地板
发表于 2016-5-3 11:16 AM | 只看该作者


下面是我的时序和原理图:但就是没法使AD正常工作。请高手帮助,急啊谢啦

LE(373使能端),CS,A0,R_C(574控制端)都已经定义过了,

uint adc()
{
uint val,val_1,val_2;
LE=1; //373使能

CS=0; //使其转化
A0=0;
R_C=0;
LE=0;

_nop_();

LE=1;
CS="0"; //输出读取信号 高8位

R_C=1;
A0=0;
LE=0;
// _nop_();


val_1=P1; //记录高8位于val_1
LE=1;
CS="0";

R_C=1;
A0=1;
LE=0;
_nop_();

val_2=P1&0xf0;
val=val_1*16+val_2/16;

return val;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

0

主题

110

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
5#
发表于 2016-5-3 12:28 PM | 只看该作者
您好,你还有这个的电路连接图吗》
还有最后AD数据显示出来是用哪个函数?谢谢~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表