at89c51基于数码管的电子时钟设计和代码
时间: 2024-04-29 21:21:38 浏览: 212
基于AT89C51的电子时钟
AT89C51是一款经典的单片机,可以用来设计各种各样的电子产品。下面是基于AT89C51的数码管电子时钟设计和代码:
硬件设计:
1. 时钟电路:使用DS1302实时时钟芯片
2. 数码管显示:使用共阳数码管
3. 控制电路:使用AT89C51单片机
电路连接:
1. DS1302连接:
- SCLK连接P3.0
- IO连接P3.1
- RST连接P3.2
2. 数码管连接:
- A~G连接P2.0~P2.6
- COM1~4连接P1.0~P1.3
3. 控制电路连接:
- P0口作为时钟控制口
- P3.3作为时钟数据输入口
- P3.4作为时钟使能口
代码实现:
```
#include<reg51.h> //头文件
#define uint unsigned int
#define uchar unsigned char //类型定义
sbit SCLK=P3^0; //定义时钟脚
sbit IO=P3^1; //定义数据脚
sbit RST=P3^2; //定义复位脚
sbit EN=P3^4; //定义使能脚
sbit led=P0^0; //定义led灯脚
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阳数码管0~9编码表
uchar time[]={0x00,0x59,0x23,0x06,0x08,0x05,0x21}; //初始时间秒分时日月周年
void delay() //延时函数
{
uint i,j;
for(i=100;i>0;i--)
for(j=110;j>0;j--);
}
void write_ds1302_byte(uchar dat) //写数据到DS1302
{
uchar i;
for(i=0;i<8;i++)
{
IO=dat&0x01;
dat>>=1;
SCLK=0;
SCLK=1;
}
}
uchar read_ds1302_byte() //从DS1302读取数据
{
uchar i,dat;
for(i=0;i<8;i++)
{
dat>>=1;
if(IO) dat|=0x80;
SCLK=0;
SCLK=1;
}
return dat;
}
void write_ds1302(uchar reg,uchar dat) //向DS1302写入寄存器数据
{
RST=0;
SCLK=0;
RST=1;
write_ds1302_byte(reg);
write_ds1302_byte(dat);
RST=0;
}
uchar read_ds1302(uchar reg) //从DS1302读取寄存器数据
{
uchar dat;
RST=0;
SCLK=0;
RST=1;
write_ds1302_byte(reg|0x01);
dat=read_ds1302_byte();
RST=0;
return dat;
}
void init_ds1302() //DS1302初始化函数
{
write_ds1302(0x8e,0x00);
write_ds1302(0x80,0x00);
}
void display_time() //数码管显示时间函数
{
uchar i,j;
for(j=0;j<4;j++)
{
P1=0x0f^(1<<j);
P2=table[time[j*2+1]/16];
delay();
P1=0xff;
P2=0xff;
P1=0x0f^(1<<j);
P2=table[time[j*2+1]%16];
delay();
P1=0xff;
P2=0xff;
}
}
void main()
{
init_ds1302(); //DS1302初始化
while(1)
{
if(EN==0) //判断时钟是否启动
{
time[0]=read_ds1302(0x81); //读取秒
time[1]=read_ds1302(0x83); //读取分
time[2]=read_ds1302(0x85); //读取时
time[3]=read_ds1302(0x87); //读取日
time[4]=read_ds1302(0x89); //读取月
time[5]=read_ds1302(0x8b); //读取周
time[6]=read_ds1302(0x8d); //读取年
led=~led; //led灯闪烁
}
display_time(); //数码管显示时间
}
}
```
说明:
1. 初始化DS1302时钟芯片
2. 读取DS1302时钟芯片的时间并显示在数码管上
3. 当时钟使能脚为0时,从DS1302读取时间并闪烁LED灯
这是一份简单的时钟代码,可以根据需要进行修改和扩展。
阅读全文