您的位置 首页 硬件

【C51】源码 3 — 电子时钟(独立按键、8 位数码管、定时器)

自购自学单片机有一段日子了,300多页的pdf教程看到一半了,正好看完定时器和独立按键部分,综合前边的数码管,试着编写了电子时钟,…

自购自学单片机有一段日子了,300 多页的 pdf 教程看到一半了,正好看完守时器独立按键部分,归纳前边的数码管,试着编写了“电子时钟”,将源码发上来,用于备份……

注:因为运用了中止以及各种延时程序,此程序并不是真实精确的“电子时钟”,想要真实精确,需求特别的外部模块,如时钟芯片 DS1302。

附上源码:(初出茅庐,不免有写的欠好的当地,仅作备份之用,欢迎点拨,喷子退散……)

/**********************************************************************************
电子时钟

1、初始从 00-00-00 时刻开端显现
2、按 Pause 键暂停,此刻能够经过三个按键调理时刻
3、再按 Pause 键恢复作业

缺点:

1、按键过程中,有瞬间闪耀
2、再次按 Pause 开端时,会等候一瞬间,电子时钟才会作业
***********************************************************************************/

#include

#defineDATA P1// 数码管数据传输口

sbitSEG = P0^0;// 段码输入
sbitBIT = P0^2;// 位码输入

sbitKEY_PAUSE = P2^0;// 暂停 / 开端 按键
sbitKEY_H_UP = P2^2;// 小时调理 按键
sbitKEY_M_UP = P2^4;// 分钟调理 按键
sbitKEY_S_UP = P2^6;// 秒调理 按键

unsigned char codeSEG_CODE[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40};
unsigned char codeBIT_CODE[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};

// 上面是段码表,0-9,还有一个 “-” 符号
// 下面是位码表,指示哪一位显现字符

unsigned chartimer0_count;// 守时器 50ms 一个中止,计 20 次为 1s
unsigned charH1, H0, M1, M0, S1, S0;// 电子时钟显现数字 HH-MM-SS

voidDelay(unsigned intt);// 一般推迟函数
voidDelay_ms(unsigned intt);// ms 推迟函数
voidInit_Key(void);// 初始化按键
voidInit_Clock(void);// 初始化电子时钟显现
voidInit_Timer0(void);// 初始化守时器
voidDisplay(unsigned charx,unsigned charnum);// 在 x 方位,显现数字 num
voidDisplay_Clock(void);// 显现电子时钟

voidmain (void)
{
Init_Key();
Init_Clock();
Init_Timer0();

while(1) {

Display_Clock();// 在大循环中显现时钟,构成动态扫描

if(timer0_count == 20) {// 守时器中止了 20 次,即 1s,开端对显现进行处理
timer0_count = 0;
S0 += 1;
if(S0 == 10) {// 以下确保了秒:0-59,分钟:0-59,小时:0-23
S0 = 0;
S1 += 1;
}
if(S1 == 6) {
S1 = 0;
M0 +=1;
}
if(M0 == 10) {
M0 = 0;
M1 += 1;
}
if(M1 == 6) {
M1 = 0;
H0 += 1;
}
if(H0 == 10 && (H1 == 0 || H1 == 1)) {
H0 = 0;
H1 += 1;
}
else if(H0 == 4 && H1 == 2) {
H0 = 0;
H1 = 0;
}
}

if(!KEY_PAUSE) { // 检测 暂停键 是否按下
Delay_ms(10);// 推迟 10ms,消除按键颤动,后边同理
if(!KEY_PAUSE) {// 在推迟之后,还能检测到按键,阐明真的是按键
while(!KEY_PAUSE) Display_Clock();// 假如按住按键不放,就坚持时钟显现状况

while(KEY_PAUSE) {// 按键总算放开了,处理按键的行为

Display_Clock();// 在此期间,要坚持时钟一向动态显现

if(!KEY_H_UP) { // 在暂停期间,检测到了 小时调理 操作,处理显现
Delay_ms(10);
if(!KEY_H_UP) {
while(!KEY_H_UP) Display_Clock();
H0 += 1;
if(H0 == 10 && (H1 == 0 || H1 == 1)) {
H0 = 0;
H1 += 1;
}
else if(H0 == 4 && H1 == 2) {
H0 = 0;
H1 = 0;
}
}
}

if(!KEY_M_UP) {// 在暂停期间,检测到了 分钟调理 操作,处理显现
Delay_ms(10);
if(!KEY_M_UP) {
while(!KEY_M_UP) Display_Clock();
M0 += 1;
if(M0 == 10) {
M0 = 0;
M1 += 1;
}
if(M1 == 6) M1 = 0;
}
}

if(!KEY_S_UP) {// 在暂停期间,检测到了 秒调理 操作,处理显现
Delay_ms(10);
if(!KEY_S_UP) {
while(!KEY_S_UP) Display_Clock();
S0 += 1;
if(S0 == 10) {
S0 = 0;
S1 += 1;
}
if(S1 == 6) S1 = 0;
}
}
}

if(!KEY_PAUSE) {// 再次按下 暂停 按键,恢复作业
Delay_ms(10);
if(!KEY_PAUSE) {
while(!KEY_PAUSE) Display_Clock();
}
}
}
}
}
}

voidDelay(unsigned intt)
{
while(t–);
}

voidDelay_ms(unsigned intt)// 依据测验,能够适当近似的表明 1ms
{
while(t–) {
Delay(245);
Delay(245);
}
}

voidInit_Key(void)
{
KEY_PAUSE = 1;// 赋值高电平为 按键断开 状况
KEY_H_UP = 1;
KEY_M_UP = 1;
KEY_S_UP = 1;
}

voidInit_Clock(void)// 初始时钟显现为 00-00-00
{
H1 = 0;
H0 = 0;
M1 = 0;
M0 = 0;
S1 = 0;
S0 = 0;
}

voidInit_Timer0(void)
{
TMOD = 0x01;// 运用守时器 0,形式 1
EA = 1;// 开总中止
ET0 = 1;// 开守时器 0 中止
TH0 = (65536-50000)/256;// 守时器 0 赋值,守时 50ms
TL0 = (65536-50000)%256;
TR0 = 1;// 守时器 0 开端作业

timer0_count = 0;// 计中止个数,方针 20
}

/*************************************************************************************************
当守时器 0 守时结束,进入此中止过程,后边的 1 代表守时器 0 的中止
*************************************************************************************************/

voidTimer0_ISR(void)interrupt1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;

timer0_count++;
}

voidDisplay(unsigned charx,unsigned charnum)
{
SEG = 1;// 关锁存器
DATA = SEG_CODE[num];// 送段码
SEG = 0;// 开锁存器

BIT = 1;// 关锁存器
DATA = BIT_CODE[x-1];// 送位码
BIT = 0;// 开锁存器

Delay(200);// 延时,构成动态显现,200 正好,过大闪耀,过小重影
}

voidDisplay_Clock(void)
{
Display(1, H1);// 在 1、2 方位显现 小时
Display(2, H0);
Display(3, 10);
Display(4, M1);// 在 4、5 方位显现 分钟
Display(5, M0);
Display(6, 10);
Display(7, S1);// 在 7、8 方位显现 秒,其他方位显现 “-”
Display(8, S0);
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/268071.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部