51单片机学习总结(一)
最近在学习STM32单片机的过程中,经常联想到51单片机,一些知识点总是会拿来对比。发现STM32单片机比起51内核要复杂和强大的多,但同时也对51单片机的很多知识点有了进一步的认识。下面回顾下之前用51单片机做过的项目。包括点阵显示项目,智能台灯项目,蓝牙小车项目,频率计项目。
频率计项目
- 1、这个项目主要是需要使用到51内部的两个定时器/计数器。其中一个用做定时,一个用作计数。根据测频原理可知,使用51内核中的定时器定时1秒,然后通过计数器检测脉冲数,从而判断出频率值,之后通过LED显示出来。
- 2、所以,首先需要对定时器和计数器进行初始化。这个过程包括设置工作方式,设置初值,允许中断。代码如下:
1 2 3 4 5 6 7 8 9 10
| void Timer_Init(void) { TMOD=0x15; TH0=0; TL0=0; TH1=(65536-50000)/256; TL1=(65536-50000)%256; EA=1; ET1=1; }
|
- 3、主函数需要调用定时器计数器初始化函数,打开定时器和计数器,然后让程序一直执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void main(void) { Timer_Init(); LCD1602_Init(); TR0=1; TR1=1;
while(1) {
} }
|
- 4、在定时器达到设定时间,会产生中断,进入中断函数后,需要先关闭定时器和计数器,以免产生干扰。在中断函数中,需要对计数器的值进行判断,并进行LCD的写入操作,结束后需要重新设置定时器初值和计数器初值,之后打开定时器和计数器。由于采用定时器定时间为50ms,所以需要进入中断函数20次才有1秒,因此计数值才等于频率值。在第20次时,获取计数值,写入LCD ,并且对计数值进行清零处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| void Timer1() interrupt 3 {
TR0=0; TR1=0; TH1=(65536-50000)/256; TL1=(65536-50000)%256;
if(times!=19) { times++; } else { times=0; Frequence=TH0*256+TL0;
write1602_DDRAM_pos(0,0);
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; TL0=0; } TR0=1; TR1=1; }
|