单片机小白学习之路(四十)---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一同自加,数值相同
}

上一篇下一篇

猜你喜欢

热点阅读