2301_82157984 2024-06-04 01:32 采纳率: 0%
浏览 8

基于51单片机ADC0809的使用

#include <reg52.h>
#include <INTRINS.H>
unsigned char dispbitcode[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
unsigned char ADC_DATA;

sbit ST = P1^2;
sbit OE = P1^0;
sbit EOC = P1^1;
sbit CLK = P1^3;
sbit LED = P2^7;

void TimeInitial();
void DelayUs(unsigned int us);
unsigned char adc_red(void);

void TimeInitial()
{
    TMOD = 0x10;
    TH1 = (65536 - 5000) / 256;
    TL1 = (65536 - 5000) % 256;
    EA = 1; 
    ET1 = 1;
    TR1 = 1; 
}

void DelayUs(unsigned int us)
{
    unsigned int i;
    for (i = 0; i < us; i++)
        _nop_();
}

unsigned char adc_red()
{
    unsigned char getdata;
    ST = 1;
        DelayUs(2);
        ST = 0;
        while(EOC == 0);
        OE = 1;
        getdata = P3;
        OE=0;
     
    
    return getdata;
}

void displayDigitOnSevenSegment(unsigned char digit)
{
    P2 = 0XFE; 
    P0 = dispbitcode[digit % 10]; 
    DelayUs(50); 
        P2 = 0XFD; 
    P0 = dispbitcode[digit / 10];
}

void main()
{
    TimeInitial();
    while (1)
    {
        ADC_DATA = adc_red();
                displayDigitOnSevenSegment(ADC_DATA);
                DelayUs(1);
    }
}

为啥数码管输出的一直都是0没变化 是数据没采集到吗

img

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-06-04 01:32
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的代码和描述,数码管显示的数值一直为0,可能的原因有以下几点:

    1. ADC0809初始化:代码中没有显示ADC0809的初始化过程,确保ADC0809已经正确初始化,并且已经配置为正确的模式。

    2. ADC0809与单片机的接口:检查ADC0809的控制引脚(如ALE, START, EOC, CLK等)是否已经正确连接到51单片机的相应端口,并且确保时序正确。

    3. 数据采集逻辑:在adc_red()函数中,您使用了P3端口来读取ADC数据,但并没有看到您设置ADC0809的通道选择。确保在开始转换前,已经正确设置了要读取的通道。

    4. 数码管显示逻辑displayDigitOnSevenSegment函数中,您使用了P0来驱动数码管,而P2用于控制数码管的位选。确保您的数码管硬件连接正确,并且位选和段选代码与硬件匹配。

    5. 延时函数DelayUs函数中使用了_nop_()来实现微秒级的延时,但这个延时可能不够精确,您可能需要根据实际的晶振频率调整延时函数,以确保足够的稳定性。

    6. 硬件问题:如果以上软件逻辑都正确,那么问题可能出在硬件上,比如ADC0809模块故障,或者连接线问题等。

    为了解决这个问题,您可以尝试以下步骤:

    • 确保ADC0809已经正确初始化,并检查其数据手册以确保您遵循了正确的初始化过程。
    • 使用逻辑分析仪或示波器检查ADC0809的控制引脚和数据引脚,确保信号正确。
    • 检查adc_red()函数中是否正确读取了ADC0809的数据,并且确保读取的是正确的通道。
    • 检查数码管的硬件连接,确保位选和段选与您的代码逻辑一致。
    • 如果可能,添加一些调试代码,比如在读取ADC数据后打印或显示这些数据,以验证数据是否被正确读取。

    至于参考资料,您可以参考以下资源:

    请注意,以上链接可能需要根据实际情况进行搜索和验证,以确保它们仍然有效且相关。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月4日