用ADC0808控制PMW输出,通过调节可变电阻R1来调
//程序设计调试与实训:
//ADC0808有8个模拟输入通道,本例的模拟量从0通道输入,由ADC0808的模拟通道地址
//,本例所使用的IN0通道地址为000,由于本例仅使用了INO通道,因此电路中直接
//将这ADDC、ADDB、ADDA三只引脚全部接地。
//根据图中所示的ADC0808工作时序图可知,START引脚在一个高脉冲后启动A/D转换,
//当EOC引脚出现一个低电平时转换结束,然后由OE引脚控制,从并行输出端读取一字节的转换
//结果。转换后的结果为0x00~0xFF,根据该结果可控制输出脉冲宽度。转换过程中芯片所需要的
//说明:本例使用了模数转换芯片ADC0808,通过调节可变电阻R1来调
//节脉冲宽度,运行程序时,打开VSM Oscilloscope即可观察占空
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK = P2^4;
sbit ST= P2^5;
sbit EOC= P2^6;
sbit OE= P2^7;
sbit PWM= P3^0;
/////////////////////////////////////////////////////////////////////////
//延时
void Delay(uchar x)
{
uchar i;
while (x--)
for (i = 0;i < 40; i++);
}
///////////////////////////////////////////////////////////////////////////
//主程序
void main()
{
uchar value;
TMOD= 0x02;
TH0=0x14;
TL0=0x00;
IE=0x82;
TR0=1;
while (1)
{
ST =0;ST =1;ST = 0;//启动A/D转换
while (!EOC);//等待转换完成
OE =1;
value=P1;//读取转换结果
OE= 0;
if (value==0) //PWM输出(占空比为0%)
{
PWM= 0;
Delay(0xFF);
continue;
// continue`语句用于跳过当前循环的剩余部分,直接进入下一次循环的执行
}
if (value == 0xFF) //PWM输出(占空比为100%)
{
PWM=1;
Delay(0xFF);
continue;
}
PWM=1; //PWM输出(占空比大于0%小于100%)
Delay (value);
PWM=0;
Delay(0xFF - value);
}
}
//////////////////////////////////////////////////////////////////////////
//TO定时器中断给ADC0808提供时钟信号
void Timer0_INT()interrupt 1
{
CLK =!CLK;//ADC0808时钟信号
}
//ADC0808有8个模拟输入通道,本例的模拟量从0通道输入,由ADC0808的模拟通道地址
//,本例所使用的IN0通道地址为000,由于本例仅使用了INO通道,因此电路中直接
//将这ADDC、ADDB、ADDA三只引脚全部接地。
//根据图中所示的ADC0808工作时序图可知,START引脚在一个高脉冲后启动A/D转换,
//当EOC引脚出现一个低电平时转换结束,然后由OE引脚控制,从并行输出端读取一字节的转换
//结果。转换后的结果为0x00~0xFF,根据该结果可控制输出脉冲宽度。转换过程中芯片所需要的
//时钟信号由单片机定时器中断子程序Timer0_INT提供。
//说明:本例使用了模数转换芯片ADC0808,通过调节可变电阻R1来调
//节脉冲宽度,运行程序时,打开VSM Oscilloscope即可观察占空
//比的变化
通过网盘分享的文件:ADC0808
链接: https://pan.baidu.com/s/1sP-OULW12WeYmX1wTjUbxQ 提取码: 4pbg
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit CLK = P2^4;
sbit ST= P2^5;
sbit EOC= P2^6;
sbit OE= P2^7;
sbit PWM= P3^0;
/////////////////////////////////////////////////////////////////////////
//延时
void Delay(uchar x)
{
uchar i;
while (x--)
for (i = 0;i < 40; i++);
}
///////////////////////////////////////////////////////////////////////////
//主程序
void main()
{
uchar value;
TMOD= 0x02;
TH0=0x14;
TL0=0x00;
IE=0x82;
TR0=1;
while (1)
{
ST =0;ST =1;ST = 0;//启动A/D转换
while (!EOC);//等待转换完成
OE =1;
value=P1;//读取转换结果
OE= 0;
if (value==0) //PWM输出(占空比为0%)
{
PWM= 0;
Delay(0xFF);
continue;
// continue`语句用于跳过当前循环的剩余部分,直接进入下一次循环的执行
}
if (value == 0xFF) //PWM输出(占空比为100%)
{
PWM=1;
Delay(0xFF);
continue;
}
PWM=1; //PWM输出(占空比大于0%小于100%)
Delay (value);
PWM=0;
Delay(0xFF - value);
}
}
//////////////////////////////////////////////////////////////////////////
//TO定时器中断给ADC0808提供时钟信号
void Timer0_INT()interrupt 1
{
CLK =!CLK;//ADC0808时钟信号
}







最新发布