導航:首頁 > 操作系統 > 單片機做時鍾

單片機做時鍾

發布時間:2023-02-21 17:46:34

1. 51單片機做數字電子鍾

這么復雜的東西給這么少分 暈死了 你也太小氣了吧,分多的話還可能幫你動動腦

2. 單片機中時鍾是指什麼

單片機是依照時鍾節拍來工作的,單片機主要是靠執行先前已經編譯好的程序來工作的,程序要一條條地被執行。這樣時鍾就給執行一條條的程序做一個標准,即時鍾的多少分頻----指令周期。
時鍾的來源主要有兩種:一是來源於單片機的外部,由時鍾輸入引腳xtal0輸入,xtal1懸掛即可。另外一種就是來源於單片機的內部時鍾源,但需要外部接晶體振盪器(接在xtal0和xtal1端)和電容,這兩個引腳的時鍾源是可以輸出到外部的,具體的使用應該還需要先接上分頻器再使用,和一般的時鍾源差不多。

3. 單片機做時鍾程序

基於DS1302的日歷時鍾
#include<reg51.h> //包含單片機寄存器的頭文件
#include<intrins.h> //包含_nop_()函數定義的頭文件
/***********************************************************************
以下是DS1302晶元的操作程序
************************************************************************/
unsigned char code digit[10]={"0123456789"}; //定義字元數組顯示數字
sbit DATA=P1^1; //位定義1302晶元的介面,數據輸出端定義在P1.1引腳
sbit RST=P1^2; //位定義1302晶元的介面,復位埠定義在P1.1引腳
sbit SCLK=P1^0; //位定義1302晶元的介面,時鍾輸出埠定義在P1.1引腳
/*****************************************************
函數功能:延時若干微秒
入口參數:n
***************************************************/
void delaynus(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
;
}
/*****************************************************
函數功能:向1302寫一個位元組數據
入口參數:x
***************************************************/
void Write1302(unsigned char dat)
{
unsigned char i;
SCLK=0; //拉低SCLK,為脈沖上升沿寫入數據做好准備
delaynus(2); //稍微等待,使硬體做好准備
for(i=0;i<8;i++) //連續寫8個二進制位數據
{
DATA=dat&0x01; //取出dat的第0位數據寫入1302
delaynus(2); //稍微等待,使硬體做好准備
SCLK=1; //上升沿寫入數據
delaynus(2); //稍微等待,使硬體做好准備
SCLK=0; //重新拉低SCLK,形成脈沖
dat>>=1; //將dat的各數據位右移1位,准備寫入下一個數據位
}

}
/*****************************************************
函數功能:根據命令字,向1302寫一個位元組數據
入口參數:Cmd,儲存命令字;dat,儲存待寫的數據
***************************************************/
void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
RST=0; //禁止數據傳遞
SCLK=0; //確保寫數居前SCLK被拉低
RST=1; //啟動數據傳輸
delaynus(2); //稍微等待,使硬體做好准備
Write1302(Cmd); //寫入命令字
Write1302(dat); //寫數據
SCLK=1; //將時鍾電平置於已知狀態
RST=0; //禁止數據傳遞
}
/*****************************************************
函數功能:從1302讀一個位元組數據
入口參數:x
***************************************************/
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2); //稍微等待,使硬體做好准備
for(i=0;i<8;i++) //連續讀8個二進制位數據
{
dat>>=1; //將dat的各數據位右移1位,因為先讀出的是位元組的最低位
if(DATA==1) //如果讀出的數據是1
dat|=0x80; //將1取出,寫在dat的最高位
SCLK=1; //將SCLK置於高電平,為下降沿讀出
delaynus(2); //稍微等待
SCLK=0; //拉低SCLK,形成脈沖下降沿
delaynus(2); //稍微等待
}
return dat; //將讀出的數據返回
}
/*****************************************************
函數功能:根據命令字,從1302讀取一個位元組數據
入口參數:Cmd
***************************************************/
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0; //拉低RST
SCLK=0; //確保寫數居前SCLK被拉低
RST=1; //啟動數據傳輸
Write1302(Cmd); //寫入命令字
dat=Read1302(); //讀出數據
SCLK=1; //將時鍾電平置於已知狀態
RST=0; //禁止數據傳遞
return dat; //將讀出的數據返回
}
/*****************************************************
函數功能: 1302進行初始化設置
***************************************************/
void Init_DS1302(void)
{
WriteSet1302(0x8E,0x00); //根據寫狀態寄存器命令字,寫入不保護指令
WriteSet1302(0x80,((0/10)<<4|(0%10))); //根據寫秒寄存器命令字,寫入秒的初始值
WriteSet1302(0x82,((0/10)<<4|(0%10))); //根據寫分寄存器命令字,寫入分的初始值
WriteSet1302(0x84,((12/10)<<4|(12%10))); //根據寫小時寄存器命令字,寫入小時的初始值
WriteSet1302(0x86,((16/10)<<4|(16%10))); //根據寫日寄存器命令字,寫入日的初始值
WriteSet1302(0x88,((11/10)<<4|(11%10))); //根據寫月寄存器命令字,寫入月的初始值
WriteSet1302(0x8c,((8/10)<<4|(8%10))); //根據寫小時寄存器命令字,寫入小時的初始值
}
/*******************************************************************************
以下是對液晶模塊的操作程序
*******************************************************************************/
sbit RS=P2^0; //寄存器選擇位,將RS位定義為P2.0引腳
sbit RW=P2^1; //讀寫選擇位,將RW位定義為P2.1引腳
sbit E=P2^2; //使能信號位,將E位定義為P2.2引腳
sbit BF=P0^7; //忙碌標志位,,將BF位定義為P0.7引腳
/*****************************************************
函數功能:延時1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函數功能:延時若干毫秒
入口參數:n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
/*****************************************************
函數功能:判斷液晶模塊的忙碌狀態
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
bit BusyTest(void)
{
bit result;
RS=0; //根據規定,RS為低電平,RW為高電平時,可以讀狀態
RW=1;
E=1; //E=1,才允許讀寫
_nop_(); //空操作
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
result=BF; //將忙碌標志電平賦給result
E=0; //將E恢復低電平
return result;
}
/*****************************************************
函數功能:將模式設置指令或顯示地址寫入液晶模塊
入口參數:dictate
***************************************************/
void WriteInstruction (unsigned char dictate)
{
while(BusyTest()==1); //如果忙就等待
RS=0; //根據規定,RS和R/W同時為低電平時,可以寫入指令
RW=0;
E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,
// 就是讓E從0到1發生正跳變,所以應先置"0"
_nop_();
_nop_(); //空操作兩個機器周期,給硬體反應時間
P0=dictate; //將數據送入P0口,即寫入指令或地址
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=1; //E置高電平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:指定字元顯示的實際地址
入口參數:x
***************************************************/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); //顯示位置的確定方法規定為"80H+地址碼x"
}
/*****************************************************
函數功能:將數據(字元的標准ASCII碼)寫入液晶模塊
入口參數:y(為字元常量)
***************************************************/
void WriteData(unsigned char y)
{
while(BusyTest()==1);
RS=1; //RS為高電平,RW為低電平時,可以寫入數據
RW=0;
E=0; //E置低電平(根據表8-6,寫指令時,E為高脈沖,
// 就是讓E從0到1發生正跳變,所以應先置"0"
P0=y; //將數據送入P0口,即將數據寫入液晶模塊
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=1; //E置高電平
_nop_();
_nop_();
_nop_();
_nop_(); //空操作四個機器周期,給硬體反應時間
E=0; //當E由高電平跳變成低電平時,液晶模塊開始執行命令
}
/*****************************************************
函數功能:對LCD的顯示模式進行初始化設置
***************************************************/
void LcdInitiate(void)
{
delaynms(15); //延時15ms,首次寫指令時應給LCD一段較長的反應時間
WriteInstruction(0x38); //顯示模式設置:16×2顯示,5×7點陣,8位數據介面
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x38);
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x38); //連續三次,確保初始化成功
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x0c); //顯示模式設置:顯示開,無游標,游標不閃爍
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x06); //顯示模式設置:游標右移,字元不移
delaynms(5); //延時5ms,給硬體一點反應時間
WriteInstruction(0x01); //清屏幕指令,將以前的顯示內容清除
delaynms(5); //延時5ms,給硬體一點反應時間

}
/**************************************************************
以下是1302數據的顯示程序
**************************************************************/
/*****************************************************
函數功能:顯示秒
入口參數:x
***************************************************/
void DisplaySecond(unsigned char x)
{
unsigned char i,j; //j,k,l分別儲存溫度的百位、十位和個位
i=x/10;//取十位
j=x%10;//取個位
WriteAddress(0x49); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[i]); //將百位數字的字元常量寫入LCD
WriteData(digit[j]); //將十位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}

