基于AT89C51单片机的6位数码管显示的简易电子时钟设计

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-07-02
基于AT89C51单片机的6位数码管显示的简易电子时钟设计 能显示时间 整点报时(蜂鸣) 误差在五秒以内。

我有个四位的,共阳,还有日期,不过没有整点报时,稍微修改一下就好了,你可以找我。



自己在看着改一下吧

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds1302_RST =P2^0;
sbit ds1302_IO =P2^1;
sbit ds1302_SCLK=P2^2;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit A1=P3^0;
sbit A2=P3^1;
sbit A3=P3^2;
sbit A4=P3^3;
sbit A5=P3^4;
sbit A6=P3^5;
sbit key1=P3^6;
sbit key2=P3^7;
uchar now_time[3],wei,d[3]={0,0,0};
uchar code s[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
void delay(uint x)
{
uchar i;
for(x;x>0;x--)
for(i=0;i<100;i++);
}
void disp()
{
P1=s[now_time[2]/16];
A1=d[2];
delay(5);
A1=1;
P1=s[now_time[2]%16];
A2=d[2];
delay(5);
A2=1;
P1=s[now_time[1]/16];
A3=d[1];
delay(5);
A3=1;
P1=s[now_time[1]%16];
A4=d[1];
delay(5);
A4=1;
P1=s[now_time[0]/16];
A5=d[0];
delay(5);
A5=1;
P1=s[now_time[0]%16];
A6=d[0];
delay(5);
A6=1;
}
/***********************************************************************/
uchar read_Byte()
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=ds1302_IO;
ds1302_SCLK=1;
ds1302_SCLK=0;
}
return(ACC);
}

void write_Byte(uchar tdata)
{
uchar i;
ACC=tdata;
for(i=8;i>0;i--)
{
ds1302_IO=ACC0;
ds1302_SCLK=1;
ds1302_SCLK=0;
ACC=ACC>>1;
}

}
/***********************************************************************************/
void write_data_ds1302(uchar taddr,uchar tdata)
{
ds1302_RST=0;
ds1302_SCLK=0;
ds1302_RST=1;
write_Byte(taddr);
write_Byte(tdata);
ds1302_RST=0;
ds1302_SCLK=1;
}

uchar read_data_ds1302(uchar taddr)
{
uchar tdata;

ds1302_RST=0;
ds1302_SCLK=0;
ds1302_RST=1;
write_Byte(taddr);
tdata=read_Byte();
ds1302_RST=0;
ds1302_SCLK=1;
return(tdata);
}
/***********************************************************************************/

void get_ds1302()
{
uchar k;
uchar taddr = 0x81;
for (k=0; k<3; k++)
{
now_time[k] = read_data_ds1302(taddr);
taddr+=2;

}
}
/***********************************************************************************/

void init_ds1302()
{
ds1302_RST=0;
ds1302_SCLK=0;
A1=1;
A2=1;
A3=1;
A4=1;
A5=1;
A6=1;
write_data_ds1302(0x80,0x00);
}
/***********************************************************************************/
void Time();
/***********************************************************************************/
main()
{
init_ds1302();

while(1)
{
disp();
get_ds1302();
if(key1==0);
{ delay(10);
if(key1==0)
Time();
}

}
}
void timer() interrupt 3
{
uchar i;i++;
TH1=(65535-50000)/256;
TL2=(65535-50000)%256;
if(i==50)
{
d[wei]=1;
}
if(i==100)
{ i=0;
d[wei]=0;
}
}
/***********************************************************************************/

