基于51单片机ADC0808转化1K电位器分压5V模拟量来调节PWM(即脉冲宽度调制)大小的项目工程
Posted achenweiqianga
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于51单片机ADC0808转化1K电位器分压5V模拟量来调节PWM(即脉冲宽度调制)大小的项目工程相关的知识,希望对你有一定的参考价值。
#include <regx52.h> #define uchar unsigned char #define uint unsigned int sbit START=P1^0;//启动信号 sbit EOC=P1^1;//转换结束信号 sbit ENA=P1^2;//输出使能 sbit CLOCK=P1^3;//时钟信号 sbit led=P2^6;//位定义LED灯端口 sbit P14=P1^4;//A地址输入线端 sbit P15=P1^5;//B地址输入线端 sbit P16=P1^6;//C地址输入线端 uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管段码表,高电平段导通,低电平位导通。 uchar getdata,count;//电位器分压5V电压模拟量经ADC0808转化为数字量变量、定时器0中断次数变量 uint temp;//电位器分压5V电压模拟量经ADC0808转化为多少份电压值数字量变量 void DelayMS(uchar t) { uchar i,j; for (i=0;i<t;i++) for (j=0;j<123;j++); } // void ADC0808()//读ADC0808子程序 //{ // P3=0xff;//P3全部置高电平准备读数据 // ENA=1; // getdata=P3;//读出转换数据赋与addata // ENA=0;//读数完毕 // } void Display(uint temp) { P2=0xfe;//第1个数码管显示千位数 P0=DSY_CODE[temp/1000]; DelayMS(1); P0=0x00; P2=0xfd;//第2个数码管显示百位数 P0=DSY_CODE[temp%1000/100]; DelayMS(1); P0=0x00; P2=0xfb;//第3个数码管显示十位数 P0=DSY_CODE[temp%100/10]; DelayMS(1); P0=0x00; P2=0xf7;//第4个数码管显示个位数 P0=DSY_CODE[temp%10]; DelayMS(1); P0=0x00; } void main() { TMOD=0x11;//定时计数器1设置方式1 TH0=(65536-500)/256;//定时500us,即0.5ms,大概0.005s。 TL0=(65536-500)%256; TH1=0xff;//定时65520us,即65.520ms,大概0.065s。 TL1=0xf0; EA=1; ET0=1; ET1=1;//允许定时计数器1中断以便产生CLOCK时钟 TR0=1; TR1=1; P14=0;//A地址输入线端 P15=0;//B地址输入线端 P16=0;//C地址输入线端 while(1) { START=0;//启动信号初始为低电平 ENA=0;//允许输出信号初始为低电平 START=1;//启动信号由低电平变为高电平,产生上升沿,内部寄存器清零。 START=0;//启动信号由高电平变为低电平,产生下降沿,开始A/D转换。 // while(EOC==0);//等待转换完成,开始A/D转换时为低电平,A/D转换结束后为高电平。 while (!EOC)//等待转换完成,开始A/D转换时为低电平,A/D转换结束后为高电平。 { // ADC0808();//模拟量转换 P3=0xff; ENA=1;//允许输出A/D数据到单片机 getdata=P3;//电位器分压5V电压模拟量经ADC0808转化为数字量变量数据 temp=getdata*19.6/50;//由于实际电压的模拟量范围是0v~5v,ADC0808测量的是数字量信号0~255(即8个0到8个1),表达式temp=getdata*19.6/50中19.6是用5v按255份来分成每份5v/255=0.0196v=19.6mv,getdata为电位器分压5V电压模拟量经ADC0808转化为数字量变量,最大为255,为何又除以50?由于所用电压为5V,且PWM(脉冲宽度调制)一个周期内产生高低电平共100个,除以50是按50mv一份来算,刚好是100份,也就是5V,又符合PWM(脉冲宽度调制)一个周期高低电平个数,从而把电位器调节电压与PWM(脉冲宽度调制)联系起来,实现了通过电位器调节电压值份数大小来间接调节PWM(脉冲宽度调制)大小去驱动负载。 Display(temp);//显示电位器分压5V电压模拟量经ADC0808转化为多少份电压值数字量变量 ENA=0;//输出完毕 // temp=getdata*19.6/50;//由于实际电压的模拟量范围是0v~5v,ADC0808测量的是数字量信号0~255(即8个0到8个1),表达式temp=getdata*19.6/50中19.6是用5v按255份来分成每份5v/255=0.0196v=19.6mv,getdata为电位器分压5V电压模拟量经ADC0808转化为数字量变量,最大为255,为何又除以50?由于所用电压为5V,且PWM(脉冲宽度调制)一个周期内产生高低电平共100个,除以50是按50mv一份来算,刚好是100份,也就是5V,又符合PWM(脉冲宽度调制)一个周期高低电平个数,从而把电位器调节电压与PWM(脉冲宽度调制)联系起来,实现了通过电位器调节电压值份数大小来间接调节PWM(脉冲宽度调制)大小去驱动负载。 } } } void Time0() interrupt 1 { TH0=(65536-500)/256;//重装定时500us,即0.5ms,大概0.005s。 TL0=(65536-500)%256; count++;//中断1次为0.5ms if (count==100)//PWM周期为0.5ms*100=50ms=0.05s count=0; if (count<temp)//判断定时器0中断次数变量是否小于电位器分压5V电压模拟量经ADC0808转化为多少份电压值数字量变量 led=1;//LED灯灭 else led=0;//LED灯亮 } void Time1() interrupt 3 { TH1=0xff;//重装定时65520us,即65.520ms,大概0.065520s。 TL1=0xf0; CLOCK=~CLOCK;//时钟信号输入端一般为500KHz,该定时器1定时时间为65520微妙,即65.520毫秒,亦0.065520秒,相当于高低电平各占0.065520秒,一个周期就是高低电平时间,则T=0.065520sX2=0.13104s,大概T=0.1s,频率为1/0.1s=10Hz=0.010KHz。 }
以上是关于基于51单片机ADC0808转化1K电位器分压5V模拟量来调节PWM(即脉冲宽度调制)大小的项目工程的主要内容,如果未能解决你的问题,请参考以下文章
51单片机ADC0831+LCD12864+DAC0808+DS1302+24C64+Proteus仿真