1302六位数字钟实验报告 六位数字钟电路原理

专业目录 2025-01-04 10:23:14

用51单片机 ds1302 液晶显示isd1420完成多功能数字钟的论文

//DS1302读写程序

1302六位数字钟实验报告 六位数字钟电路原理1302六位数字钟实验报告 六位数字钟电路原理


1302六位数字钟实验报告 六位数字钟电路原理


1302六位数字钟实验报告 六位数字钟电路原理


void w(uchar u) //写入1位字节

{uchar i;

ACC = u;

for(i=8; i>0; i--)

{IO = ACC0;

CLK = 1;

CLK = 0;

ACC = ACC >> 1;

}}

uchar r(void) //读出1位字节

{uchar i;

for(i=8; i>0; i--)

{ACC = ACC >>1;

ACC7 = IO;

CLK = 1;

CLK = 0;

}return(ACC);

}void W1302(uchar ucAddr, uchar ucDa)

{RST = 0;

CLK = 0;

RST = 1;

w(ucAddr); // 地址,命令

w(ucDa); //写1Byte数据

CLK = 1;

RST = 0;

}void wclock(uchar p) //写入时钟多字节数据

{uchar i;

// W1302(0x80,0x00); //停止时钟

W1302(0x8e,0x00); // 允许写

RST=0;

CLK=0;

RST=1;

w(0xbe); //写多字节命令

for(i=8;i>0;i--)

{w(p); //按数组指针逐个写入,写入数据在主函数调用时指向b数组

p++;

}W1302(0x00,0x50); //启动定时器

CLK=1;

RST=0;

}void rclock(uchar p) //读出时钟多字节数据

{uchar i;

RST=0;

CLK=0;

RST=1;

w(0xbf);

for(i=7;i>0;i--)

{p=r();

p++;

}CLK=1;

RST=0;

}DS1302读写程序,供参考 以下定义口

it CLK=P2^3;

it IO=P2^4;

it RST=P2^5;

it ACC7=ACC^7;

it ACC0=ACC^0;

我用DS1302+LCD1602+单片机制作的的电子钟,可以显示,但是时间不会走,而且显示出来的是乱的

时间不走,一般是1302接的晶振未起振。

如果程序没错的话,出现乱码一般是接触不良,可以拿起来紧一下再试试,用洞洞板做电路很容易出现这个问题。

这说明你的读取时序是错的,你调整下你的延时或者读取时序可以了。

我以前也做过,当时的问题是51复位电路没接好,所以每次都要上电后复位一次。

如果你不是的话,估计就是读值没读出来。或者你的代表时间标量没有设置成全局变量。

编写程序,采用51单片机驱动6个LED数码管、DS1302实现数字钟功能。

#include

#include

unsigned char data dis_digit;

unsigned char key_s, key_v;

unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3

0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off

unsigned char data dis_buf[8];

unsigned char data dis_index;

unsigned char hour,min,sec;

unsigned char sec100;

it K1 = P1^0;

it K2 = P1^1;

//it JJ=P2^0;

bit scan_key();

void proc_key();

void inc_sec();

void inc_min();

void inc_hour();

void display();

void delayms(unsigned char ms);

void main(void)

{P0 = 0xff;

P3 = 0xff;

TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式

TH1 = 0xdc;

TL1 = 0;

TH0 = 0xFC;

TL0 = 0x17;

hour = 12;

min = 00;

sec = 00;

sec100 = 0;

dis_buf[0] = dis_code[hour / 10]; // 时十位

dis_buf[1] = dis_code[hour % 10]; // 时个位

dis_buf[3] = dis_code[min / 10]; // 分十位

dis_buf[4] = dis_code[min % 10]; // 分个位

dis_buf[6] = dis_code[sec / 10]; // 秒十位

dis_buf[7] = dis_code[sec % 10]; // 秒个位

dis_buf[2] = 0xbf; // 显示"-"

dis_buf[5] = 0xbf; // 显示"-"

dis_digit = 0xfe;

dis_index = 0;

TCON = 0x01;

IE = 0x8a; // 使能timer0,1 中断

TR0 = 1;

TR1 = 1;

key_v = 0x03;

while(1)

{if(scan_key())

{delayms(10);

if(scan_key())

{key_v = key_s;

proc_key();

}}

}}