/*****************************************************
函數功能:顯示分鍾
入口參數:x
***************************************************/
void DisplayMinute(unsigned char x)
{
unsigned char i,j; //j,k,l分別儲存溫度的百位、十位和個位
i=x/10;//取十位
j=x%10;//取個位
WriteAddress(0x46); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[i]); //將百位數字的字元常量寫入LCD
WriteData(digit[j]); //將十位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示小時
入口參數:x
***************************************************/
void DisplayHour(unsigned char x)
{
unsigned char i,j; //j,k,l分別儲存溫度的百位、十位和個位
i=x/10;//取十位
j=x%10;//取個位
WriteAddress(0x43); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[i]); //將百位數字的字元常量寫入LCD
WriteData(digit[j]); //將十位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示日
入口參數:x
***************************************************/
void DisplayDay(unsigned char x)
{
unsigned char i,j; //j,k,l分別儲存溫度的百位、十位和個位
i=x/10;//取十位
j=x%10;//取個位
WriteAddress(0x0c); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[i]); //將百位數字的字元常量寫入LCD
WriteData(digit[j]); //將十位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示月
入口參數:x
***************************************************/
void DisplayMonth(unsigned char x)
{
unsigned char i,j; //j,k,l分別儲存溫度的百位、十位和個位
i=x/10;//取十位
j=x%10;//取個位
WriteAddress(0x09); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[i]); //將百位數字的字元常量寫入LCD
WriteData(digit[j]); //將十位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}
/*****************************************************
函數功能:顯示年
入口參數:x
***************************************************/
void DisplayYear(unsigned char x)
{
unsigned char i,j; //j,k,l分別儲存溫度的百位、十位和個位
i=x/10;//取十位
j=x%10;//取個位
WriteAddress(0x06); //寫顯示地址,將在第2行第7列開始顯示
WriteData(digit[i]); //將百位數字的字元常量寫入LCD
WriteData(digit[j]); //將十位數字的字元常量寫入LCD
delaynms(50); //延時1ms給硬體一點反應時間
}

