完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>
标签 > 电子时钟
电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许多场合可以看到数字电子钟。
电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许多场合可以看到数字电子钟。
电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显 示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许多场合可以看到数字电子钟。
工作原理
电子钟是一个将“ 时”,“分”,“秒”显示于人的视觉器官的计时装置。它的计时周期为24小时,显示满刻度为23时59分59秒,具有校时功能和报时功能。因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器、校时电路、报时电路和振荡器组成。主电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计时器,可实现对一天24小时的累计。译码显示电路将“时”、“分”、“秒”计数器的输出状态用七段显示译码器译码,通过七段显示器显示出来。整点报时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现报时。校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整。
51单片机电子时钟设计
硬件部分
基于51单片机、 ds1302时钟芯片、 ds18b20温度芯片、 以及1602液晶显示的 实时时间 和 实时温度显示 。同时可通过按键 设置 年、月、日、时、分、星期。 并且可以设置闹钟 当闹钟时间到时 蜂鸣器持续发出 滴。。声 同时led灯不停闪烁 且在一分钟内没有按指定停止按键 闹钟将自动停止 。。。
软件部分
如果网页上复制的代码不能编译可以从这里下载keil工程: http://www.51hei.com/f/dszdec.rar
#include 《reg52.h》
#define uchar unsigned char
#define uint unsigned int
sbit spk=P1^7;
sbit led=P1^5;
sbit DQ=P1^0;
sbit RS=P2^4;
sbit RW=P2^5;
sbit EN=P2^6;
sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit IO=P3^6;
sbit RST=P3^7;
sbit SCLK=P3^5;
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
int nian,xing,yue,ri,shi,fen,miao;
uchar num,temp,c,d,time[7],a,b,aa,bb,ns,ng,ys,yg,rs,rg,ss,sg,fs,fg,ms,mg,flag;
/*******************1602************************/
void delay(int z)
{
int x,y;
for(x=z;x》0;x--)
for(y=100;y》0;y--);
}
void write_com(uchar com) //写命令
{
RS=0;
P0=com;
delay(5);
EN=1;
delay(5);
EN=0;
}
void write_data(uchar date) //写数据
{
RS=1;
P0=date;
delay(5);
EN=1;
delay(5);
EN=0;
}
void init() //初始化
{
RW=0;
EN=0;
write_com(0x38); //显示模式设置
write_com(0x0c); //开显示 不显示光标 不闪
write_com(0x06); //写一个字符 地址指针 光标 加一 整屏不移动
write_com(0x01); //显示清零
write_com(0x80+0x04);
write_data(‘2’);
write_com(0x80+0x05);
write_data(‘0’);
write_com(0x80+0x00);
write_data(‘c’);
write_com(0x80+0x01);
write_data(‘a’);
write_com(0x80+0x02);
write_data(‘i’);
write_com(0x80+0x4e);
write_data(0xdf);
write_com(0x80+0x4f);
write_data(‘C’);
write_com(0x80+0x4b);
write_data(0x2e); //显示“。”
}
/**************DS18B20****************/
void delay1(unsigned int t) //延时函数
{
while(t--);
}
void init1() //初始化
{
uchar n=0;
DQ=1; //DQ复位
delay1(8);
DQ=0; //主机将DQ拉低
delay1(80); //大于480us的延时
DQ=1;
delay1(5); //延时15~60us
n=DQ;
delay1(5); //若n=0初始成功 n=1初始失败(可设置返回值查看n是否为1)
}
void write_byte(uchar dat) //写入一个字节
{
uint i;
for(i=0;i《8;i++)
{
DQ=0;
DQ=dat&0x01;
delay1(12);
DQ=1;
dat》》=1;
}
delay1(4);
}
uchar read_byte() //读入一个字节
{
uint k=0;
uchar value=0;
for(k=0;k《8;k++)
{
DQ=0;
value》》=1;
DQ=1;
if(DQ)
value|=0x80;
delay1(4);
}
return value;
}
uchar read_temp() //读取温度函数
{
uchar a=0,b=0;
init1();
write_byte(0xcc);
write_byte(0x44);
delay1(200);
init1();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();
b=read_byte();
c=b;
d=a;
b《《=4;
b+=(a&0xf0)》》4;
return b;
}
/***********************1302**********************/
void wirte_byte1(uchar date) //写入一个字节
{
uchar i;
for(i=8;i》0;i--)
{
IO=date&0x01;
SCLK=0;
SCLK=1;
date=date》》1;
}
}
uchar read_byte1() //读一个字节
{
uchar dat,i;
for(i=8;i》0;i--)
{
dat=dat》》1;
SCLK=0;
if(IO)
dat=dat|0x80;
SCLK=1;
}
return(dat);
}
void write_ds1302(uchar add,uchar date) //将数据写入1302中
{
RST=0;
SCLK=0;
RST=1;
wirte_byte1(add);
wirte_byte1(date);
RST=0;
SCLK=1;
}
uchar read_ds1302(uchar add) //读出1302中数据
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
wirte_byte1(add);
temp=read_byte1();
RST=0;
SCLK=0;
return (temp);
}
uchar huan_BCD(uint z) //将数据 转换成BCD
{
uint a,b;
a=z/10;
b=z%10;
a=a&0xff;
b=b&0xff;
a《《=4;
a=a|b;
return (a);
}
void xian_shi() //液晶显示函数
{
if(b==0&a==0)
{
ms=time[0]/16;
mg=time[0]%16;
fs=time[1]/16;
fg=time[1]%16;
fen=fs*10+fg;
ss=time[2]/16;
sg=time[2]%16;
shi=ss*10+sg;
rs=time[3]/16;
rg=time[3]%16;
ri=rs*10+rg;
ys=time[4]/16;
yg=time[4]%16;
yue=ys*10+yg;
ns=time[6]/16;
ng=time[6]%16;
nian=ns*10+ng;
xing=time[5];
}
if(a==1|b==1)
{
ss=shi/10;
sg=shi%10;
write_com(0x80+0x41);
write_data(0xff);
write_com(0x80+0x40);
write_data(table[ss]);
write_com(0x80+0x41);
write_data(table[sg]);
}
if(a==2|b==2)
{
fs=fen/10;
fg=fen%10;
write_com(0x80+0x44);
write_data(0xff);
write_com(0x80+0x43);
write_data(table[fs]);
write_com(0x80+0x44);
write_data(table[fg]);
}
if(a==3)
{
rs=ri/10;
rg=ri%10;
write_com(0x80+0x0d);
write_data(0xff);
write_com(0x80+0x0c);
write_data(table[rs]);
write_com(0x80+0x0d);
write_data(table[rg]);
}
if(a==4)
{
ys=yue/10;
yg=yue%10;
write_com(0x80+0x0a);
write_data(0xff);
write_com(0x80+0x09);
write_data(table[ys]);
write_com(0x80+0x0a);
write_data(table[yg]);
}
if(a==5)
{
ns=nian/10;
ng=nian%10;
write_com(0x80+0x07);
write_data(0xff);
write_com(0x80+0x06);
write_data(table[ns]);
write_com(0x80+0x07);
write_data(table[ng]);
}
if(a==6)
{
write_com(0x80+0x0f);
write_data(0xff);
write_com(0x80+0x0f);
write_data(table[xing]);
}
write_com(0x80+0x06); //在液晶第一行第七八位显示 年
write_data(table[ns]);
write_com(0x80+0x07);
write_data(table[ng]);
write_com(0x80+0x08);
write_data(‘-’);
write_com(0x80+0x09); //在液晶第一行第十十一位显示 月
write_data(table[ys]);
write_com(0x80+0x0a);
write_data(table[yg]);
write_com(0x80+0x0b);
write_data(‘-’);
write_com(0x80+0x0c); //在液晶第一行第十三 十四位显示 日
write_data(table[rs]);
write_com(0x80+0x0d);
write_data(table[rg]);
write_com(0x80+0x0f); //在液晶第一行第十七位显示 星期
write_data(table[xing]);
write_com(0x80+0x40); //在液晶第二行第二三位显示 时
write_data(table[ss]);
write_com(0x80+0x41);
write_data(table[sg]);
write_com(0x80+0x42);
write_data(‘:’);
write_com(0x80+0x43); //在液晶第二行第五六位显示 分
write_data(table[fs]);
write_com(0x80+0x44);
write_data(table[fg]);
write_com(0x80+0x45);
write_data(‘:’);
write_com(0x80+0x46); //在液晶第二行第八九位显示 秒
write_data(table[ms]);
write_com(0x80+0x47);
write_data(table[mg]);
}
void keyscan() //按键设置函数 可任意设置年月日时分秒星期的数值
{
if(key4!=0)
{
if(key1==0) //key1按键 选择需设置的位
{
if(key1==0)
{
a++;
delay(1);
}
while(!key1)
{
delay(1);
}
}
if(a!=0)
{
if(key2==0) //key2按键 可将需设置的数 调大
{
if(a==1)
{
shi++;
if(shi》=24)
{
shi=0;
}
}
if(a==2)
{
fen++;
if(fen》=60)
{
fen=0;
}
}
if(a==3)
{
ri++;
if(ri》=32)
{
ri=1;
}
}
if(a==4)
{
yue++;
if(yue》=12)
{
yue=1;
}
}
if(a==5)
{
nian++;
if(nian》=99)
{
nian=0;
}
}
if(a==6)
{
xing++;
if(xing》=8)
{
xing=1;
}
}
}
if(key3==0) //key3按键 可将需设置的数 调小
{
if(a==1)
{
shi--;
if(shi《0)
{
shi=23;
}
}
if(a==2)
{
fen--;
if(fen《0)
{
fen=59;
}
}
if(a==3)
{
ri--;
if(ri《1)
{
ri=31;
}
}
if(a==4)
{
yue--;
if(yue《1)
{
yue=12;
}
}
if(a==5)
{
nian--;
if(nian《0)
{
nian=99;
}
}
if(a==6)
{
xing--;
if(xing《1)
{
xing=7;
}
}
}
if(a==7) //当按下key1 7次后 将个数据写入1302
{
a=0;
write_ds1302(0x8e,0x00); //WP=0 写操作
write_ds1302(0x80,0x00); //0x80是写秒数据
write_ds1302(0x82,huan_BCD(fen)); //0x82是写分数据
write_ds1302(0x84,huan_BCD(shi)); //0x84是写时数据
write_ds1302(0x86,huan_BCD(ri)); //0x84是写日数据
write_ds1302(0x88,huan_BCD(yue)); //0x84是写月数据
write_ds1302(0x8a,huan_BCD(xing)); //0x84是写星期数据
write_ds1302(0x8c,huan_BCD(nian)); //0x84是写年数据
write_ds1302(0x8e,0x80); //WP=1 写保护
}
}
}
}
void naozhong() //通过按键设置闹钟 时 分
{
if(key1!=0)
{
if(key4==0)
{
if(key4==0)
{
b++;
delay(1);
}
while(!key4)
{
delay(1);
}
}
if(b!=0)
{
if(key2==0) //key2按键 可将需设置的数 调大
{
if(b==1)
{
shi++;
if(shi》=24)
{
shi=0;
}
}
if(b==2)
{
fen++;
if(fen》=60)
{
fen=0;
}
}
}
if(key3==0) //key3按键 可将需设置的数 调小
{
if(b==1)
{
shi--;
if(shi《0)
{
shi=23;
}
}
if(b==2)
{
fen--;
if(fen《0)
{
fen=59;
}
}
}
aa=huan_BCD(shi); //将设置的时钟 赋值给aa
bb=huan_BCD(fen); //将设置的分钟 赋值给bb
if(b==3) //当按下key4 3次后 闹钟设置完成
{
b=0;
}
}
}
}
void main()
{
uint i,temp;
init();
TMOD=0x10;
EA=1;
TH1=(65536-51200)/256;
TL1=(65536-51200)%256;
ET1=1;
while(1)
{
temp=0x81; //读的初始地址
for(i=0;i《7;i++) //分别把秒分时日月年星期数据读出分7次读好一次地址加2“ temp+=2;”
{
time[i]=read_ds1302(temp);
temp+=2;
}
if(bb==time[1]&aa==time[2]&!time[0]) //如果读出来的时钟 分钟与1302读出来的值相等且读出来的秒钟为零时 进入中断
{
TR1=1;
flag=1; //标志位设置为1
}
if(key3==0) //进入闹钟后 可由key3按下 停止中断 标志位置零 允许调时闹钟设置按键动作 停止闹铃
{
led=1;
spk=1;
flag=0;
TR1=0;
}
if(flag!=1) //当进入闹钟中断后 调时与设置闹钟的按键 无效
{
naozhong();
keyscan();
}
xian_shi();
temp=read_temp();
write_com(0x80+0x49);
write_data(table[temp/10]); //在液晶第二行第十位显示温度的十位
write_com(0x80+0x4a);
write_data(table[temp%10]); //在液晶第二行第十一位显示温度的个位
write_com(0x80+0x4c);
write_data(table[(d&0x0f)*625/1000]); //在液晶第二行第十三位显示温度的小数点后一位
write_com(0x80+0x4d);
write_data(table[(d&0x0f)*625/100%10]); //在液晶第二行第十四位显示温度的小数点后二位
}
}
void timer1() interrupt 3 //定时器
{
uint t;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t++;
spk=0; //蜂鸣器 发出 滴答 声
led=!led; //发光二极管 不停闪烁
delay1(10);
if(t==1120) //约1分钟后 闹钟自动停止 标志位
{
led=1;
spk=1;
t=0;
TR1=0;
flag=0;
}
}
单片机电子时钟是一种基于微处理器和数字时钟显示技术的计时装置。它通过内部的晶振电路精确地计算时间,并将结果显示在数字时钟面板上。在现代生活中,电子时钟已...
基于RASC的keil电子时钟制作(瑞萨RA)(9)----保存数据到flash
本篇文章主要介绍如何使用e2studio对瑞萨进行Flash配置,并且分别对Code Flash & Data Flash进行读写操作。
基于RASC的keil电子时钟制作(瑞萨RA)(8)----按键修改数码管时间
前几节课程已经单独驱动了数码管和RTC,同时已经整合成了能够用数码管显示具体时间,但是无法修改时间,这节就来配置使用按键修改具体的日期。
基于RASC的keil电子时钟制作(瑞萨RA)(7)----配置RTC时钟及显示时间
本文将详细讲解如何借助e2studio来对瑞萨微控制器进行实时时钟(RTC)的设置和配置,以便实现日历功能和一秒钟产生的中断,从而通过串口输出实时数据。
基于RASC的keil电子时钟制作(瑞萨RA)(6)----定时器驱动数码管
要想让每个数码管显示不同的数字,但是数码管必须依次地被持续驱动,数码管之间的刷新速度应该足够快,这样就看不出来数码管之间在闪烁。刷新频率可以设置为2ms...
单片机电子时钟时间误差如何调整有效? 单片机电子时钟的时间误差可以通过以下几种方式进行调整和校正: 1. 外部校准:使用外部可靠的时钟源(例如GPS接收...
时钟辐射超标怎么解决? 时钟辐射超标,是指在使用电子钟类产品时,超出了人体可以承受的安全辐射值。这是当代电子产品日益普及所带来的问题。如何有效解决时钟...
因此,此次设计与制作数字钟就是为了了解数字钟的原理,从而学会制作数字钟,而且通过数字钟的制作进一步的了解各种在制作中用到的中小规模集成电路的作用及使用方法。
单片机电子时钟利用内部定时,计数器溢出产生中断(12MHz晶振一般为50ms)再乘以相应的倍率,来实现秒、分、时的转换。大家都知道,从定时,计数器产生中...
1.单片机电子时钟的计时脉冲基准,是由外部晶振的频率经过12分频后提供的,采用内部的定时,计数器来实现计时功能。所以,外接晶振频率的精确度直接影响电子钟...
0 引言 近年来,随着电力线载波通信(Power Line Communication,PLC)技术的发展,电力线载波通信已大量地应用于日常生活和工业生...
2017-11-30 标签:电子时钟 1303 0
编辑推荐厂商产品技术软件/工具OS/语言教程专题
电机控制 | DSP | 氮化镓 | 功率放大器 | ChatGPT | 自动驾驶 | TI | 瑞萨电子 |
BLDC | PLC | 碳化硅 | 二极管 | OpenAI | 元宇宙 | 安森美 | ADI |
无刷电机 | FOC | IGBT | 逆变器 | 文心一言 | 5G | 英飞凌 | 罗姆 |
直流电机 | PID | MOSFET | 传感器 | 人工智能 | 物联网 | NXP | 赛灵思 |
步进电机 | SPWM | 充电桩 | IPM | 机器视觉 | 无人机 | 三菱电机 | ST |
伺服电机 | SVPWM | 光伏发电 | UPS | AR | 智能电网 | 国民技术 | Microchip |
开关电源 | 步进电机 | 无线充电 | LabVIEW | EMC | PLC | OLED | 单片机 |
5G | m2m | DSP | MCU | ASIC | CPU | ROM | DRAM |
NB-IoT | LoRa | Zigbee | NFC | 蓝牙 | RFID | Wi-Fi | SIGFOX |
Type-C | USB | 以太网 | 仿真器 | RISC | RAM | 寄存器 | GPU |
语音识别 | 万用表 | CPLD | 耦合 | 电路仿真 | 电容滤波 | 保护电路 | 看门狗 |
CAN | CSI | DSI | DVI | Ethernet | HDMI | I2C | RS-485 |
SDI | nas | DMA | HomeKit | 阈值电压 | UART | 机器学习 | TensorFlow |
Arduino | BeagleBone | 树莓派 | STM32 | MSP430 | EFM32 | ARM mbed | EDA |
示波器 | LPC | imx8 | PSoC | Altium Designer | Allegro | Mentor | Pads |
OrCAD | Cadence | AutoCAD | 华秋DFM | Keil | MATLAB | MPLAB | Quartus |
C++ | Java | Python | JavaScript | node.js | RISC-V | verilog | Tensorflow |
Android | iOS | linux | RTOS | FreeRTOS | LiteOS | RT-THread | uCOS |
DuerOS | Brillo | Windows11 | HarmonyOS |