bit scan_key()

{key_s = 0x00;

key_s |= K2;

key_s <<= 1;

key_s |= K1;

return(key_s ^ key_v);

}void proc_key()

{EA = 0;

if((key_v & 0x01) == 0) // K1

{inc_hour();

// JJ=1;

}else if((key_v & 0x02) == 0) // K2

{min++;

// JJ=0;

if(min > 59)

{min = 0;

}dis_buf[3] = dis_code[min / 10]; // 分十位

dis_buf[4] = dis_code[min % 10]; // 分个位

}EA = 1;

}void timer0() interrupt 1

// 定时器0中断服务程序, 用于数码管的动态扫描

// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量

// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,

// 选通P2.0口数码管

// dis_buf --- 显于缓冲区基地址

{TH0 = 0xFC;

TL0 = 0x17;

P3 = 0xff; // 先关闭所有数码管

P0 = dis_buf[dis_index]; // 显示代码传送到P0口

P3 = dis_digit; //

dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管

dis_index++; //

dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到个开始下一次扫描

}void timer1() interrupt 3

{TH1 = 0xdc;

sec100++;

if(sec100 >= 100)

{sec100 = 0;

inc_sec();

}}

void inc_sec()

{sec++;

if(sec > 59)

{sec = 0;

inc_min();

}dis_buf[6] = dis_code[sec / 10]; // 秒十位

dis_buf[7] = dis_code[sec % 10]; // 秒个位

}void inc_min()

{min++;

if(min > 59)

{min = 0;

inc_hour();

}dis_buf[3] = dis_code[min / 10]; // 分十位

dis_buf[4] = dis_code[min % 10]; // 分个位

}void inc_hour()

{hour++;

if(hour > 23)

{hour = 0;

}if(hour > 9)

dis_buf[0] = dis_code[hour / 10]; // 时十位

else

dis_buf[0] = 0xff; // 当小时的十位为0时不显示

dis_buf[1] = dis_code[hour % 10]; // 时个位

}void delayms(unsigned char ms)

// 延时子程序

{unsigned char i;

while(ms--)

{for(i = 0; i < 120; i++);

}}

单片机数字钟毕业中期检查表中的一个问题

电子钟相关毕业设计

·数字电子钟的电路设计 (字数:9242,页数:22 )·数字电子钟的设计与制作 (字数:8017,页数:22 )·数字钟的设计 (字数:6208,页数:21 )·基于8051单片机的数字钟 (字数:21638,页数:50)·基于单片机的电子时钟控制系统 (字数:7935,页数:42 )·数字电路数字钟设计 (字数:4846,页数:21 )·电子闹钟设计 (字数:4094,页数:19 )·定时闹钟设计 (字数:5714,页数:24 )·智能定时闹钟设计 (字数:3826,页数:18 )·下棋定时钟设计 (字数:5290,页数:24 )·多功能数字钟设计与制作 (字数:13129,页数:34)·基于单片机的电子钟设计 (字数:7710,页数:24 )·基于单片机的数字电子钟设计 (字数:10301,页数:42)·基于Labview的虚拟数字钟设计 (字数:17457,页数:32)·电子日历钟 (字数:10677,页数:33)·数字钟的设计与制作 (字数:4922,页数:23 )·单片机数字钟设计 (字数:15355,页数:47)·基于单片机的数字钟设计 (字数:12541,页数:27)·单片机定时闹钟设计 (字数:8450,页数:24 )·万年历可编程电子钟控电铃 (字数:14371.页数:41)·数字定时闹钟设计 (字数:7770,页数:28 )·基于EDA技术的数字电子钟设计 (字数:12247,页数:32)·多功能时钟打点系统设计 (字数:8353,页数:31 )·智能音乐闹钟设计 (字数:10002,页数:37)·基于AT89S51单片机的数字电子钟设计 (字数:14560,页数:39)