/*****************************************************
函數功能:主函數
***************************************************/
void main(void)
{
unsigned char second,minute,hour,day,month,year; //分別儲存苗、分、小時,日,月,年
unsigned char ReadValue; //儲存從1302讀取的數據
LcdInitiate(); //將液晶初始化
WriteAddress(0x01); //寫Date的顯示地址,將在第1行第2列開始顯示
WriteData('D'); //將字元常量寫入LCD
WriteData('a'); //將字元常量寫入LCD
WriteData('t'); //將字元常量寫入LCD
WriteData('e'); //將字元常量寫入LCD
WriteData(':'); //將字元常量寫入LCD
WriteAddress(0x08); //寫年月分隔符的顯示地址, 顯示在第1行第9列
WriteData('-'); //將字元常量寫入LCD
WriteAddress(0x0b); //寫月日分隔符的顯示地址, 顯示在第1行第12列
WriteData('-'); //將字元常量寫入LCD
WriteAddress(0x45); //寫小時與分鍾分隔符的顯示地址, 顯示在第2行第6列
WriteData(':'); //將字元常量寫入LCD
WriteAddress(0x48); //寫分鍾與秒分隔符的顯示地址, 顯示在第2行第9列
WriteData(':'); //將字元常量寫入LCD
Init_DS1302(); //將1302初始化
while(1)
{
ReadValue = ReadSet1302(0x81); //從秒寄存器讀數據
second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//將讀出數據轉化
DisplaySecond(second); //顯示秒
ReadValue = ReadSet1302(0x83); //從分寄存器讀
minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出數據轉化
DisplayMinute(minute); //顯示分
ReadValue = ReadSet1302(0x85); //從分寄存器讀
hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出數據轉化
DisplayHour(hour); //顯示小時
ReadValue = ReadSet1302(0x87); //從分寄存器讀
day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出數據轉化
DisplayDay(day); //顯示日
ReadValue = ReadSet1302(0x89); //從分寄存器讀
month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出數據轉化
DisplayMonth(month); //顯示月
ReadValue = ReadSet1302(0x8d); //從分寄存器讀
year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); //將讀出數據轉化
DisplayYear(year); //顯示年
}
}

