单片机我也是才刚刚接触,还在学习中……我想把我在学习中的体会和心得都记录下来,以便像我一样的初学者的交流学习。我是一个真正的单片机初学者,上大学之前对单片机是一无所知,甚至听都没有听说过。下面我的学习体会有可能在单片机已经入门或者高手面前只是班门弄斧,但是我仅仅是从初学者的角度出发,和初学者的交流。下面所写的都是我在学习51单片机定时器的一些体会心得。
首先,对于单片机初学者要推荐的入门讲解视频有两个,其中一个是《郭天祥的10天学会51单片机》,另外一个是金沙滩工作室小宋老师的《手把手教你学51单片机》(http://www.kingst.org),这两个老师讲得都很好,都有自己的讲课风格,我就是交叉的看这两位老师的视频学习的。下面进入我们今天的主题—定时器。
大家应该对定时器都不陌生,我也不在此废话。在学习单片机的过程中,有可能我们做的第一个实验就是点亮LED灯实验,这个完成之后做的实验就是要让LED一亮一灭即闪烁实验。在做闪烁实验的时候,是怎样让它亮几秒又熄灭几秒的呢?这个我们最开始学习的时候就是用软件延时。但是我今天的主题不是用软件延时,而是单片机自身的定时器。首先大家对于延时问题,从总体上有三种方法可以实现延时。第一个就是软件延时,软件延时不占用硬件资源,但是占用CPU;第二个就是单片机的定时器,这个是单片机的硬件资源,可以编程实现控制;第三个就是555定时器,这个需要外围的硬件搭建,且不能编程控制。
51单片机有2个定时器T0和T1,它的定时器功能由2个寄存器控制,即TMOD和TCON,其中TMOD是定时器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制 T0、T1的启动和 停止以及设置溢出标志。不懂的话可以自己查阅书籍或者是看视频(小宋老师的视频第五讲、郭老师的视频的四讲),我开始也是不懂,自己查阅书籍了解了一些基本知识,但是还是不是很懂,再去看老师的讲解,你就会明白一些,听完老师讲解,在去实际操作,下载到板子上的时候,你就会豁然开朗。两个老师的讲解都不是纯理论的讲解,而是从工程的角度讲解,在做实验中去学习单片机的内部结构;而在高校的学习中,大多数老师都是先讲解单片机的内部结构,搞得大家晕头转向。
对于我们初学者来说,现在是你知识积累的时候,现在我们就得多多积累,就像两位老师在讲解T0在方式1的工作方式下(晶振频率是12MHZ),定时器设置初值的计算过程就不一样,但是最终结果是一样的。设延时时间为X,初值为N,小宋老师讲解的方法和书上的一样,运用公式12*(2^16-N)/12MHZ=X,计算出初值N,在将其转化成16进制,分别将其高8为赋值给TH0、低8位赋值给TL0;而郭老师的方法是TH0=(2^16-X)/256、TL0=(2^16-X)%256,(在此方法中注意延时时间的统一),这就是两种不同的思路。
再者就是一定要亲自动手写程序,下载到板子上,不要好高骛远,认为简单就不做,有可能在实际的操作中会出现一些从理论上貌似可以实现的,但是实际却不行的现象。我在做这个定时器的时候也遇到了很多问题,自己从理论上好像能实现样,结果则不然。一定要亲自动手做。
好了,我就写到这里了,就不再废话了。我写的程序只是一个简单的闪烁实验,能都把定时器的工作原理搞清楚了,后面慢慢地写其他复杂的延时程序也就没有太大的问题,下面把我的程序代码给附上。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit LED = P0^0;
uint Count=0;
void main()
{
TMOD=0x01;//设置定时器0为工作方式1
TH0=0xB8;
TL0=0X00;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while(1)
{
if(TF0 == 1)
{
TF0 = 0;
TH0 = 0xB8;
TL0 = 0x00;
}
if(Count ==50)
{
Count = 0;
LED = ~LED;
}
}
}
void time0() interrupt 1
{
Count ++;
}