找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3226|回复: 10
收起左侧

如何用单片机定时器做一个秒表?

  [复制链接]
ID:855589 发表于 2020-12-7 11:13 | 显示全部楼层 |阅读模式
定时器TH0和TL0那部分我倒是弄懂了,就是寄存器TMOD和TCON那部分看了半天看不明白。应该怎么样编才能用定时器来设计一个秒表呢..........

轻触按键的话分别作启停和清零的功能,现在就不知道按钮该连在啥地方...........启停我看教材可能是INT0,清0咋整....还是说都放错了.....

原理图

原理图

回复

使用道具 举报

ID:836944 发表于 2020-12-7 16:49 | 显示全部楼层
额,可以看看这个计时器,玩着玩着好多地方就明白了。

8051 Timer with LCD.zip

53.67 KB, 下载次数: 26

回复

使用道具 举报

ID:332444 发表于 2020-12-7 19:09 | 显示全部楼层
回复

使用道具 举报

ID:839922 发表于 2020-12-7 19:25 | 显示全部楼层
/*定时器1,定时模式 工作模式1 16位计数器,
定时20秒后使能蜂鸣器*/
#include <reg52.h> //51头文件
#define uchar unsigned char//宏定义
#define uint  unsigned int//宏定义
sbit we = P2^7;//位定义数码管位选锁存器接口
sbit du = P2^6;//位定义数码管段选锁存器接口
sbit beep = P2^3;//蜂鸣器接口

//数码管段选表
uchar code leddata[]={

                0x3F,  //"0"
                0x06,  //"1"
                0x5B,  //"2"
                0x4F,  //"3"
                0x66,  //"4"
                0x6D,  //"5"
                0x7D,  //"6"
                0x07,  //"7"
                0x7F,  //"8"
                0x6F,  //"9"
                0x77,  //"A"
                0x7C,  //"B"
                0x39,  //"C"
                0x5E,  //"D"
                0x79,  //"E"
                0x71,  //"F"
                0x76,  //"H"
                0x38,  //"L"
                0x37,  //"n"
                0x3E,  //"u"
                0x73,  //"P"
                0x5C,  //"o"
                0x40,  //"-"
                0x00,  //熄灭
                0x00  //自定义

                         };

//毫秒级延时函数
void delay(uint z)
{
        uint x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);
}

//两位数码管动态显示函数
void display(uchar i)
{
        uchar shi, ge;
        shi = i / 10;//求模  i除以10取商的整数部分
        ge  = i % 10;//求余  i除以10取余数部分

        P0 = 0xff; //清除断码
        we = 1;//打开位选
        P0 = 0xfe;//1111 1110 只选通第一位数码管
        we = 0;        //关闭位选

        du = 1;        //打开段选
        P0 = leddata[shi];
        du = 0;        //关闭段选
        delay(5);//延时5毫秒
       
        P0 = 0xff;//清除断码
        we = 1;        //打开位选
        P0 = 0xfd;//1111 1101  只选通第二位数码管
        we = 0;        //关闭位选
       
        du = 1;//打开段选
        P0 = leddata[ge];
        du = 0;        //关闭段选
        delay(5);//延时5毫秒       
}

void main()
{
                uchar a; //50次数计数
                uchar b;//秒计数
                TR1 = 1;//启动T1
                TMOD = 0x10;//T1为定时器,工作模式1 16位计数器
                TH1 = 0x4b;
                TL1 = 0xfc;//0x4bfc        定时50ms                               
                while(1)
                {
                        if(TF1 == 1)//判断T1是否溢出
                        {
                                TH1 = 0x4b;
                                TL1 = 0xfc;//0x4bfc        定时50ms
                                TF1 = 0;//清零便于下次判断
                                a++;//50毫秒计数加1       
                        }
                        if(a == 20)//判断是否到1秒
                        {
                                a = 0;//清零便于下次记录50ms的次数
                                b++;//秒加1
                        }

                        display(b);//显示秒的值

                        if(b == 20)//检查是否到20秒
                        {
                                TR1 = 0;//时间到关闭定时器1
                                beep = 0; //使能蜂鸣器
                                delay(4000);//使能时间4秒
                                beep = 1;//关闭蜂鸣器
                                while(1); //停止程序
                        }

                       
                }
}
回复

使用道具 举报

ID:451718 发表于 2020-12-7 20:25 | 显示全部楼层
1,弄清楚定时器的几种常用模式: 记录时间,一般建议用16位的中断模式1。 记录数量,可以用8位自动重装置的模式2。
2,养成好的程序框架模式,涉及定时功能,就一定把定时0空出来,做long型变量的定时自加用。也就是在定时0的中断中,只放一个语句,就是让变量 SysTick++。 然后在主程序中,去记录,对比,查询变量和SysTick的差值。比如,要开始计时,就把T1 = SysTick ; 要查询时间,就计算SysTick - T1的差值;要重置,就重新把T1 = SysTick; 要暂停,就记录T2 = SysTick - T1;要继续计时,就把T1 = SysTick - T2。
3,按键的操作,不建议放到定时器中操作,因为按键是有抖动的,对于初学者这个稳定过程的判断,最好还是放在主程序。
回复

使用道具 举报

ID:180919 发表于 2020-12-7 21:57 | 显示全部楼层
秒也有要求,比如时多久,用什么单片机,什么显示方式,有几个按键,这类的了。
回复

使用道具 举报

ID:517951 发表于 2020-12-8 11:38 | 显示全部楼层
89C52单片机的有两个定时器T0,T1 都可以设置为16位模式, 在12M晶振的时候,T0,T1 的THL,THH设置为0XFFFF, 最大计时时长为65ms, 可以设置为50ms ,溢出就中断可以+或者-寄存器,200次就是1秒,就可以做倒计时或正计时的秒表了。
回复

使用道具 举报

ID:855589 发表于 2020-12-8 20:09 | 显示全部楼层
xianfajushi 发表于 2020-12-7 19:09
可参https://blog.csdn.net/xianfajushi/article/details/89448933

他那个原理图太复杂了。。。
回复

使用道具 举报

ID:808225 发表于 2020-12-8 22:05 | 显示全部楼层
按键放哪个pi口都行,不占用定时器的就好。你在程序中写按键按下后,把定时器的中断清零试试
回复

使用道具 举报

ID:318489 发表于 2020-12-9 11:04 | 显示全部楼层
51有定时器,设定个10ms,进行计算就可以了
回复

使用道具 举报

ID:223621 发表于 2020-12-9 15:30 | 显示全部楼层
精度要求不高的化无所谓,几乎所有51都搞定了的,stc-isp程序有相关定时器例程,应用的化就应该考虑单独的时钟芯片了。。。。。。。。
另,本人软转硬,可能考虑角度不同,给你个不同角度的建议,画个时序图,啥子都明白了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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