0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用单片机设计记时器的资料概述

Wildesbeast 来源:单片机教程网 作者:单片机教程网 2020-05-16 12:02 次阅读

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)MOD256

当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)%6;

TR0=1;

tcount=0;

second=0;

P0=dispcode[second/10];

P2=dispcode[second];

while(1)

{

if(TF0==1)

{

tcount++;

if(tcount==20)

{

tcount=0;

second++;

if(second==60)

{

second=0;

}

P0=dispcode[second/10];

P2=dispcode[second];

}

TF0=0;

TH0=(65536-50000)/256;

TL0=(65536-50000)%6;

}

}

}

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)%6;

TR0=1;

ET0=1;

EA=1;

tcount=0;

second=0;

P0=dispcode[second/10];

P2=dispcode[second];

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];

}

TH0=(65536-50000)/256;

TL0=(65536-50000)%6;

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6044

    文章

    44632

    浏览量

    639416
  • 计数器
    +关注

    关注

    32

    文章

    2276

    浏览量

    95107
  • 定时器
    +关注

    关注

    23

    文章

    3256

    浏览量

    115522
收藏 人收藏

    评论

    相关推荐

    32位单片机相关资料和解决方案参考指南

    电子发烧友网站提供《32位单片机相关资料和解决方案参考指南.pdf》资料免费下载
    发表于 01-21 14:00 0次下载
    32位<b class='flag-5'>单片机</b>相关<b class='flag-5'>资料</b>和解决方案参考指南

    一个基于Cortex的单片机专为USB耳机设备设计的USBCodec芯片

    USBCodec芯片 - CJC6811A是一款基于Cortex的单片机,专为USB耳机设备而设计。它集成了一个32位的RISC CPU和16KB的SRAM、USB、UART、IIC、音频编解码、GPIO、定时
    的头像 发表于 01-15 09:41 166次阅读
    一个基于Cortex的<b class='flag-5'>单片机</b>专为USB耳<b class='flag-5'>机设</b>备设计的USBCodec芯片

    用ADS1256结合飞思卡尔的单片机设计一个数据采集系统,为什么采用SPI通信时得到的总是一个固定的数?

    我准备用ADS1256结合飞思卡尔的单片机设计一个数据采集系统,但是不知道为什么采用SPI通信时,得到的总是一个固定的数。
    发表于 01-02 06:02

    51单片机温度报警

    电子发烧友网站提供《51单片机温度报警.zip》资料免费下载
    发表于 12-30 14:16 0次下载

    昂宝单片机相关资料

    昂宝单片机相关资料
    发表于 11-25 14:50 0次下载

    8位单片机为何不会被高端单片机取代?

    的功能集和更低的时钟速度。 通常,8位单片机设计为在比高端单片机更低的时钟频率下工作,从而降低功耗。它们的内部存储、外设和通信接口通常也具有较低的功耗要求。 此外,许多8位单片机设
    发表于 09-24 16:51

    用MSP430FR235x单片机设计双射线烟雾探测模拟前端

    电子发烧友网站提供《用MSP430FR235x单片机设计双射线烟雾探测模拟前端.pdf》资料免费下载
    发表于 09-14 10:53 0次下载
    用MSP430FR235x<b class='flag-5'>单片机设</b>计双射线烟雾探测<b class='flag-5'>器</b>模拟前端

    stm32单片机用什么软件编程

    STM32单片机是一种广泛应用于嵌入式系统领域的微控制,具有高性能、低功耗、丰富的外设接口等特点。要对STM32单片机进行编程,需要选择合适的软件工具。 概述 STM32
    的头像 发表于 09-02 10:16 2073次阅读

    单片机烧录程序的线比单片机上的少还能烧录吗

    单片机烧录原理 单片机烧录是指将编写好的程序代码通过一定的方式传输到单片机的存储中,使其能够按照程序的指令运行。这个过程通常需要使用烧录
    的头像 发表于 09-02 09:54 640次阅读

    stm32单片机引脚介绍及功能

    STM32系列单片机是STMicroelectronics(意法半导体)推出的一款基于ARM Cortex-M内核的32位微控制。STM32单片机具有高性能、低功耗、丰富的外设和灵活的引脚配置等
    的头像 发表于 09-02 09:38 7248次阅读

    简述单片机定时的工作原理

    单片机定时的工作原理是一个复杂而精细的过程,它涉及到单片机内部的多个组件和机制。
    的头像 发表于 08-19 18:20 1876次阅读

    基于STM32单片机的智能冰箱控制系统设计

    基于单片机设计的一款智能冰箱控制系统,可以控制冰箱的制冷装置,可以采集冰箱的异味浓度,超过闽值之后控制紫外灯进行消毒工作单片机采用单片机采用单片机采用STM32F103C8T6。通过继
    的头像 发表于 06-25 09:21 1416次阅读
    基于STM32<b class='flag-5'>单片机</b>的智能冰箱控制系统设计

    STM8单片机设计时钟要注意什么?

    刚开始学习STM8单片机,想利用该系列单片机实践设计一款LED数码管时钟。请求大家说明一些注意事项(事先查阅了一些资料;方案确认的元器件有6位数码管和TM1620驱动芯
    发表于 04-18 08:23

    基于单片机的燃气报警设计

    电子发烧友网站提供《基于单片机的燃气报警设计.doc》资料免费下载
    发表于 03-04 09:46 1次下载

    8-Bit 触控式 Flash 单片机中文资料

    该系列单片机是一款 8 位具有高性能精简指令集且完全集成触摸按键功能的 Flash 单片机。此系列单片机含有触摸按键功能和可多次编程的 Flash 存储特 性,为各种触摸按键的应用提
    发表于 02-28 10:01 4次下载