/* 名称:用 ADC0808 控制 PWM 输出 说明:使用数模转换芯片 ADC0808,通过调节可变电阻 RV1 来调节脉冲宽度, 运行程序时,通过虚拟示波器观察占空比的变化。 */ #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; //PWM 输出 //延时 void delay(uint xms) { uchar i; while(xms--) for(i=0;i<40;i++); } //主程序 void main() { uchar Val; TMOD=0x02; //T1 工作模式 2 TH0=0x14; TL0=0x00; IE=0x82; TR0=1; while(1) { ST=0;ST=1;ST=0; //启动 A/D 转换 while(!EOC); //等待转换完成 OE=1; //[page] Val=P1; //读转换值 OE=0; if(Val==0) //PWM 输出(占空比为 0%) { PWM=0; delay(0xff); continue; } if(Val==0xff) //PWM 输出(占空比为 100%) { PWM=1; delay(0xff); continue; } } } //T0 定时器中断给 ADC0808 提供时钟信号 void Timer0_INT() interrupt 1 { CLK=~CLK; //PWM } PWM=1; //PWM 输出(占空比为 0%~100%) delay(Val); PWM=0; delay(0xff-Val); 修改完善这段代码
时间: 2023-06-26 18:06:34 浏览: 125
ADC0808控制PWM输出_Return=Continue.rar
这段代码实现了使用 ADC0808 控制 PWM 输出的功能,其中通过调节可变电阻 RV1 来调节脉冲宽度。在主程序中,通过启动 A/D 转换并等待转换完成,读取转换值 Val 并进行 PWM 输出,当 Val 为 0 时,占空比为 0%;当 Val 为 0xff 时,占空比为 100%。在 T0 定时器中断中提供时钟信号 CLK 给 ADC0808,并根据 Val 值来控制 PWM 输出的占空比。
需要修改的地方有:
1. 在主程序中,需要将 PWM 输出的占空比从 0%~100% 改为根据 Val 值来控制占空比,可以使用以下代码实现:
PWM=1;
delay(Val);
PWM=0;
delay(0xff-Val);
2. 在主程序中,需要将 while 循环中的 ST=0;ST=1;ST=0; 改为 ST=1;ST=0;ST=1;,即先拉高启动信号,再拉低,再拉高,这样才能正常启动 A/D 转换。
修改后的代码如下:
阅读全文