PRELOADER

不念过去 不负现在 不畏将来

当前文章 : 《51单片机学习总结(一)》

12/4/2018 —— 

51单片机学习总结(一)

最近在学习STM32单片机的过程中,经常联想到51单片机,一些知识点总是会拿来对比。发现STM32单片机比起51内核要复杂和强大的多,但同时也对51单片机的很多知识点有了进一步的认识。下面回顾下之前用51单片机做过的项目。包括点阵显示项目,智能台灯项目,蓝牙小车项目,频率计项目。

频率计项目

  • 1、这个项目主要是需要使用到51内部的两个定时器/计数器。其中一个用做定时,一个用作计数。根据测频原理可知,使用51内核中的定时器定时1秒,然后通过计数器检测脉冲数,从而判断出频率值,之后通过LED显示出来。
  • 2、所以,首先需要对定时器和计数器进行初始化。这个过程包括设置工作方式,设置初值,允许中端。代码如下:
void Timer_Init(void)
{
    TMOD=0x15;//定时器与计数器均用方式1  计数器用timer0  定时器用timer1
    TH0=0;                                //计数器初值为0
    TL0=0;                                
    TH1=(65536-50000)/256;                //定时1        50ms
    TL1=(65536-50000)%256;
    EA=1;
    ET1=1;//开定时器1中断
}
  • 3、主函数需要调用定时器计数器初始化函数,打开定时器和计数器,然后让程序一直执行。
//主函数
void main(void)
{
    Timer_Init();
    LCD1602_Init();
    TR0=1;
    TR1=1;

    while(1)
    {

    }
}

  • 4、在定时器达到设定时间,会产生中断,进入中断函数后,需要先关闭定时器和计数器,以免产生干扰。在中断函数中,需要对计数器的值进行判断,并进行LCD的写入操作,结束后需要重新设置定时器初值和计数器初值,之后打开定时器和计数器。由于采用定时器定时间为50ms,所以需要进入中断函数20次才有1秒,因此计数值才等于频率值。在第20次时,获取计数值,写入LCD ,并且对计数值进行清零处理。
//中断程序
void Timer1() interrupt 3
{

    TR0=0;                                //关计数器0
    TR1=0;                                //关定时器1
    TH1=(65536-50000)/256;                //定时1        50ms
    TL1=(65536-50000)%256;              

    if(times!=19)
    {
        times++;
    }
    else
    {
            times=0;
            Frequence=TH0*256+TL0;       //计算频率值

            write1602_DDRAM_pos(0,0);

            //开始向LCD1602写频率值
            write1602_byte(Table[Frequence/10000],1); //万位数
            write1602_byte(Table[Frequence%10000/1000],1);    //千位数
            write1602_byte(Table[Frequence%1000/100],1);    //百位数
            write1602_byte(Table[Frequence%100/10],1);        //十位数
            write1602_byte(Table[Frequence%10],1);            //个位数
            write1602_byte(' ',1);
            write1602_byte(' ',1);
            write1602_byte('h',1);                        
            write1602_byte('z',1);

            TH0=0;                                //计数器清0
            TL0=0;
    }
    TR0=1;                //开计数器0
    TR1=1;                //开定时器1
}