改改 就是你的了

4. 用51單片機編寫時鍾程序

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4;
sbit rs=P3^5;
sbit la=P2^6;
sbit wela=P2^7;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit rd=P3^7;
uchar num,count,s1num;
uchar code table[]=" 2007-7-30 MON";
uchar code table1[]=" 00:00:00 ";
char shi,fen,miao;
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcden=0;
rs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;

}
void write_date(uchar date)
{
lcden=0;
rs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;

}
void init()
{
wela=0;
la=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<13;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<11;num++)
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0X80+0X40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void keyscan()
{
rd=0;
if(s1==0)
{
delay(5);
if(s1==0)
{
while(!s1);
s1num++;
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+10) ;
write_com(0x0f);
}
if(s1num==2)
{
write_com(0x80+0x40+7);
}
if(s1num==3)
{
write_com(0x80+0x40+7);
}
if(s1num==4)
{
s1num=0;
TR0=1;
write_com(0x0c);

}
}
}
if(!s1num)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}

}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}

}
}
}

}
void main()
{
init();
while(1)
{
keyscan();
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);

}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}

5. 基於單片機的數字時鍾怎麼做

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit la=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit rd=P3^7;
uchar count,s1num;
char miao,shi,fen;
uchar code table[]=" 2007-7-30 MON";
uchar code table1[]=" 00:00:00";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}

void init()
{
uchar num;
la=0;
wela=0;
lcden=0;
// fen=59;
// miao=53;
// shi=23;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}

void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}

void keyscan()
{
rd=0;
if(s1==0)
{
delay(5);
if(s1==0)
{ s1num++;
while(!s1);
if(s1num==1)
{
TR0=0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
}
if(s1num==2)
{
write_com(0x80+0x40+7);
}
if(s1num==3)
{
write_com(0x80+0x40+4);
}
if(s1num==4)
{
s1num=0;
write_com(0x0c);
TR0=1;
}

}
if(s1num!=0)
{
if(s2==0)
{
delay(5);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(10,miao);
write_com(0x80+0x40+10);

}
if(s1num==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
if(s3==0)
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
/* if(miao==0)
{
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}*/
miao--;
if(miao==-1)
miao=59;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();

}
// while(1);
}

void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==18)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);

}
}

這個是數字時鍾的源程序,用12864夜晶顯示。

6. 怎樣用單片機做時鍾

在電腦裡面翻翻,找到一個上學時候做的電子鍾程序。你將就看看吧。可以幫你找找思路。。。//*********************************////************電子時鍾**********////*********************************//#include <reg51.h>
#include <intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit P10=P1^0;
sbit P31=P3^1;
sbit P32=P3^2;
sbit P33=P3^3;
sbit P34=P3^4;
sbit P35=P3^5;uchar bdata SYSflag;
sbit HMexchangflag = SYSflag^0;uchar led[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0xff}; //0123456789 off/*定義並初始化變數*/
uchar second=0;
uchar minite=0;
uchar hour=12;
uchar sec20;
/*函數聲明*/
void delay(uchar k ); //延時子程序
void time( ); //時間處理子程序
void xianshi( ); //顯示子程序
void tiaozheng(); //時間調整子程序
void dingshi(); //定時子程序 /*****************************/
/*延時子程序*/
/****************************/
void delay (uchar k)
{
uchar j;
while((k--)!=0)
{
for(j=0;j<125;j++)
{;}
}
}