这个肯定是你怎么想的,怎么写的就怎么来呗,这还要问人呀

ds1302单片机实现数字钟秒表/时钟转换功能

我的是1602显示的,很容易改成数码管的,给你参考一下。

#include

#include

#define uchar unsigned char

#define uint unsigned int

it lcrs=P2^2;//数据/命令

it lcwr=P2^1;//读/写

it lcden=P2^0;//使能

it SCLK = P2^5;//DS1302时钟口P1.0

it IO = P2^4; //DS1302数据口P1.1

it RS = P2^3; //DS1302片选口P1.2

it key1=P4^4;

it key2=P4^5;

it key3=P4^1;

it key4=P4^6;

//秒 分 时 日 月 星期 年

uchar init[] = {0x45, 0x40, 0x20, 0x018, 0x04, 0x03, 0x12};

uchar now[7];

uchar code table[]={48,49,50,51,52,53,54,55,56,57};

uchar dis[16];

uchar H;//定义小时

uchar Mi;//定义分钟

uchar S;//定义秒

uchar Y;//定义年

uchar Mo;//定义月

uchar D;//定义日期

uchar W;//定义星期

uchar key=0;

uchar bcdto(uchar temp);

void delayms(uint ms);

void DS1302_Initial();

void DS1302_SetTime(uchar p);

void DS1302_GetTime(uchar p);

////////////////////// 延时子程序/////////////////////////////

void delayms(uint ms) //在11.0592M晶振下,单周期指令的ms级延时

{uint i;

while(ms--)

{for(i = 0; i < 850; i++);

}}

//////1062/////////

void ydelay(uchar x)

{uint a,b;

for(a=x;a>0;a--)

for(b=10;b>0;b--);

}void write_com(uchar com)

{P0=com;

lcwr=0;

lcrs=0;

lcden=0;

ydelay(20);

lcden=1;

ydelay(20);

lcden=0;

lcwr=1;

}void write_date(uchar date)//写数据

{P0=date;

lcwr=0;

lcrs=1;

lcden=0;

ydelay(20);

lcden=1;

ydelay(20);

lcden=0;

lcwr=1;

}void init1602()//初始化

{write_com(0x38);//设置显示模式

ydelay(40);

write_com(0x0c);//开显示

ydelay(40);

write_com(0x06);//指针和光标自动加一

ydelay(40);

write_com(0x01);//清屏指令

ydelay(40);

}void display(uchar a)//显示

{uint i;

dis[0]='2';dis[1]='0';dis[2]=table[Y/10];dis[3]=table[Y%10];

dis[4]='.';dis[5]=table[Mo/10];dis[6]=table[Mo%10];

dis[7]='.';dis[8]=table[D/10];dis[9]=table[D%10];dis[10]=' ';

dis[11]='W';dis[12]='e';dis[13]='e';dis[14]=' ';

dis[15]=table[W%10];

if(a==3)

{dis[2]=' ';dis[3]=' ';}

else if(a==4)

{dis[5]=' ';dis[6]=' ';}

else if(a==5)

{dis[8]=' ';dis[9]=' ';}

else if(a==6)

{dis[15]=' ';}

write_com(0x0c);

write_com(0xc0);

for(i=0;i<16;i++)

write_date(dis[i]);

dis[0]=table[H/10];dis[1]=table[H%10];dis[2]=':';

dis[3]=table[Mi/10]; dis[4]=table[Mi%10];dis[5]=':';

dis[6]=table[S/10];dis[7]=table[S%10];dis[8]=' ';

if(a==1)

{dis[0]=' ';dis[1]=' ';

}else if(a==2)

{dis[3]=' ';dis[4]=' ';}

write_com(0x80+4);

for(i=0;i<9;i++)

write_date(dis[i]);

}uchar tobcd(uchar temp)//十进制转换成BCD码

