要求:利用电位器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的变化
}
}
}