模拟电压显示器单片机设计

要求:利用电位器W1产生的0-5V电压,依次点亮DS35-DS42共8个LED。
控制功能:将单片机实验箱上的电位器W1产生0~5V电压输入到ADC0809的IN0。通过74HC4040将8MHz晶振产生的脉冲信号16分频后做为ADC0809的时钟信号。利用A/D对W1输出的电压进行采样,根据采样值点亮相应的LED。要求A/D的输入电压每增加607.6mV(31*19.6mV),则点亮一个LED。当A/D的输入电压=5V时,8个LED全部点亮。当A/D的输入电压<607.6mV时,8个LED全部熄灭。
使用的主要元器件:89C51、11.0592MHz晶振、74LS373、74LS138、8MHz晶振、74HC04、74HC4040、ADC0809、发光二极管DS35-DS42等。


#include <reg52.h>

sbit ADC_CS = P2^0;     // ADC0809片选信号
sbit ADC_CLK = P2^1;    // ADC0809时钟信号
sbit ADC_IN = P2^2;     // ADC0809输入信号
sbit ADC_OUT = P2^3;    // ADC0809输出信号
sbit LED = P1^0;        // 控制LED

void delay(unsigned int count)
{
    unsigned int i;
    while(count)
    {
        i = 100;
        while(i--);
        count--;
    }
}

unsigned int ADC_read()
{
    unsigned int value = 0;
    ADC_CS = 0;    // 使能ADC0809
    ADC_CLK = 1;   // 设置时钟信号为高电平
    ADC_CLK = 0;   // 设置时钟信号为低电平
    ADC_CS = 1;    // 禁用ADC0809

    while(ADC_OUT);    // 等待ADC0809准备好输出数据
    for(int i = 0; i < 8; i++)
    {
        value = value << 1;
        ADC_CLK = 1;    // 设置时钟信号为高电平
        ADC_CLK = 0;    // 设置时钟信号为低电平
        if(ADC_OUT)
            value = value | 0x01;
    }
    return value;
}

void main()
{
    unsigned int voltage, led_count;
    while(1)
    {
        voltage = ADC_read();
        led_count = voltage / 607.6;    // 根据输入电压计算点亮的LED数量
        for(int i = 0; i < 8; i++)
        {
            if(i < led_count)
                LED = 1;    // 点亮相应的LED
            else
                LED = 0;    // 关闭其他LED
            delay(100);    // 延时一段时间,以观察LED的变化
        }
    }
}