400 lines
11 KiB
C
400 lines
11 KiB
C
/*
|
||
|
||
く__,.ヘヽ. / ,ー、 〉
|
||
\ ', !-─‐-i / /´
|
||
/`ー' L//`ヽ、
|
||
/ /, /| , , ',
|
||
イ / /-‐/ i L_ ハ ヽ! i
|
||
レ ヘ 7イ`ト レ'ァ-ト、!ハ| |
|
||
!,/7 '0' ´0iソ| |
|
||
|.从" _ ,,,, / |./ |
|
||
レ'| i>.、,,__ _,.イ / .i |
|
||
レ'| | / k_7_/レ'ヽ, ハ. |
|
||
| |/i 〈|/ i ,.ヘ | i |
|
||
.|/ / i: ヘ! \ |
|
||
kヽ>、ハ _,.ヘ、 /、!
|
||
!'〈//`T´', \ `'7'ーr'
|
||
レ'ヽL__|___i,___,ンレ|ノ
|
||
ト-,/ |___./
|
||
'ー' !_,.:
|
||
|
||
四位数码管STC89C52RC单片机实现简易时钟外加闹钟功能
|
||
Four digital tube STC89C52RC microcontroller to achieve a simple clock plus alarm clock function
|
||
创建于2023/6/15 14:13
|
||
Created on 2023/6/15 14:13
|
||
*/
|
||
#include<reg52.h>
|
||
typedef unsigned int u16;
|
||
typedef unsigned char u8;
|
||
|
||
//定义数码管的端口
|
||
sbit D1 = P2^0;
|
||
sbit D2 = P2^1;
|
||
sbit D3 = P2^2;
|
||
sbit D4 = P2^3;
|
||
//如果D1 = 0则选中
|
||
//如果D1 = 1则不选中
|
||
|
||
|
||
//定义按键的端口
|
||
sbit K3 = P3^5; //切换显示时间和设置时间和设置闹钟的时间
|
||
sbit K4 = P3^4; //切换小时和分钟的时间设置
|
||
sbit K5 = P3^3; //当设置时钟的时间、设置闹钟的时间,用来增加时间、可减少小时和分钟通过K4切换
|
||
sbit K6 = P3^2; //当设置时钟的时间、设置闹钟的时间,用来减少时间、可减少小时和分钟通过K4切换
|
||
|
||
//判断按钮是否按下
|
||
int K3UPdown;
|
||
int K4UPdown;
|
||
int K5UPdown;
|
||
int K6UPdown;
|
||
|
||
// 设置默认时间
|
||
//12:00:00
|
||
u8 hour = 12;
|
||
u8 minute = 0;
|
||
|
||
// 设置默认闹钟时间
|
||
//12:01:00
|
||
u8 bellhour = 12;
|
||
u8 bellminute = 1;
|
||
u8 bellsecond = 0;
|
||
|
||
//默认显示时钟
|
||
u8 timekey = 0;
|
||
|
||
//小时和分分钟的切换状态
|
||
u8 Statukey = 0; //Statukey = 0 小时设置、Statukey = 1 分钟设置
|
||
//定义蜂鸣器的端口
|
||
sbit beep = P3^6;
|
||
//0~9的段码
|
||
u8 code table[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; //0~9的段码 共阳极数码管
|
||
u8 code tablecode[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};//0~9的段码 共阳极数码管带小数点
|
||
u8 second;
|
||
u8 key=0;
|
||
|
||
// 1ms*1000=1s
|
||
void delay1ms(u16 t)
|
||
{
|
||
u16 i,j;
|
||
for(i=0;i<t;i++)
|
||
{
|
||
for(j=0;j<120;j++);
|
||
}
|
||
}
|
||
|
||
void ExitInit() //定时器初始化
|
||
{
|
||
TMOD =0X01;
|
||
ET0=1;
|
||
EA=1;
|
||
second=0; //秒数计时
|
||
TH0=0xFC;
|
||
TL0=0x18;
|
||
P3=0xff;
|
||
P0=0x00;
|
||
}
|
||
|
||
void Display() //数码管显示
|
||
{
|
||
//切换显示时间设置或者闹钟设置
|
||
//如果key = 0则显示时间设置,key = 1则显示闹钟设置
|
||
if(timekey == 0 || timekey == 1){ //切换显示时间或者时间设置
|
||
//显示时间设置
|
||
D1 = 0; D2 = 1; D3 = 1; D4 = 1; //选中第一个数码管
|
||
P0 = table[hour / 10]; //显示s的十位
|
||
delay1ms(3);
|
||
D1 = 1; D2 = 0; D3 = 1; D4 = 1;
|
||
P0 = tablecode[hour % 10];
|
||
delay1ms(3);
|
||
D1 = 1; D2 = 1; D3 = 0; D4 = 1;
|
||
P0 = table[minute / 10]; //显示s的十位
|
||
delay1ms(3);
|
||
D1 = 1; D2 = 1; D3 = 1; D4 = 0;
|
||
P0 = table[minute % 10];
|
||
delay1ms(3);
|
||
}
|
||
|
||
// 闹钟设置
|
||
if (timekey==2) //闹钟设置
|
||
{
|
||
D1 = 0; D2 = 1; D3 = 1; D4 = 1; //选中第一个数码管
|
||
P0 = table[bellhour / 10]; //显示s的十位
|
||
delay1ms(3);
|
||
D1 = 1; D2 = 0; D3 = 1; D4 = 1;
|
||
P0 = tablecode[bellhour % 10];
|
||
delay1ms(3);
|
||
D1 = 1; D2 = 1; D3 = 0; D4 = 1;
|
||
P0 = table[bellminute / 10]; //显示s的十位
|
||
delay1ms(3);
|
||
D1 = 1; D2 = 1; D3 = 1; D4 = 0;
|
||
P0 = table[bellminute % 10];
|
||
delay1ms(3);
|
||
}
|
||
|
||
|
||
}
|
||
void Timer0() interrupt 1 //定时器0中断函数 检查是否到达闹钟时间
|
||
{
|
||
static u16 timer;
|
||
TH0=0XFC;
|
||
TL0=0X18;
|
||
timer++;
|
||
//1ms*1000=1s
|
||
if(timer==1000)
|
||
{
|
||
timer=0;
|
||
second++;
|
||
if(second==60)
|
||
{
|
||
second=0;
|
||
minute++;
|
||
if(minute==60)
|
||
{
|
||
minute=0;
|
||
hour++;
|
||
if(hour==24)
|
||
{
|
||
hour=0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
void main()
|
||
{
|
||
int timex;
|
||
ExitInit();
|
||
TR0 = 1;
|
||
while(1)
|
||
{
|
||
if(timekey == 0)//时钟模式才响铃
|
||
{
|
||
if (hour == bellhour && minute == bellminute && second == bellsecond)
|
||
{
|
||
for(timex=0;timex<3;timex++)
|
||
{
|
||
beep = 0;
|
||
delay1ms(1);
|
||
beep = 1;
|
||
delay1ms(1);
|
||
}
|
||
}
|
||
}
|
||
// 如果计时器开启则进行以下判断
|
||
if(timekey==0)
|
||
{
|
||
TR0 = 1;
|
||
}
|
||
if(timekey==1 || timekey==2)
|
||
{
|
||
// 停止计时
|
||
TR0 = 0;
|
||
//归零
|
||
second = 0;
|
||
}
|
||
|
||
Display(); //数码管显示
|
||
|
||
//切换显示时间或者时间设置或者闹钟设置
|
||
//timekey = 0 显示时间 timekey = 1 时间设置 timekey = 2 闹钟设置
|
||
//当进入时间设置或者闹钟设置时,timekey = 1或者timekey = 2 则归零秒数计时并暂停
|
||
if (K3 == 0) //切换显示时间和设置时间和设置闹钟的时间
|
||
{
|
||
delay1ms(5);
|
||
if (K3 == 0)
|
||
{
|
||
if (K3UPdown == 0)
|
||
{
|
||
key++;
|
||
K3UPdown = 1;
|
||
if (key == 3)
|
||
{
|
||
key = 0;
|
||
}
|
||
if (key == 0)
|
||
{
|
||
timekey = 0;
|
||
}
|
||
if (key == 1)
|
||
{
|
||
timekey = 1;
|
||
}
|
||
if (key == 2)
|
||
{
|
||
timekey = 2;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if(K3UPdown == 1)//恢复按键状态
|
||
{
|
||
if (K3 == 1)
|
||
{
|
||
delay1ms(5);
|
||
if (K3 == 1)
|
||
{
|
||
K3UPdown = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
//切换小时和分钟的时间设置
|
||
if (K4 == 0)
|
||
{
|
||
delay1ms(5);
|
||
if (K4 == 0)
|
||
{
|
||
if (K4UPdown == 0)
|
||
{
|
||
Statukey++;
|
||
K4UPdown = 1;
|
||
if (Statukey == 2)
|
||
{
|
||
Statukey = 0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if(K4UPdown == 1) //恢复按键状态
|
||
{
|
||
if (K4 == 1)
|
||
{
|
||
delay1ms(5);
|
||
if (K4 == 1)
|
||
{
|
||
K4UPdown = 0;
|
||
}
|
||
}
|
||
}
|
||
//K5用来增加时间、小时和分钟通过K4切换
|
||
if(K5 == 0)
|
||
{
|
||
delay1ms(5);
|
||
if (K5 == 0)
|
||
{
|
||
if (K5UPdown == 0)
|
||
{
|
||
K5UPdown = 1;
|
||
if (timekey == 1)
|
||
{
|
||
if (Statukey == 0)
|
||
{
|
||
hour++;
|
||
if (hour == 24)
|
||
{
|
||
hour = 0;
|
||
}
|
||
}
|
||
if (Statukey == 1)
|
||
{
|
||
minute++;
|
||
if (minute == 60)
|
||
{
|
||
minute = 0;
|
||
}
|
||
}
|
||
}
|
||
if(timekey == 2)
|
||
{
|
||
if (Statukey == 0)
|
||
{
|
||
bellhour++;
|
||
if (bellhour == 24)
|
||
{
|
||
bellhour = 0;
|
||
}
|
||
}
|
||
if (Statukey == 1)
|
||
{
|
||
bellminute++;
|
||
if (bellminute == 60)
|
||
{
|
||
bellminute = 0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//当设置时钟的时间、设置闹钟的时间,用来增加时间、可减少小时和分钟通过K4切换
|
||
|
||
}
|
||
}
|
||
if(K5UPdown == 1) //恢复按键状态
|
||
{
|
||
if (K5 == 1)
|
||
{
|
||
delay1ms(5);
|
||
if (K5 == 1)
|
||
{
|
||
K5UPdown = 0;
|
||
}
|
||
}
|
||
}
|
||
if(K6 == 0)
|
||
{
|
||
delay1ms(5);
|
||
if(K6 == 0)
|
||
{
|
||
if (K6UPdown == 0)
|
||
{
|
||
K6UPdown = 1;
|
||
//当设置时钟的时间、设置闹钟的时间,用来减少时间、可减少小时和分钟通过K4切换
|
||
if (timekey == 1)
|
||
{
|
||
if (Statukey == 0)
|
||
{
|
||
hour--;
|
||
Display(); //数码管显示
|
||
if (hour == 255)
|
||
{
|
||
hour = 23;
|
||
}
|
||
}
|
||
if (Statukey == 1)
|
||
{
|
||
minute--;
|
||
if (minute == 255)
|
||
{
|
||
minute = 59;
|
||
}
|
||
}
|
||
}
|
||
if(timekey == 2)
|
||
{
|
||
if (Statukey == 0)
|
||
{
|
||
bellhour--;
|
||
if (bellhour == 255)
|
||
{
|
||
bellhour = 23;
|
||
}
|
||
}
|
||
if (Statukey == 1)
|
||
{
|
||
bellminute--;
|
||
if (bellminute == 255)
|
||
{
|
||
bellminute = 59;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if(K6UPdown == 1) //恢复按键状态
|
||
{
|
||
if (K6 == 1)
|
||
{
|
||
delay1ms(5);
|
||
if (K6 == 1)
|
||
{
|
||
K6UPdown = 0;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//Path: SASO-STATIC-API/C/时钟.c
|
||
// Compare this snippet from C/按键计时.c:
|
||
// Author: Syayuri
|
||
// E-mail: syayuri@outlook.jp
|