单片机小白学习之路(四十)---DAC转换编码
2018-10-31 本文已影响0人
飞向深空
目标:DA转换编码
状态图
count和timer1在同一个中断中一起自加,数值相同。count加到100后变为0并且value自加1。timer1在自加到1000后变成0,这时候一周期已经结束了,但此时的value才10。想要value到1000,那么timer1起码要到1000*100才行。
就是value在一个周期里移到,而timer1不限它可以到1000不断重载。timer1在大范围里移动形成几个周期,而value移动慢在一个周期里移动,当然它也可以重载。
#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;
sbit PWM = P2^1;
bit DIR; //方向标志位
u16 count ,value ,timer1; //计数标志
void Timer1Init() //定时1us
{
TMOD |=0x10; //设置模式是1
TH1 = 0xff;
TL1 = 0xff; //初值
ET1 = 1; //定时器1中断标志位开启
EA = 1; //总中断开启
TR1 = 1; //开始计时
}
void main()
{
Timer1Init();
while(1){
if(count>100){ //每次count计数到100就变成0,然后value加1或减1
count = 0;
if(DIR==1){ //方向是正
value++;
}
if(DIR==0){ //方向是负
value--;
}
}
if(value==1000){ //满一个PMW周期了
DIR = 0; //方向变负,高电平减少
}
if(value==0){ //value一开始默认是0
DIR = 1; //方向是正
}
if(timer1>1000){ //满以后周期了,清0
timer1 = 0;
}
if(timer1 < value){ //如果timer1 <value那么在这个周期内value前部分是高电平
PWM = 1;
}else{
PWM = 0;
}
}
}
void Time1() interrupt 3
{
TH1 = 0xff;
TL1 = 0xff; //重新赋初值
timer1++;
count++; //count和timer1一同自加,数值相同
}