中国IEEE
关于我们 | 会员登陆 | 收藏本站 | 留 言 薄
 

 | 网站首页 | 电子知识 | 单片机知识 | 电路设计 | 微电子技术 | SCADA系统 | 资源下载 | 给我留言 | 谷歌商城 | 视频教程 | ieee | 
热门搜索关键字: 单片机教程 | 三极管 | 二极管 |  C语言汇编语言SCADA元器件模拟电子 |
cnieee.com baidu
栏目导航  
栏目更新推荐  
·用单片机实现高速数据采集
·单片机也唱歌——电子琴
·定时计数器T0作定时应用技术(二)
·定时计数器T0作定时应用技术(一)
·4×4矩阵式键盘识别技术
·数字显示00-59秒计时器
·数字显示00-99计数器
·一键多功能按键识别技术
点击TOP(10)  
  • 此栏目下没有热点文章
  • 图片文章  

    用单片机实现高速数…

    单片机也唱歌——电…

    定时计数器T0作定时…

    定时计数器T0作定时…
     
    您现在的位置: 中国IEEE中国电气电子工程师网 >> 单片机知识 >> 入门教程 >> 正文

    定时计数器T0作定时应用技术(一)
    文章来源:不详 点击数: 更新时间:2008-5-6 【字体:
    (欢迎光临中国IEEE,希望本文能对您有所帮助http://www.cnieee.com)


    相关文章:

    定时/计数器软件编程范例
    AT89C51制作的自动计数剪线系
    动手制作6位数显频率计数器
    定时计数器T0作定时应用技术(二)

  • 上一个文章:

  • 下一个文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     
    关于〖定时计数器T0作定时应用技术(一)〗的最新评论:

    1. 实验任务

    用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时,自动从0开始。硬件电路如下图所示

    2. 电路原理图

    图4.15.1

    3. 系统板上硬件连线

    (1. 把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。

    (2. 把“单片机系统”区域中的P2.0/A8-P2.7/A15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P2.0/A8对应着a,P2.1/A9对应着b,……,P2.7/A15对应着h。

    4. 程序设计内容

    AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存器TMOD,即可完成。定时/计数器何时工作也是通过软件来设定TCON特殊功能寄存器来完成的。

    现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这20次我们就可以采用软件的方法来统计了。

    因此,我们设定TMOD=00000001B,即TMOD=01H

    下面我们要给T0定时/计数器的TH0,TL0装入预置初值,通过下面的公式可以计算出

    TH0=(216-50000) / 256

    TL0=(216-50000) MOD 256

    当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测TCON特殊功能寄存器中的TF0标志位,如果TF0=1表示定时时间已到。

    5. 程序框图

     

     

     

     

     

     

     

     

     

     

     

     

    图4.15.2

    6. 汇编源程序(查询法)
    SECOND EQU 30H
    TCOUNT EQU 31H
    ORG 00H
    START: MOV SECOND,#00H
    MOV TCOUNT,#00H
    MOV TMOD,#01H
    MOV TH0,#(65536-50000) / 256
    MOV TL0,#(65536-50000) MOD 256
    SETB TR0
    DISP: MOV A,SECOND
    MOV B,#10
    DIV AB
    MOV DPTR,#TABLE
    MOVC A,@A+DPTR
    MOV P0,A
    MOV A,B
    MOVC A,@A+DPTR
    MOV P2,A
    WAIT: JNB TF0,WAIT
    CLR TF0
    MOV TH0,#(65536-50000) / 256
    MOV TL0,#(65536-50000) MOD 256
    INC TCOUNT
    MOV A,TCOUNT
    CJNE A,#20,NEXT
    MOV TCOUNT,#00H
    INC SECOND
    MOV A,SECOND
    CJNE A,#60,NEX
    MOV SECOND,#00H
    NEX: LJMP DISP
    NEXT: LJMP WAIT
    TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
    END
    7. C语言源程序(查询法)
    #include <AT89X51.H>

    unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71,0x00};
    unsigned char second;
    unsigned char tcount;

    void main(void)
    {
    TMOD=0x01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    TR0=1;
    tcount=0;
    second=0;
    P0=dispcode[second/10];
    P2=dispcode[second%10];
    while(1)
    {
    if(TF0==1)
    {
    tcount++;
    if(tcount==20)
    {
    tcount=0;
    second++;
    if(second==60)
    {
    second=0;
    }
    P0=dispcode[second/10];
    P2=dispcode[second%10];
    }
    TF0=0;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    }
    }
    }
    1. 汇编源程序(中断法)
    SECOND EQU 30H
    TCOUNT EQU 31H
    ORG 00H
    LJMP START
    ORG 0BH
    LJMP INT0X
    START: MOV SECOND,#00H
    MOV A,SECOND
    MOV B,#10
    DIV AB
    MOV DPTR,#TABLE
    MOVC A,@A+DPTR
    MOV P0,A
    MOV A,B
    MOVC A,@A+DPTR
    MOV P2,A
    MOV TCOUNT,#00H
    MOV TMOD,#01H
    MOV TH0,#(65536-50000) / 256
    MOV TL0,#(65536-50000) MOD 256
    SETB TR0
    SETB ET0
    SETB EA
    SJMP $
    INT0X:
    MOV TH0,#(65536-50000) / 256
    MOV TL0,#(65536-50000) MOD 256
    INC TCOUNT
    MOV A,TCOUNT
    CJNE A,#20,NEXT
    MOV TCOUNT,#00H
    INC SECOND
    MOV A,SECOND
    CJNE A,#60,NEX
    MOV SECOND,#00H
    NEX: MOV A,SECOND
    MOV B,#10
    DIV AB
    MOV DPTR,#TABLE
    MOVC A,@A+DPTR
    MOV P0,A
    MOV A,B
    MOVC A,@A+DPTR
    MOV P2,A
    NEXT: RETI

    TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
    END
    2. C语言源程序(中断法)
    #include <AT89X51.H>

    unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71,0x00};
    unsigned char second;
    unsigned char tcount;

    void main(void)
    {
    TMOD=0x01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    TR0=1;
    ET0=1;
    EA=1;
    tcount=0;
    second=0;
    P0=dispcode[second/10];
    P2=dispcode[second%10];
    while(1);
    }

    void t0(void) interrupt 1 using 0
    {
    tcount++;
    if(tcount==20)
    {
    tcount=0;
    second++;
    if(second==60)
    {
    second=0;
    }
    P0=dispcode[second/10];
    P2=dispcode[second%10];
    }
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    }

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明网站地图 | 名站导航 | 管理登录 | 
    本站资源部分来自互联网,如侵犯您的权利,我们将予以删除  鲁ICP备08006092号
    本站欢迎同类网站做友情链接,QQ留言
    中国IEEE 中国电气电子工程师网 版权所有