void Time()
{
uchar temp;
uint r=0,p=1;
wei=2;
TMOD=0x01;
EA=1;
ET1=1;
TH1=(65535-50000)/256;
TL2=(65535-50000)%256;
TR1=1;
for(r=0;r<50;r++)
disp();

while( key1 )
{
wei=2;
disp();
if(key2==0)
{
disp();
if(key2==0)
{
temp=now_time[2]/16*10+now_time[2]%16;
temp++;
if(temp>=24)
temp=0;
now_time[2]=temp/10*16+temp%10;
write_data_ds1302(0x84,now_time[2]);
}
while(!key2);

}

}
wei=1;
d[2]=0;
for(r=0;r<50;r++)
disp();

while(key1 )
{ disp();
if(key2==0)
{
disp();
if(key2==0)
{
temp=now_time[1]/16*10+now_time[1]%16;
temp++;
if(temp>=60)
temp=0;
now_time[1]=temp/10*16+temp%10;
write_data_ds1302(0x82,now_time[1]);
}
while(!key2);
}
}
wei=0;
d[1]=0;

for(r=0;r<50;r++)
disp();

while(key1 )
{
disp();
if(key2==0)
{
now_time[0]=0;
write_data_ds1302(0x80,now_time[0]);
}

} TR1=0;

d[0]=0;
for(r=0;r<30;r++)
disp();

}

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

  • 利用AT89C51单片机,1个按键和6 位共阳LED数码管,构成一个秒表系统,当点...
    答:姑娘,我这里有proteus图、汇编程序、c程序、程序框图一应俱全的设计报告。留个邮箱免费给你,稍作修改,把数码管改成6位的:00:00:00这种样式即可
  • ...任务要求:利用AT89C51单片机设计简易电子钟(六位),通过6位共阴_百度...
    答:include<reg52.h> define uchar unsigned char ...要是PROTEUS的话差不多是这样,要是不想麻烦搞个74595的话P1就直接连(有没有都一样有的话比较整洁,没有的话程序上省点脑筋)主按键就用INT0,我没用P0口是因为懒得加上拉电阻,高低电平暂时先设成低的,思路就是P2口片选,当INT0触发时,你...
  • 用Aat89c51单片机驱动六个数码管静态显示年月日,求程序
    答:你这个仿真图需要修改一下,才好写程序,就是74LS373的LE端不要用ALE信号锁存,改用P2口的某一个脚,或干脆把LE端接到VCC上,即一个电源端子。而你现在的仿真图的接法需要的用汇编MOVX指令,要是写C语言程序就麻烦了。而改接到VCC上只要从P0口输出段码就行了,汇编语言或C语言都好写程序。
  • AT89C51单片机实验 LED 0-9999循环显示的程序图
    答://0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 //0 1 2 3 4 5 6 7 8 9 A B C D E F - .unsigned char code tab_w[]={ 0x7F,0xBF,0xDF,0xEF};//位选择代码 从右到左 void delay1ms(unsigned int count) //延时1ms { unsigned char j;...
  • AT89c51单片机如何编制6位数码管计时器
    答:Proteus文件发给我 就可以写了
  • 用at89c51单片机的定时/计数器T0汇编语言设计
    答:6位数显频率计数器 1. 实验任务 利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。2. 电路原理图 图4.31.1 3. 系统板上硬件连线 (1). 把...
  • 单片机AT89C51,想实现六个端口输入都是开关量,两个端口输出,
    答:at89c51没有这两个端口,如果要对输入的高速脉冲计数,可以设置定时/计数器0和1的为计数器,脉冲输入为外部输入t0(p3.4)和t1(p3.5)口,这两个口在12mhz晶振频率下最大计数速率可达500khz左右计算方法是:晶振频率/24=最大计数速率,带入上面的就是12000000hz(12mhz)/24=500000hz(500khz)。具...
  • AT89C51单片机设计独立按键,静态数码管电路,并编程实现按下Ki键,数码...
    答:一位共阳数码管接在P0口,为静态显示。P3口接有8个独立式按键,按键为K1~K8,按键8个按键中的任意一个,数码管则显示出按键编号。仿真图如下,这是按下K6时显示6。
  • 基于AT89C51的单片机C语言设计
    答:include<reg51.h>#include<INTRINS.h>#define u16 unsigned int#define u8 unsigned char/***/u8 ds[2]; //数码管显示缓存//共阳code u8 w[]={0x01,0x02,0x04,0x08};//位码code u8 d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//断码void dispaly(){//...
  • 急需要单片机AT89C51的16键单片机电子密码锁电路和C语言源程序!_百度...
    答:程序需要调试的,就是给你写出来也是问题多多。。假如是6位密码的吧,你的16个键假设是从0到9,要有一个清除键、一个修改键,你在程序里预设6位数字,然后存储从键盘上输入的6位数字,如果相同就执行下一步操作,如果不同就提示密码错误,你也可以设定密码输入次数。。太麻烦 一两句说不清楚 ...