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
}