📄 clock_mian.c
字号:
#include<regx51.h>
/*--------------------函数申明------------------------*/
void init(void); //硬件初始化
void init_data(void); //数据初始化
void time(void); //时间计算函数
void stop_watch(void); //秒表函数
void alarm(void) ; //闹钟函数
void display(void); //显示函数
void delay(char n); //延时函数
void un_slop_over(void); //防溢出函数
/*--------------------变量和标志为声明------------------------*/
/*---------------data[][]数据结构如下: ---------------------------
时间: 小时 分钟 秒
日期: 年 月 日
闹钟: 小时 分钟 闹钟开启标志位
秒表: 分 秒 0.01s
/*---------------------------------------------------------------*/
unsigned char Data_stor[4][3]; //定义结构体数组分别存放时间,日期,秒表和闹钟数据
static unsigned char mode; //模式选择 0:时间 1:日期 2闹钟 3秒表
static char adjustnum; //选择待调整的项目,值为-1,0,1,2 -1表示不调整
static unsigned char flash; //闪烁定时标志位
static unsigned char alarm_run; //闹钟启动标志
static unsigned char run; //秒表启动标志
unsigned char count_base = 0 ;
sbit key1 = P1^0; //按键入口
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit diode = P2^6; //发光二极管输出口
sbit alarm_ring = P2^7; //蜂鸣器输出口
void main()
{
init();
init_data();
display();
}
/***********************************/
/*nms定时*/
void delay(char n)
{
unsigned char i,j;
for(i=0;i<n;i++)
for (j=0;j<254;j++);
}
/***********************************/
/*显示函数*/
void display()
{
char i;
/*--------------------编码------------------------------*/
int disp[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*--------------------显示位选择------------------------*/
int select[6] = {0x3e,0x3d,0x3b,0x37,0x2f,0x1f};
int display_bit[6]; //储存显示数据
while (1)
{
/*--------------------将显示数据转换为位---------------*/
display_bit[0] = Data_stor[mode][0]/10;
display_bit[1] = Data_stor[mode][0]%10;
display_bit[2] = Data_stor[mode][1]/10;
display_bit[3] = Data_stor[mode][1]%10;
display_bit[4] = Data_stor[mode][2]/10;
display_bit[5] = Data_stor[mode][2]%10;
for (i=0;i<6;i++){
if ((2*adjustnum==i||2*adjustnum==(i-1))&&flash){
P2 = 0x3f; //调整时屏蔽相应两位
}
else{
P0 = disp[display_bit[i]];
P2 = select[i];
}
if(mode==0&&(adjustnum == -1)&&flash) //发光二极管闪烁
diode = 1;
else diode = 0;
delay(10);
P2 = 0x3f; //关数码管使能,消除重影
}
}
}
/***************************************/
/*硬件初始化函数*/
void init()
{
EA =1; //CPU中断开
ET0 = 1; //开启定时中断0 ,1
ET1 = 1;
TMOD = 0x11; //工作方式1
TH0 = (65536-10000)/256; //定时器初始化,T0用于基准时钟产生,为10ms
TL0 = (65536-10000)%256;
TH1 = (65536-50000)/256; //T1用于调整时的闪烁,为50ms
TL1 = (65536-50000)%256;
TR0 = 1; //计时开始
TR1 = 1;
EX1 = 1; //外部中断开
// IT1 = 1; //边沿触发
alarm_ring = 0; //关闭闹钟
}
/***************************************/
/*数据初始化函数*/
void init_data()
{
mode = 0;
adjustnum = -1;
flash = 0;
run = 0;
alarm_run = 0;
Data_stor[0][0] = 0; //时间初始化:00:00:00
Data_stor[0][1] = 0;
Data_stor[0][2] = 0;
Data_stor[1][0] = 0; //日期初始化:00-01-01
Data_stor[1][1] = 1;
Data_stor[1][2] = 1;
Data_stor[2][0] = 0; //闹钟初始化:00:00:00
Data_stor[2][1] = 0;
Data_stor[2][2] = 0;
Data_stor[3][0] = 0; //秒表初始化:00:00:00
Data_stor[3][1] = 0;
Data_stor[3][2] = 0;
}
/***************************************/
/*闹钟函数*/
void alarm()
{
unsigned char alarm_count = 120; //闹钟2min
if(Data_stor[2][1]==Data_stor[0][1] && Data_stor[2][0]==Data_stor[0][0]) {
while(alarm_count){
if(flash){
alarm_ring = 1;
alarm_count--;
}
else alarm_ring = 0;
}
alarm_ring = 0;
}
}
/***************************************/
/*基准时间中断函数*/
void time_base()interrupt 1
{
TH0 = (65536-10000)/256;
TL0 = (65536-10000)%256;
if (mode==0&&adjustnum>=0)
count_base = 0;
else
count_base++;
if(count_base == 100) //一秒
{
time();
count_base = 0;
}
if(run) stop_watch();
}
/***************************************/
/*按键响应中断函数*/
void key_block()interrupt 2
{
/*--------------------按键响应------------------------------*/
if(!key1){
delay(2);
if(!key1){
mode++;
adjustnum =-1;
if(mode == 4) mode = 0;
while(!key1);
}
}
if(!key2){
delay(2);
if(!key2){
adjustnum++;
if (adjustnum == 3)
adjustnum =-1;
if(mode == 3){
if(adjustnum == 0) {
run = !run;
adjustnum = -1;
}
else run = 0;
}
while(!key2);
}
}
if(!key3){
delay(2);
if(!key3){
if (adjustnum>=0&&mode<3){
Data_stor[mode][adjustnum] += 1;
un_slop_over();
alarm_run = Data_stor[2][2];
}
/*--------------------秒表------------------------------*/
/*秒表模式下key2控制开始/继续和停止/暂停key3控制秒表复位*/
if(mode == 3){
adjustnum = -1;
Data_stor[3][0] = 0;
Data_stor[3][1] = 0;
Data_stor[3][2] = 0;
}
while(!key3);
}
}
}
/***************************************/
/*0.5s延时中断函数*/
void time_flash()interrupt 3
{
TH1 = (65536-50000)/256;
TL1 = (65536-50000)%256;
flash = !flash;
}
/***************************************/
/*防止数据溢出函数*/
void un_slop_over()
{
/*时间*/
Data_stor[0][0] = Data_stor[0][0]%24; //小时
Data_stor[0][1] = Data_stor[0][1]%60; //分钟
Data_stor[0][2] = Data_stor[0][2]%60; //秒
/*日期*/
Data_stor[1][0] = Data_stor[1][0]%100; //年
if(Data_stor[1][1] ==13) Data_stor[1][1] = 1; //月
switch(Data_stor[1][1]) //日
{
case 4:
case 6:
case 9:
case 11:
if (Data_stor[1][2] == 31) Data_stor[1][2]= 1;
break;
case 2:{
if (Data_stor[1][0]%4==0&&Data_stor[1][2]==30) Data_stor[1][2] = 1;
if (Data_stor[1][0]%4!=0&&Data_stor[1][2]==29) Data_stor[1][2] = 1;
break;
}
default :
if (Data_stor[1][2] == 32) Data_stor[1][2] = 1;
break;
}
/*闹钟*/
Data_stor[2][0] = Data_stor[2][0]%24; //小时
Data_stor[2][1] = Data_stor[2][1]%60; //分钟
Data_stor[2][2] = Data_stor[2][2]%2; //闹钟状态 1开,0关
}
/***************************************/
/*时间处理函数函数*/
void time()
{
Data_stor[0][2] ++;
if(Data_stor[0][2] == 60){ //一分
Data_stor[0][1]++;
Data_stor[0][2] = 0;
if(alarm_run) alarm();
if(Data_stor[0][1] ==60){ //一小时
Data_stor[0][0]++;
Data_stor[0][1]= 0;
if(Data_stor[0][0] ==24){ //一天
Data_stor[1][2]++;
Data_stor[0][0] = 0;
if(Data_stor[1][2] == 29||Data_stor[1][2] == 30||Data_stor[1][2] == 31||Data_stor[1][2] == 32)
switch(Data_stor[1][1]){ //一月
case 4:
case 6:
case 9:
case 11:
if (Data_stor[1][2] == 31){
Data_stor[1][1]++;
Data_stor[1][2]= 1;
}
break;
case 2:
if (Data_stor[1][0]%4==0&&Data_stor[1][2]==30){
Data_stor[1][1]++;
Data_stor[1][2] = 1;
}
if (Data_stor[1][0]%4!=0&&Data_stor[1][2]==29){
Data_stor[1][1]++;
Data_stor[1][2]= 1;
}
break;
default :
if (Data_stor[1][2] == 32){
Data_stor[1][1]++;
Data_stor[1][2] = 1;
}
break;
}
if (Data_stor[1][1] ==13){
Data_stor[1][0]++;
Data_stor[1][1] = 1;
if (Data_stor[1][0] == 100) Data_stor[1][0] = 0;
}
}
}
}
}
/***************************************/
/*秒表函数*/
void stop_watch()
{
Data_stor[3][2]++;
if (Data_stor[3][2] == 100){
Data_stor[3][1]++;
Data_stor[3][2] = 0;
if (Data_stor[3][1] == 60){
Data_stor[3][0]++;
Data_stor[3][1] = 0;
if (Data_stor[3][0]==100){
alarm_ring = 1; //报警
delay(250);
delay(250);
delay(250);
delay(250);
alarm_ring = 0;
Data_stor[3][0] = 0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -