单片机多功能数字钟设计程序(单片机数字时钟设计程序)
本篇文章给大家谈谈单片机多功能数字钟设计程序,以及单片机数字时钟设计程序对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、用C语言编写AT89C51单片机程序,设计一个智能数字钟。
- 2、单片机课程设计(数字时钟) 麻烦大家不要发链接 直接帮我把程序写过来。
- 3、跪求单片机c51一个多功能时钟设计。要闹钟。调整时间、秒表、就行了。急求。。。C语言编写
- 4、单片机课程设计 设计制作一个24小时制多功能数字钟
用C语言编写AT89C51单片机程序,设计一个智能数字钟。
#includereg52.h
#define uint unsigned int
#define uchar unsigned char
sbit QB1=P1^0;
sbit QB2=P1^1; //数码管段选
sbit QB3=P1^2;
sbit QB4=P1^3;
sbit QB5=P1^4;
sbit QB6=P1^5;
sbit fm=P1^6; //蜂鸣器
sbit s1=P2^4; //s5按键,切换显示
sbit s2=P2^3; //s2按键,设置调时
sbit s3=P2^2; //s3按键,加1
sbit s4=P2^1; //s4按键,减1
sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
uchar count;
uchar sec,minu,hour,day,week,mon;
uchar n_sec,n_minu,n_hour;
uint year;
uchar set_2=1,set_1=1;
uchar hs,hg,mis,mig,ss,sg;
uchar nhs,nhg,nms,nmg,nss=0,nsg=0;
uchar ms,mg,ds,dg,w;
uchar code table[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,
0X90,0X88,0X83,0XC6,0XA1,0X8E,0X86,0xbf}; //0~F,-,共阳
//uchar code tableyi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
//0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};//0-F,-,共阴
uchar code table_d[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef}; //0~9数组,带小数点
uchar table1[]={31,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年
uchar table2[]={31,31,28,31,30,31,30,31,31,30,31,30,31}; //非闰年
void delay(uint); //延时函数
void timer0(); //走时中断函数
void jishi(); //计时函数
void key_change(); //切换显示按键函数
void key_set(); //设置时间按键函数
void disp(uchar,uchar,uchar,uchar,uchar,uchar); //显示函数
void zd_clock(); //整点报时函数
void nz_clock(); //闹钟函数
uchar incone(uchar); //加1函数
uchar decone(uchar); //减1函数
void set_time(); //设置时间函数
void set_clock(); //设置闹钟函数
void set_mdw(); //设置月日星期函数
void main() //主函数
{
EA=1;
ET0=1;
TR0=1;
TMOD=0x01;
TH0=0x4c; //50ms初值 晶振11.0592
TL0=0x00;
hour=23;minu=59;sec=49; //赋初值:11点59分0秒
n_hour=12;n_minu=56;n_sec=0; //闹钟赋初值12点1分0秒
year=2008;mon=5;day=14;week=3;//年月日星期赋初值2008年5月11日星期天;祝天下所有母亲节日快乐
while(1)
{
hs=hour/10; //时分秒HH.MM.SS
hg=hour%10;
mis=minu/10;
mig=minu%10;
ss=sec/10;
sg=sec%10;
ms=mon/10; //月日-星期MM.DD.-W
mg=mon%10;
ds=day/10;
dg=day%10;
w=week;
nhs=n_hour/10; //闹钟定时HH.MM.SS
nhg=n_hour%10;
nms=n_minu/10;
nmg=n_minu%10;
nss=n_sec/10;
nsg=n_sec%10;
key_change(); //s4按键扫描
key_set(); //s2按键扫描
set_time(); //设置时间
set_mdw(); //设置月日星期
set_clock(); //设置闹钟
if(set_1==1) //正常走时显示
{
disp(hs,hg,mis,mig,ss,sg);
}
if(set_1==2) //设置时间,LED1闪亮
{
disp(hs,hg,mis,mig,ss,sg);
if(sec%2==0)
{led2=1;led3=1;led1=~led1;}
// else
// {led1=1;}
}
if(set_1==3) //正常显示月日-星期
{
disp(ms,mg,ds,dg,16,w);
}
if(set_1==4) //设置月日-星期,LED2闪亮
{
disp(ms,mg,ds,dg,16,w);
if(sec%2==0)
{led1=1;led3=1;led2=~led2;}
// else
// {led2=1;}
}
if(set_1==5) //正常显示定时
{
disp(nhs,nhg,nms,nmg,nss,nsg);
}
if(set_1==6) //设置闹钟定时,LED3闪亮
{
disp(nhs,nhg,nms,nmg,nss,nsg);
if(sec%2==0)
{led1=1;led2=1;led3=~led3;}
// else
// {led3=1;}
}
zd_clock(); //整点报时
nz_clock(); //闹钟
}
}
void timer0() interrupt 1 //50ms中断函数
{
TMOD=0x01;
TH0=0x4c; //50ms初值 晶振11.0592
TL0=0x00;
count++;
if(count==20)
{
count=0;
sec++;
jishi(); //调计时函数
}
}
void jishi() //计时函数
{
if(sec==60)
{
sec=0;
minu++;
if(minu==60)
{
minu=0;
hour++;
if(hour==24)
{ hour=0;
day++;
week++;
if(week==8)
{week=0;}
if(year%4==0year%100!=0||year%400==0) //闰年
{
if(day==table1[mon]+1)
{
day=0;
mon++;
if(mon==13)
{mon=0;year++;}
}
}
else //非闰年
{
if(day==table2[mon]+1)
{
day=0;
mon++;
if(mon==13)
{mon=0;year++;}
}
}
}
}
}
}
void key_change() //s1按键扫描
{
if(s1==0)
{
delay(200);
if(s1==0)
{
set_1++;
while(!s1);
if(set_1==7)
{set_1=1;}
}
}
}
void key_set() //s2按键扫描
{
if(s2==0)
{
delay(10);
if(s2==0)
{
set_2++;
while(!s2);
if(set_2==4)
{set_2=1;}
}
}
}
void disp(uchar a1,uchar a2,uchar a3,uchar a4,uchar a5,uchar a6) //显示函数
{
QB1=1;
QB2=0;
QB3=0;
QB4=0;
QB5=0;
QB6=0;
P3=table[a1]; //段码送P0口
delay(10); //延时一小会
QB1=0;
QB2=1;
QB3=0;
QB4=0;
QB5=0;
QB6=0;
P3=table[a2]; //第2个数码管显示,带小数点
delay(10);
QB1=0;
QB2=0;
QB3=1;
QB4=0;
QB5=0;
QB6=0;
P3=table[a3]; //第3个数码管显示
delay(10);
QB1=0;
QB2=0;
QB3=0;
QB4=1;
QB5=0;
QB6=0;
P3=table[a4]; //第4个数码管显示,带小数点
delay(10);
QB1=0;
QB2=0;
QB3=0;
QB4=0;
QB5=1;
QB6=0;
//第5个数码管显示
P3=table[a5];
delay(10);
QB1=0;
QB2=0;
QB3=0;
QB4=0;
QB5=0;
QB6=1;
P3=table[a6]; //第6个数码管显示
delay(10);
QB1=0;
QB2=0;
QB3=0;
QB4=0;
QB5=0;
QB6=0;
}
void zd_clock() //整点报时函数
{
if(minu==59(sec==53||sec==55||sec==57))
{
fm=0;
delay(5);
fm=1;
delay(5);
}
fm=0;
if(minu==59sec==59)
{
fm=0;
delay(5);
fm=1;
delay(5);
fm=0;
}
}
void nz_clock() //闹钟函数
{
if(hour==n_hourminu==n_minusec==n_sec)
//if((sec%2==0)sec30)
{
fm=0;
delay(1);
fm=1;
delay(1);
}
}
void set_time() //设置时间函数
{
if(set_1==2)
{
if(set_2==1)
{
hour=incone(hour);
if(hour==24)
{hour=0;}
// if(hour0)
// {hour=23;}
hour=decone(hour);
}
if(set_2==2)
{
minu=incone(minu);
if(minu==60)
{minu=0;}
// if(minu0)
// {minu=59;}
minu=decone(minu);
}
}
}
void set_mdw() //设置月日星期函数
{
if(set_1==4)
{
if(set_2==1)
{
mon=incone(mon);
if(mon==13)
{mon=1;}
mon=decone(mon);
// if(mon==0)
// {mon=12;}
}
if(set_2==2)
{
day=incone(day);
if(day==32)
{day=0;}
day=decone(day);
// if(day==0)
// {day=0;}
}
if(set_2==3)
{
week=incone(week);
if(week==8)
{week=0;}
week=decone(week);
// if(week==0)
// {week=7;}
}
}
}
void set_clock() //设置闹钟函数
{
if(set_1==6)
{
if(set_2==1)
{
n_hour=incone(n_hour);
if(n_hour==24)
{n_hour=0;}
n_hour=decone(n_hour);
if(n_hour==0)
{n_hour=0;}
}
if(set_2==2)
{
n_minu=incone(n_minu);
if(n_minu==60)
{n_minu=0;}
n_minu=decone(n_minu);
if(n_minu==0)
{n_minu=0;}
}
}
}
uchar incone(uchar n) //加1函数
{
if(s3==0)
{ delay(200);
if(s3==0)
{
n++;
while(!s3);
}
}
return(n);
}
uchar decone(uchar m) //减1函数
{
if(s4==0)
{
delay(200);
if(s4==0)
{
m--;
while(!s4);
if(m0)
{m=0;}
}
}
return(m);
}
void delay(uint k) //延时函数
{
uint i,j;
for(i=k;i0;i--)
for(j=80;j0;j--);
}
单片机课程设计(数字时钟) 麻烦大家不要发链接 直接帮我把程序写过来。
哈哈 有个1602显示的 不过程序太长 贴不上 给你个数码管的吧 不行再联系
1302.c
#includeDS1302.h
#includekey.h
uchar bit_ser[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/***********************时间显示*****************/
void timer0_init(void) //T0初始化函数,用于时间的动态显示
{
TMOD = 0x21;
TL0 = (65536-5000) % 256;
TH0 = (65536-5000) / 256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void timer0_isr(void) interrupt 1 //T0中断处理函数
{
char flag; //flag用于表示调整时闪烁的亮或灭
TR0 = 0;
TL0 = (65536-5000) % 256;
TH0 = (65536-5000) / 256;
TR0 = 1;
flag = x / 100 * 0xff; //设置闪烁标志,如果x大于100则flag为0xff,小于100则为0x00
x++;
if(x 200)
x = 0;
switch(i)
{
case 0:
P2 = bit_ser[0];
if(setflag == 3) //根据setflag的值判断当前位是否需要闪烁
P0 = flag | seven_seg[dis_buffer[0]];
else
P0 = seven_seg[dis_buffer[0]];
break;
case 1:
P2 = bit_ser[1];
if(setflag == 3)
P0 =flag | seven_seg[dis_buffer[1]];
else
P0 =seven_seg[dis_buffer[1]];
break;
case 2:
P2 = bit_ser[2];
if(setflag == 2)
P0 =flag | seven_seg[dis_buffer[2]];
else
P0 =seven_seg[dis_buffer[2]];
break;
case 3:
P2 = bit_ser[3];
if(setflag == 2)
P0 =flag | seven_seg[dis_buffer[3]];
else
P0 =seven_seg[dis_buffer[3]];
break;
case 4:
P2 = bit_ser[4];
if(setflag == 1)
P0 =flag | seven_seg[dis_buffer[4]];
else
P0 =seven_seg[dis_buffer[4]];
break;
case 5:
P2 = bit_ser[5];
if(setflag == 1)
P0 =flag | seven_seg[dis_buffer[5]];
else
P0 =seven_seg[dis_buffer[5]];
break;
}
i++;
if(i = 6)
{
i = 0;
if(j == 10)
{
j = 0;
if(setflag == 0)
DS1302_GetTime(Time); //如果setflag是0,就从1302中读出时间,因为setflag不是0时,说明处于调整状态,不需要读时间
dis_buffer[5] = Time.Second % 10; //把当前时间放入显示缓冲区
dis_buffer[4] = Time.Second / 10;
dis_buffer[3] = Time.Minute % 10;
dis_buffer[2] = Time.Minute / 10;
dis_buffer[1] = Time.Hour % 10;
dis_buffer[0] = Time.Hour / 10;
}
j++;
}
}
void main()
{
Initial_DS1302(Time);
timer0_init();
while(1)
{
set_down();
timer_down();
up_down();
down_down();
beepflag_down();
if(setflag == 0 Time.Hour == romhour Time.Minute == romminute Beepflag == 1) //判断蜂鸣器是否要响
Beep = !Beep;
}
}
//key.c
#includereg51.h
#define uchar unsigned char
#define uint unsigned int
uchar i = 0,j = 0,x = 0,setflag,flag_set,flag_timer; //setflag用来表示调整的位置,flag_set和flag_timer分别表示当前处于调整状态还是定时状态
SYSTEMTIME Time={0,20,15,3,30,6,10}; //系统时间的初始值2010年6月30日星期三,15时20分0秒
char dis_buffer[6]; //存放显示数据的缓冲区
sbit Beep_flag = P3^2; //蜂鸣器的接口
sbit key_timer = P3^4; //定时按钮
sbit key_set = P3^5; //调整按钮
sbit key_up = P3^6; //增加按钮
sbit key_down = P3^7; //减小按钮
char romhour,romminute,romsec; //分别存放定时的时,分,秒
bit Beepflag; //标记闹钟是否开启
//延时函数
void delays(uchar x)
{
while(x) x--;
}
//设置键的处理函数
void set()
{
setflag ++;
flag_set = 1;
if(setflag = 4)
{
setflag = 0;
flag_set = 0;
Initial_DS1302(Time);
}
}
//定时间的处理函数
void timer()
{
setflag ++;
flag_timer = 1;
if(setflag == 1)
{
Time.Hour = romhour;
Time.Minute = romminute;
Time.Second = romsec;
}
else if(setflag = 4)
{
setflag = 0;
flag_timer = 0;
romhour = Time.Hour;
romminute = Time.Minute;
romsec = Time.Second;
}
}
//增加键的处理函数
void up()
{
switch(setflag)
{
case 0:
break;
case 1:
Time.Second ++;
if(Time.Second = 60)
Time.Second = 0;
break;
case 2:
Time.Minute ++;
if(Time.Minute = 60)
Time.Minute = 0;
break;
case 3:
Time.Hour ++;
if(Time.Hour = 24)
Time.Hour = 0;
break;
}
}
//减小键的处理函数
void down()
{
switch(setflag)
{
case 0:
break;
case 1:
Time.Second --;
if(Time.Second 0)
Time.Second = 59;
break;
case 2:
Time.Minute --;
if(Time.Minute 0)
Time.Minute = 59;
break;
case 3:
Time.Hour --;
if(Time.Hour 0)
Time.Hour = 23;
break;
}
}
//设置键的扫描函数
void set_down()
{
if(key_set == 0 flag_timer == 0)
{
delays(100);
if(key_set == 0)
{
set();
}
while(!key_set);
}
}
//定时键的扫描函数
void timer_down()
{
if(key_timer == 0 flag_set == 0)
{
delays(100);
if(key_timer == 0)
{
timer();
}
while(!key_timer);
}
}
//增加键的扫描函数
void up_down()
{
if(key_up == 0 setflag != 0)
{
delays(100);
if(key_up == 0)
{
up();
while(!key_up);
}
}
}
//减少键的处理函数
void down_down()
{
if(key_down == 0 setflag != 0)
{
delays(100);
if(key_down == 0)
{
down();
while(!key_down);
}
}
}
//定时开关的扫描处理函数
void beepflag_down()
{
if(Beep_flag == 0)
{
delays(100);
{
Beepflag = !Beepflag;
while(!Beep_flag);
}
}
}
//ds1302.h
#ifndef _REAL_TIMER_DS1302
#define _REAL_TIMER_DS1302
#include REG51.h
sbit DS1302_CLK = P1^1; //实时时钟时钟线引脚
sbit DS1302_IO = P1^2; //实时时钟数据线引脚
sbit DS1302_RST = P1^3; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit Beep = P2^7;
typedef struct __SYSTEMTIME__
{ char Second;
char Minute;
char Hour;
char Week;
char Day;
char Month;
char Year;
}SYSTEMTIME; //定义的时间类型
#define AM(X) X
#define PM(X) (X+12) // 转成24小时制
#define DS1302_SECOND 0x80 //秒寄存器
#define DS1302_MINUTE 0x82 //分寄存器
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
#define DS1302_RAM(X) (0xC0+(X)*2) //用于计算 DS1302_RAM 地址的宏
void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
{ unsigned char i;
ACC = d;
for(i=8; i0; i--)
{ DS1302_IO = ACC0; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 0; //发一个高跳变到低的脉冲
ACC = ACC 1;
}
}
unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
{ unsigned char i;
for(i=8; i0; i--)
{ ACC = ACC 1; //相当于汇编中的 RRC
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0; //发一个高跳变到低的脉冲
}
return(ACC);
}
void Write1302(unsigned char ucAddr, unsigned char ucDa)//ucAddr: DS1302地址, ucData: 要写的数据
{ DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0; //RST 0-1-0,CLK 0-1
}
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{ unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1; //enable
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 读1Byte数据
DS1302_CLK = 1; //RST 0-1-0,CLK 0-1
DS1302_RST = 0;
return(ucData);
}
void DS1302_SetProtect(bit flag) //是否写保护
{ if(flag)
Write1302(0x8E,0x80); //WP=1,不能写入
else
Write1302(0x8E,0x00);//WP=0,可以写入
}
void DS1302_SetTime(unsigned char Address, unsigned char Value) // 设置时间函数
{ DS1302_SetProtect(0);
Write1302(Address, ((Value/10)4 | (Value%10))); //高4位为十位,低4位为个位
DS1302_SetProtect(1);
}
//获取时间函数,从DS1302内读取时间然后存入Time内
void DS1302_GetTime(SYSTEMTIME *Time)
{ unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time-Second = ((ReadValue0x70)4)*10 + (ReadValue0x0F);//转换成10进制的秒
ReadValue = Read1302(DS1302_MINUTE);
Time-Minute = ((ReadValue0x70)4)*10 + (ReadValue0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time-Hour = ((ReadValue0x70)4)*10 + (ReadValue0x0F);
ReadValue = Read1302(DS1302_DAY);
Time-Day = ((ReadValue0x70)4)*10 + (ReadValue0x0F);
ReadValue = Read1302(DS1302_WEEK);
Time-Week = ((ReadValue0x70)4)*10 + (ReadValue0x0F);
ReadValue = Read1302(DS1302_MONTH);
Time-Month = ((ReadValue0x70)4)*10 + (ReadValue0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time-Year = ((ReadValue0x70)4)*10 + (ReadValue0x0F);
}
//利用STime初始化DS1302
void Initial_DS1302(SYSTEMTIME STime)
{ unsigned char Second=Read1302(DS1302_SECOND);
if(Second0x80) DS1302_SetTime(DS1302_SECOND,0); //如果第七为1(表明没有启动), 则启动时钟
DS1302_SetTime(DS1302_SECOND,STime.Second); //设定起始时间
DS1302_SetTime(DS1302_MINUTE,STime.Minute);
DS1302_SetTime(DS1302_HOUR,STime.Hour);
DS1302_SetTime(DS1302_DAY,STime.Day);
DS1302_SetTime(DS1302_MONTH,STime.Month);
DS1302_SetTime(DS1302_YEAR,STime.Year);
DS1302_SetTime(DS1302_WEEK,STime.Week);
}
#endif
跪求单片机c51一个多功能时钟设计。要闹钟。调整时间、秒表、就行了。急求。。。C语言编写
//给你发一个数码管输出的可调节时钟的程序,DS1302.H在最后
#include at89x52.h
#include DS1302.h
//定义共阳极字型码0123456789-
unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char time[]={0,0,0,0,0,0,0,0};//用来储存时间
unsigned char date[]={0,0,0,0,0,0,0,0};//用来储存日期
SYSTEMTIME time1; //在ds1302.h文件中已经定义了一个名字为SYSTEMTIME的结构体,在这里我们定义一个变量名
//为time的SYSTEMTIME结构体
void delay(unsigned char i) //延时子程序
{
unsigned char j;
while((i--)!=0)
{
for(j=123;j0;j--);
}
}
unsigned char button_time(n,x,y) //时钟调整子程序
unsigned char n,x,y;
{
if(P1_7==0)
{
delay(50);
if(P1_7==0)
{
n++;
if(n==x)
n=0;
while(P1_7==0);
}
}
if(P1_5==0)
{
delay(50);
if(P1_5==0)
{
if(n==0)
n=y;
else
n--;
while(P1_5==0);
}
}
return n;
}
unsigned char button_date(n,x,y) //日期调整子程序
unsigned char n,x,y;
{
if(P1_7==0)
{
delay(50);
if(P1_7==0)
{
n++;
if(n==x)
n=1;
while(P1_7==0);
}
}
if(P1_5==0)
{
delay(50);
if(P1_5==0)
{
if(n==1)
n=y;
else
n--;
while(P1_5==0);
}
}
return n;
}
void display(second10,second1,minute10,minute1,hour10,hour1) //显示子程序
unsigned char second10,second1,minute10,minute1,hour10,hour1;
{
P2=0xfe;
P0=dispcode[second10];//显示秒的十位
delay(1);
P2=0xfd;
P0=dispcode[second1]; //显示秒的个位
delay(1);
P2=0xfb;
P0=dispcode[10]; //显示"-"
delay(1);
P2=0xf7;
P0=dispcode[minute10];//显示分的十位
delay(1);
P2=0xef;
P0=dispcode[minute1]; //显示分的个位
delay(1);
P2=0xdf;
P0=dispcode[10]; //显示"-"
delay(1);
P2=0xbf;
P0=dispcode[hour10]; //显示时的十位
delay(1);
P2=0x7f;
P0=dispcode[hour1]; //显示时的个位
delay(1);
}
void main()
{
unsigned char flag;
Initial_DS1302(); //初始化DS1302这个时钟芯片,
while(1)
{
DS1302_GetTime(time1); //读取时间参数
time[5]=(time1.Second)%10; //把秒的个位数据存入time[5]
time[4]=(time1.Second)/10; //把秒的十位数据存入time[4]
time[3]=(time1.Minute)%10; //把分的个位数据存入time[3]
time[2]=(time1.Minute)/10; //把分的十位数据存入time[2]
time[1]=(time1.Hour)%10; //把时的个位数据存入time[1]
time[0]=(time1.Hour)/10; //把时的十位数据存入time[0]
date[5]=(time1.Day)%10;
date[4]=(time1.Day)/10;
date[3]=(time1.Month)%10;
date[2]=(time1.Month)/10;
date[1]=(time1.Year)%10;
date[0]=(time1.Year)/10;
if(P1_4==0) //如果按下Time Start键一下,时钟开始正常显示时间,再按一下,显示日期
{
delay(50);
if(P1_4==0)
{
flag++;
if(flag1)
{
flag=0;
}
}
while(P1_4==0);
}
if(P1_6==0) //如果按下Time Set键一下,开始显示日期,再按一下进入日期跟时钟的调节模式
{
delay(50);
if(P1_6==0)
{
flag++;
if(flag7)
{
flag=0;
}
}
while(P1_6==0);
}
switch(flag)
{
case 0:display(time[0],time[1],time[2],time[3],time[4],time[5]); //调用子函数display,把存入数组time的数据给显示出来
break;
case 1:display(date[0],date[1],date[2],date[3],date[4],date[5]); //调用子函数display,把存入数组date的数据给显示出来
break;
case 2:time1.Year=button_date(time1.Year,100,99); //调整年
DS1302_SetTime(0x8c,time1.Year);
display(date[0],date[1],10,10,10,10);
break;
case 3:time1.Month=button_date(time1.Month,13,12); //调整月
DS1302_SetTime(0x88,time1.Month);
display(10,10,date[2],date[3],10,10);
break;
case 4:time1.Day=button_date(time1.Day,32,31); //调整日
DS1302_SetTime(0x86,time1.Day);
display(10,10,10,10,date[4],date[5]);
break;
case 5:time1.Hour=button_time(time1.Hour,24,23); //调整时
DS1302_SetTime(0x84,time1.Hour);
display(time[0],time[1],10,10,10,10);
break;
case 6:time1.Minute=button_time(time1.Minute,60,59); //调整分
DS1302_SetTime(0x82,time1.Minute);
display(10,10,time[2],time[3],10,10);
break;
case 7:time1.Second=button_time(time1.Second,60,59); //调整秒
DS1302_SetTime(0x80,time1.Second);
display(10,10,10,10,time[4],time[5]);
break;
}
}
}
//DS1302.H
#ifndef _REAL_TIMER_DS1302_2003_7_21_
#define _REAL_TIMER_DS1302_2003_7_21_
#include at89x52.h
sbit DS1302_CLK = P1^0; //实时时钟时钟线引脚
sbit DS1302_IO = P1^1; //实时时钟数据线引脚
sbit DS1302_RST = P1^2; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
typedef struct __SYSTEMTIME__
{
unsigned char Second;
unsigned char Minute;
unsigned char Hour;
unsigned char Week;
unsigned char Day;
unsigned char Month;
unsigned char Year;
unsigned char DateString[9];
unsigned char TimeString[9];
}SYSTEMTIME; //定义的时间类型
#define AM(X) X
#define PM(X) (X+12) // 转成24小时制
#define DS1302_SECOND 0x80 //秒寄存器
#define DS1302_MINUTE 0x82 //分寄存器
#define DS1302_HOUR 0x84
#define DS1302_WEEK 0x8A
#define DS1302_DAY 0x86
#define DS1302_MONTH 0x88
#define DS1302_YEAR 0x8C
#define DS1302_RAM(X) (0xC0+(X)*2) //用于计算 DS1302_RAM 地址的宏
void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
{
unsigned char i;
ACC = d;
for(i=8; i0; i--)
{
DS1302_IO = ACC0; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 0; //发一个高跳变到低的脉冲
ACC = ACC 1;
}
}
unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
{
unsigned char i;
for(i=8; i0; i--)
{
ACC = ACC 1; //相当于汇编中的 RRC
ACC7 = DS1302_IO;
DS1302_CLK = 1;
DS1302_CLK = 0; //发一个高跳变到低的脉冲
}
return(ACC);
}
void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
{
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(ucAddr); // 地址,命令
DS1302InputByte(ucDa); // 写1Byte数据
DS1302_CLK = 1;
DS1302_RST = 0; //RST 0-1-0,CLK 0-1
}
unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
{
unsigned char ucData;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1; //enable
DS1302InputByte(ucAddr|0x01); // 地址,命令
ucData = DS1302OutputByte(); // 读1Byte数据
DS1302_CLK = 1; //RST 0-1-0,CLK 0-1
DS1302_RST = 0;
return(ucData);
}
void DS1302_SetProtect(bit flag) //是否写保护
{
if(flag)
Write1302(0x8E,0x10); //WP=1,不能写入
else
Write1302(0x8E,0x00);//WP=0,可以写入
}
void DS1302_SetTime(unsigned char Address, unsigned char Value) // 设置时间函数
{
DS1302_SetProtect(0);
Write1302(Address, ((Value/10)4 | (Value%10))); //高4位为十位,低4位为个位
}
void DS1302_GetTime(SYSTEMTIME *Time)
{
unsigned char ReadValue;
ReadValue = Read1302(DS1302_SECOND);
Time-Second = ((ReadValue0x70)4)*10 + (ReadValue0x0F);//转换成10进制的秒
ReadValue = Read1302(DS1302_MINUTE);
Time-Minute = ((ReadValue0x70)4)*10 + (ReadValue0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time-Hour = ((ReadValue0x70)4)*10 + (ReadValue0x0F);
ReadValue = Read1302(DS1302_DAY);
Time-Day = ((ReadValue0x70)4)*10 + (ReadValue0x0F);
ReadValue = Read1302(DS1302_WEEK);
Time-Week = ((ReadValue0x70)4)*10 + (ReadValue0x0F);
ReadValue = Read1302(DS1302_MONTH);
Time-Month = ((ReadValue0x70)4)*10 + (ReadValue0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time-Year = ((ReadValue0xf0)4)*10 + (ReadValue0x0F);
}
/*
void DateToStr(SYSTEMTIME *Time)
{
Time-DateString[0] = Time-Year/10 + '0'; //数字类型转化为字符类型
Time-DateString[1] = Time-Year%10 + '0';
Time-DateString[2] = '-';
Time-DateString[3] = Time-Month/10 + '0';
Time-DateString[4] = Time-Month%10 + '0';
Time-DateString[5] = '-';
Time-DateString[6] = Time-Day/10 + '0';
Time-DateString[7] = Time-Day%10 + '0';
Time-DateString[8] = '\0';
}
void TimeToStr(SYSTEMTIME *Time)
{
Time-TimeString[0] = Time-Hour/10 + '0'; //数字类型转化为字符类型
Time-TimeString[1] = Time-Hour%10 + '0';
Time-TimeString[2] = ':';
Time-TimeString[3] = Time-Minute/10 + '0';
Time-TimeString[4] = Time-Minute%10 + '0';
Time-TimeString[5] = ':';
Time-TimeString[6] = Time-Second/10 + '0';
Time-TimeString[7] = Time-Second%10 + '0';
Time-DateString[8] = '\0';
}
*/
void Initial_DS1302(void)
{
unsigned char Second=Read1302(DS1302_SECOND);
if(Second0x80) //如果第七为1(表明没有启动), 则启动时钟
DS1302_SetTime(DS1302_SECOND,0);
}
/********************************************************************************
void BurstWrite1302(unsigned char *pWClock) //往DS1302写入时钟数据(多字节方式)
{
unsigned char i;
Write1302(0x8e,0x00); // 控制命令,WP=0,写操作?
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(0xbe); // 0xbe:时钟多字节写命令
for (i = 8; i0; i--) //8Byte = 7Byte 时钟数据 + 1Byte 控制
{
DS1302InputByte(*pWClock); // 写1Byte数据
pWClock++;
}
DS1302_CLK = 1;
DS1302_RST = 0;
}
void BurstRead1302(unsigned char *pRClock) //读取DS1302时钟数据(时钟多字节方式)
{
unsigned char i;
DS1302_RST = 0;
DS1302_CLK = 0;
DS1302_RST = 1;
DS1302InputByte(0xbf); // 0xbf:时钟多字节读命令
for (i=8; i0; i--)
{
*pRClock = DS1302OutputByte(); // 读1Byte数据
pRClock++;
}
DS1302_CLK = 1;
DS1302_RST = 0;
}
void DS1302_TimeStop(bit flag) // 是否将时钟停止
{
unsigned char Data;
Data=Read1302(DS1302_SECOND);
DS1302_SetProtect(0);
if(flag)
Write1302(DS1302_SECOND, Data|0x80);//停止
else
Write1302(DS1302_SECOND, Data0x7F);不停止
}
********************************************************************************/
#endif
单片机课程设计 设计制作一个24小时制多功能数字钟
额。。。。。这个东西就是零碎的东西加起来变成一个一个整体的啊,讲个思路,写个中断服务程序,里面的是led灯亮的程序,和1秒的计时程序,写个beep子程序控制蜂鸣器,写个display子程序,控制icl0809,主程序循环控制,显示数码管,显示am,过了12,进入中断,显示pm,这个其实很简单的,我才大三,单片机才学了四个星期,我都会做,相信你能行的。。。
关于单片机多功能数字钟设计程序和单片机数字时钟设计程序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。