2.2 电子时钟电路图
图2-3 线路连接图
2.3 电子时钟程序设计
6
1、程序流程图
如图2-4所示
单片机上电 复位初始化
While无限循环
等待中断
键盘中断
键盘数据的处理
秒中断 对时间的处理,与LCD的显示控制 图2-4
2、电路元器件清单
低压电源 4.5V 导线 AT89C51 单片机 微动开关按钮 LCD1602显示器 NPN三极管 电阻 10K 滑动变阻器 10K 电容10uF 电容30pF 晶振12MHZ 若干 1 4 1 1 1 1 1 2 1 3、电子时钟C语言源程序
/***********************************
使用LCD1602与单片机实现的时钟与日期 显示年、月、日、时、分、秒(24小时制) 时间可调, 年份2000——9999 jiahuhenan
2012年10月9日
***********************************/ #include
7
/******全局变量的定义与设置******/ sbit key_mean=P1^0; //按键的定义 sbit key_ok =P1^1; sbit key_set =P1^2;
sbit RS =P1^5; //LCD控制端口 sbit RW =P1^6; sbit E =P1^7; sfr PORT =0xA0; //flag
char flag_sec=0; //值为20代表1s char flag_en_ok=0; char flag_en_key=0; //值为1表示键盘有效,否则无效
char flag_ok=0; //key_up与key_down的功能选择
char flag_mean=0; char flag_set=0; //key_up与key_down的功能标识
char flag_year_leap=0; //短语
//code char string_time[]= \ ? \\0\ code char string_year[]= \ ? \\0\ code char string_month[]= \ \\0\ code char string_mday[]= \ ? \\0\ code char string_week[]= \ ? \\0\ code char string_hour[]= \ ? \\0\ code char string_minute[]=\ \\0\ code char string_second[]=\ \\0\//年月日时分秒的定义 struct DATA_TIME { short year; //待选 char month; char mday ; char week ; char hour ; char minute; char second; }time;
struct time_char //time的字符型 {
char ch_year[4]; char ch_month[2];
8
char ch_mday[2]; char ch_week[1]; char ch_hour[2]; char ch_minute[2]; char ch_second[2]; }time_ch;
/***************子函数****************/ //LCD的延时程序 void LCD_delay(void) {
char i;
for(i=123;i>=0;i--); }
//向写指令函数
void wcmd(char cmd ) {
RS=0; RW=0; E=1;
LCD_delay(); PORT=cmd; LCD_delay(); E=0; }
//向LCD写数据函数 void wdata(char DATA) {
RS=1; RW=0; E=1;
LCD_delay(); PORT=DATA; LCD_delay(); E=0; }
//写字符串
void wstring(char *pt,char i)//i为字符的个数,不带\\0 {
char j;
for(j=0;j
9
{
wdata(pt[j]); } }
//时间数据的格式转换
void tran_2_ch(char *pt,char DATA) {
pt[0]=DATA/10+0x30;
pt[1]=DATA-pt[0]*10+0x10; }
void tran_4_ch(char *pt,int DATA) {
pt[0]=DATA/1000;
pt[1]=DATA/100-pt[0]*10;
pt[2]=DATA/10-pt[0]*100-pt[1]*10;
pt[3]=DATA-pt[0]*1000-pt[1]*100-pt[2]*10; pt[0]+=0x30; pt[1]+=0x30; pt[2]+=0x30; pt[3]+=0x30; }
//格式转换的实现 void tran_ch(void) {
tran_4_ch(time_ch.ch_year ,time.year ); tran_2_ch(time_ch.ch_month,time.month); tran_2_ch(time_ch.ch_mday ,time.mday );
//tran_2_ch(time_ch.ch_week ,time.week*10+1); time_ch.ch_week[0]=time.week+0x30; tran_2_ch(time_ch.ch_hour ,time.hour ); tran_2_ch(time_ch.ch_minute,time.minute); tran_2_ch(time_ch.ch_second,time.second); }
//是否是闰年
char leep_year(int year)//如果是闰年则flag_year_leep=1,否则=0 {
if((year@0==0)||year%4==0&&year0!=0)return 1; else return 0; }
//星期的判断
void de_week(void) {
int i,j,day=0; char mweek;
10