找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求助关于ADC转换的问题

[复制链接]
跳转到指定楼层
楼主
ID:81140 发表于 2016-7-13 17:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
20黑币
请看我写的程序是不是有地方错误,为什么AD的IN0口的输入模拟电压与转换之后的电压不同?(程序在附件中)

ADC转换.doc

36.5 KB, 下载次数: 8, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:76158 发表于 2016-7-15 10:30 | 只看该作者
下载东西还要黑币 这么黑 还是来要人帮忙的?
给你个程序看看吧!
#include<STC15F2K60S2.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define VCC 4.97
uchar code dsp_duan[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0x3e,0xe0,0xfe,0xf6};
uchar code dsp_dian[]={0xfd,0x61,0xdb,0xf3,0x67,0xb7,0xbf,0xe1,0xff,0xfd};
sbit du=P1^1;
sbit we=P1^0;
uint AVG=0;
uint aa,bb,cc,dd;



//_____________________________________

void delay1ms()                //@22.1184MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        i = 22;
        j = 128;
        do
        {
                while (--j);
        } while (--i);
}

void display()
{                           
                du=1;
                        P3=dsp_dian[aa];
                        du=0;
                        P3=0Xff;
                       
                        we=1;
                        P3=0X7F; //For table[8];
                        we=0;
                        delay1ms();                 


                                du=1;
                                P3=dsp_duan[bb];
                                du=0;
                                P3=0Xff;
                               
                                we=1;
                                P3=0XBF;
                                we=0;
                                delay1ms();
                                       
                                    du=1;
                                        P3=dsp_duan[cc];
                                        du=0;
                                        P3=0XFF;
                                       
                                        we=1;
                                        P3=0Xdf;
                                        we=0;
                                        delay1ms();


}

void adc_init()
{
        uint i;
        ADC_CONTR|=0X80;
        for(i=0;i<10000;i++);
        P1ASF|=0X80;
        ADC_CONTR=0XE7;
        delay1ms();
        ADC_CONTR|=0X08;
        EADC=1;
        EA=1;
}

void main()
{
        float Vin;
        adc_init();
        while(1)
        {
             Vin=(VCC*AVG)/1023;
                dd=(Vin*1000);
                aa=dd/1000;
                bb=dd/100%10;
                cc=dd%100/10;
                display();

        }

}

void adc() interrupt 5
{
uint AD_DAT=0;
uchar TMP=0;
ADC_CONTR&=0XE7;
AD_DAT=ADC_RES;
AD_DAT<<=2;
TMP=ADC_RESL;
TMP&=0X03;
AD_DAT|=TMP;
AVG=AD_DAT;
ADC_CONTR|=0X88;

}

只是个简单的 没有做平均求值!也是开始学ADC时候写的程序!实现最简单的功能
回复

使用道具 举报

板凳
ID:76158 发表于 2016-7-15 10:31 | 只看该作者
给你看下 ADC 最简单测试程序 带数码管显示
这也是开始的时候自己写的
#include<STC15F2K60S2.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define VCC 4.97
uchar code dsp_duan[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0x3e,0xe0,0xfe,0xf6};
uchar code dsp_dian[]={0xfd,0x61,0xdb,0xf3,0x67,0xb7,0xbf,0xe1,0xff,0xfd};
sbit du=P1^1;
sbit we=P1^0;
uint AVG=0;
uint aa,bb,cc,dd;



//_____________________________________

void delay1ms()                //@22.1184MHz
{
        unsigned char i, j;

        _nop_();
        _nop_();
        i = 22;
        j = 128;
        do
        {
                while (--j);
        } while (--i);
}

void display()
{                           
                du=1;
                        P3=dsp_dian[aa];
                        du=0;
                        P3=0Xff;
                       
                        we=1;
                        P3=0X7F; //For table[8];
                        we=0;
                        delay1ms();                 


                                du=1;
                                P3=dsp_duan[bb];
                                du=0;
                                P3=0Xff;
                               
                                we=1;
                                P3=0XBF;
                                we=0;
                                delay1ms();
                                       
                                    du=1;
                                        P3=dsp_duan[cc];
                                        du=0;
                                        P3=0XFF;
                                       
                                        we=1;
                                        P3=0Xdf;
                                        we=0;
                                        delay1ms();


}

void adc_init()
{
        uint i;
        ADC_CONTR|=0X80;
        for(i=0;i<10000;i++);
        P1ASF|=0X80;
        ADC_CONTR=0XE7;
        delay1ms();
        ADC_CONTR|=0X08;
        EADC=1;
        EA=1;
}

void main()
{
        float Vin;
        adc_init();
        while(1)
        {
             Vin=(VCC*AVG)/1023;
                dd=(Vin*1000);
                aa=dd/1000;
                bb=dd/100%10;
                cc=dd%100/10;
                display();

        }

}

