单片机练习 - 计时器

发布者:advancement3最新更新时间:2016-12-29 来源: eefocus关键字:单片机练习  计时器 手机看文章 扫描二维码
随时随地手机看文章

利用单片机的定时/计数器(单片机练习 - 定时器 ), 这天写了一个计时器, 精确到小数0.01秒, 拥有一个开始/暂停键, 一个清零键...

6位数码管与单片机的连接电路图


按键S2, S3与单片机的连接电路图: 其中S2与P3.4连, S3与P3.5连接...


计时器
  1#include 
  2#include 
  3//秒表, 精确到小数1%秒, 即10ms, 一个开始/暂停键, 一个停止清零键
  4//准确定时采用定时器1, 工作方式1
  5
  6sbit wela = P2^7;  //数码管位选
  7sbit dula = P2^6;  //数码管段选
  8sbit ds = P2^2;
  9unsigned char th, tl;
 10unsigned char datas[] = {0, 0, 0, 0, 0, 0};//分秒毫秒
 11
 12//0-F数码管的编码(共阴极)
 13unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
 14    0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
 15//0-9数码管的编码(共阴极), 带小数点
 16unsigned char code tableWidthDot[]={0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 
 17    0x87, 0xff, 0xef};
 18
 19//延时函数, 对于11.0592MHz时钟, 例i=5,则大概延时5ms.
 20void delay(unsigned int i)
 21{
 22    unsigned int j;
 23    while(i--)
 24    {
 25        for(j = 0; j < 125; j++);
 26    }
 27}
 28
 29void display() 
 30{
 31    unsigned char count;
 32    for(count = 0; count < 6; count++)
 33    {
 34        //关位选, 去除对上一位的影响
 35        P0 = 0xff; 
 36        wela = 1; //打开锁存, 给它一个下降沿量
 37        wela = 0;
 38        //段选
 39        if(count == 1 || count == 3)
 40        {
 41            P0 = tableWidthDot[datas[count]]; //显示带小数点数字, 作为分秒, 秒与毫秒的分隔
 42        }
 43        else
 44        {
 45            P0 = table[datas[count]];  //显示数字
 46        }
 47        dula = 1;  //打开锁存, 给它一个下降沿量
 48        dula = 0;
 49
 50        //位选 
 51        P0 = _crol_(0xfe, count); //选择第(count + 1) 个数码管
 52        wela = 1; //打开锁存, 给它一个下降沿量
 53        wela = 0;
 54        delay(1); 
 55    }
 56}
 57
 58sbit S2 = P3^4;  //键S2, 作开始/暂停 
 59sbit S3 = P3^5;    //键S3, 清零
 60sbit S4 = P3^6;    //键S4
 61sbit S5 = P3^7;    //键S5
 62unsigned char tmp;  
 63
 64//等待键被释放 
 65void waitFreeKey()
 66{
 67    while(!S2 || !S3)
 68    {
 69        display(); // 等待期间要显示
 70    }
 71}
 72
 73//检测是否有键按下, 并执行相应功能
 74void checkKey()
 75{
 76    if(!S2)
 77    {
 78        delay(7);  //延时大约10ms, 去抖动
 79        if(!S2)  //开始/暂停键按下
 80        {
 81            TR1 = ~TR1;
 82        }
 83    }
 84
 85    if(!S3)
 86    {
 87        delay(14);  //延时大约10ms, 去抖动
 88        if(!S3)  //清零键按下
 89        {
 90            TR1 = 0;
 91            TH1 = th;
 92            TL1 = tl;
 93            for(tmp = 0; tmp < 6; tmp++)
 94            {
 95                datas[tmp] = 0;
 96            }
 97        }
 98    }
 99    //等待键被释放 
100    waitFreeKey();
101}
102
103void main()
104{
105    th = (65536 - 10000/1.085) / 256;  //定时10ms
106    tl = (65536 - 10000/1.085) - th * 256;
107    TH1 = th;
108    TL1 = tl;
109    EA = 1;  //开中断
110    ET1 = 1; //允许定时器1中断请求
111    TMOD = 0x10;  //定时器工作方式1
112    while(1)
113    {
114        checkKey();  //检测是否就键按下
115        display();  //显示计时值
116    }
117}
118
119//定时器1中断响应函数
120void time1() interrupt 3
121{
122    TH1 = th;  //重置计数值
123    TL1 = tl;
124
125    datas[5]++;  //0.01秒
126    if(datas[5] == 10)
127    {
128        datas[5] = 0;
129        datas[4]++;   //0.1秒
130        if(datas[4] == 10)
131        {
132            datas[4] = 0;
133            datas[3]++;  //秒
134            if(datas[3] == 10)
135            {
136                datas[3] = 0;
137                datas[2]++;   //10秒
138                if(datas[2] == 6)
139                {
140                    datas[2] = 0;
141                    datas[1]++;  //分
142                    if(datas[1] == 10)
143                    {
144                        datas[1] = 0;
145                        datas[0]++;  //10分
146                        if(datas[0] == 6)
147                        {
148                            datas[0] = 0;
149                            P1 <<= 1;
150                        }
151                    }
152                }
153            }
154        }
155    }
156}


