完善資料讓更多小伙伴認識你,還能領取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 標簽:電子時鐘 1305 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 |