ADC0809简介
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):地址锁存允许信号,输入,高电平有效。(这里接START,跟随变化)
6(START): A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动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路模拟输入中的一路
精华部分(ADC0809运作函数)
ST = 0;//
ST = 1;//复位
ST = 0;//开始转换
while(EOC == 0);//等待EOC变1,等待AD转换信号结束
OE = 1;//数据输出开启
Display_Result(P3);//p3采集完的数据送到数码管
OE = 0;//数据输出关闭
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210603143032334.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzM2OTYyNQ==,size_16,color_FFFFFF,t_70)
A B C来控制通道输入
数码管显示
ADC0809驱动有7个输出端口 0000 0000,所以我们可以知道他的值得范围0x00—0xFF(换算成十进制0—255),对应的电压值以5V 为例,取比例值,举例子:
当你数码管显示204时,那么你对应的电压值:
204/255=x/5V
x=4V
测量的电压V=5-4=1V
可见数码管的数值=滑动变阻器下部分电压值(接地那一端)
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021060315513073.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzM2OTYyNQ==,size_16,color_FFFFFF,t_70)
/*************** writer:shopping.w ******************/
#include
#define uint unsigned int
#define uchar unsigned char
uchar code LEDData[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f//数码管显示
};
sbit OE = P1^0;
sbit EOC = P1^1;
sbit ST = P1^2;
sbit CLK = P1^3;
void DelayMS(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i
TMOD = 0x02;//定时模式2
TH0 = 0x14;
TL0 = 0x00;
IE = 0x82;
TR0 = 1;
P1 = 0x3f;
while(1)
{
ST = 0;//
ST = 1;//复位
ST = 0;//开始转换
while(EOC == 0);//等待EOC变1,等待AD转换信号结束
OE = 1;//数据输出开启
Display_Result(P3);//p3采集完的数据送到数码管
OE = 0;//数据输出关闭
}
}
void Timer0_INT() interrupt 1
{
CLK = !CLK;//高低电平转换
}
问题一:滑动电阻调到最大或者最少时,数码管可以显示正确值,但是当调至中间位置时,显示乱码。
解决:说明你的ADC0808输出引脚接反了!ADC0808 OUT0.1.2.3.4.5.6.7引脚,对应的引脚Px.7.6.5.4.3.2.1.0,。之前掉这个坑花了我好几个小时!
PWM输出
输出口P3.0,能够通过滑动电阻进行调节,输出电压的占空比,后续可加个直流电机进行调速
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210603152352412.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzM2OTYyNQ==,size_16,color_FFFFFF,t_70)
#include
#define uint unsigned int
#define uchar unsigned char
sbit adc = P2^0;//add a 控制
sbit CLK = P2^4;//时钟脉冲输入端。要求时钟频率不高于640KHZ
sbit ST = P2^5;// A/D转换启动信号
sbit EOC = P2^6;//A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
sbit OE = P2^7;//数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量
sbit PWM = P3^0;
void DelayMS(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i
adc=0;
ST = 0;//
ST = 1;//复位
ST = 0;//开始转换
while(!EOC);//当EOC等于1,
OE = 1;//打开输出
Val = P1;//
OE = 0;//关闭输出
if(Val == 0)//当电压等于0的时候
{
PWM = 0;
DelayMS(0xff);//无限延迟
continue;
}
if(Val == 0xff)//当电压等于最大值的时候
{
PWM = 1;
DelayMS(0xff);//无线延迟
continue;
}
PWM = 1;
DelayMS(Val);//高电平占空比
PWM = 0;
DelayMS(0xff - Val);//低电平占空比
}
}
void Timer0_INT() interrupt 1
{
CLK = !CLK;
}
|