效果图:
6小时23分44.98秒


0时0分30.73秒


关键字:单片机练习  计时器 引用地址:单片机练习 - 计时器

上一篇:单片机练习 - 定时器
下一篇:单片机综合练习 - 多功能时钟

推荐阅读最新更新时间:2024-03-16 15:27

51单片机计时器中断
单片机中,中断算是一个比较重要的部分,在51单片机中有八种中断方式 ,其中常用的的有五种,分别是外部中断0,计时器中断0,外部中断1,计时器中断1,和串口中断。今天主要介绍的是计时器中断。 51单片机给我们提供了2个计时器中断,分别是计时器0和计时器1,他们对应的优先级分别是1和3,开启计时器并允许其中断后,计时器会从给定的初始值开始,每个指令周期加1,直到加到65535,再加一时计时器溢出,计时器此时会进入中断,并执行中断服务函数。 在编程过程中发现有许多人搞不清中断服务函数与一般函数的区别,他们总是问出诸如中断服务函数在程序中哪一句之前或哪一句之后执行的问题。其实中断服务函数虽然也是个函数,但是它与一般函数还是有一
[单片机]
IDT 推出 Versacloc 计时器件新产品系列
混合信号半导体解决方案供应商 IDT® 公司(Integrated Device Technology, Inc.; NASDAQ: IDTI)推出其 VersaClock™ 计时器件的最新产品系列。VersaClock III 器件是专为高性能消费、电信、网络和数据通信应用设计的可编程时钟发生器,可以更经济有效地在多个晶体和振荡器之间进行选择。这些可编程计时解决方案对节省占板空间和保持功效非常关键,因其体积可能不允许全定制解决方案。多个具有各种不同需求的系统能够整合成更少的可编程器件,以改善库存管理。 为了最大可能实现设计灵活性,IDT VersaClock 系列采用了 4 个内部 PLL。每个 PLL 都是可编程
[模拟电子]
用看门狗定时器做计时器,计算程序耗时,超声波测距,FL244
开发板:FL2440 核心芯片:S3C2440(ARM9) 超声波模块:HC-SR04 超声波模块工作原理:共四个脚,VCC接5V,GND接地,Trig脚接芯片通过IO传出的高电平(持续时间不低于10微秒),之后Echo脚输出一段时间高电平,高电平持续时间即为超声波发出到接收到回波的间隔时间。 主要是为了使用看门狗定时器来作计时器,来计算Echo脚返回的高电平持续时间,要将复位使能与中断使能关闭,然后给“狗”最大数值,持续一段时间后,用最大数值减去当前数值,就可得到消耗的数值,再乘以“狗”每次减数的时间间隔(通过设定预分频与分频因子来确定),就是消耗的时间。 试验期间出现的重要错误:程序自动run后,消耗时间总
[单片机]
ATmega8 定时器/计时器振荡器
对于拥有定时器/ 振荡器引脚(TOSC1 和TOSC2) 的AVR 微处理器,晶体可以直接与这 两个引脚连接,无需外部电容。此振荡器针对32.768 kHz 的钟表晶体作了优化。不建议 在TOSC1 引脚输入振荡信号。
[单片机]
篮球比赛计时器的51单片机proteus仿真
51单片机仿真计时器的原理图: 部分源程序预览: #include main.h #include delay.h #include keypad.h #include display.h void main() { INT0_Initial(); Time0_Initial(); delay_ms(10); LED = 0; while(1) { switch(key_value) { case 12: { num1 ++;key_value = 0;
[单片机]
篮球比赛<font color='red'>计时器</font>的51<font color='red'>单片机</font>proteus仿真
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved