单片机定时器实验总结c51定时器应用实验

单片机c51定时器应用实验_百度知道
单片机c51定时器应用实验
单片机c51定时器应用实验用5单片机的p1.0接1个发光二极管,编写程序,控制发光二极管闪烁,时间间隔为1s,要求at89c51内部定时器计时
我有更好的答案
TR0=1;while(1);}中断程序:void timer0 ()
interrupt 1{TH0=()/256;TL0=()%256;n++;if(n==10){ led=!n=0;}//256;TH0=()&#47sbit led=P1^0;uchar n=0;主程序:void main ( ){TMOD=0X01;ET0=1;EA=1;TL0=()%256
采纳率:88%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。技术小站:
& 参加直播现场,与专家互动,学最新知识
& 学习业内最热门知识,还有好礼送
& 看视频,填问卷,拿好礼
& 海量精华技术资源 限时在线阅读
张飞电子工程师速成全集
10天掌握PCB AD画板
教你高速PCB项目整体设计
如何设计STM32单片机系统?
物联网操作系统从写到用
讲师:华清远见
讲师:林超文
讲师:郑振宇
讲师:李述铜
移入鼠标可放大二维码
片机倒计时定时器 - 单片机经典实验实例精华详解(附源程序)
来源:本站整理
作者:电子大兵日 14:39
[导读] 四、单片机倒计时定时器 这里我们先要安装好51试验板上的两个轻触按钮开关,我们采用的是独立式按钮开关,也就是说将开关直接连接到电源的地和单片
  四、单片机倒计时定时器
  这里我们先要安装好51试验板上的两个轻触按钮开关,我们采用的是独立式按钮开关,也就是说将开关直接连接到电源的地和单片机的对应引脚之间,这里K1接到单片机的P3.6引脚,K2接到P3.7。正常情况下单片机的P3.6、P3.7都被程序初始化时置&1& 当有按键按下时对应的单片机引脚被按钮开关下拉为&0&,这种方法比较直观,而且比较简单,在按键数量不多的场合下使用很广泛。
  因为机械开关开关时有抖动,所以需要在程序中加一个软件去抖动程序,它的工作原理如下:当单片机检测到有按键被按下后立即执行一个10毫秒的延时程序,然后再在检测该引脚是否仍然为闭合状态?如果仍然为闭合说明确认该键被按下立即执行相应的处理程序,否则可能是干扰,丢弃这次检测结果。
  接下来我们再安装一个四位的拨码开关,就是图中红色的开关,它相当于四个装在一起的拨动开关,当开关拨到&ON&一侧时,对应的那路就会接通,反之断开。它在单片机中一般用于设置初始参数,而且不经常改变的场合。这里因为单片机引脚资源不够,所以我们只使用了拨码开关的第2、3、4位,第1位闲置。三个开关可以逻辑组合出8种状态,所以我们能够方便灵活地预置多达7种的倒计时时间。
  最后我们来安装两个继电器和相关电路,有了继电器我们的实验板不再仅仅是做做实验而已,可以用于控制一些负载,比如说:充电器,洗衣机,电风扇等,使我们的实验板的实用功能大大增强,这也是电子制作实验室网站的单片机实验板和其他公司的产品不同的地方。
  这里继电器由相应的S8050三极管来驱动,开机时,单片机初始化后的P2.3/P2.4为高电平,+5伏电源通过电阻使三极管导通,所以开机后继电器始终处于吸合状态,如果我们在程序中给单片机一条:CLR P2.3或者CLR P2.4的指令的话,相应三极管的基极就会被拉低到零伏左右,使相应的三极管截至,继电器就会断电释放,每个继电器都有一个常开转常闭的接点,便于在其他电路中使用,继电器线圈两端反相并联的二极管是起到吸收反向电动势的功能,保护相应的驱动三极管,这种继电器驱动方式硬件结构比较简单。
  ;电子制作实验室http://www.xie-gang.com/
  ;可设定时间的倒计时定时器,可选择5/15/20/30/35/45/50分钟倒计时
  ;倒计时时间由四位拨码开关的2/3/4位来控制,
  ;第2位表示5分钟,第3位表示15分钟,第4位表示30分钟,
  ;通过不同的组合可以产生5/15/20/30/35/45/50分钟倒计时
  ;P1.0口的外接的发光二极管为状态LED,定时未开始时LED常亮,定时过程中LED闪烁
  ;K1为开始按钮,K2为停止按钮
  a_bit equ 20数码管个位数存放内存位置
  b_bit equ 21数码管十位数存放内存位置
  temp equ 22计数器数值存放内存位置
  ;开机初始化
  MOV P3,#0FFH;对P3口初始化,设置为高电平,用于按键输入
  MOV P0,#0FFH;使显示时间数码管熄灭
  CLR P1.0;点亮LED指示灯
  ;等待键盘输入
  START:JB P3.6,$;循环判断开始按钮K1是否按下?
  ACALL DELAY10;延时10毫秒触点消抖
  JB P3.6,START;如果是干扰就返回
  JNB P3.6,$;等待按键松开
  ;读拨码开关的状态,获得倒计时时间
  SET:MOV A,#0;首先对A清零
  JB P2.0,A1;判断拨码开关的第2位是否接通,接通就对A加5
  ADD A,#5
  A1:JB P2.1,A2;判断拨码开关的第3位是否接通,接通就对A加15
  ADD A,#15
  A2:JB P2.2,A3;判断拨码开关的第4位是否接通,接通就对A加30
  ADD A,#30
  A3:MOV TEMP,A
  ;这时TEMP中的值就是倒计时时间
  ;数码管显示定时时间的程序
  display:CLR P2.4;使继电器1释放,开始定时(开机时继电器处于吸合状态)
  CLR P2.3;使继电器2释放,开始定时(开机时继电器处于吸合状态)
  MOV R2,#120
  AB:MOV R3,#250
  TIME1:mov a,将temp中的十六进制数转换成10进制
  mov b,#10 ;10进制/10=10进制
  div ab
  mov b_bit,十位在a
  mov a_bit,个位在b
  mov dptr,#指定查表启始地址
  mov r0,#4
  dpl1: mov r1,#250 ;
  dplop: mov a,a_取个位数
  MOVC A,@A+DPTR ;查个位数的7段代码
  mov p0,送出个位的7段代码
  clr p2.7 ;开个位显示
  ACALL DELY1;显示1毫秒
  setb p2.7;关闭个位显示,防止鬼影
  mov a,b_取十位数
  MOVC A,@A+DPTR ;查十位数的7段代码
  mov p0,送出十位的7段代码
  clr p2.6 ;开十位显示
  ACALL DELY1;显示1毫秒
  setb p2.6;关闭十位显示,防止鬼影
  ;插入一段判断定时过程中是否有按键输入的程序段
  C1:JB P3.6,B1
  ACALL DELAY10;延时10毫秒消抖
  JB P3.6,C1
  JNB P3.6,$;等待按键松开
  AJMP SET
  B1:JB P3.7,M33
  ACALL DELAY10;延时10毫秒消抖
  JB P3.7,B1
  JNB P3.7,$;等待按键松开
  AJMP OVER
  M33:djnz r3,TIME1 ;2毫秒循环执行250次,时间约0.5秒
  CPL P1.0;使LED每1秒闪烁一次
  djnz r2,AB ;循环执行120次,时间为1分钟
  DEC TEMP;满一分钟对定时时间减1
  MOV A,TEMP
  JNZ DISPLAY;判断TEMP的数值是否为0?不为0循环
  ;结束定时
  OVER:CLR P1.0;LED指示灯常亮
  SETB P2.4;继电器1吸合,定时结束,退回到开机时的状态
  SETB P2.3;继电器2吸合,定时结束,退回到开机时的状态
  AJMP START;退到开机初始化状态
  ;1毫秒延时子程序
  DELY1:MOV R4,#2
  D1:MOV R5,#248
  DJNZ R5,$
  DJNZ R4,D1
  ;10毫秒延时子程序
  DELAY10:MOV R4,#20
  D2:MOV R5,#248
  DJNZ R5,$
  DJNZ R4,D2
  ;实验板上的7段数码管0~9数字的共阴显示代码
  numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
单片机实验相关文章
单片机实验相关下载
单片机相关文章
单片机相关下载
技术交流、积极发言! 发表评请遵守相关规定。
随着物联网技术的突飞猛进,生活中越来越多的家庭设备将会联上网络,变得“智慧”起来,智慧家庭的概念成了这几年媒体、企业、用户关注的焦点,而...
研华IoT嵌入式平台事业群总经理许杰弘表示,工业物联网 2009年就开始提出,至今缺乏临门一脚,现在是打开大门的时候了。研华WISE-PaaS物智联软件平台和...
创新实用技术专题
供应链服务
商务及广告合作
Jeffery Guo
关注我们的微信
供应链服务 PCB/IC/PCBA
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
C51单片机定时器及数码管控制实验报告
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口查看: 4984|回复: 27
51单片机的定时器纠结了很久的问题
请问前辈们&&51单片机里的定时器& &在初始化给TH0&&TL0装上值,然后溢出,申请中断(假设中断打开),进入中断服务函数后,重新给TH0,TL0装值,请问此时TH0,TL0是出中断以后开始计数还是一进中断装上值就开始计数?
一直不停计数。
health 发表于
一直不停计数。
你的意思就是只要赋值后就开始计数了& &我明白了&&谢谢
zhenglingo 发表于
你的意思就是只要赋值后就开始计数了& &我明白了&&谢谢
和赋值没什么关系的,只受运行控制位控制,如TR0。
在开中断后,定时器就开始计数,在计数溢出之后,产生一个中断信号,进入中断服务程序,在中断服务程序中又重新给TH和TL赋值,只要你定时器的开着的,那第计数器是一直在计数,你要知道,定时器和中断是分开的。
health 发表于
和赋值没什么关系的,只受运行控制位控制,如TR0。
& && &初始化已经给TH0,TL0装上值了(非自动重装模式下), 如果溢出(中断允许时),此时TH0,TL0都为0了,进入中断服务函数中,重新装值。那你的意思就是在中断里装上值后定时器就开始跑吗?还是等退出中断函数后计数?&&你说的一直不停的计数&&那是在自动重装模式下吧
<font color="#3728579 发表于
在开中断后,定时器就开始计数,在计数溢出之后,产生一个中断信号,进入中断服务程序,在中断服务程序中又 ...
你的意思是在进入中断给TH0 TL0装值后,定时器就开始计数吗?而不是等中断结束后开始 (定时器已经打开,并且不是自动重装模式下。
给你赋不赋值是没有关系的,只要你一开定时器开始计数,计数器就一直在计数了,定时器的是否工作是由:TMOD&&和 TCON 这两个寄存器来控制的,不是说给TH0和TL0赋值后,定时器才开始工作,
health 发表于
和赋值没什么关系的,只受运行控制位控制,如TR0。
------------------
前面人家说的很清楚了。
只要TRx=1,定时器就运行,你赋不赋值都要将计数寄存器(TH,TL)++的。
只要TRx=0,定时器就停止。
你赋初值只是决定定时器从什么值开始++而已 。
自动重装方式,也只是管着自动重装计数初值,与计时器是否运行无关
一直在计时的,
如果在中断中打开计时器就会计时。。
一启动定时器就开始计数,独立的(它自己一直在动作),中断里面赋值只是把计数器里面我们不想要的的值刷一下(变成我们想要的)。可以这么理解
health 发表于
和赋值没什么关系的,只受运行控制位控制,如TR0。
嗯&&我明白了 多谢
<font color="#3728579 发表于
给你赋不赋值是没有关系的,只要你一开定时器开始计数,计数器就一直在计数了,定时器的是否工作是由:TMOD ...
嗯& & 根据你的解释& & 在TH0&&TL0溢出时假设中断允许,那么在进入中断的过程中&&TL0 TH0始终在计数,因为由溢出到进入中断的时间很小(如果此时CPU不在执行更乘法指令或者已经进入其它中断的服务函数),在这种情况下只有TL0计了数,当进入后又重装TH0,TL0&&这时重装的TL0与之前的TL0是否为相加或者被替换掉,TL0 = 重装值 还是 TL0 = 重装值+溢出到中断过程中TL0计数值& &&&假设我不忽略这个过程的误差情况下,只是为了更加精确
wicy001 发表于
health 发表于
和赋值没什么关系的,只受运行控制位控制,如TR0。
thank you& &
zhanyanqiang 发表于
一启动定时器就开始计数,独立的(它自己一直在动作),中断里面赋值只是把计数器里面我们不想要的的值刷一 ...
不想要的值?指的是误差值吗?比如说从溢出后的到进入中断 这段时间TL0计的值&&是这段不要吗? 要道理来说&&应该需要加上这段值才准确啊& &经查资料我知道&&TH0 TL0溢出后并不是马上得到中断响应&&所以此时计数器还在计数假设为T1&&当进入中断后 重装了TH0 TL0&&那么之前的T1是如何处理的?如果舍弃就不准确了&&应该需要加上这个值吧&&对于这点还是有点迷惑
分开的,一个管一个的,不冲突
所以51的16位定时器方式是有误差的,要提前消掉。
cddyy 发表于
所以51的16位定时器方式是有误差的,要提前消掉。
你好& &哪么我这样处理是否正确呢&&在中断中装值时&&TLX= TLX+ 初值 TLX= TLX+ 初值& &这样处理可以吗?
roy2002 发表于
分开的,一个管一个的,不冲突
你好& &哪么我这样处理是否正确呢&&在中断中装值时&&TLX= TLX+ 初值 TLX= TLX+ 初值& &这样处理可以吗?
zhenglingo 发表于
你好& &哪么我这样处理是否正确呢&&在中断中装值时&&TLX= TLX+ 初值 TLX= TLX+ 初值& &这样处理可以吗? ...
不用加哦,加了就不是你需要的了吧,中断发生了的同时就赋了初值了,我是这样理解的
本帖最后由 xslff 于
22:13 编辑
虽然是个小问题,但很重要。
我的理解(暂未实验),因该是覆盖,定时器就是个累加器,累加到顶(头)告诉你一声(产生中断),不管你听(中断打开并配套了中断程序)或不听(未开中断或没有中断程序),定时器都会清0并(有延时很短)重新开始累加,如果您听了,中断程序马上运行(有延时)告诉定时器从某个数开始累加(比如从2开始,有的单片机可能才累加到1,有些可能累加到3了),定时器应该直接从给的数开始累加,不会去管自己目前累加到的数。
xslff 发表于
虽然是个小问题,但很重要。
我的理解(暂未实验),因该是覆盖,定时器就是个累加器,累加到顶(头)告诉 ...
按照你所说的& &这样处理应该是没问题的啊& &TLX = TLX + 初值&&THX = THX +初值
本帖最后由 xslff 于
22:47 编辑
zhenglingo 发表于
按照你所说的& &这样处理应该是没问题的啊& &TLX = TLX + 初值&&THX = THX +初值
请问一下,您做什么要这么精确?
xslff 发表于
请问一下,您做什么要这么精确?
我用IO口模拟PWM输出,一个可调的占空比& &我主要做的就是用PID去控制PWM输出,AD采集的模块。&&但是用PID去控制占空比来输出PWM时总是不准确,经过发现是定时器不准问题& &所以现在就在弄定时器部分,原来我忽略了定时器里的很多细节。& & 但是THX&&TLX在溢出之后,仍然会计数啊,看论坛上的帖子,在溢出到中断期间会需要一定的时间假设为T1,如果我需要更准确的定时,那么在进入中断后重新装值,按你所说,THX,TLX的的值被覆盖,如果不加处理,整个过程中就多计数了T1,因为这个T1是定时器自己加的值,所以在重装值时应该加上这个值还补偿啊,就是说应该让定时器少计数T1了,因为定时器所计的时间是0XFFFF-初值& &所以0XFFFF-(初值+T1),这样不就是减去了多计的时间吗?&&不知道这样理解有没有问题
zhenglingo 发表于
我用IO口模拟PWM输出,一个可调的占空比& &我主要做的就是用PID去控制PWM输出,AD采集的模块。&&但是用PI ...
T1清零了马上硬件自己重新开始从0计数,到我中断入口函数赋值这段时间T1,目前来说我也是这么理解的~~~~
本帖最后由 xslff 于
11:15 编辑
zhenglingo 发表于
我用IO口模拟PWM输出,一个可调的占空比& &我主要做的就是用PID去控制PWM输出,AD采集的模块。&&但是用PI ...
这个应该比较难精确,但我觉得有办法让这个误差缩小!
首先因为定时器的速度和单片机的工作频率精密相关,所以缩小误差的工作必须首先保证有稳定的工作频率!
然后要反复的做试验(汇编代码),看看这个误差均值是多少(固定频率)!
其次赋值过程中对试验得到的误差均值进行处理同时还要注意赋值运算差生的误差(不知道您在不在意这个微小的误差)!
最后重复上面的步骤再次试验,验证直到结果让您满意为止!
PS:这么费劲,还不如更换一款性能高的单片机!
zhanyanqiang 发表于
T1清零了马上硬件自己重新开始从0计数,到我中断入口函数赋值这段时间T1,目前来说我也是这么理解的~~~~ ...
那么找我这样处理没有问题吗?在进入中断后&&TLX = TLX + 初值&&THX = THX +初值
阿莫电子论坛, 原"中国电子开发网"
, 原www.ourdev.cn, 原www.ouravr.com51单片机教程:单片机定时器、中断试验
> 51单片机教程:单片机定时器、中断试验
51单片机教程:单片机定时器、中断试验
我们在学时我们第一个例程就是灯的闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道只能这样工作吗?当然不是,我们能用来实现灯的闪烁的功能。本文引用地址:例1:查询方式ORG 0000HAJMP STARTORG 30HSTART:MOV P1,#0FFH ;关所 灯MOV TMOD,#B ;定时/计数器0工作于方式1MOV TH0,#15HMOV TL0,#0A0H ;即数5536SETB TR0 ;定时/计数器0开始运行LOOP:JBC TF0,NEXT ;如果TF0等于1,则清TF0并转NEXT处AJMP LOOP ;不然跳转到LOOP处运行NEXT:CPL P1.0MOV TH0,#15HMOV TL0,#9FH;重置定时/计数器的初值AJMP LOOPEND AJMP LOOPEND键入程序,看到了什么?灯在闪烁了,这可是用做的,不再是主程序的循环了。简单地分析一下程序,为什么用JBC呢?TF0是定时/计数器0的溢出标记位,当产生溢出后,该位由0变1,所以查询该位就可知宇时时间是否已到。该位为1后,要用软件将标记位清0,以便下一次定时是间到时该位由0变1,所以用了JBC指令,该指位在判1转移的同时,还将该位清0。以上程序是能实现灯的闪烁了,可是主程序除了让灯闪烁外,还是不能做其他的事啊!不,不对,我们能在LOOP:&&和AJMP LOOP指令之间插入一些指令来做其他的事情,只要保证执行这些指令的时间少于定时时间就行了。那我们在用软件延时程序的时候不是也能用一些指令来替代DJNZ吗?是的,但是那就要求你精确计算所用指令的时间,然后再减去对应的DJNZ循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行,显然要求低了。当然,这样的办法还是不好,所以我们常用以下的办法来实现。
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一}

我要回帖

更多关于 单片机定时器实验报告 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信