8410|11

51

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

51单片机的定时器(初学者) [复制链接]

 单片机我也是才刚刚接触,还在学习中……我想把我在学习中的体会和心得都记录下来,以便像我一样的初学者的交流学习。我是一个真正的单片机初学者,上大学之前对单片机是一无所知,甚至听都没有听说过。下面我的学习体会有可能在单片机已经入门或者高手面前只是班门弄斧,但是我仅仅是从初学者的角度出发,和初学者的交流。下面所写的都是我在学习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 ++;

}

此帖出自51单片机论坛

最新回复

如果用: TH0=(65536-50000)/256; TL0=(65536-50000)%256; 这种方法是不是不用考虑晶振的频率了呀?  详情 回复 发表于 2011-8-6 16:54
点赞 关注
 

回复
举报

473

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
说的很有道理,一定要自己写程序,
我看的是郭的视频,如果没有C语言的基础还是不行的
此帖出自51单片机论坛
 
 
 

回复

350

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
拥有强悍的C语言基础学习单片机事半功倍!
此帖出自51单片机论坛
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(高级)

4
 

回复 沙发 zjjone1023 的帖子

我们大一的时候就把c语言学了,但是那个时候一直不知道学这个有什么用。但是我一直在学习c语言,从大一下学期就复习c准备考全级计算机二级考试,在这个过程中对C有了更深的了解,对我现在学习51写程序很有帮助……
   我现在也在看郭天祥老师的视频但是我还在看金沙滩小宋老师的视频,交叉着看,两位老师都有自己的风格
此帖出自51单片机论坛
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(高级)

5
 

回复 板凳 终极菜鸟 的帖子

确实是啊,用C方便的多啊,汇编好麻烦哦
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

6
 

回复 楼主 扫把鑫 的帖子

程序没问题,有几个地方没做好
定时初值有更好的方法,
另外,你用TF0干什么,白用中断了。

饿死了,吃饭,会来说。
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

7
 
定时初值可以考虑采用一个宏定义,来修改数值,比方说
#define LOW (65535 - TIME) % 255

不过这个问题不大,只是为了修改灵活,这种写法会比较容易修改。

TF0这个呢,其实这么写也可以,但是这种写法可能暴露了一种你不了解中断和TF0这个标志位的特点。
而且这种写法突然增加了每次定时的误差。
首先,在中断打开的情况下,TF0一旦置位,会自动响应中断,同时硬件自动复位,所以你无须清除它。

另外有一个建议是:
对定时值的重新赋值和判断够50次翻转一次的动作,全部加到中断里去,这样主程序里就会更简单。
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

51

帖子

0

TA的资源

一粒金砂(高级)

8
 

回复 7楼 辛昕 的帖子

哦,我知道了啊,昕哥。对于定时器那个初值的设定很好,对于修改的时候确实方便得多啊。想我那样写每次都还得用计算器计算,太麻烦了。
  我现在也是边看视频边学习,看完视频就把程序下载到板子上练习。在学习的过程中肯定会有很多的问题,希望昕哥以及大家多多指教。
   今天又有收获,昕哥这句说的好啊好“基本知识用脑记住,具体袭击用心琢磨”
此帖出自51单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

9
 

楼主写的很不错

有人说这个程序有问题,你可以写一个这样的程序来让大家看一看,看看你写的程序有什么不同。
此帖出自51单片机论坛
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

10
 

回复 9楼 9lyx 的帖子

#include
#include
#define uint unsigned int
#define uchar unsigned char
uint tt=0,m=0;
uchar temp=0xfe;
void main()
{

TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);

}

void led() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
m++;
if(tt==1)
{
P0=temp;
}

if(tt==2)
{
P0=0xff;tt=0;
}
if(m==20)
{
temp=_crol_(temp,1);
m=0;

}昨天写的,LZ确实是没有用到中断
此帖出自51单片机论坛
 
 
 

回复

40

帖子

0

TA的资源

一粒金砂(中级)

11
 

回复 楼主 扫把鑫 的帖子

我是超级菜鸟,不过楼主的程序与宋老师的程序大致一样,!但我还是没学会!总感到精确延迟很难理解!
此帖出自51单片机论坛
 
 
 

回复

40

帖子

0

TA的资源

一粒金砂(中级)

12
 

回复 10楼 王囧囧Orz 的帖子

如果用:
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
这种方法是不是不用考虑晶振的频率了呀?
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表