历史上的今天
今天是:2025年04月17日(星期四)
2020年04月17日 | 51单片机做一个计时器
2020-04-17 来源:eefocus
同样我们使用的仍然是STC的8051单片机,这段代码是用来做一个计时器,通过数码管实时显示出来,因为板子上数码管有6个,所以可以设置小时,分钟,秒三个单位,在Proteus上也是可以模拟的,计时结束可以用蜂鸣器,或者继电器接口连接
一个闹铃,闹铃用电磁式的就可以,当然简单来说蜂鸣器就是一个不错的选择。
程序中没有设置小时单位,想要加上的小伙伴可以用显示分钟,秒的方法同样显示出来,但添加后要注意延时的时间,时间设置不当可能会出现显示不清楚,数字抖动,或者未选中的数码管也隐隐发光(“鬼影”)。具体大小可以自己调试着来,也是很简单的。下边是源代码:
#include #define uint unsigned int #define uchar unsigned char sbit we=P2^7; sbit du=P2^6; uchar code table[]={0x3f,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F, 0x77,0x7C,0x39,0x5E,0x79, 0x71,0x76,0x38,0x37,0x3E, 0x73,0x5C,0x40,0x00,}; uchar num=0,aa,s,g,m,f,h; void delay(uchar x); void main() { TMOD=0x01; //设置内部中断0,1的工作方式为方式1 EA=1; //开总中断 ET0=1; //允许中断 TR0=1; //开中断0 TH0=0x4c; TL0=0x00; while(1) { du = 1; P0 = 0; du = 0; we = 1; P0 = 0x3e; we = 0; du = 1; P0 = table[s]; //十位 du = 0; delay(10); du = 1; P0 = 0; du = 0; we = 1; P0 = 0x3d; we = 0; du = 1; P0 = table[g]; //个位 du = 0; delay(10); du = 1; P0 = 0; du = 0; we = 1; P0 = 0x1f; //显示分钟 we = 0; du = 1; P0 = table[m]; du = 0; delay(10); du = 1; P0 = 0; du = 0; we = 1; P0 = 0x2f; we = 0; du = 1; P0 = table[h]; du = 0; delay(10); if(aa == 20) { aa = 0; if(num == 59) { num = 0; f++; } else num++; s = num/10; g = num%10; m = f%10; h = f/10; } if(h == 6) f = 0; } } void timer0() interrupt 1 //内部中断0 { TH0=0x4c; TL0=0x00; aa++; } void delay(uchar x) { uchar y,z; for(y=x;y>0;y--) for(z=120;z>0;z--); }
上一篇:51单片机简单计时器
下一篇:51单片机之计时器
史海拾趣
|
大家好,遇到点问题,有点困惑,想在这上面看看有没有同志遇到类似问题。 最近设计的两款射频通信板,采用的射频芯片是nRF2401和nRF24L01,但是设置此两个芯片的发射功率时,发现基本上没有什么效果,通信距离基本都保持比较远的距离,很难将距离 ...… 查看全部问答> |
|
无线传感器网络中用LEACH协议进行分簇后,簇内想采用局部的TDMA机制,这样的话,相邻的各个簇之间会产生干扰。目前考虑到了两种解决方法: 一种是采用采用直接序列扩频技术,即各个簇采用不 ...… 查看全部问答> |
|
请问M62X42B计时过快过快是什么问题,我读M62X42B的寄存器的值,变换很快,理论上应该是1s变化一次,而我写的程序基本上都是小时级别的递增?请问高手,一般出现这种情况都什么什么原因引起的。… 查看全部问答> |
|
有人会问这个简单,我看未必,有些心得我还是写出以免走弯路 这套开发板老好了, 大板是LM3S8962,且可以外接ULINK,JLINK调式. 小板是LM3S2110,且可以外接ULINK,JLINK调式 小板通过10针线跟大板连接,评估CAN总线时用 那 ...… 查看全部问答> |




