qq_49415831 2021-06-23 14:11 采纳率: 0%
浏览 116

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

利用电位器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等。

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-03-06 18:50
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:如何利用电位器产生的0-5V电压,依次点亮八个LED,满足题目要求?并列举所需元器件和需要实现的控制功能。 解答:
    1. 所需元器件:89C51单片机、11.0592MHz晶振、74LS373锁存器、74LS138译码器、8MHz晶振、74HC04反相器、74HC4040二进制计数器、ADC0809模数转换器、发光二极管DS35-DS42等。
    2. 实现的控制功能:
    3. 利用电位器W1产生的0-5V电压,通过ADC0809将其转换为数字值。
    4. 通过74HC4040获取16分频后的8MHz晶振信号,作为ADC0809的时钟信号。
    5. 根据采样值点亮相应的LED。
    6. 输入电压每增加607.6mV(31*19.6mV),则点亮一个LED。
    7. 当输入电压=5V时,8个LED全部点亮。
    8. 当输入电压<607.6mV时,8个LED全部熄灭。
    9. 解题思路:
    10. 将电位器W1的电压输入到ADC0809的IN0口,通过74HC4040将8MHz晶振分频后做为ADC0809的时钟信号,将采样后的数字值通过P1口输出到外设。
    11. 通过程序计算采样的数值n值,根据n值点亮相应的LED。由于每个LED需要控制一个段选信号和一个亮灭信号,因此需要使用74LS138译码器和74LS373锁存器来控制LED的段选和亮灭信号。
    12. 根据题目的要求,可以将输入电压转换为相应的LED点亮个数,分别控制LED的点亮和熄灭。 例如,当输入电压为3.036V时,采样值为312(数值范围为0-1023),则应该点亮2个LED,即DS38和DS39。可以使用下面的代码实现:
    unsigned int adc_value;   // 定义采样值变量
    unsigned char led_num;    // 定义LED点亮数量变量
    // 获取ADC采样值的函数
    unsigned int GetAdcValue(unsigned char channel)
    {
        unsigned int adc_val;   // 定义采样返回值
        ADC0809_EOC = 0;        // 清除EOC标志位
        ADC0809_A = 0;          // 写入开始采样命令
        ADC0809_CH0 = channel;  // 选择采样通道
        while (!ADC0809_EOC);   // 等待采样完成
        adc_val = ADC0809_D;    // 读取采样值
        return adc_val;         // 返回结果
    }
    void main()
    {
        while (1)
        {
            adc_value = GetAdcValue(0);    // 采样电位器W1的电压
            led_num = adc_value / 312;     // 计算LED点亮数量
            if (adc_value >= 5000)         // 当电压输入为5V时,全部点亮
                P1 = 0xFF;
            else if (adc_value <= 607)     // 当电压输入小于607mV时,全部熄灭
                P1 = 0x00;
            else                            // 否则按照数量点亮LED
                P1 = (0xFF >> (8 - led_num)) & 0xFF;
        }
    }
    

    以上代码是一个简单的示例,实际上还需要考虑到LED灯的选型和驱动电路的设计,以保证LED能够正常工作。同时还需要注意电路的连接和程序的编写,以实现预期的控制效果。

    评论

报告相同问题?