{uchar a,b,c;

a=temp;

b=0;

if(a>=10)

{while(a>=10)

{a=a-10;

b=b+16;

c=a+b;

temp=c;

}}

return temp;

}uchar bcdto(uchar temp)//BCD码转换成十进制

{uchar a,b,c;

a=temp;

b=0;

if(a>=16)

{while(a>=16)

{a=a-16;

b=b+10;

c=a+b;

temp=c;

}}

return temp;

}void keyf(uchar num,uchar up,uchar du)

{uint z;

if(key2==0)

{delayms(10);

if(key2==0)

{if(num>=up)

{if((key==4)||(key==5)||(key==6))

num=1;

else

num=0;

}else

num=num+1;

for(z=0;z<50;z++)

{display(0);

if(key2!=0)

break;

}while(!key2)

{for(z=0;z<25;z++)

{display(0);}

if(num>=up)

{if((key==4)||(key==5)||(key==6))

num=1;

else

num=0;

}else

num=num+1;

}}

}if(key3==0)

{delayms(10);

if(key3==0)

{if(num==du)

{if(key==1)

num=23;

else if(key==2)

num=59;

else if(key==3)

num=99;

else if(key==4)

num=12;

else if(key==5)

num=31;

else if(key==6)

num=7;

}else

num=num-1;

for(z=0;z<50;z++)

{display(0);

if(key3!=0)

break;

}while(!key3)

{for(z=0;z<25;z++)

{display(0);}

if(num==du)

{if(key==1)

num=23;

else if(key==2)

num=59;

else if(key==3)

num=99;

else if(key==4)

num=12;

else if(key==5)

num=31;

else if(key==6)

num=7;

}else

num=num-1;

}}

}}

void keyjc()

{uint i,j;

if(key1==0)

delayms(10);

if(key1==0)

{key++;

if(key>=7)

{key=0;

display(0);

}while(!key1);

if(key==1)

{for(i=0;i<25;i++)

{for(j=0;j<25;j++)

display(1);

for(j=0;j<25;j++)

display(0);

if((key2==0)||(key3==0))

{delayms(10);

if((key2==0)||(key3==0))

{i=0;

keyf(&H,23,0);

}}

if(key1==0)

{delayms(10);

if(key1==0)

{key=2;

while(!key1);

break;

}}

}}

if(key==2)

{for(i=0;i<25;i++)

{for(j=0;j<25;j++)

display(2);

for(j=0;j<25;j++)

display(0);

if((key2==0)||(key3==0))

{delayms(10);

if((key2==0)||(key3==0))

{i=0;

keyf(&Mi,59,0);

}}

if(key1==0)

{delayms(10);

if(key1==0)

{key=3;

while(!key1);

break;

}}

}}

if(key==3)

{for(i=0;i<25;i++)

{for(j=0;j<25;j++)

display(3);

for(j=0;j<25;j++)

display(0);

if((key2==0)||(key3==0))

{delayms(10);

if((key2==0)||(key3==0))

{i=0;

keyf(&Y,99,0);

}}

if(key1==0)

{delayms(10);

if(key1==0)

{key=4;

while(!key1);

break;

}}

}}

if(key==4)

{for(i=0;i<25;i++)

{for(j=0;j<25;j++)

display(4);

for(j=0;j<25;j++)

display(0);

if((key2==0)||(key3==0))

{delayms(10);

if((key2==0)||(key3==0))

{i=0;

keyf(&Mo,12,1);

}}

if(key1==0)

{delayms(10);

if(key1==0)

{key=5;

while(!key1);

break;

}}

}}

if(key==5)

{for(i=0;i<25;i++)

{for(j=0;j<25;j++)

display(5);

for(j=0;j<25;j++)

display(0);

if((key2==0)||(key3==0))

{delayms(10);

if((key2==0)||(key3==0))

{i=0;

keyf(&D,31,1);

}}

if(key1==0)

{delayms(10);

if(key1==0)

{key=6;

while(!key1);

break;

}}

}}

if(key==6)

{for(i=0;i<25;i++)

{for(j=0;j<25;j++)

display(6);

for(j=0;j<25;j++)

display(0);

if((key2==0)||(key3==0))

{delayms(10);

if((key2==0)||(key3==0))

{i=0;

keyf(&W,7,1);

}}

if(key1==0)

{delayms(10);

if(key1==0)

{key=0;

while(!key1);

break;

}}

}}

init[0]=tobcd(S);

init[1]=tobcd(Mi);

init[2]=tobcd(H);

init[3]=tobcd(D);

init[4]=tobcd(Mo);

init[5]=tobcd(W);

init[6]=tobcd(Y);

DS1302_SetTime(init);

key=0;

}}