/**************************/
/*時間處理子程序*/
/**************************/
void time( void)
{
if(second==60) //秒鍾設為60進制
{ second=0;
minite++;
if( minite==60) //分鍾設為60進制
{ minite=0;
hour++;
if(hour==24) //時鍾設為24進制
{hour=0; }
}
}

}
/*****************************/
/* 顯示子程序*/
/*****************************/
void xianshi(void)
{
P2=0x01;
P1=led[hour/10]; //顯示小時的十位
delay(4);
P2=0x02;
P1=led[hour%10]; //顯示小時的個位
delay(4);
P2=0x04;
P1=led[minite/10]; //顯示分的十位
delay(4);
P2=0x08;
P1=led[minite%10]; //顯示分的個位
delay(4);
P2=0x10;
P1=led[second/10];
delay(4);
P2=0x20;
P1=led[second%10];
delay(4);
}
/**************************/
/**時間調整子程序*/
/*************************/
void tiaozheng()
{
if (P10==0)
{
delay(100);
if (P10==0)
{
if(HMexchangflag)
{
hour++;
if(hour==24)
{hour=0;}
}
else
{
minite++;
if(minite==59)
{minite=0;}
}
}
} }
/**************************/
/*主函數*/
/**************************/
void main(void)
{ P1=0xff; //初始化p1口,全設為1
TMOD=0x01; //time0為定時器,方式1
TH0=0x3c; //預置計數初值
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
while (1)
{

time( ); //時間處理
xianshi( ); //顯示時間
tiaozheng(); //調整時間
}
}
/********************************
外部中斷0服務子函數
*********************************/
void Exoint() interrupt 0
{
HMexchangflag= ~HMexchangflag;
}//定時Timer0中斷服務子程序-------------------
void timer0(void) interrupt 1 using 0 //定時器0方式1,100ms中斷一次
{
TH0=0x3c;
TL0=0xb0;
sec20++;
if(sec20==10)
{
second++;
sec20=0;
}
}

7. 用單片機做電子時鍾需要的材料

做電子時鍾需要的材料:
1 6個七段數碼管(2個顯示:0~23小時 、2個顯示:0~59分、2個顯示:0~59秒)
2 6個三極體 作為 6個七段數碼管的驅動
3 一個51單片機(P1口作為6個七段數碼管的段形控制、P2口作為七段數碼管的位控、動態顯示)
4 需要4個微動按鈕,可以分別用來設置或修改小時、分、秒的按鍵。
5 需要電阻或電阻排(220歐姆、10K)
6 最後就是需要焊接工具:電烙鐵一把20~30瓦、焊錫一卷。
7 電路板 可以使用簡易的實驗電路板

呵呵 滿意 就選滿意回答啊

8. 用單片機製作一個簡易的時鍾。。

#include<reg52.h>
#include"segnumca.h"
#define uchar unsigned char
sbit _speak=P1^0; //蜂鳴器P1^0
uchar hello_[]={0x89,0x86,0xc7,0xc7,0xc0,0xf7}; //HELLO_
uchar con[]={0x01,0x02,0x04,0x08,0x10,0x20}; //位控制
uchar time0=100;
uchar i=0;
uchar s,m,h;
void delay(); //0.3s
void intr_(); //int0\1初始化
/*********************************
主函數
*********************************/
void main()
{
s=m=h=0;
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
TR0=1;
ET0=1;
EA=1;
intr_();
while(time0>10)
{
P2=con[i];
P0=hello_[i];
i++;
if(i>=6)i=0;
delay();
}
i=0;
while(1)
{
P2=con[i];
switch(i)
{
case 0:P0=seg[h/10];break;
case 1:P0=seg[h%10]+0x80;break;
case 2:P0=seg[m/10];break;
case 3:P0=seg[m%10]+0x80;break;
case 4:P0=seg[s/10];break;
case 5:P0=seg[s%10];break;
}
i++;
if(i>=6)i=0;
delay();
}
}
/****************************
T0
****************************/
void isr_time0() interrupt 1
{
TH0=0x3c;
TL0=0xb0;
time0--;
if(!time0)
{
time0=20;
s++;
if(s>=60)
{
s=0;
m++;
if(m>=60)
{
m=0;
h++;
if(h>=24)
{
h=0;
}
}
}
}
}
/*************************
外中斷初始化
*************************/
void intr_()
{
IT0=1;IT1=1;EX0=1;EX1=1;
}
/**************************
for延時
**************************/
void delay() //大約延時0.3秒
{
unsigned char delay0,delay1;
for(delay0=0;delay0<5;delay0++)
for(delay1=0;delay1<255;delay1++);
}
/*********************************************
INT0
*********************************************/
void intr_0() interrupt 0
{
m++;
if(m>=60)m=0;
}
/*********************************************
INT1
*********************************************/
void intr_1() interrupt 2
{
h++;
if(h>=24)h=0;
}

