『壹』 基於STC89C52單片機的電子時鍾系統的設計
就弄個AT24C02讀寫程序,注釋詳細看這個也應該用不到專門的時鍾晶元,思路:開機進入主循環之前讀取晶元中的數據,設置個標志位沒30秒取反一次。或者但秒=0或為60時取反一次也是半分種吸和或斷開,利用單片機本身的定時器,例如每個50ms中斷一次20次就是一秒,bit ack; //應答標志位sbit SDA=P2^1;
sbit SCL=P2^0;/*------------------------------------------------
啟動匯流排
------------------------------------------------*/
void Start_I2c()
{
SDA=1; //發送起始條件的數據信號
_Nop();
SCL=1;
_Nop(); //起始條件建立時間大於4.7us,延時
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; //發送起始信號
_Nop(); //起始條件鎖定時間大於4μ
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; //鉗住I2C匯流排,准備發送或接收數據
_Nop();
_Nop();
}
/*------------------------------------------------
結束匯流排
------------------------------------------------*/
void Stop_I2c()
{
SDA=0; //發送結束條件的數據信號
_Nop(); //發送結束條件的時鍾信號
SCL=1; //結束條件建立時間大於4μ
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; //發送I2C匯流排結束信號
_Nop();
_Nop();
_Nop();
_Nop();
}
/*----------------------------------------------------------------
位元組數據傳送函數
函數原型: void SendByte(unsigned char c);
功能: 將數據c發送出去,可以是地址,也可以是數據,發完後等待應答,並對
此狀態位進行操作.(不應答或非應答都使ack=0 假)
發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
------------------------------------------------------------------*/
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數據長度為8位
{
if((c<<BitCnt)&0x80)SDA=1; //判斷發送位
else SDA=0;
_Nop();
SCL=1; //置時鍾線為高,通知被控器開始接收數據位
_Nop();
_Nop(); //保證時鍾高電平周期大於4μ
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
SDA=1; //8位發送完後釋放數據線,准備接收應答位
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; //判斷是否接收到應答信號
SCL=0;
_Nop();
_Nop();
} /*----------------------------------------------------------------
位元組數據傳送函數
函數原型: unsigned char RcvByte();
功能: 用來接收從器件傳來的數據,並判斷匯流排錯誤(不發應答信號),
發完後請用應答函數。
------------------------------------------------------------------*/
unsigned char RcvByte()
{
unsigned char retc;
unsigned char BitCnt;
retc=0;
SDA=1; //置數據線為輸入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
SCL=0; //置時鍾線為低,准備接收數據位
_Nop();
_Nop(); //時鍾低電平周期大於4.7us
_Nop();
_Nop();
_Nop();
SCL=1; //置時鍾線為高使數據線上數據有效
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; //讀數據位,接收的數據位放入retc中
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
return(retc);
} /*----------------------------------------------------------------
應答子函數
原型: void Ack_I2c(void);
----------------------------------------------------------------*/
void Ack_I2c(void)
{
SDA=0;
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); //時鍾低電平周期大於4μ
_Nop();
_Nop();
_Nop();
SCL=0; //清時鍾線,鉗住I2C匯流排以便繼續接收
_Nop();
_Nop();
}/*----------------------------------------------------------------
向有子地址器件發送多位元組數據函數
函數原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
功能: 從啟動匯流排到發送地址,子地址,數據,結束匯流排的全過程,從器件
地址sla,子地址suba,發送內容是s指向的內容,發送no個位元組。
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束匯流排。
----------------------------------------------------------------*/
bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i;
for(i=0;i<no;i++)
{
Start_I2c(); //啟動匯流排
SendByte(sla); //發送器件地址
if(ack==0)return(0);
SendByte(suba); //發送器件子地址
if(ack==0)return(0);
SendByte(*s); //發送數據
if(ack==0)return(0);
Stop_I2c(); //結束匯流排
DelayMs(1); //必須延時等待晶元內部自動處理數據完畢
s++;
suba++;
}
return(1);
}/*----------------------------------------------------------------
向無子地址器件讀位元組數據函數
函數原型: bit IRcvByte(unsigned char sla,ucahr *c);
功能: 從啟動匯流排到發送地址,讀數據,結束匯流排的全過程,從器件地
址sla,返回值在c.
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束匯流排。
----------------------------------------------------------------*/
/*bit IRcvByte(unsigned char sla,unsigned char *c)
{
Start_I2c(); //啟動匯流排
SendByte(sla+1); //發送器件地址
if(ack==0)return(0);
*c=RcvByte(); //讀取數據
NoAck_I2c(); //發送非就答位
Stop_I2c(); //結束匯流排
return(1);
}*/
/*----------------------------------------------------------------
向有子地址器件讀取多位元組數據函數
函數原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
功能: 從啟動匯流排到發送地址,子地址,讀數據,結束匯流排的全過程,從器件
地址sla,子地址suba,讀出的內容放入s指向的存儲區,讀no個位元組。
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結束匯流排。
----------------------------------------------------------------*/
bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
{
unsigned char i; Start_I2c(); //啟動匯流排
SendByte(sla); //發送器件地址
if(ack==0)return(0);
SendByte(suba); //發送器件子地址
if(ack==0)return(0); Start_I2c();
SendByte(sla+1);
if(ack==0)return(0); for(i=0;i<no-1;i++)
{
*s=RcvByte(); //發送數據
Ack_I2c(); //發送就答位
s++;
}
*s=RcvByte();
NoAck_I2c(); //發送非應位
Stop_I2c(); //結束匯流排
return(1);
}
『貳』 基於51單片機的電子時鍾請求幫忙
電子鍾可以用proteus模擬實現,8位一體共陰數碼管顯示時分秒,再用3個按鍵調節時間。模擬圖如下。
『叄』 基於單片機的電子時鍾畢業答辯常見問題
嘿嘿 俺來幫你回答
基於單片機的電子時鍾畢業答辯常見問題:
1 可以圍繞硬體電路提問 如:電子時鍾顯示器的介面驅動能力?是屬於靜態顯示還是動態顯示?
採用的顯示編碼是共陽極還是共陰極的?電子時鍾功耗有多大?有沒有採取降低功耗的措施?
2 也可以圍繞軟體提問 如:如何實現秒、分、小時計時的?主程序的功能有哪些?除了主程序還有哪些子程序?
3 圍繞你設計方案提問: 如你的設計方案有什麼特點?你的設計方案還存在哪些不足?有哪些可以進一步改進的?
呵呵 滿意 就選滿意回答
『肆』 單片機電子時鍾怎麼調星期
按鍵控制電路中共有4個按鍵,按鍵1的功能是進行日期,時間的設置。
按下1次,進入「秒」設置;按下2次,進入「分」設置;按下3次,進入「時」設置;按下4次,進入「星期」設置;按下5次,進入「日」設計;按下6次;進入「月」設置;按下7次,進入「年」設置。按鍵2的功能是增加時間或日期。按鍵3的功能是減少時間或日期。按鍵4的功能是數碼管顯示的相應時間進行加或減。
系統上電首先初始化LCD1602和定時器,設置定時器模式、開啟定時器中斷,然後循環執行更新顯示時間,實時掃描按鍵狀態。當單片機上電以後,LCD上會立即顯示出2021. 12.12 SUN 7 21:42:00即2021年12月12號,周日,21 時 42 分 0 秒,通過與實時掃描單片機 IO 口相連接的按鍵的控制可以實現對時間以及模式的調整,以調整到正確的時間和模式。
『伍』 單片機電子時鍾設計
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>#define INT8U unsigned char
#define INT16U unsigned int
#define k1() ((PIND & (1<<PD0))==0x00)
#define k2() ((PIND & (1<<PD1))==0x00)
#define k3() ((PIND & (1<<PD2))==0x00)
#define k4() ((PIND & (1<<PD3))==0x00)
#define k5() ((PIND & (1<<PD4))==0x00)
#define k6() ((PIND & (1<<PD5))==0x00)
#define k7() ((PIND & (1<<PD6))==0x00)
#define k8() ((PIND & (1<<PD7))==0x00)const INT8U seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
INT8U seg11[]={0,0,0x40,0,0,0x40,0,0};
INT8U ja;
INT8U key=0xff;
INT8U h,m,s,m1,d;
INT16U y; void hour1()
{
if (++h>23) {h=0;day();}
seg11[0]=seg[h/10];
seg11[1]=seg[h%10];
} void minute1()
{
if (++m>59)
{m=0;<br> hour1();<br> }
seg11[3]=seg[m/10];
seg11[4]=seg[m%10];
} void second1() {
if (++s>59)
{ s=0;
minute1();
}
seg11[6]=seg[s/10];
seg11[7]=seg[s%10];
} const INT8U Days1[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
const INT8U Days2[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
void year()
{if (++y>9999) y=0;<br> <br> seg11[0]=seg[y/1000];<br> seg11[1]=seg[y%1000/100];<br> seg11[2]=seg[y%100/10];<br> seg11[3]=seg[y%10];<br> } void month1()
{
if (++m1>12)
{m1=0;<br> year();<br> }
seg11[4]=seg[m1/10];
seg11[5]=seg[m1%10];
} void day()
{ INT8U DAY;
DAY=(( y%4==0 && y%100!=0 )||( y%400==0 ) ) ? Days1[m1]:Days2[m1];//判斷閏年
if(++d>DAY)
{ d=0;
month1();
}
seg11[6]=seg[d/10];
seg11[7]=seg[d%10];
} //時間函數
void time()
{
seg11[0]=seg[h/10];
seg11[1]=seg[h%10];
seg11[3]=seg[m/10];
seg11[4]=seg[m%10];
seg11[6]=seg[s/10];
seg11[7]=seg[s%10];
PORTA=0x00;
PORTA=seg11[ja]; PORTB=~(1<<ja);
ja=(ja+1)&0x07;
_delay_ms(5); }
//日期
void date()
{ seg11[0]=seg[y/1000];
seg11[1]=seg[y%1000/100];
seg11[2]=seg[y%100/10];
seg11[3]=seg[y%10];
seg11[4]=seg[m1/10];
seg11[5]=seg[m1%10];
seg11[6]=seg[d/10];
seg11[7]=seg[d%10];
//seg11[2]=seg11[5]=0x00;
PORTA=0x00;
PORTA=seg11[ja];
PORTB=~(1<<ja);
ja=(ja+1)&0x07;
_delay_ms(3);
}
int main()
{ INT8U ja=0;
DDRA=0xff; PORTA=0xff;
DDRB=0xff; PORTB=0xff;
DDRD=0x00; PORTD=0xff;PIND=0x00;
MCUCR=0X0A;//MCU 控制寄存器- MCUCR
GICR=0XC0; //通用中斷控制寄存器- GICR ASSR=0x08;
TCCR2=0x04;
TCNT2=0;
TIMSK=_BV(TOIE2)|_BV(TOIE0); d=26;y=2000;m1=2;
h=m=s=12;
sei();
while(1)
{ time();
if(k1())
/{ while(k1()); hour1(); }
if(k8())
{ while(k8());
while(2)//日期循環
{
date();
if(k8())
{while(k8());break;} }
}
}}
ISR(TIMER2_OVF_vect) {
if( seg11[2]==0x40)
{
seg11[2]=seg11[5]=0x00;
}
else
{ seg11[2]=seg11[5]=0x40;
second1();
}
}
『陸』 基於單片機電子鍾的國內外研究現狀
二十一世紀是數字化技術高速發展的時代,而單片機在數字化高速發展的時代扮演著極為重要的角色。基於單片機操控的電子鍾的開發與研究在信息化時代的今天亦是當務之急,因為它應用在學校、機關、企業、部隊等單位禮堂、訓練場地、教學室、公共場地等場合,可以說遍及人們生活的每一個角落。所以說電子萬年歷的開發是國家之所需,社會之所需,人民之所需。由於社會對信息交換不斷提高的要求及高新技術的逐步發展,促使電子萬年歷發展並且投入市場得到廣泛應用。隨著科技的快速發展,時間的流逝,從觀太陽、擺鍾到現在電子鍾,人類不斷研究,不斷創新紀錄。它可以對年、月、日、時、分、秒進行計時,還具有閏年補償等多種功能,而且DS1302的使用壽命長,誤差小。對於數字電子萬年歷採用直觀的數字顯示,可以同時顯示年、月、日、周日、時、分、秒和溫度等信息,還具有時間校準等功能。該電路採用STC89C52單片機作為核心,功耗小,能在5V的低壓工作,電壓可選用4.5~5.5V電壓供電。
『柒』 一、基於單片機的電子時鍾設計 設計內容:1、用LCD液晶作為顯示設備(30分)
http://blog.163.com/asm_c/blog/static/2482031132012330340436/
參考。
『捌』 求用單片機c語言做一個電子時鍾,實現調時、顯示、整點報時等功能。
(1)用數字邏輯集成塊實現;
(2)時間以24小時為一個周期,顯示時、分、秒;
(3)計時過程具有報時功能,當時間到達整點前5秒進行蜂鳴報時;
(4)為了保證計時的穩定及准確須由晶體振盪器提供表針時間基準信號。
c51單片機 晶振為11.0592MHz
#include<reg52.h>
#define HOUR1 1
#define HOUR0 0
#define MIN1 2
#define MIN0 8
#define SEC1 2
#define SEC0 0
#define uint unsigned int
#define ulint unsigned long int
#define uchar unsigned char
sbit la=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
int i;
ulint
sharp,second,count=0,sec0=SEC0,sec1=SEC1,min0=MIN0,min1=MIN1,hour0=HOUR0,hour1=HOUR1;//秒計數全局變數
uchar code segment[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar code time[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
void delay(uint);//程序毫秒延時
void beeper(uchar);//開蜂鳴器毫秒
void init();//初始化函數
void display();//從數碼管上顯示
void counter();//計算進行過程中的時、分、秒值
void scan();//掃描鍵盤
void main()
{
init();
while(1)
{
scan();//掃描鍵盤看是否有鍵按下
for(i=6;i>0;i--)//動態掃描6位數碼管
{
display();//顯示時、分、秒
}
}
}
void init()
{
second=hour1*36000+hour0*3600+min1*600+min0*60+sec1*10+sec0;
TMOD=0x01;
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
EA=1;
ET0=1;
TR0=1;
}
void delay(uint z)//程序毫秒延時
{
uint x=0,y=0;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer0() interrupt 1
{
TH0=(65536-46080)/256;
TL0=(65536-46080)%256;
count++;
if(count==20)//判斷是否到1秒
{
counter();//計算進行過程中的時、分、秒值
if(sharp!=hour0) beeper(1000);//判斷小時的值是否改變,變則啟動蜂鳴器
}
}
void beeper(uchar tt)
{
uchar t=tt;
count=0;
beep=0;//開蜂鳴器
delay(t);
beep=1;//關蜂鳴器
}
void display()
{
P0=0xff;//位消影(低電平選擇位)
//送位選信號
wela=1;
P0=segment[i-1];
wela=0;
P0=0x00;//段消影(高電平選擇段)
//送段選信號
la=1;
switch(i)
{
case 6 : P0=time[sec0]; break;
case 5 : P0=time[sec1]; break;
case 4 : P0=time[min0]; break;
case 3 : P0=time[min1]; break;
case 2 : P0=time[hour0]; break;
case 1 : P0=time[hour1]; break;
}
delay(1);
P0=0x00; //配合上面用於消隱
la=0;
}
void counter()
{
second++;
if(second==86400) second=0;
count=0;
sharp=hour0;//設置報時檢測KEY
sec0=second%10;
sec1=(second%60-sec0)/10;
min0=((second%3600-sec1*10-sec0)/60)%10;
min1=((second%3600-sec1*10-sec0)/60-min0)/10;
hour0=(second%36000-min1*600-min0*60-sec1*10-sec0)/3600;
hour1=second/36000;
}
void scan()
{
}
『玖』 求一段為51單片機編寫的LCD電子時鍾的設計,簡單就好!高分伺候!
簡單的時鍾,不用1302即可辦到。
題目要求的設計已經完成,電路圖如下。
程序稍長,放在我的網路空間了。
可以用網路、網頁,進行查找:
做而論道用LCD1602顯示的時鍾
網路一下,即可查到。