void main()

{init1602();

DS1302_Initial(); //初始化DS1302

P4SW=0x70;

while (1)

{delayms(10);

DS1302_GetTime(now);//读取当前时间

Y=bcdto(now[6]);

Mo=bcdto(now[4]);

D=bcdto(now[3]);

W=bcdto(now[5]);

if(W==7)

W=8;

H=bcdto(now[2]);

Mi=bcdto(now[1]);

S=bcdto(now[0]);

display(0);

keyjc();

}}

/

延时X微秒(STC12C5A60S2@12M)

不同的工作环境,需要调整此函数

此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同

/

void Delay()

{_nop_();

_nop_();

}/

从DS1302读1字节数据

/

uchar DS1302_ReadByte()

{uchar i;

uchar dat = 0;

for (i=0; i<8; i++) //8位计数器

{SCLK = 0; //时钟线拉低

Delay(); //延时等待

dat >>= 1; //数据右移一位

if (IO) dat |= 0x80; //读取数据

SCLK = 1; //时钟线拉高

Delay(); //延时等待

}return dat;

}/

向DS1302写1字节数据

/

void DS1302_WriteByte(uchar dat)

{char i;

for (i=0; i<8; i++) //8位计数器

{SCLK = 0; //时钟线拉低

Delay(); //延时等待

dat >>= 1; //移出数据

IO = CY; //送出到端口

SCLK = 1; //时钟线拉高

Delay(); //延时等待

}}

/

读DS1302某地址的的数据

/

uchar DS1302_ReadData(uchar addr)

{uchar dat;

RS = 0;

Delay();

SCLK = 0;

Delay();

RS = 1;

Delay();

DS1302_WriteByte(addr); //写地址

dat = DS1302_ReadByte(); //读数据

SCLK = 1;

RS = 0;

return dat;

}/

往DS1302的某个地址写入数据

/

void DS1302_WriteData(uchar addr, uchar dat)

{RS = 0;

Delay();

SCLK = 0;

Delay();

RS = 1;

Delay();

DS1302_WriteByte(addr); //写地址

DS1302_WriteByte(dat); //写数据

SCLK = 1;

RS = 0;

}/

写入初始时间

/

void DS1302_SetTime(uchar p)

{uchar addr = 0x80;

uchar n = 7;

DS1302_WriteData(0x8e, 0x00); //允许写作

while (n--)

{DS1302_WriteData(addr, p++);

addr += 2;

}DS1302_WriteData(0x8e, 0x80); //写保护

}/

读取当前时间

/

void DS1302_GetTime(uchar p)

{uchar addr = 0x81;

uchar n = 7;

while (n--)

{p++ = DS1302_ReadData(addr);

addr += 2;

}}

/

初始化DS1302

/

void DS1302_Initial()

{RS = 0;

SCLK = 0;

DS1302_WriteData(0x8e, 0x00);

DS1302_WriteData(0x80, 0x00);

DS1302_WriteData(0x90, 0xaa);

DS1302_WriteData(0x8e, 0x80);

}

