c#include "reg52.h"
#include <intrins.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
/*
* 大概就是,做一个电子时钟,然后加四个独立按键,
* K1按一次设置闹钟的秒,两次设置闹钟的分,三次设置闹钟的时,
* 然后四次修改时间的秒,五次修改时间的分,六次改时间的时这样
*
* K2是加一,K3是减一
*
* K4是关闹钟
定时器实现时钟送PC机显示独立键盘设置时间
要求;
筒易时钟。并送PC机上湿示,当前时间可以通过独立键盘来没置;整点提醒、定时闹钟
需要keil c语言程序(注释),proteus仿真图
*
*/
#define uchar unsigned char
#define uint unsigned int
#define u8 unsigned char
#define u16 unsigned int
char rtc_hour = 23;
char rtc_min = 59;
char rtc_sec = 55;
char rtc_hour_al = 1; /* 闹钟 */
char rtc_min_al = 0;
char rtc_sec_al = 1;
unsigned char num2 = 0; /* 计数 */
u8 ItemsNum = 0; /*按键改变项目 */
char *ALLtime[] = { &rtc_hour, &rtc_min, &rtc_sec, &rtc_hour_al, &rtc_min_al,
&rtc_sec_al }; /* 指针便于调用 */
u8 openAlarm = 1; /* 打开或者关闭闹钟 */
u8 alarmifg = 0;
u8 alarm_shijian = 0;
sbit key_01 = P2 ^ 1;
sbit key_02 = P2 ^ 2;
sbit key_03 = P2 ^ 3;
sbit key_04 = P2 ^ 4;
sbit key_05 = P2 ^ 5;
sbit BEEP = P3 ^ 6;
/*********************************************************************************
* 【函 数 名】: void send_cmd(unsigned char dat)
* 【功 能】: 串口发送数据命令
**********************************************************************************/
void send( unsigned char dat )
{
SBUF = dat; /* 发送指令到SBUF */
while ( !TI )
; /* 等待发送结束 */
TI = 0; /* 清除结束标志,以便再发送数据 */
}
/*********************************************************************************
* 【函 数 名】: Print_Str(unsigned char *s)
* 【功 能】: 串口发送 一个字符串
**********************************************************************************/
void Print_Str( unsigned char *s )
{
while ( *s != '\0' )
{
send( *s++ );
}
}
#define FSOC 11059200L //晶振
#define BAUD 9600 //波特率
/*********************************************************************************
* 【函 数 名】: void SerInit(void)
* 【功 能】: 串口初始化程序 设置波特率为9600
**********************************************************************************/
void SerInit( void )
{
SCON = 0x50; /* 010 1 0000B,工作方式1, 8位UART,波特率可变,允许接收 */
TMOD = 0x20; /* T1工作于方式2 */
TCON = 0x40; /* 定时器1开始计数 */
TH1 = -(FSOC/BAUD/12/16); /* T1计数初值 */
TL1 = -(FSOC/BAUD/12/16);
PCON = 0x80; /* SMOD置1,双倍速率 */
RI = 0;
TI = 0;
ES = 0; /* 关闭串口中断 */
}
/* 闹钟函数 */
void BeepAlarm()
{
unsigned char beeptime = 0;
int cycl = 1000;
while ( cycl-- )
{
BEEP = !BEEP;
for ( beeptime = 0; beeptime < 5; beeptime++ )
;
}
BEEP = 1;
}
/* 延时函数 */
void delay_ms_key( unsigned char t ) /* 延时xms */
{
unsigned char ttt;
while ( t-- )
{
for ( ttt = 0; ttt < 125; ttt++ )
;
}
}
/*
* 四个按键的检测函数
* 按键则返回1 2 3 4
* 无按键则返回0xff
*/
unsigned char KeySscan( void )
{
unsigned char keyvaluee = 0xff;
if ( key_01 == 0 )
{
delay_ms_key( 10 );
if ( key_01 == 0 )
{
while ( key_01 == 0 )
;
return(1);
}
}
if ( key_02 == 0 )
{
delay_ms_key( 10 );
if ( key_02 == 0 )
{
while ( key_02 == 0 )
;
return(2);
}
}
if ( key_03 == 0 )
{
delay_ms_key( 10 );
if ( key_03 == 0 )
{
while ( key_03 == 0 )
;
return(3);
}
}
if ( key_04 == 0 )
{
delay_ms_key( 10 );
if ( key_04 == 0 )
{
while ( key_04 == 0 )
;
return(4);
}
}
if ( key_05 == 0 )
{
delay_ms_key( 10 );
if ( key_05 == 0 )
{
while ( key_05 == 0 )
;
return(5);
}
}
return(0xff);
}
/* 显示时间 */
void displaytime()
{
u8 disp[15];
u8 count = 0;
disp[count++] = rtc_hour / 10 + '0';
disp[count++] = rtc_hour % 10 + '0';
disp[count++] = ':';
disp[count++] = rtc_min / 10 + '0';
disp[count++] = rtc_min % 10 + '0';
disp[count++] = ':';
disp[count++] = rtc_sec / 10 + '0';
disp[count++] = rtc_sec % 10 + '0';
disp[count++] = 0;
Print_Str( disp );
Print_Str("\r\n");//发送换行符号 便于看
}
/* 显示闹钟 */
void displayAlarm()
{
u8 disp[15];
u8 count = 0;
disp[count++] = rtc_hour_al / 10 + '0';
disp[count++] = rtc_hour_al % 10 + '0';
disp[count++] = ':';
disp[count++] = rtc_min_al / 10 + '0';
disp[count++] = rtc_min_al % 10 + '0';
disp[count++] = ':';
disp[count++] = rtc_sec_al / 10 + '0';
disp[count++] = rtc_sec_al % 10 + '0';
disp[count++] = 0;
Print_Str( disp );
Print_Str("\r\n");//发送换行符号 便于看
}
/*********************************************************************************
*
* 定时器中断
**********************************************************************************/
void T1_time()
interrupt 1
{
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
num2++;
if ( num2 == 20 )
{
displaytime(); /* 发送时间显示 */
num2 = 0;
rtc_sec++;
/* 闹钟响声判定 */
if ( openAlarm == 1 ) /* 打开了闹钟 */
{
if ( *ALLtime[0] == *ALLtime[3] ) /* 判定时间一样不一样 */
{
if ( *ALLtime[1] == *ALLtime[4] )
{
if ( *ALLtime[2] == *ALLtime[5] )
{
alarmifg = 1;
}
}
}
}
if ( alarmifg == 1 ) /* 闹钟开始响了 */
{
alarm_shijian++;
}
if ( rtc_sec == 60 )
{
rtc_sec = 0;
rtc_min++;
if ( rtc_min == 60 )
{
rtc_min = 0;
//整点报时
//alarmifg = 1;//打开蜂鸣器
Print_Str("zheng dian bao shi ");
Print_Str("\r\n");//发送换行符号 便于看
rtc_hour++;
if ( rtc_hour == 24 )
{
rtc_hour = 0;
}
}
}
}
}
void delay_ms( unsigned int t ) /* 延时xms */
{
unsigned char ttt;
while ( t-- )
{
for ( ttt = 0; ttt < 125; ttt++ )
;
}
}
/*********************************************************************************
*
* 主函数
**********************************************************************************/
void main( void )
{
u8 key = 0xff;
SerInit();
TMOD |= 0x01;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
/* LCD_write_com(0x0c); //关光标,闪烁 */
while ( 1 )
{
key = KeySscan();
if ( key != 0xff )
{
if ( key == 1 )
{
ItemsNum = (ItemsNum + 1) % 7;
if(ItemsNum==0)
{
Print_Str("Settings have been saved and exited\r\n");
}else if(ItemsNum==1)
{
Print_Str("Set Clock hours\r\n");
}else if(ItemsNum==2)
{
Print_Str("Set Clock minutes, \r\n");
}else if(ItemsNum==3)
{
Print_Str("Set Clock seconds\r\n");
}else if(ItemsNum==4)
{
Print_Str("Set Alarm clock hours \r\n");
}else if(ItemsNum==5)
{
Print_Str("Set Alarm clock minutes, \r\n");
}else if(ItemsNum==6)
{
Print_Str("Set Alarm clock seconds\r\n");
}
} else if ( key == 2 ) /* 加法 */
{
*ALLtime[ItemsNum - 1] = *ALLtime[ItemsNum - 1] + 1;
} else if ( key == 3 ) /* 减法 */
{
*ALLtime[ItemsNum - 1] = *ALLtime[ItemsNum - 1] - 1;
} else if ( key == 4 ) /* 关闭或者打开闹钟 */
{
openAlarm = !openAlarm;
if ( openAlarm == 0 ) /* 恢复闹钟功能 */
{
alarmifg = 0;
alarm_shijian = 0;
}
} else if ( key == 5 ) /* 保存并退出设置 */
{
ItemsNum=0;
Print_Str("Settings have been saved and exited\r\n");
}
/* 增加时间界限 */
if ( *ALLtime[0] == 24 )
{
*ALLtime[0] = 0;
} else if ( *ALLtime[1] == 60 )
{
*ALLtime[1] = 0;
} else if ( *ALLtime[2] == 60 )
{
*ALLtime[2] = 0;
}
if ( *ALLtime[0] == -1 )
{
*ALLtime[0] = 23;
} else if ( *ALLtime[1] == -1 )
{
*ALLtime[1] = 59;
} else if ( *ALLtime[2] == -1 )
{
*ALLtime[2] = 59;
}
/* 增加闹钟界限 */
if ( *ALLtime[3] == 24 )
{
*ALLtime[3] = 0;
} else if ( *ALLtime[4] == 60 )
{
*ALLtime[4] = 0;
} else if ( *ALLtime[5] == 60 )
{
*ALLtime[5] = 0;
}
if ( *ALLtime[3] == -1 )
{
*ALLtime[3] = 23;
} else if ( *ALLtime[4] == -1 )
{
*ALLtime[4] = 59;
} else if ( *ALLtime[5] == -1 )
{
*ALLtime[5] = 59;
}
/* 无论按哪一个按键 我们都要刷新显示 */
if ( ItemsNum <= 3 )
{
displaytime();
} else {
displayAlarm();
}
/* 控制游标 */
if ( ItemsNum == 0 )
{
TR0 = 1; /* 开启时钟 */
} else {
TR0 = 0; /* 关闭时钟 */
}
key = 0xff;
}
/* 闹钟 */
if ( alarmifg == 1 )
{
BeepAlarm(); /* 闹钟想 */
if ( alarm_shijian > 5 ) /* 响一会后关闭闹钟 alarm_shijian在定时器中自加 */
{
alarmifg = 0;
alarm_shijian = 0;
}
}
}
}
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!