void adc() interrupt 5
{
uint AD_DAT=0;
uchar TMP=0;
ADC_CONTR&=0XE7;
AD_DAT=ADC_RES;
AD_DAT<<=2;
TMP=ADC_RESL;
TMP&=0X03;
AD_DAT|=TMP;
AVG=AD_DAT;
ADC_CONTR|=0X88;

}
回复

使用道具 举报

地板
ID:81140 发表于 2016-7-18 14:34 | 只看该作者
好的  谢谢您
回复

使用道具 举报

5#
ID:81140 发表于 2016-7-18 21:22 | 只看该作者
danpianji258 发表于 2016-7-15 10:31
给你看下 ADC 最简单测试程序 带数码管显示
这也是开始的时候自己写的
#include

抱歉请您帮忙看一下程序。
#include<reg52.h>
#include<intrins.h>
#define uint8 unsigned char
#define uint16 unsigned int
//端口声明
#define CMD 0x00
#define DAT 0X01
#define LCD1602_DatPort P1         //LCD1602数据口D0-D7
#define ADC_DataPort        P0         //ADC0809数据口D0-D7
sbit OE=P3^5;  //ADC0809输出使能
sbit ST=P3^7;  //转换开始控制
sbit CLK=P3^4; //ADC0809时钟
sbit EOC=P3^6; //ADC0809转换结束信号
//sbit ALE=P2^0;
//sbit ADDA=P2^2;
//sbit ADDB=P2^3;
//sbit ADDC=P2^5;
sbit RS=P2^4;  //LCD1602指令数据选择端
sbit RW=P2^6;  //LCD1602读写选择端
sbit E=P2^7;   //LCD1602使能端

//延时子程序
void delay(uint16 t)
{
        uint16 a;
        for(;t>0;t--)
        {
                for(a=124;a>0;a--)
                {}
        }       
}
//1602写子程序
void Write1602(uint8 dat,bit rs)
{
        E=0;
        RS=rs;                 //选择指令或数据
        RW=0;                 //写操作
        _nop_();_nop_();_nop_();
        E=1;
        _nop_();_nop_();_nop_();
        LCD1602_DatPort=dat;//送数据到LCD1602       
        _nop_();_nop_();_nop_();       
        E=0;
        delay(1);                       
}
//设置显示位置坐标子程序
void SetXY(uint8 x,uint8 y)
{
        x=x&0x0f;//防止超出X范围
        y=y&0x01;//防止超出Y范围
        if(y==0)
        {
                Write1602(0x80+x,CMD);       
        }
        else
        {
                Write1602(0x80+0x40+x,CMD);       
        }       
}
//1602写字符串子程序
void LCD1602_WrStrs(uint8* str)
{
        while(*str!='\0') //终止符
        {
                Write1602(*str,DAT);
                str++;       
        }       
}

//初始化子程序
void Init()
{
        P0=0XFF; //ADC0809数据口
        ST=0;         //开始信号初始化
        OE=1;         //始终输出
        CLK=0;         //时钟端口初始化
        EOC=1;         //转换结束信号
//        ALE=1;
//        ADDA=0;
//        ADDB=0;
//        ADDC=0;
        //定时器1 作为转换的时钟脉冲
        TMOD=0X01;
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;
        ET0=1;
        TR0=1;
        EA=1;
        delay(200);

        Write1602(0x38,CMD); //8位数据格式,两行显示,5*7点阵
        Write1602(0x38,CMD); //8位数据格式,两行显示,5*7点阵

        Write1602(0x0C,CMD); //打开显示,关闭光标,光标不闪烁
        Write1602(0x01,CMD); //清屏
        delay(10);

        SetXY(4,0); //设置显示位置
        LCD1602_WrStrs("ADC TEST!");
}
uint8 ADC_Conventer()
{
        uint8 ad,alc;//局部变量
        ST=1;        //启动转换,并锁存地址
        delay(1);
        ST=0;
        delay(10);
        while(EOC==1); //等待转换结束
        while(EOC==0);
        OE=1;                   //使能数据输出
        delay(100);
        ad=ADC_DataPort;                   //读取ADC转换值
        OE=0;
        //alc=ad;                   //禁止数据输出
        return ad;       
}
//装载子程序
void disload(n)
{
        uint16 a;

        a=(196*n)/10;

        SetXY(4,1); //设置显示位置
        Write1602(n/1000+'0',DAT);
        Write1602('.',DAT);
        Write1602(n%1000/100+'0',DAT);
        Write1602(n%100/10+'0',DAT);
        Write1602(n%10+'0',DAT);
        Write1602('V',DAT);       
}
void main()
{
        Init();
        while(1)
        {               
                disload(ADC_Conventer());
                delay(500);               
        }
}
void timer0() interrupt 1
{
        TH0=(65536-100)/256;
        TL0=(65536-100)%256;
        CLK=!CLK;       
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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