利用单片机DS1302芯片编制数字时钟程序:从今天开始到2100之前的秒,分,时,星期,月和年的能力。能自动

用Protues仿真的,看不清可以留个邮箱,我把整体发给你

#include

#define uchar unsigned char

#define uint unsigned int

it rs=P2^0; //数据、命令选择端

it lcden=P2^2; // 使能信号

it lcdew=P2^1; // 读写选择端

it s1=P1^5; //功能键设定

it s2=P1^6; // 增大键设定

it s3=P1^7; // 减小键设定

it beep=P3^3; // 蜂鸣器设定 /

it RST=P1^2; //ds1302 设定

it SCLK=P1^0;

it IO=P1^1;

it ACC0 = ACC^0;

it ACC7 = ACC^7;

uchar num[8],enter,shi,fen,miao,nian,yue,ri,week,shi1,fen1,flag1=0,flag2=0,flag3,cho,

time[]="20XX-XX-XX XXX ", //年月日字符数组

time1[]=" xx:xx:xx ", //时分秒字符数组

time3[]="@ NO 00:00:00"; //闹钟设定时显示的时间数组

void delay(uint z) //1ms延时函数

{uint x,y;

for(x=z;x>0;x--)

for(y=1;y>0;y--);

}void di() //蜂鸣设定函数

{beep=0;

delay(800);

beep=1;

}uchar read(uchar x) //读ds1302数据

{uchar i;

RST=0;

SCLK=0;

RST=1;

ACC=(x|0x01);

for(i=8;i>0;i--)

{IO=ACC0;

SCLK=1;

SCLK=0;

ACC=ACC>>1;

}for(i=8;i>0;i--)

{ACC=ACC>>1;

ACC7=IO;

SCLK=1;

SCLK=0;

}SCLK=1;

RST=0;

return ACC;

}void write (uchar addr,uchar dat) //向ds1302写数据

{uchar i;

RST=0;

SCLK=0;

RST=1;

ACC=addr;

for(i=8;i>0;i--)

{IO=ACC0;

SCLK=1;

SCLK=0;

ACC=ACC>>1;

}ACC=dat;

for(i=8;i>0;i--)

{IO=ACC0;

SCLK=1;

SCLK=0;

ACC=ACC>>1;

}SCLK=1;

RST=0;

}void getnum() //接收ds1302的数据

{uchar j;

for(j=0;j<7;j++)

{num[j]=read(0x80+0x02j);

}time[2]=((num[6]&0x70)>>4)+'0';//年

time[3]=(num[6]&0x0f)+'0'; nian=((num[6]&0x70)>>4)10+(num[6]&0x0f);

time[5]=((num[4]&0x70)>>4)+'0';//yue

time[6]=(num[4]&0x0f)+'0'; yue=((num[4]&0x70)>>4)10+(num[4]&0x0f);

time[8]=((num[3]&0x70)>>4)+'0';//ri

time[9]=(num[3]&0x0f)+'0'; ri=((num[3]&0x70)>>4)10+(num[3]&0x0f);

time[13]=(num[5]&0x0f)+'0';//week

week=(num[5]&0x0f);

switch(time[13]) //星期字符数组赋值

{case '1': time[12]='S'; time[13]='u'; time[14]='n';

break;

case '2': time[12]='M'; time[13]='o'; time[14]='n';

break;

case '3': time[12]='T'; time[13]='u'; time[14]='e';

break;

case '4': time[12]='W'; time[13]='e'; time[14]='d';

break;

case '5': time[12]='T'; time[13]='h'; time[14]='u';

break;

case '6': time[12]='F'; time[13]='r'; time[14]='i';

break;

case '7': time[12]='S'; time[13]='a'; time[14]='t';

break;

}time1[5]=((num[2]&0x70)>>4)+'0'; //shi

time1[6]=(num[2]&0x0f)+'0'; shi=((num[2]&0x70)>>4)10+(num[2]&0x0f);

time1[8]=((num[1]&0x70)>>4)+'0'; //fen

time1[9]=(num[1]&0x0f)+'0'; fen=((num[1]&0x70)>>4)10+(num[1]&0x0f);

time1[11]=((num[0]&0x70)>>4)+'0'; //miao

time1[12]=(num[0]&0x0f)+'0'; miao=((num[0]&0x70)>>4)10+(num[0]&0x0f);

}void write_com(uchar com) //写入lcd显示方式

