第一次写,拿个较为简单的练练手。O(∩_∩)O
程序目的:通过对PWM波形的控制,完成D/A转换
PWM工作原理图:
通过该图我们可以看出,通过调节线c调节占空比来让PWM实现不同波形。在1周期内,调节线左侧为1,右侧为0。
具体程序如下:
#include"reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
bit DIR=0;
u16 count=0,value=0,timer=0;
这使用bit定义位变量,表示方向。在这里也可以使用u8定义。value为调节线c(调节占空比),count调节value,timer为一周期的时间。
定义计时器1
void TimerInit()
{
TMOD|=0x10;
TH1=0XFF;
TL1=0XFF;//1us
ET1=1;
EA=1;
TR1=1;
}
主函数
void main()
{
TimerInit();
while(1)
{
if(count>100)
{
count=0;
if(DIR==1)
{
value++;
}
if(DIR==0)
{
value--;
}
}
if(value==1000)
{
DIR=0;
}
if(value==0)
{
DIR=1;
}
if(timer>1000)
{
timer=0;
}
if(timer<value)
{
PWM=1;
}
if(timer>value)
{
PWM=0;
}
}
}
if(timer>1000) timer=0;可以看出。周期定义为1000。count以100为界,在此每过100value变化一次。而变化起码要到下个周期才能看到。(个人理解,在同一周期内,value的变化很难赶上timer)
中断函数
void Time() interrupt 3
{
TH1=0XFF;
TL1=0XFF;
timer++;
count++;
}
通过定时器中断,让timer,count 每过100us增大一次。
菜鸡初学,水平有限,如有错误,欢迎指正。