51单片机定时计数器实验计数器周期的问题

51单片机的中断与定时计数器尝试
这是我的第一篇有关51单片机的博客,主要记录我的学习历程与中间遇到的问题,如有错漏请指出。
在我理解里面中断与定时计数器是这样的:
中断是通过检查P3.2(INT0)与P3.3(INT1)两个引脚来触发的
计数器是通过检查P3.4(T0)与P3.5(T1)两个引脚的状态,要达到一定的次数(一般是记脉冲数)才触发
定时器不需要检测引脚,直接计数
先说中断的代码
#include&reg51.h&
#include&intrins.h&
#define SDT P0//静态数码管定义
unsigned char code SDT_map[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//静态数码管字模
void delay10ms(unsigned int c)
unsigned int i,j;
for(;c&0;c--)
for(i=38;i&0;i--)
for(j=130;j&0;j--);
void interCongf()
//设置中断0
IT0=1;//IT=0表示低电平触发
IT=1表示负跳变沿触发
EX0=1;//EX为外部中断的允许位
PX0=0;//PX=0表示低优先级
PX=1表示高优先级
//设置中断1
PX1=1;//中断1的优先级比中断0高
EA=1;//总中断允许位
void main()
unsigned char ininum=0;
interCongf();
while(1){}
void inter0() interrupt 0 //外部中断0
for(temp=0;temp&10;temp++) //中断内部无法定义函数
SDT=SDT_map[temp];
delay10ms(10);
//在开始和结尾关开中断,防止中断运行过程中误触
//void timer0() interrupt 1
//定时器中断0
void inter1() interrupt 2 //外部中断1
delay10ms(30);
//void timer1() interrupt 3
//定时器中断1
//void serialport() interrupt 4
{} //串行口中断
其中,SDT为共阳极静态数码管,P3.2(INT0)与P3.3(INT1)两个引脚分别接两个共阴的开关K1与K2
这个程序的功能就是无按键时,数码管全亮(0x00),
当按下K1时,数码管从一走到九
当按下K2时,数码管熄灭600ms,如果在INT0的执行过程中按K2,INT0会被中断(其实是挂起),立刻执行INT1,完成INT1后再返回INT0
然后说说计数器
#include&reg51.h&
#include&intrins.h&
#define SDT P0//静态数码管定义
sbit pulse=P1^0;
unsigned char temp=0;
unsigned char code SDT_map[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//静态数码管字模
void delay10ms(unsigned int c)
unsigned int i,j;
for(;c&0;c--)
for(i=38;i&0;i--)
for(j=130;j&0;j--);
void timeConfg()
TMOD=0x05; //选用计数模式和 选用模式1
TL0=0xF6; //计数10000次
void main()
timeConfg();
//void inter0() interrupt 0
{} //外部中断0
void timer0() interrupt 1
//定时器中断0
TH0=0xD8;//如果不更新TH0与TL0的值,第二次计数将从0~65535+1
SDT=SDT_map[(temp++)%10];
//void inter1() interrupt 2
{} //外部中断1
//void timer1() interrupt 3
//定时器中断1
//void serialport() interrupt 4
{} //串行口中断
#include&reg51.h&
#include&intrins.h&
#define SDT P0//静态数码管定义
unsigned char temp=0, status=0;
unsigned char code SDT_map[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//静态数码管字模
void timeConfg()
TMOD=0x01; //选用定时器模式和 选用模式1
TL0=0xf0; //定时
计数10000次
void main()
SDT=SDT_map[temp];
timeConfg();
if(status==100)
SDT=SDT_map[temp%10];
//void inter0() interrupt 0
{} //外部中断0
void timer0() interrupt 1
//定时器中断0
TH0=0xd8;//如果不更新TH0与TL0的值,第二次计数将从0~65535+1
//void inter1() interrupt 2
{} //外部中断1
//void timer1() interrupt 3
//定时器中断1
//void serialport() interrupt 4
{} //串行口中断
其实定时器和计数器很相似,只用在TMOD里修改就行
其实中断,计数器,定时器很相似
共用的寄存器:定时计数器控制寄存器TCON, 中断优先寄存器IP 和 中断允许寄存器IE
定时计数器特有的寄存器:工作方式寄存器TMOD
附一些有关这些寄存器的资料(转自 普中科技,侵删)
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!论文发表、论文指导
周一至周五
9:00&22:00
浅议降低51单片机定时器定时误差的几种方法
  摘要: 51单片机在当前控制检测系统中的应用越来越多,对其定时的精确要求也越来越高。虽然51单片机自带的16位定时/计数器较为精确,但是在实际应用过程中难免存在误差,而且这个误差不可避免,所以降低51单片机定时器误差就显得尤为重要。 中国论文网 /7/view-4272806.htm  关键词: 单片机;定时误差   中图分类号:TP368.1 文献标识码:A 文章编号:(1-02   0 引言   51单片机的定时/计数器在基本的单片机系统中都会用到,而且对其定时精确度的要求越来越高。一般我们在单片机系统设计中,定时方式通常有以下三种:软件定时,硬件定时和可编程控制器定时。软件定时是通过程序的指令控制实现定时方法,这种定时方式虽然调整方便,但是误差较大,而且CPU的利用率很低;硬件定时是利用专用的定时集成电路设计实现的定时方法,硬件定时的时间较为精确,但是不易调整定时时间;可编程控制器定时是利用程序控制的方法控制硬件的定时时间,这种定时方式能够得到比较精确的定时时间,且调整定时时间也比较方便,51单片机的定时/计数器就属于可编程控制器定时。   虽然51单片机定时/计数器定时方便,但是在系统应用过程中还存在一定的误差,这个误差主要是由于系统中断响应所引起的。基本的51单片机中有5个中断源,其中两个16位的定时/计数器中断,中断系统采用两个优先级控制。51单片机中断响应过程如图1所示。   这是一个多级中断响应的流程图,在定时中断响应过程中,CPU一般通过查看定时/计数器的中断请求标志位TF0和TF1来确定是否有中断请求。但是在执行定时中断的过程中,CPU必须执行完当前执行的指令或者高优先级的中断程序之后才能进入定时中断,这个过程至少需3个机器周期才能实现,这时定时器中的加1计数器还在计数,这样在进入定时中断重新给加1计数器赋值时就会出现加1计数器重新计数的过程,这就是定时器误差的来源。   我们在利用51单片机定时/计数器进行定时操作时最多的使用它的方式1和方式2。方式1是一个16位的定时/计数器,在中断处理过程中需要对定时器中的加1计数器THx和TLx重新赋值。方式2是一个8位自动重装的定时/计数器,在中断处理中可以不同对其加1计数器进行重新赋值。不管是方式1和方式2在中断处理过程中,由于单片机本身响应流程的问题,都会存在一定的定时误差,在定时要求精确的系统中我们考虑的重点是如何去降低定时误差。   1 降低定时器定时误差的几种方法   在单片机系统设计中,我们可以通过以下方法来降低定时器的定时误差。   1.1 提高外部晶振频率 在常用的51单片机系统中,系统时钟是由外接晶体振荡器的频率决定的,系统时钟频率的高低决定了CPU执行速度,外接晶振频率越高,机器周期越短,CPU执行指令的速度越快,响应中断的速度也越快。在51单片机中,1个机器周期=12个晶振周期,若外接晶振频率为6MHz,则机器周期为2us,若CPU在响应定时中断时正在执行2机器周期的指令,那么进入定时中断所需要的时间为4us,定时器内部加1计数器至少计数了4次(不算重置初值的时间)。若我们将外接晶振频率提升到12MHz,则机器周期为1us,CPU在相同条件下响应中断的时间降低到2us,在进入定时中断时内部加1计数器只加了2次,这样的话就能够降低定时器的误差。   不过,相对而言,这种方法有一定的弊端。我们所希望的是外接晶振的频率越高越好,但是并不是所有的51单片机的外接晶振的频率都能提升的很高,比如ATMEL公司的AT89S51单片机外接晶振的频率最大只有33MHz,那么通过提升外接晶振频率降低51单片机的定时器的误差有一定的局限性。   1.2 软件纠正 其实,在使用定时器定时时,定时器的误差一般是由响应过程引起的,这个误差我们可以通过软件调整的方法对其进行纠正。比如我们利用51单片机T0实现50ms的定时,T0工作在方式1,晶振频率为12MHz,那么程序我们一般这样实现:   Void main()   {   TMOD=0x01; //设置T0工作方式,方式1   TH0=()/256; //置初值   TL0=()%256;   ET0=1; //开启T0中断   TR0=1; //启动T0   EA=1; //开CPU中断   ...   }   Void timer0() interrupt 1 //T0中断程序   {   TH0=()/256; //重置初值   TL0=()%256;   ...   }   在以上的程序中,T0的中断程序中直接对TH0和TL0进行赋值,这里忽略了CPU在响应定时中断过程中加1计数器的计数值,这样会引起较大的定时误差,而且这个误差是累积的,程序执行的时间越长,误差越大。   我们可以将T0的中断程序做如下的修改:   Void timer0() interrupt 1 //T0中断程序   {   TH0=()/256+TH0; //重置初值   TL0=()%256+TL0;   ...   }   这样的话,在CPU响应中断的过程中,虽然定时器内部加1计数器还在计数,但是在定时中断程序中,我们将已经计数的值进行累加,这样就能够降低CPU在响应中断时所产生的误差。   1.3 利用外部硬件定时器 我们知道,51单片机的定时/计数器可以实现定时和计数方式,两者的核心都是在计数,只不过定时方式是对机器周期进行计数,计数方式是对外部引脚输入的输入的方波信号进行计数。那么我们在利用定时器定时时,也可以将定时计数器设置在计数方式。比如我们要实现50ms的定时,我们可以在单片机外部设计一个周期为50ms,占空比为50%的方波电路,将该电路产生的方波信号送入单片机的定时/计数器的外部引脚,这样我们在确定定时时间时,可以通过查询定时器的加1计数器的增量是否为5就可以了,这样也能降低定时误差。不过利用这种方式在实现定时时,外部硬件定时器所产生的基准时间的精确程度决定了定时的误差,外部硬件定时器所产生基准时间越精确,误差越小。   2 结束语   在51单片机系统设计中,在需要用到定时的场合,我们总希望定时误差越小越好,尤其是对于某些对定时时间要求比较高的系统。那么以上的三种方法我们可以相互结合使用,这样可以将定时误差大大降低。   参考文献:   [1]马立国.51单片机定时器中断误差分析.集成电路通讯,).   [2]杨洪亮.基于MCS51单片机定时误差的分析及纠正.临沂师范学院信息学院,福建电脑,2006(12).   [3]李全利,迟荣强.单片机原理与接口技术.高等教育出版社.
转载请注明来源。原文地址:
【xzbu】郑重声明:本网站资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有,如有不愿意被转载的情况,请通知我们删除已转载的信息。
xzbu发布此信息目的在于传播更多信息,与本网站立场无关。xzbu不保证该信息(包括但不限于文字、数据及图表)准确性、真实性、完整性等。51单片机定时器计数器详解_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机定时器计数器详解
&&慢慢看完这些,对51单片机定时器、计数器就没有什么不懂的了,强烈推荐!!!
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩53页未读,
定制HR最喜欢的简历
你可能喜欢关于51单片机中应用m82c54计数器的问题, - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
关于51单片机中应用m82c54计数器的问题,
13:46:26  
本帖最后由 懒惰的魔方 于
14:03 编辑
单片机晶振12MHz,因此下面函数中,没有做延时处理.m82c54WR的作用是写控制字,写初值.
无标题.png (75.71 KB, 下载次数: 1)
13:41 上传
82c54有三路16位计数器,分别为计数器0,1,2现在遇到的问题是,计数器0 计数器1完全正常计数,而计数器2不正常,个人猜测可能初值没有被写入的几率比较大(不确定).即使单独测试三路计数器,结果依然一样,依然是计数器2不正常.以下是Main代码: //初始化略过
& && &&&//写控制字
& && &&&m82c54WR(1,1,0X16);//计数器0方式3
& && &&&m82c54WR(1,1,0X56);//计数器1方式3
& && &&&m82c54WR(1,1,0X96);//计数器2方式3
& && &&&//写初值
& && && &m82c54WR(0,0,0x04);
& && &&&m82c54WR(0,1,0x04);
& && &&&m82c54WR(1,0,0x04);
复制代码以下是电路图和时序图:
无标题.png (112.92 KB, 下载次数: 1)
13:42 上传
无标题.png (73.5 KB, 下载次数: 1)
14:03 上传
16:41:05  
自己顶,别死掉,千万别死掉
16:41:08  
自己顶,别死掉,千万别死掉
16:55:49  
& && && && && && && &
高级工程师
17:04:23  
呵呵,我有实物的,用的是STM32控制的
19:27:24  
呵呵,我有实物的,用的是STM32控制的
您好,您是怎么控制的啊?我这里唯独计数器2有问题.
20:59:26  
您好,已经加你了
21:49:01  
这东西不会这么难吧?
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司51单片机测变周期脉冲信号的简便方法
11:21:28来源: 21ic
关键字:&&&&
&&& 脉冲信号是工程中一类较常见的信号,如光电位移、速度、转速等传感器输出的信号,而和脉冲周期是其基本参数,往往需对它们进行测量。对等周期的脉冲信号的测量比较容易,只需测量任一脉冲宽度或周期就可以了,近年来已有许多MCS-51用户利用测量脉冲信号的基本参数而开发新产品,如山东大学的“ZBCY—I型智能标枪速度测试仪”就是利用测量一个脉冲宽度来获得标枪在某一飞行距离内的平均速度。对连续变周期的脉冲信号周期的测量则相对困难些,许多测量人员都首先对这类信号进行二分频后一路反相,然后用两个定时/计数器分别测出两路脉冲信号的正脉冲宽度得到周期,这种方法硬件开销较大,软件设计也较复杂。本文将介绍了一种用MCS-内部一个定时/计数器直接测量连续变周期的实用方法。&&& 用803l内部定时器来测连续变周期的脉冲信号的周期时,关键是如何控制定时/计数器的启动、停止。以定时器T1为例,当其工作于方式1时,则按16位计数器工作,由两个特殊功能寄存器THl作为高8位和TLl作为低8位构成,其控制逻辑如图1。&&&& 图1定时,计数器方式1的控制逻辑&&& 当定时/计数器方式控制寄存器TMOD门控位GATE=0时,计数器的启动、停止只受TR1控制,只要TR1置位。计数器就被选通,而不管INT1电平高低。因此,在主程序中先置位IE中位EA,将信号引入INT1,在INT1中断服务程序中使TCON中位TR1复位和置位来实现计数器的停止、数据读取、计数器赋初值和启动。其工作过程如图2。&&&& 图2& 定时,计数器测脉冲周期简图其中:t1-中断服务程序执行时间&&& t2-计数器计数时间&&& 则:第i个脉冲周期ti=t1+t2(i=1,2,3,…)。&&& 可以看出,仅用8031内部的一个定时/计数器,就可测出一路变周期脉冲信号的每个周期。&&& 定时器T1中断服务程序流程框图如图3所示。
关键字:&&&&
编辑:什么鱼
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
关注eeworld公众号快捷获取更多信息
关注eeworld服务号享受更多官方福利
网友正在学习IC视频
EEWORLD网友正在观看&&视频
EEWORLD网友正在观看&&视频
EEWORLD网友正在观看&&视频
EEWORLD网友正在观看&&视频
EEWORLD网友正在观看&&视频
相关关键词
热门关键词
大学堂最新课程
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源
热门资源推荐
频道白皮书
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

我要回帖

更多关于 单片机计数器 的文章

 

随机推荐