9. 怎麼用51單片機做一個時鍾

  1. 一片單片機+一個LED數碼模塊或LCD液晶模塊+一段簡單的程序=一個簡單的時鍾。

  2. 一片單片機+一片DS1302或其他的時基晶元+一個LED數碼模塊或LCD液晶模塊+一段簡單的程序=一個實用的時鍾。

  3. 系統構成確定了以後,程序就有現成的了,可以移步到網路網頁「網路一下」里搜索,資源多如牛毛。

10. 用單片機設計一個數字時鍾

#include <REG51.H>#include <intrins.h> #define uint unsigned int#define uchar unsigned charsbit DS1302_CLK = P1^7; //實時時鍾時鍾線引腳 sbit DS1302_IO = P1^6; //實時時鍾數據線引腳 sbit DS1302_RST = P1^5; //實時時鍾復位線引腳sbit wireless_1 = P3^0;sbit wireless_2 = P3^1;sbit wireless_3 = P3^2;sbit wireless_4 = P3^3; //無線控制sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,時到日,月,年位閃的計數sbit Set = P2^0; //模式切換鍵sbit Up = P2^1; //加法按鈕sbit Down = P2^2; //減法按鈕sbit out = P2^3; //立刻跳出調整模式按鈕sbit DQ = P1^0; //溫度傳送數據IO口char done,count,temp,flag,up_flag,down_flag;uchar temp_value; //溫度值uchar TempBuffer[5],week_value[2]; void show_time(); //液晶顯示程序/***********1602液晶顯示部分子程序****************///Port Definitions**********************************************************sbit LcdRs = P2^5;sbit LcdRw = P2^6;sbit LcdEn = P2^7;sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據埠 //內部等待函數**************************************************************************unsigned char LCD_Wait(void){ LcdRs=0; LcdRw=1; _nop_(); LcdEn=1; _nop_(); LcdEn=0; return DBPort; }//向LCD寫入命令或數據************************************************************#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 游標返回原點void LCD_Write(bit style, unsigned char input){ LcdEn=0; LcdRs=style; LcdRw=0; _nop_(); DBPort=input; _nop_();//注意順序 LcdEn=1; _nop_();//注意順序 LcdEn=0; _nop_(); LCD_Wait(); } //設置顯示模式************************************************************#define LCD_SHOW 0x04 //顯示開#define LCD_HIDE 0x00 //顯示關 #define LCD_CURSOR 0x02 //顯示游標#define LCD_NO_CURSOR 0x00 //無游標 #define LCD_FLASH 0x01 //游標閃動#define LCD_NO_FLASH 0x00 //游標不閃動 void LCD_SetDisplay(unsigned char DisplayMode){ LCD_Write(LCD_COMMAND, 0x08|DisplayMode); } //設置輸入模式************************************************************#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default #define LCD_MOVE 0x01 // 畫面可平移#define LCD_NO_MOVE 0x00 //default void LCD_SetInput(unsigned char InputMode){ LCD_Write(LCD_COMMAND, 0x04|InputMode);} //初始化LCD************************************void LCD_Initial(){ LcdEn=0; LCD_Write(LCD_COMMAND,0x38); //8位數據埠,2行顯示,5*7點陣 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //開啟顯示, 無游標 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC遞增, 畫面不動} //液晶字元輸入的位置************************void GotoXY(unsigned char x, unsigned char y){ if(y==0) LCD_Write(LCD_COMMAND,0x80|x); if(y==1) LCD_Write(LCD_COMMAND,0x80|(x-0x40));} //將字元輸出到液晶顯示void Print(unsigned char *str){ while(*str!='\0') { LCD_Write(LCD_DATA,*str); str++; }} /***********DS1302時鍾部分子程序******************/typedef struct __SYSTEMTIME__{ unsigned char Second; unsigned char Minute; unsigned char Hour; unsigned char Week; unsigned char Day; unsigned char Month; unsigned char Year; unsigned char DateString[11]; unsigned char TimeString[9];}SYSTEMTIME; //定義的時間類型SYSTEMTIME CurrentTime; #define AM(X) X#define PM(X) (X+12) // 轉成24小時制#define DS1302_SECOND 0x80 //時鍾晶元的寄存器位置,存放時間#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84 #define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8C void DS1302InputByte(unsigned char d) //實時時鍾寫入一位元組(內部函數){ unsigned char i; ACC = d; for(i=8; i>0; i--) { DS1302_IO = ACC0; //相當於匯編中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } } unsigned char DS1302OutputByte(void) //實時時鍾讀取一位元組(內部函數){ unsigned char i; for(i=8; i>0; i--) { ACC = ACC >>1; //相當於匯編中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; } return(ACC); } void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要寫的數據{ DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); // 地址,命令 DS1302InputByte(ucDa); // 寫1Byte數據 DS1302_CLK = 1; DS1302_RST = 0;} unsigned char Read1302(unsigned char ucAddr) //讀取DS1302某地址的數據{ unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); // 地址,命令 ucData = DS1302OutputByte(); // 讀1Byte數據 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);} void DS1302_GetTime(SYSTEMTIME *Time) //獲取時鍾晶元的時鍾數據到自定義的結構型數組{ unsigned char ReadValue; ReadValue = Read1302(DS1302_SECOND); Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MINUTE); Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_HOUR); Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_DAY); Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_WEEK); Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_MONTH); Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue = Read1302(DS1302_YEAR); Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); } void DateToStr(SYSTEMTIME *Time) //將時間年,月,日,星期數據轉換成液晶顯示字元串,放到數組里DateString[]{ if(hide_year<2) //這里的if,else語句都是判斷位閃爍,<2顯示數據,>2就不顯示,輸出字元串為 2007/07/22 { Time->DateString[0] = '2'; Time->DateString[1] = '0'; Time->DateString[2] = Time->Year/10 + '0'; Time->DateString[3] = Time->Year%10 + '0'; } else { Time->DateString[0] = ' '; Time->DateString[1] = ' '; Time->DateString[2] = ' '; Time->DateString[3] = ' '; } Time->DateString[4] = '/'; if(hide_month<2) { Time->DateString[5] = Time->Month/10 + '0'; Time->DateString[6] = Time->Month%10 + '0'; } else { Time->DateString[5] = ' '; Time->DateString[6] = ' '; } Time->DateString[7] = '/'; if(hide_day<2) { Time->DateString[8] = Time->Day/10 + '0'; Time->DateString[9] = Time->Day%10 + '0'; } else { Time->DateString[8] = ' '; Time->DateString[9] = ' '; } if(hide_week<2) { week_value[0] = Time->Week%10 + '0'; //星期的數據另外放到 week_value[]數組里,跟年,月,日的分開存放,因為等一下要在最後顯示 } else { week_value[0] = ' '; } week_value[1] = '\0'; Time->DateString[10] = '\0'; //字元串末尾加 '\0' ,判斷結束字元} void TimeToStr(SYSTEMTIME *Time) //將時,分,秒數據轉換成液晶顯示字元放到數組 TimeString[];{ if(hide_hour<2) { Time->TimeString[0] = Time->Hour/10 + '0'; Time->TimeString[1] = Time->Hour%10 + '0'; } else { Time->TimeString[0] = ' '; Time->TimeString[1] = ' '; } Time->TimeString[2] = ':'; if(hide_min<2) { Time->TimeString[3] = Time->Minute/10 + '0'; Time->TimeString[4] = Time->Minute%10 + '0'; } else { Time->TimeString[3] = ' '; Time->TimeString[4] = ' '; } Time->TimeString[5] = ':'; if(hide_sec<2) { Time->TimeString[6] = Time->Second/10 + '0'; Time->TimeString[7] = Time->Second%10 + '0'; } else { Time->TimeString[6] = ' '; Time->TimeString[7] = ' '; } Time->DateString[8] = '\0';} void Initial_DS1302(void) //時鍾晶元初始化{ unsigned char Second=Read1302(DS1302_SECOND); if(Second&0x80) //判斷時鍾晶元是否關閉 { Write1302(0x8e,0x00); //寫入允許 Write1302(0x8c,0x07); //以下寫入初始化時間 日期:07/07/25.星期: 3. 時間: 23:59:55 Write1302(0x88,0x07); Write1302(0x86,0x25); Write1302(0x8a,0x07); Write1302(0x84,0x23); Write1302(0x82,0x59); Write1302(0x80,0x55); Write1302(0x8e,0x80); //禁止寫入 } } /***********ds18b20子程序*************************/ /***********ds18b20延遲子函數(晶振12MHz )*******/ void delay_18B20(unsigned int i){ while(i--);} /**********ds18b20初始化函數**********************/ void Init_DS18B20(void) { unsigned char x=0; DQ = 1; //DQ復位 delay_18B20(8); //稍做延時 DQ = 0; //單片機將DQ拉低 delay_18B20(80); //精確延時 大於 480us DQ = 1; //拉高匯流排 delay_18B20(14); x=DQ; //稍做延時後 如果x=0則初始化成功 x=1則初始化失敗 delay_18B20(20);} /***********ds18b20讀一個位元組**************/ unsigned char ReadOneChar(void){ uchar i=0; uchar dat = 0; for (i=8;i>0;i--) { DQ = 0; // 給脈沖信號 dat>>=1; DQ = 1; // 給脈沖信號 if(DQ) dat|=0x80; delay_18B20(4); } return(dat);} /*************ds18b20寫一個位元組****************/ void WriteOneChar(uchar dat){ unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; }} /**************讀取ds18b20當前溫度************/ void ReadTemp(void){ unsigned char a=0; unsigned char b=0; unsigned char t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳過讀序號列號的操作 WriteOneChar(0x44); // 啟動溫度轉換 delay_18B20(100); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳過讀序號列號的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度 delay_18B20(100); a=ReadOneChar(); //讀取溫度值低位 b=ReadOneChar(); //讀取溫度值高位 temp_value=b<<4; temp_value+=(a&0xf0)>>4; }void temp_to_str() //溫度數據轉換成液晶字元顯示{ TempBuffer[0]=temp_value/10+'0'; //十位 TempBuffer[1]=temp_value%10+'0'; //個位 TempBuffer[2]=0xdf; //溫度符號 TempBuffer[3]='C'; TempBuffer[4]='\0';}void Delay1ms(unsigned int count){ unsigned int i,j; for(i=0;i<count;i++) for(j=0;j<120;j++);} /*延時子程序*/void mdelay(uint delay){ uint i; for(;delay>0;delay--) {for(i=0;i<62;i++) //1ms延時. {;} }}

閱讀全文

與單片機做時鍾相關的資料

熱點內容
伺服器無影響是怎麼回事 瀏覽:950
比德電子采購平台加密 瀏覽:200
加密貨幣400億 瀏覽:524
植發2次加密 瀏覽:44
vc6查看編譯的錯誤 瀏覽:595
心理大全pdf 瀏覽:1002
區域鏈加密幣怎麼樣 瀏覽:343
查找命令符 瀏覽:95
壓縮工具zar 瀏覽:735
白盤怎麼解壓 瀏覽:474
辰語程序員學習筆記 瀏覽:47
程序員被公司勸退 瀏覽:523
java三子棋 瀏覽:692
加密空間怎麼強制進入 瀏覽:345
ug分割曲線命令 瀏覽:209
學碼思程序員 瀏覽:609
自考雲學習app為什麼登不上 瀏覽:410
domcer伺服器晝夜更替怎麼搞 瀏覽:436
plc和單片機哪個好 瀏覽:535
帝國神話組建雲伺服器 瀏覽:827