找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1860|回复: 0
打印 上一主题 下一主题
收起左侧

AD8090 问题

[复制链接]
跳转到指定楼层
楼主
ID:203453 发表于 2017-5-22 13:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为何程序//功能:ADC0809模块测试,读取IN3口的模拟电
//编译环境: KEIL UVISION2
//单片机晶振:12M  单片机型号AT89S52
//单片机晶振: 无特殊要求
//作者:兴向荣电子元件店
//日期:2013.06.20
//功能:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

// adc0809模块接线
#define uchar unsigned char
sbit STR=P1^0; //单片机P1.0接模块STR引脚, 启动转换信号
sbit EOC=P1^1; //单片机P1.1接模块EOC, 转换结束信号,高电平有效
sbit OE=P1^2; //单片机P1.2接模块OE,输出允许信号,高电平有效
sbit CLK=P1^3; //单片机P1.3接CLK ,ADC0809时钟,输入50-800KHZ的频率
               //一般选用500K
#define adc0809_data  P3// ADC0809模块的D0-D7分别接P3.0-P3.7
/*地址选择 A 接H  
           B 接H
           C 接L
选择通到IN3,当然也可以通过软件设置地址
     REF+ 接VCC
     REF- 接GND
这样 AD=256*(VIN-(VREF-))/(VREF+)-(VREF-)
     (VREF+)=5V;
     (VREF-)=0V;
     AD=256*VIN/5
所以IN3口的电压VIN=AD*5/256;
*/
uchar AD_DATA[1]; //保存IN0通道转换后的数据
uint  addata2;
//==============LCD1602接口连接方法=====================
/*-----------------------------------------------------
       |DB0-----P0.0 | DB4-----P0.4 | RW-------P2.3    |
       |DB1-----P0.1 | DB5-----P0.5 | RS-------P2.4    |
       |DB2-----P0.2 | DB6-----P0.6 | E--------P2.2    |
       |DB3-----P0.3 | DB7-----P0.7 |
    ---------------------------------------------------*/
//================================================*/              
#define LCM_Data     P0    //LCD1602数据接口
#define Busy         0x80   //用于检测LCM状态字中的Busy标识
sbit    LCM_RW     = P2^3;  //读写控制输入端,LCD1602的第五脚
sbit    LCM_RS     = P2^4;  //寄存器选择输入端,LCD1602的第四脚
sbit    LCM_E      = P2^2;  //使能信号输入端,LCD1602的第6脚


//**************函数声明***************************************
void    WriteDataLCM                (uchar WDLCM);//LCD模块写数据
void    WriteCommandLCM        (uchar WCLCM,BuysC); //LCD模块写指令
uchar   ReadStatusLCM(void);//读LCD模块的忙标
void    DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
void    LCMInit(void);//LCD初始
void    delayms(uint ms);//1MS基准延时程序
void    delay(uchar i); //延时函数2
void    DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData);
void   judge_xianshi(void);//显示处理程序
void init();//系统初始化设置
void AD();//读取AD数据
uchar flag1;
//***********************主程序******************************
main()   
{   
   init();//系统初始化设置
   LCMInit();
   while(1)
   {
       AD();
       judge_xianshi();
       delayms(100);
      
   }
}
/*********
系统初始化
***********/
void init()
{  
  EA=1; //开总中断
  TMOD=0x02; //设定定时器 T0工作方式
  TH0=216; //利用T0中断产生CLK信号
  TL0=216;  
  TR0=1; //启动定时器T0
  ET0=1;
  STR=0;
  OE=0;

}  
void   judge_xianshi()
{
  addata2=AD_DATA[0]*100;//把数据扩大100,为下面求取小数位后2位做准备
  DisplayListChar(0,1,0, "xingxiangrong");//在液晶的第一行显示字符"XINGXIANGR"
  DisplayListChar(1,0,0, "AD="); //在液晶的第二行第0位开始显示"AD="
  DisplayOneChar( 1, 3, AD_DATA[0]/100+0x30); //显示AD数据的百位
  DisplayOneChar( 1, 4, AD_DATA[0]/10%10+0x30);//显示AD数据的十位
  DisplayOneChar( 1, 5, AD_DATA[0]%10+0x30);//显示AD数据的各位
  DisplayListChar(1,7,0, "Vin="); //在液晶的第二行第8位开始显示"Vin="
//根据VIN=AD*5/256,求取IN3通到输入的电压
  DisplayOneChar( 1, 11, AD_DATA[0]/51+0x30);//显示输入电压的整数位
  DisplayListChar(1,12,0, ".");//显示小数点
  DisplayOneChar( 1, 13, addata2/51/10%10+0x30);//显示输入电压小数后1位
  DisplayOneChar( 1, 14, addata2/51%10+0x30);//显示输入电压小树后2位
  DisplayListChar(1,15,0, "V");
}
/***********AD
转换函数
**********/
void AD()
{
   STR=0;
   //ADDR这样如果不是通道0,可以在这边加一条其他地址的程序
   delay(10);  
   STR=1; //启动AD转换
   delay(10);
   STR=0;  
   while(0==EOC);//等待转换结束
   OE=1;  
   AD_DATA[0]=adc0809_data; //读取AD数据,数据范围为0-255
   OE=0;  
程序没有下载完成

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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