51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > C51教程 > 详细内容
【吉林科技大学】第三章:89S51实践课题--T0作定时应用技术(一)
发布时间:2009/6/16  阅读次数:3585  字体大小: 【】 【】【

Lesson 16

1. 实验任务
用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时,自动从0开始。硬件电路如下图所示
2. 电路原理图
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. 程序框图
  
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;
}
  
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号