基于 单片机AT89C51的电子时钟的电路图和程序怎么做啊

2024-10-30 23:51:59
推荐回答(3个)
回答1:

不知道你做的是led还是lcd的,之前做了一个led的,程序代码如下,希望能帮到你,要是用lcd的改下显示就行了,也可以到我空间看看的,有问题随时交流下

#include

//#include"DS18B20_3.H"

#define uint unsigned int

#define uchar unsigned char

uchar a,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp,key4n;//sheding为调节打铃时间时显示

//flag用于读取头文件中的温度值,和显示温度值

uchar code Seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};

unsigned int s_1,s_2,s_3,s_4,s_5,s_6;

#define yh 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)

#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)

uchar flag_xs=0,flag_m,flag_m1,flag_f,flag_f1,flag_s,flag_s1;

uchar flag_n,flag_n1,flag_y,flag_y1,flag_r,flag_r1,flag_mb;

uint numt;

//液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)

//DS1302时钟芯片与C51之间的引脚连接定义

sbit IO=P1^1;

sbit SCLK=P1^0;

sbit RST=P1^2;

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;

sbit nyr=P3^1;

sbit sfm=P3^0;

/************************************************************

ACC累加器=A

ACC.0=E0H 

ACC.0就是ACC的第0位。Acc可以位寻址。

累加器ACC是一个8位的存储单元,是用来放数据的。但是,这个存储单元有其特殊的地位,

是单片机中一个非常关键的单元,很多运算都要通过ACC来进行。以后在学习指令时,

常用A来表示累加器。但有一些地方例外,比如在PUSH指令中,就必须用ACC这样的名字。

一般的说法,A代表了累加器中的内容、而ACC代表的是累加器的地址。 

***************************************************************/

//校时按键与C51的引脚连接定义

sbit key1=P1^4;  //设置键

sbit key2=P1^5;  //加键

sbit key3=P1^6;  //减键

sbit key4=P1^3;  //秒表

/**************************************************************/

void delay(uint xms)//延时函数,有参函数

{

uint x,y;

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

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

}

void write_sfm(uchar com,uchar miao)

{

uchar ge,shi;

sfm=1;

nyr=0;

// P3=0;

shi=miao/10;

ge=miao%10;

P2=com;

P0=Seg[ge];

delay(3);

P2=com>>1;

P0=Seg[shi];

delay(3);

}

void write_sfm_(uchar com)

{

P2=0;

nyr=0;

sfm=1;

P2=com;

P0=Seg[10];

delay(2);

P2=com>>3;

P0=Seg[10];

delay(2);

}

void write_nyr(uchar com,uchar dat)

{

uchar ge,shi;

P2=0;

nyr=1;

sfm=0;

shi=dat/10;

ge=dat%10;

P2=com;

P0=Seg[ge];

delay(3);

P2=com>>1;

P0=Seg[shi];

delay(3);

}

void write_nyr_(uchar com)

{

P2=0;

nyr=1;

sfm=0;

P2=com;

P0=Seg[10];

delay(2);

P2=com>>3;

P0=Seg[10];

delay(2);

}

void display_1(int d_1,int d_2,int d_3,int d_4,int d_5,int d_6)//LED时间显示(用于秒表)

{

P2=0;

nyr=0;

sfm=1;

P2=0x01;

P0=Seg[d_1];

delay(2);

P2=0x02;

P0=Seg[d_2];

delay(2);

//P0=0x04;

//P2=0xbf;

//delay(2);

P2=0x08;

P0=Seg[d_3];

delay(2);

P2=0x10;

P0=Seg[d_4];

delay(2);

//P0=0x20;

//P2=0xbf;

//delay(2);

P2=0x40;

P0=Seg[d_5];

delay(2);

P2=0x80;

P0=Seg[d_6];

delay(2);

}

void second()//秒表

{

display_1(s_1,s_2,s_3,s_4,s_5,s_6);

s_6++;

    if(s_6>9)

{

s_6=0;

s_5++;

}

if(s_5>9)

{

s_5=0;

s_4++;

}

    if(s_4>9)

{

s_4=0;

s_3++;

}

if(s_3>5)

{

s_3=0;

s_2++;

}

    if(s_2>9)

{

s_2=0;

s_1++;

}

if(s_1>5)

{

s_1=0;

}

}

/***************DS1302有关子函数********************/

void write_byte(uchar dat)//写一个字节

{

ACC=dat;

RST=1;

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

{

IO=ACC0;

SCLK=0;

SCLK=1;

ACC=ACC>>1;

}

}

uchar read_byte()//读一个字节

{

RST=1;

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

{

ACC7=IO;

SCLK=1;

SCLK=0;

ACC=ACC>>1;

}

return (ACC);

}

电路如下

回答2:

区电子发烧友这个网站吧,里面有

回答3:

我来帮你做做