{rs=0;

P0=com;

delay(1);

lcden=1;

delay(1);

lcden=0;

}void write_data(uchar date) //向lcd1602写入数据

{rs=1;

P0=date;

delay(1);

lcden=1;

delay(1);

lcden=0;

}void display() //显示数据

{uchar i;

write_com(0x0c); //显示方式设定为:无光标,且不闪烁

if(flag2==1)

time1[0]='@'; //闹钟图标设定

else

time1[0]=' ';

if(flag1==0) //flag为0时正常显示年、月、日、时、分、秒等

{write_com(0x80);

for(i=0;time[i]!='0';i++)

{write_data(time[i]);

}write_com(0xc0);

for(i=0;time1[i]!='0';i++)

{write_data(time1[i]);

}}

if(flag1==1) //flag为1时进入时间设定界面

{time3[8]=fen1/10+'0'; time3[9]=fen1%10+'0';

time3[5]=shi1/10+'0';time3[6]=shi1%10+'0';

if(cho==0)

{time3[2]='N';time3[3]='O';

}if(cho==1)

{time3[2]='O'; time3[3]='K';

}write_com(0xc0);

for(i=0;time3[i]!='0';i++)

{write_data(time3[i]);

}} }

void keyscan() // 扫描键盘

{getnum();

if(s1==0) //功能键被按下 write_com(0x0c);

{delay(10);

if(s1==0)

{enter++; //记录摁下次数

if(flag1==1&&enter==6)

enter=2;

if(flag1==0&&enter==9)

enter=0;

while(s1==0); di(); //按键放下时响一下

}}

switch(enter)

{case 0: write_com(0x0c); break;

case 1: write_com(0xcc); write_com(0x0e); delay(7); //按秒 时 有光标

break;

case 2: write_com(0xc9); write_com(0x0e); delay(7); //分

break;

case 3: write_com(0xc6); write_com(0x0e); delay(7); //时

break;

case 4: if(flag1==0)

{write_com(0x8e); write_com(0x0e); delay(7); //星期

}if(flag1==1)

{write_com(0xc3); write_com(0x0e); delay(7); //NO、OK选项闪烁

}break;

case 5: if(flag1==0)

{write_com(0x89); write_com(0x0e); delay(7); //日闪烁

}if(flag1==1)

{write_com(0xc0); write_com(0x0e); delay(7); //时钟标志闪烁

}break;

case 6: write_com(0x86); write_com(0x0e); delay(7); //月

break;

case 7: write_com(0x83); write_com(0x0e); delay(7); //年

break;

case 8: write_com(0x0c);write_com(0xc0); write_data('@');

if(flag1==0) write_com(0xc0);

else write_com(0xc9); write_com(0x0e); delay(7); //闹钟

break;

}if(enter!=0&&s2==0)

{delay(10);

if(enter!=0&&s2==0)

{switch(enter)

{case 1: miao++; if(miao==60) miao=0;

write(0x80,(miao/100x10+miao%10)); //秒

break;

case 2: if(flag1==0)

{fen++; if(fen==60) fen=0;

write(0x82,((fen/10)0x10+fen%10)); //分

}if(flag1==1)

{fen1++; if(fen1==60) fen1=0;

}break;

case 3: if(flag1==0)

{shi++; if(shi==24) shi=0;

write(0x84,(shi/100x10+shi%10)); //时

}if(flag1==1)

{shi1++; if(shi1==24) shi1=0;

}break;

case 4: if(flag1==0)

{week++; if(week==8) week=1;

write(0x8a,(week/100x10+week%10)); //星期

}if(flag1==1)

{cho++; if(cho==2) cho=0;

}break;

case 5: if(flag1==0)

{ri++; if(ri==32) ri=1;

write(0x86,(ri/100x10+ri%10)); //日

}if(flag1==1)

{if(cho==0) flag2=0;

if(cho==1) flag2=1;

enter=0; flag1=0;

}break;

case 6: yue++; if(yue==13) yue=1;

write(0x88,(yue/100x10+yue%10)); //月

break;

case 7: nian++; if(nian==99)nian=0;

write(0x8c,(nian/100x10+nian%10)); //年

break;

case 8: flag1=1; enter=2;display(); break; //进入闹钟设置界面

}while(s2==0); di(); //按键放下时响一下

}}

if(enter!=0&&s3==0)

{delay(10);

if(enter!=0&&s3==0)

{switch(enter)

{case 1: miao--; if(miao==-1) miao=59;

write(0x80,(miao/100x10+miao%10)); //秒

break;

case 2:if(flag1==0)

{fen--; if(fen==-1) fen=59;

write(0x82,((fen/10)0x10+fen%10)); //分

}if(flag1==1)

{fen1--; if(fen1==-1) fen1=59;

}break;

case 3: if(flag1==0)

{shi--; if(shi==-1) shi=23;

write(0x84,(shi/100x10+shi%10)); //时

}if(flag1==1)

{shi1--; if(shi1==-1) shi1=23;

}break;

case 4: if(flag1==0)

{week--; if(week==0) week=7;

write(0x8a,(week/100x10+week%10)); //星期

}if(flag1==1)

{cho--; if(cho==-1) cho=1;

}break;

case 5: if(flag1==0)

{ri--; if(ri==0) ri=31;

write(0x86,(ri/100x10+ri%10)); //日

}if(flag1==1)

{if(cho==0) flag2=0;

if(cho==1) flag2=1;

enter=0; flag1=0;

}break;

case 6: yue--; if(yue==0) yue=12;

write(0x88,(yue/100x10+yue%10)); //月

break;

case 7: nian--; if(nian==-1) nian=99;

write(0x8c,(nian/100x10+nian%10)); //年

break;

case 8: flag1=1; break; //进入闹钟设置界面

}while(s3==0); di(); //按键放下时响一下

}}

}void init() //初始化

