找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7929|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机定时/计数器使用方法

[复制链接]
跳转到指定楼层
楼主
ID:103513 发表于 2016-1-17 04:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定时/计数器的使用方法:
1、根据要求选择方式,确定方式控制字,写入方式控制寄存器TMOD。
2、根据要求计算定时/计数器的计数值,再由计数值求得初值,写入初值寄存器TH0/TH1和TL0/TL1。
3、根据需要开放定时/计数器中断(后面需要编写中断服务程序)。
4、设置定时/计数器控制寄存器TCON的值,启动定时/计数器开始工作。
5、等待定时/计数器时间到,到则执行中断服务程序;如用查询处理则编写查询程序判断溢出标志,溢出标志等于1,则进行相应处理。

/******************************************************************************************/
/*                                                                                                                                                                                  */
/*                采用定时/计数器设计的60分钟倒计时程序,实现60分钟倒计时。利用4位数码管显示分、秒。*/
/*        数码管每秒更新一次,秒表由59倒计时到00,则分钟减1。                                                                     */
/*                                                                                        */
/******************************************************************************************/


#include <REG51.h>
#define uint unsigned int
#define uchar unsigned char
#define LED P2 // 数码管段选
// 数码管位选
sbit WE1 = P0^0;
sbit WE2 = P0^1;
sbit WE3 = P0^2;
sbit WE4 = P0^3;


uint min = 59;
uint sec = 59;
uint i;


uchar num_table[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // 0~9十六进制代码。


void display(); // 数码管显示程序
void delay(uint x); // 延时程序


void main() {
        TMOD = 0x01;// 使用方式1
        TH0 = 0xD8;// 初值寄存器高8位
        TL0 = 0xF0;// 初值寄存器低8位
        EA = 1;// 允许中断请求总控制
        ET0 = 1;// 定时/计数器T0溢出中断允许
        TR0 = 1;// 定时/计数器T0的启动位
        i = 0;
        while (1)
        {
                 display();
        }
}


void time0_int(void) interrupt 1 {// 中断服务程序
        TH0 = 0xD8;
        TL0 = 0xF0;
        i++;
        if (i == 100) {
                 sec--;
                i = 0;
                if (sec == 0) {
                        sec = 59;
                        min--;
                        if (min == 0) min = 59;
                }
        }
}


void display() {
        uint min_s = min/10;
        uint min_g = min%10;
        uint sec_s = sec/10;
        uint sec_g = sec%10;


        WE1 = 1;
        LED = num_table[min_s];
        delay(1);
        WE1 = 0;
        WE2 = 1;
        LED = ~(~num_table[min_g]|0x80); // 显示时后添加一个小数点
        delay(1);
        WE2 = 0;
        WE3 = 1;
        LED = num_table[sec_s];
        delay(1);
        WE3 = 0;
        WE4 = 1;
        LED = num_table[sec_g];
        delay(1);
        WE4 = 0;
}


void delay(uint x) {
        uint i;
        while (x-- != 0)
        {
                for (i = 0; i < 300; i++);
        }
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:230250 发表于 2018-1-17 20:01 | 只看该作者
  TH0 = 0xD8;// 初值寄存器高8位         TL0 = 0xF0;// 初值寄存器低8位这段代码中为什么 TH0 = 0xD8 , TL0 = 0xF0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表