采用外部时钟芯片DS1302,设计一个具有秒、分、日、月、年的数字时钟,采用四位一体数码管显示相关信息,秒、分显示一页,日、月显示一页,年显示一页。QQ 1282031855
下面的程序配合这个电路运行就是对的
这个是完整的程序,电路图如下
#include <reg52.h>
//定义共阳极字型码0123456789-
unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char time[]={0,0,0,0};//用来储存分秒
unsigned char date[]={0,0,0,0};//用来储存日时
unsigned char year[]={0,0,0,0};//用来储存年月
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; //定义的时间类型
SYSTEMTIME time1;
sbit DS1302_CLK = P1^6; //实时时钟时钟线引脚
sbit DS1302_IO = P1^7; //实时时钟数据线引脚
sbit DS1302_RST = P1^5; //实时时钟复位线引脚
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
//#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; i>0; i--)
{
DS1302_IO = ACC0; //相当于汇编中的 RRC
DS1302_CLK = 1;
DS1302_CLK = 0; //发一个高跳变到低的脉冲
ACC = ACC >> 1;
}
}
unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
{
unsigned char i;
for(i=8; i>0; 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 = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//转换成10进制的秒
ReadValue = Read1302(DS1302_MINUTE);
Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_HOUR);
Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_DAY);
Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_WEEK);
Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_MONTH);
Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = Read1302(DS1302_YEAR);
Time->Year = ((ReadValue&0xf0)>>4)*10 + (ReadValue&0x0F);
}
void Initial_DS1302(void)
{
unsigned char Second=Read1302(DS1302_SECOND);
if(Second&0x80) //如果第七为1(表明没有启动), 则启动时钟
DS1302_SetTime(DS1302_SECOND,0);
}
void delay(unsigned char i) //延时子程序
{
unsigned char j;
while((i--)!=0)
{
for(j=625;j>0;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^1==0)
{
delay(50);
if(P1^1==0)
{
if(n==0)
n=y;
else
n--;
while(P1^1==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^1==0)
{
delay(50);
if(P1^1==0)
{
if(n==1)
n=y;
else
n--;
while(P1^1==0);
}
}
return n;
}*/
void display1(minute10,minute1,second10,second1) //显示第一页 分秒 子程序
//unsigned char second10,second1,minute10,minute1;
{
P2=0x08;
P0=dispcode[second1];//显示秒的个位
delay(1);
P2=0x04;
P0=dispcode[second10]; //显示秒的十位
delay(1);
P2=0x02;
P0=dispcode[minute1]; //显示分的个位
delay(1);
P2=0x01;
P0=dispcode[minute10];//显示分的十位
delay(1);
}
void display2(data10,data1,hour10,hour1) //显示第二页 天时 子程序
//unsigned char data10,data1,hour10,hour1;
{
P2=0xf8;
P0=dispcode[data1];//显示天的个位
delay(1);
P2=0xf4;
P0=dispcode[data10]; //显示天的十位
delay(1);
P2=0xf2;
P0=dispcode[hour1]; //显示时的个位
delay(1);
P2=0xf1;
P0=dispcode[hour10];//显示时的十位
delay(1);
}
void display3(year10,year1,month10,month1) //显示第三页 年月 子程序
//unsigned char year10,year1,month10,month1;
{
P2=0xf2;
P0=dispcode[month1];//显示月的个位
delay(1);
P2=0xf1;
P0=dispcode[month10]; //显示月的十位
delay(1);
P2=0xf8;
P0=dispcode[year1]; //显示月的个位
delay(1);
P2=0xf4;
P0=dispcode[year10];//显示月的十位
delay(1);
}
void main()
{
unsigned char flag=0;
Initial_DS1302(); //初始化DS1302这个时钟芯片,
P10=0; //点亮测试灯
while(1)
{
DS1302_GetTime(&time1); //读取时间参数
time[3]=(time1.Second)%10; //把秒的个位数据存入time[3]
time[2]=(time1.Second)/10; //把秒的十位数据存入time[2]
time[1]=(time1.Minute)%10; //把分的个位数据存入time[1]
time[0]=(time1.Minute)/10; //把分的十位数据存入time[0]
date[3]=(time1.Day)%10;
date[2]=(time1.Day)/10;
date[1]=(time1.Hour)%10;
date[0]=(time1.Hour)/10;
year[3]=(time1.Year)%10;
year[2]=(time1.Year)/10;
year[1]=(time1.Month)%10;
year[0]=(time1.Month)/10;
// display1(time[0],time[1],time[2],time[3]);
if(P11==0)
{
delay(50);
if(P11==0)
{
flag++;
if(flag>2)//flag: 1 显示第二页 日 时;2 显示第三页 年 月 0:显示第一页 分秒
{
flag=0;
}
}
while(P11==0);
}
/*if(P1^6==0) //如果按下Time Set键一下,开始显示日期,再按一下进入日期跟时钟的调节模式
{
delay(50);
if(P1^6==0)
{
flag++;
if(flag>6)
{
flag=0;
}
}
while(P1^6==0);
}*/
switch(flag)
{
case 0:display1(time[0],time[1],time[2],time[3]); //调用子函数display,把存入数组time的数据给显示出来
break;
case 1:display2(date[0],date[1],date[2],date[3]); //调用子函数display,把存入数组date的数据给显示出来
break;
case 2:display3(year[0],year[1],year[2],year[3]);
break;
/* case 3:time1.Month=button_date(time1.Month,13,12); //调整月
DS1302_SetTime(0x88,time1.Month);
display(10,10,date[2],date[3]);
break;
case 4:time1.Day=button_date(time1.Day,32,31); //调整日
DS1302_SetTime(0x86,time1.Day);
display(10,10,date[4],date[5]);
break;
case 5:time1.Minute=button_time(time1.Minute,60,59); //调整分
DS1302_SetTime(0x82,time1.Minute);
display(time[2],time[3],10,10);
break;
case 6:time1.Second=button_time(time1.Second,60,59); //调整秒
DS1302_SetTime(0x80,time1.Second);
display(10,10,time[4],time[5]);
break;*/
}
}
}
求一个数字电路简单的课程设计,最简易的电子钟的电路图
1、计数器的灵活应用 通过门电路组合逻辑控制计数器的清零、置位或装载,将计数器设置为不同的进制。2、7段码译码器的使用 3、数码管显示 数字电路设计的数字钟,由于每个数位均有单独的计数器输出,一般采用直接驱动,不用扫描电路,有兴趣的可以挑战这种情况下的扫描驱动。详细设计请在百度文库搜索“...
【选题推荐】单片机设计毕业论文精选164例
基于IAP15W4K58S4单片机的智能小车设计 基于stc89c52单片机的超声波测速 基于STC89C52单片机的门禁锁设计 基于STC单片机的多功能电子钟的设计 基于两个单片机串行通信的电子密码锁 基于单片机三路口红绿灯设计 基于单片机控制的GSM短信模块家庭防盗报警系统 基于单片机控制的交通灯设计资料 基于单片机控制的开关电源...
电子信息工程毕业论文
824. 基于AT89C51的电话远程控制系统 825. 数字电子秤的设计 826. 基于单片机的数字电子钟设计 827. 湿度传感器在农作物生长环境参数监测仪中的应用 828. 基于单片机的数字频率计的设计 829. 简易数控直流稳压源的设计 830. 基于凌阳单片机的语音实时采集系统设计 831. 简单语音识别算法研究 832. 基于数字温度计的多...
机械电子工程的专科毕业论文,最好是自己写的!
四位密码电子锁的设计 旋转LED屏的制作 基于PC机的LCD实时显示控制系统设计(pc机部份)基于PC机的LCD实时显示控制系统设计(单片机部份)ICL7135的串行采集方式在单片机电压表中的应用 用89C51和8254-2实现步进式PWM输出 桌面行走智能小车 双音频电话信息传输系统 车库控制管理系统(基于PC机)车库控制系统车位...
求大专机电专业毕业论文的题目,谢谢
33. 基于单片机的脉象信号采集系统设计 34. 基于单片机的简易智能小车设计 35. 基于FPGA的18路智力竞赛电子抢答器设计 36. 基于EDA技术的智力竞赛抢答器的设计 37. 基于EDA技术的数字电子钟设计 38. 基于EDA的计算器的设计 39. 基于DDS的频率特性测试仪设计 40. 基于CPLD直流电机控制系统的设计 41. 单色显示屏...
关于D类放大器的毕业论文
465. 数字电路数字钟设计 466. 电力行业中宏观调控的措施及能源开发利用的危机 467. 基于单片机对氧气浓度检测控制系统 468. 基于PIC16F74单片机串行通信中继控制器 469. 火灾自动报警系统 470. 基于单片机的电子时钟控制系统 471. 基于单片机的波形发生器设计 472. 智能毫伏表的设计 473. 微机型高压电网继电保护...
单片机课程设计:交通灯控制!
15.仓库温湿度的监测系统 16.基于单片机的电子密码锁 17.单片机控制交通灯系统设计 18.基于DSP的IIR数字低通滤波器的设计与实现 19.智能抢答器设计 20.基于LabVIEW的PC机与单片机串口通信 21.DSP设计的IIR数字高通滤波器 22.单片机数字钟设计 23.自动起闭光控窗帘毕业设计论文 24.三容液位远程测控系统毕业论文 25....