{// beep=0;

lcden=0; // lcd信号使能端设定

lcdew=0; //lcd读写选择端设定

RST=0;

SCLK=1;

write_com(0x38);

write_com(0x0c);

write_com(0x06); // lcd初始化

write_com(0x01);

write_com(0x80); //显示“20”

write_data(time[0]); write_data(time[1]);

write_com(0x84); //显示“—”

write_data(time[4]);

write_com(0x87); //显示“—”

write_data(time[7]);

write_com(0xc7); //显示“:”

write_data(time1[7]);

write_com(0xca); //显示“:”

write_data(time1[10]);

}void main()

{init(); //初始化

while(1)

{if(fen1!=fen) flag3=0;

getnum();

while(flag2==1&&enter==0&&shi1==shi&&fen1==fen&&flag3==0)

{di();delay(200);di();delay(600);

getnum();display();

if(s1==0||s2==0||s3==0)

{delay(10);

flag3=1;

while(s1==0||s2==0||s3==0) ;

}enter=0;

}display();

keyscan();

}}

利用单片机DS1302芯片编制数字时钟程序:能计算2100之前的秒,分,时,日,星期,月和年的能力,能进行闰

这个很简单,因为现在的DS1302可以向后计100年,所以,不用担心器件的计时问题,你要作的就是写程序将DS1302内部署的各个寄存器中(包括,年,月,日,时,分,秒,星期)的值读出来,并显示在数码管或显示屏上就可以了.

唉,又一个写的。。。

版权声明:本文内容由互联。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发 836084111@qq.com 邮箱删除。