单片机应用技术的学习(DA转换器(PWM输出))

#include"reg52.h"		 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;
typedef unsigned char u8;
//对数据类型进行声明定义↑
sbit PWM=P2^1;//定义输出PWM波形所用到的IO口
sbit beep=P1^5;
bit DIR;
//bit和int char之类的差不多,只不过char=8位, bit="1位而已"。
//都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。
//这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,
//意义有点像C++中的BOOL。通常bit定义的变量作为一个标志位用。
u16 count,value,timer1;//count和value搭配,和timer1同步自增,用来控制占空比的高电平
//持续时间,而timer1是记录走过了多长时间有没有到一个周期(PWM周期1000us=1ms是固定的)
void Timer1Init()//定时器1初始化
{
	TMOD|=0x10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。
	TH1=0xff;
	TL1=0xff;
	//定时1us
	ET1=1;
	EA=1;						
	TR1=1;
	//配置并打开定时器1和定时器1中断允许和总中断
}
int main()
{
	Timer1Init();//定时器1首先要初始化
	while(1)
	{
		if(count>100)
		{
			count=0;//count数到100清零
			if(DIR==1)					   //DIR控制增加或减小
			{
			  value++;
			}			
			if(DIR==0)
			{
			  value--;
			}
			//count累加到100清零,并根据DIR真假来决定高电平应该输出多长时间。
		}
		if(value==1000)//value已经到达周期上限了,高电平输出时间不可再加了,必须减少
		{
			DIR=0;
		}
		if(value==0)//value已经到达周期下限了,高电平输出时间不可再减了,必须增加
		{
			DIR=1;
		}
		//这个仅仅是控制DIR,也就是高电平输出时间应该增多或者减少
		if(timer1>1000)
		{
			timer1=0;//PWM周期1000us,一个周期记满重新再记
		}		
		if(timer1 <value)	
		{
			PWM=1;
			
		}
		else
		{
			PWM=0;
		}	
		//MAIN.C(48): error C141: syntax error near '='用三目运算符就报错,怎么回事?(我看这IDE这么不智能,我就老老实实写ifelse吧)
		//计时的时间未到规定的count值,输出高电平
		//到达了count(value)值,输出低电平。这一步很关键,
		//是最直接控制占空比(一个脉冲循环内的高电平输出时间/一个脉冲周期时间)的步骤	
	}	
}
void Time1(void) interrupt 3
//Time1写Time1不要写成Timer1
//否则报错:*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
//    SYMBOL:  TIMER1
//    MODULE:  main.obj (MAIN)
{
	TH1=0xff;
	TL1=0Xff;//定时1us,手动重装载定时时间
	timer1++;
	count++;//timer1和count的单位相同,timer1决定走过了多长时间,走了1个周期了吗?
	//count直接控制value,也就间接控制高电平输出时间
}

你可能感兴趣的:(单片机)