《单片机实践项目》《电子DIY》基于51单片机的ADC0808的PWM实验,Proteus仿真
ADC0808 是含8 位A/D 转换器、8 路多路开关,以及与微型计算机兼容的控制逻辑的CMOS组件,其转换方法为逐次逼近型。ADC0808的精度为 1/2LSB。在AD 转换器内部有一个高阻抗斩波稳定比较器,一个带模拟开关树组的256 电阻分压器,以及一个逐次通近型寄存器。8 路的模拟开关的通断由地址锁存器和译码器控制,可以在8 个通道中任意访问一个单边的模拟信号。
ADC0808芯片有28条引脚,采用双列直插式封装,如右图所示。各引脚功能如下:
1~5和26~28(IN0~IN7):8路模拟量输入端。
8、14、15和17~21:8位数字量输出端。
22(ALE):地址锁存允许信号,输入,高电平有效。
6(START): A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0808复位,下降沿启动A/D转换)。
7(EOC): A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
9(OE):数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
10(CLK):时钟脉冲输入端。要求时钟频率不高于640KHZ。
12(VREF(+))和16(VREF(-)):参考电压输入端
11(Vcc):主电源输入端。
13(GND):地。
23~25(ADDA、ADDB、ADDC):3位地址输入线,用于选通8路模拟输入中的一路
程序
#include <reg51.h>
//视频讲解:B站搜索:逗比小憨憨
#define uint unsigned int
#define uchar unsigned char
sbit CLK = P2^4;
sbit ST = P2^5;
sbit EOC = P2^6;
sbit OE = P2^7;
sbit PWM = P3^0;
void delay_ms(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<118;i++); //=255*1.3/5 60
}
}
int main(void)
{
uchar Val;
TMOD |= 0x02;
TH0 = 231; // 0001 0100 (256-25)=231
TL0 = 231; //50us
IE = 0x82; //1000 0010
TR0 = 1;
while(1)
{
ST = 0;
ST = 1;
ST = 0;
while(!EOC);
OE = 1;
Val = P1;// 0-255 125 180
OE = 0;
if(Val == 0)
{
PWM = 0;
delay_ms(255);
continue;
}
else if(Val == 0xff)
{
PWM = 1;
delay_ms(255);
continue;
}
else
{
PWM = 1;
delay_ms(Val);
PWM = 0;
delay_ms(0xff - Val);
}
}
return 0;
}
//定时器0中断函数
void Timer0_Handler(void) interrupt 1 using 0
{
CLK = !CLK;
}