導航:首頁 > 操作系統 > 電子時鍾51單片機

電子時鍾51單片機

發布時間:2022-10-04 21:48:53

⑴ 51單片機控制的電子時鍾系統 畢業設計

可以用1302做
我有現成的
LCD1602
顯示的,51做的
基本思路是用單片機讀取1302裡面的信息,處理,然後送LCD1602顯示。
有興趣可以去我博客看,裡面還上傳了之前我做的實物圖片和PCB,可以照著做。

⑵ 51單片機的時鍾電路產生方法是

51單片機的時鍾電路產生的方法是什麼呢?
這種單片機的時鍾電路一般是利用晶振構建電路的,
因為晶振電路振盪性能相當穩定。

⑶ 51單片機設計電子時鍾。

#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^0;
sbit key2=P3^1;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar shi,fen,miao,num1 ,num2,num3,num4,num5,num6,num7;
void delayms (uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void miaodisplay (uchar num6,uchar num5)
{
P2=0x00;
P2=0x80;
P1=table[num6];
delayms(5);
P2=0x00;
P2=0x40;
P1=table[num5];
delayms(5);
}
void fendisplay(uchar num4,uchar num3)
{
P2=0x00;
P2=0x10;
P1=table[num4];
delayms(5);
P2=0x00;
P2=0x08;
P1=table[num3];
delayms(5);
}
void shidisplay(uchar num2,uchar num1)
{
P2=0x00;
P2=0x02;
P1=table[num2];
delayms(5);
P2=0x00;
P2=0x01;
P1=table[num1];
delayms(5);
}

void main ()
{
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
shi=0;
fen=0;
miao=0;
num7=0;
while (1)
{
num1=shi/10;
num2=shi%10;
num3=fen/10;
num4=fen%10;
num5=miao/10;
num6=miao%10;
miaodisplay(num6,num5);
P2=0x00;
P2=0x20;
P1=0xbf;
delayms(5);
fendisplay(num4,num3);
P2=0x00;
P2=0x04;
P1=0xbf;
delayms(5);
shidisplay(num2,num1);

}
}
void T0_time () interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
num7++;
if(num7==20)
{
num7=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
fen=0;
miao=0;
}
}
}
}
}

⑷ 51單片機製作電子鍾

農歷轉換需要以個資料庫,我贈送你一C語言的農歷轉換

#define c_sun 0

/********陽歷轉換陰歷********************************************************************/
code uchar year_code[597]={
0x04,0xAe,0x53, //1901 0
0x0A,0x57,0x48, //1902 3
0x55,0x26,0xBd, //1903 6
0x0d,0x26,0x50, //1904 9
0x0d,0x95,0x44, //1905 12
0x46,0xAA,0xB9, //1906 15
0x05,0x6A,0x4d, //1907 18
0x09,0xAd,0x42, //1908 21
0x24,0xAe,0xB6, //1909
0x04,0xAe,0x4A, //1910
0x6A,0x4d,0xBe, //1911
0x0A,0x4d,0x52, //1912
0x0d,0x25,0x46, //1913
0x5d,0x52,0xBA, //1914
0x0B,0x54,0x4e, //1915
0x0d,0x6A,0x43, //1916
0x29,0x6d,0x37, //1917
0x09,0x5B,0x4B, //1918
0x74,0x9B,0xC1, //1919
0x04,0x97,0x54, //1920
0x0A,0x4B,0x48, //1921
0x5B,0x25,0xBC, //1922
0x06,0xA5,0x50, //1923
0x06,0xd4,0x45, //1924
0x4A,0xdA,0xB8, //1925
0x02,0xB6,0x4d, //1926
0x09,0x57,0x42, //1927
0x24,0x97,0xB7, //1928
0x04,0x97,0x4A, //1929
0x66,0x4B,0x3e, //1930
0x0d,0x4A,0x51, //1931
0x0e,0xA5,0x46, //1932
0x56,0xd4,0xBA, //1933
0x05,0xAd,0x4e, //1934
0x02,0xB6,0x44, //1935
0x39,0x37,0x38, //1936
0x09,0x2e,0x4B, //1937
0x7C,0x96,0xBf, //1938
0x0C,0x95,0x53, //1939
0x0d,0x4A,0x48, //1940
0x6d,0xA5,0x3B, //1941
0x0B,0x55,0x4f, //1942
0x05,0x6A,0x45, //1943
0x4A,0xAd,0xB9, //1944
0x02,0x5d,0x4d, //1945
0x09,0x2d,0x42, //1946
0x2C,0x95,0xB6, //1947
0x0A,0x95,0x4A, //1948
0x7B,0x4A,0xBd, //1949
0x06,0xCA,0x51, //1950
0x0B,0x55,0x46, //1951
0x55,0x5A,0xBB, //1952
0x04,0xdA,0x4e, //1953
0x0A,0x5B,0x43, //1954
0x35,0x2B,0xB8, //1955
0x05,0x2B,0x4C, //1956
0x8A,0x95,0x3f, //1957
0x0e,0x95,0x52, //1958
0x06,0xAA,0x48, //1959
0x7A,0xd5,0x3C, //1960
0x0A,0xB5,0x4f, //1961
0x04,0xB6,0x45, //1962
0x4A,0x57,0x39, //1963
0x0A,0x57,0x4d, //1964
0x05,0x26,0x42, //1965
0x3e,0x93,0x35, //1966
0x0d,0x95,0x49, //1967
0x75,0xAA,0xBe, //1968
0x05,0x6A,0x51, //1969
0x09,0x6d,0x46, //1970
0x54,0xAe,0xBB, //1971
0x04,0xAd,0x4f, //1972
0x0A,0x4d,0x43, //1973
0x4d,0x26,0xB7, //1974
0x0d,0x25,0x4B, //1975
0x8d,0x52,0xBf, //1976
0x0B,0x54,0x52, //1977
0x0B,0x6A,0x47, //1978
0x69,0x6d,0x3C, //1979
0x09,0x5B,0x50, //1980
0x04,0x9B,0x45, //1981
0x4A,0x4B,0xB9, //1982
0x0A,0x4B,0x4d, //1983
0xAB,0x25,0xC2, //1984
0x06,0xA5,0x54, //1985
0x06,0xd4,0x49, //1986
0x6A,0xdA,0x3d, //1987
0x0A,0xB6,0x51, //1988
0x09,0x37,0x46, //1989
0x54,0x97,0xBB, //1990
0x04,0x97,0x4f, //1991
0x06,0x4B,0x44, //1992
0x36,0xA5,0x37, //1993
0x0e,0xA5,0x4A, //1994
0x86,0xB2,0xBf, //1995
0x05,0xAC,0x53, //1996
0x0A,0xB6,0x47, //1997
0x59,0x36,0xBC, //1998
0x09,0x2e,0x50, //1999 294
0x0C,0x96,0x45, //2000 297
0x4d,0x4A,0xB8, //2001
0x0d,0x4A,0x4C, //2002
0x0d,0xA5,0x41, //2003
0x25,0xAA,0xB6, //2004
0x05,0x6A,0x49, //2005
0x7A,0xAd,0xBd, //2006
0x02,0x5d,0x52, //2007
0x09,0x2d,0x47, //2008
0x5C,0x95,0xBA, //2009
0x0A,0x95,0x4e, //2010
0x0B,0x4A,0x43, //2011
0x4B,0x55,0x37, //2012
0x0A,0xd5,0x4A, //2013
0x95,0x5A,0xBf, //2014
0x04,0xBA,0x53, //2015
0x0A,0x5B,0x48, //2016
0x65,0x2B,0xBC, //2017
0x05,0x2B,0x50, //2018
0x0A,0x93,0x45, //2019
0x47,0x4A,0xB9, //2020
0x06,0xAA,0x4C, //2021
0x0A,0xd5,0x41, //2022
0x24,0xdA,0xB6, //2023
0x04,0xB6,0x4A, //2024
0x69,0x57,0x3d, //2025
0x0A,0x4e,0x51, //2026
0x0d,0x26,0x46, //2027
0x5e,0x93,0x3A, //2028
0x0d,0x53,0x4d, //2029
0x05,0xAA,0x43, //2030
0x36,0xB5,0x37, //2031
0x09,0x6d,0x4B, //2032
0xB4,0xAe,0xBf, //2033
0x04,0xAd,0x53, //2034
0x0A,0x4d,0x48, //2035
0x6d,0x25,0xBC, //2036
0x0d,0x25,0x4f, //2037
0x0d,0x52,0x44, //2038
0x5d,0xAA,0x38, //2039
0x0B,0x5A,0x4C, //2040
0x05,0x6d,0x41, //2041
0x24,0xAd,0xB6, //2042
0x04,0x9B,0x4A, //2043
0x7A,0x4B,0xBe, //2044
0x0A,0x4B,0x51, //2045
0x0A,0xA5,0x46, //2046
0x5B,0x52,0xBA, //2047
0x06,0xd2,0x4e, //2048
0x0A,0xdA,0x42, //2049
0x35,0x5B,0x37, //2050
0x09,0x37,0x4B, //2051
0x84,0x97,0xC1, //2052
0x04,0x97,0x53, //2053
0x06,0x4B,0x48, //2054
0x66,0xA5,0x3C, //2055
0x0e,0xA5,0x4f, //2056
0x06,0xB2,0x44, //2057
0x4A,0xB6,0x38, //2058
0x0A,0xAe,0x4C, //2059
0x09,0x2e,0x42, //2060
0x3C,0x97,0x35, //2061
0x0C,0x96,0x49, //2062
0x7d,0x4A,0xBd, //2063
0x0d,0x4A,0x51, //2064
0x0d,0xA5,0x45, //2065
0x55,0xAA,0xBA, //2066
0x05,0x6A,0x4e, //2067
0x0A,0x6d,0x43, //2068
0x45,0x2e,0xB7, //2069
0x05,0x2d,0x4B, //2070
0x8A,0x95,0xBf, //2071
0x0A,0x95,0x53, //2072
0x0B,0x4A,0x47, //2073
0x6B,0x55,0x3B, //2074
0x0A,0xd5,0x4f, //2075
0x05,0x5A,0x45, //2076
0x4A,0x5d,0x38, //2077
0x0A,0x5B,0x4C, //2078
0x05,0x2B,0x42, //2079
0x3A,0x93,0xB6, //2080
0x06,0x93,0x49, //2081
0x77,0x29,0xBd, //2082
0x06,0xAA,0x51, //2083
0x0A,0xd5,0x46, //2084
0x54,0xdA,0xBA, //2085
0x04,0xB6,0x4e, //2086
0x0A,0x57,0x43, //2087
0x45,0x27,0x38, //2088
0x0d,0x26,0x4A, //2089
0x8e,0x93,0x3e, //2090
0x0d,0x52,0x52, //2091
0x0d,0xAA,0x47, //2092
0x66,0xB5,0x3B, //2093
0x05,0x6d,0x4f, //2094
0x04,0xAe,0x45, //2095
0x4A,0x4e,0xB9, //2096
0x0A,0x4d,0x4C, //2097
0x0d,0x15,0x41, //2098
0x2d,0x92,0xB5, //2099
};
///月份數據表
code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
code uint day_code2[3]={0x111,0x130,0x14e};
/*
函數功能:輸入BCD陽歷數據,輸出BCD陰歷數據(只允許1901-2099年)
調用函數示例:Conversion(c_sun,year_sun,month_sun,day_sun)
如:計算2004年10月16日Conversion(0,0x4,0x10,0x16);
c_sun,year_sun,month_sun,day_sun均為BCD數據,c_sun為世紀標志位,c_sun=0為21世
紀,c_sun=1為19世紀
調用函數後,原有數據不變,讀c_moon,year_moon,month_moon,day_moon得出陰歷BCD數據
*/
bit c_moon;
data uchar year_moon,month_moon,day_moon,week;
/*子函數,用於讀取數據表中農歷月的大月或小月,如果該月為大返回1,為小返回0*/
bit get_moon_day(uchar month_p,uint table_addr)
{
uchar temp;
switch (month_p){
case 1:{temp=year_code[table_addr]&0x08;
if (temp==0)return(0);else return(1);}
case 2:{temp=year_code[table_addr]&0x04;
if (temp==0)return(0);else return(1);}
case 3:{temp=year_code[table_addr]&0x02;
if (temp==0)return(0);else return(1);}
case 4:{temp=year_code[table_addr]&0x01;
if (temp==0)return(0);else return(1);}
case 5:{temp=year_code[table_addr+1]&0x80;
if (temp==0) return(0);else return(1);}
case 6:{temp=year_code[table_addr+1]&0x40;
if (temp==0)return(0);else return(1);}
case 7:{temp=year_code[table_addr+1]&0x20;
if (temp==0)return(0);else return(1);}
case 8:{temp=year_code[table_addr+1]&0x10;
if (temp==0)return(0);else return(1);}
case 9:{temp=year_code[table_addr+1]&0x08;
if (temp==0)return(0);else return(1);}
case 10:{temp=year_code[table_addr+1]&0x04;
if (temp==0)return(0);else return(1);}
case 11:{temp=year_code[table_addr+1]&0x02;
if (temp==0)return(0);else return(1);}
case 12:{temp=year_code[table_addr+1]&0x01;
if (temp==0)return(0);else return(1);}
case 13:{temp=year_code[table_addr+2]&0x80;
if (temp==0)return(0);else return(1);}
}
}
/*
函數功能:輸入BCD陽歷數據,輸出BCD陰歷數據(只允許1901-2099年)
調用函數示例:Conversion(c_sun,year_sun,month_sun,day_sun)
如:計算2004年10月16日Conversion(0,0x4,0x10,0x16);
c_sun,year_sun,month_sun,day_sun均為BCD數據,c_sun為世紀標志位,c_sun=0為21世
紀,c_sun=1為19世紀
調用函數後,原有數據不變,讀c_moon,year_moon,month_moon,day_moon得出陰歷BCD數據
*/
void Conversion(bit c,uchar year,uchar month,uchar day)
{ //c=0 為21世紀,c=1 為19世紀 輸入輸出數據均為BCD數據
uchar temp1,temp2,temp3,month_p;
uint temp4,table_addr;
bit flag2,flag_y;
temp1=year/16; //BCD->hex 先把數據轉換為十六進制
temp2=year%16;
year=temp1*10+temp2;
temp1=month/16;
temp2=month%16;
month=temp1*10+temp2;
temp1=day/16;
temp2=day%16;
day=temp1*10+temp2;
//定位數據表地址
if(c==0){
table_addr=(year+0x64-1)*0x3;
}
else {
table_addr=(year-1)*0x3;
}
//定位數據表地址完成
//取當年春節所在的公歷月份
temp1=year_code[table_addr+2]&0x60;
temp1=_cror_(temp1,5);
//取當年春節所在的公歷月份完成
//取當年春節所在的公歷日
temp2=year_code[table_addr+2]&0x1f;
//取當年春節所在的公歷日完成
// 計算當年春年離當年元旦的天數,春節只會在公歷1月或2月
if(temp1==0x1){
temp3=temp2-1;
}
else{
temp3=temp2+0x1f-1;
}
// 計算當年春年離當年元旦的天數完成
//計算公歷日離當年元旦的天數,為了減少運算,用了兩個表
//day_code1[9],day_code2[3]
//如果公歷月在九月或前,天數會少於0xff,用表day_code1[9],
//在九月後,天數大於0xff,用表day_code2[3]
//如輸入公歷日為8月10日,則公歷日離元旦天數為day_code1[8-1]+10-1
//如輸入公歷日為11月10日,則公歷日離元旦天數為day_code2[11-10]+10-1
if (month<10){
temp4=day_code1[month-1]+day-1;
}
else{
temp4=day_code2[month-10]+day-1;
}
if ((month>0x2)&&(year%0x4==0)){ //如果公歷月大於2月並且該年的2月為閏月,天數加1
temp4+=1;
}
//計算公歷日離當年元旦的天數完成
//判斷公歷日在春節前還是春節後
if (temp4>=temp3){ //公歷日在春節後或就是春節當日使用下面代碼進行運算
temp4-=temp3;
month=0x1;
month_p=0x1; //month_p為月份指向,公歷日在春節前或就是春節當日month_p指向首月
flag2=get_moon_day(month_p,table_addr); //檢查該農歷月為大小還是小月,大月返回1,小月返回0
flag_y=0;
if(flag2==0)temp1=0x1d; //小月29天
else temp1=0x1e; //大小30天
temp2=year_code[table_addr]&0xf0;
temp2=_cror_(temp2,4); //從數據表中取該年的閏月月份,如為0則該年無閏月
while(temp4>=temp1){
temp4-=temp1;
month_p+=1;
if(month==temp2){
flag_y=~flag_y;
if(flag_y==0)month+=1;
}
else month+=1;
flag2=get_moon_day(month_p,table_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp4+1;
}
else{ //公歷日在春節前使用下面代碼進行運算
temp3-=temp4;
if (year==0x0){year=0x63;c=1;}
else year-=1;
table_addr-=0x3;
month=0xc;
temp2=year_code[table_addr]&0xf0;
temp2=_cror_(temp2,4);
if (temp2==0)month_p=0xc;
else month_p=0xd; //
/*
month_p為月份指向,如果當年有閏月,一年有十三個月,月指向13,
無閏月指向12
*/
flag_y=0;
flag2=get_moon_day(month_p,table_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
while(temp3>temp1){
temp3-=temp1;
month_p-=1;
if(flag_y==0)month-=1;
if(month==temp2)flag_y=~flag_y;
flag2=get_moon_day(month_p,table_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp1-temp3+1;
}
c_moon=c; //HEX->BCD ,運算結束後,把數據轉換為BCD數據
temp1=year/10;
temp1=_crol_(temp1,4);
temp2=year%10;
year_moon=temp1|temp2;
temp1=month/10;
temp1=_crol_(temp1,4);
temp2=month%10;
month_moon=temp1|temp2;
temp1=day/10;
temp1=_crol_(temp1,4);
temp2=day%10;
day_moon=temp1|temp2;
}
void nl()
{
unsigned char yy1,yy2;
Conversion(0,yy,mo,dd);
LCM_WriteDatOrCom(0,0x90);
LCM_WriteString("農歷");//原代碼為
LCM_WriteDatOrCom(1,year_moon/16+'0');
LCM_WriteDatOrCom(1,year_moon%16+'0');
LCM_WriteDatOrCom(1,'-');
LCM_WriteDatOrCom(1,month_moon/16+'0');
LCM_WriteDatOrCom(1,month_moon%16+'0');
LCM_WriteDatOrCom(1,'-');
LCM_WriteDatOrCom(1,day_moon/16+'0');
LCM_WriteDatOrCom(1,day_moon%16+'0');
yy1=(year_moon/16)*10+year_moon%16;
yy2=yy1%12;
switch(yy2)
{
case 0: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("龍");
break;
case 1: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("蛇");
break;
case 2: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("馬");
break;
case 3: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("羊");
break;
case 4: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("猴");
break;
case 5: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("雞");
break;
case 6: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("狗");
break;
case 7: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("豬");
break;
case 8: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("鼠");
break;
case 9: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("牛");
break;
case 10: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("虎");
break;
case 11: LCM_WriteDatOrCom(0,0x87);LCM_WriteString("兔");
break;
}
}

還有我想你的中斷函數過長不會是一件好事,主程序的顯示部分可能會不正常

⑸ 51單片機做數字電子鍾

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

⑹ 關於用51單片機做一個電子時鍾的問題


程序中好像還沒有自動加時的部分,並且按鍵處理還沒有消抖措施


不多說了,上程序,俺剛剛為你編寫的,測試的時候使用的埠和你的不一樣


在我的開發板上測試成功後,按照你的板子埠做了修改


如果你直接復制到你的程序中不能使用,檢查及更改一下埠即可


如果滿意記得採納哦,若有疑問可以隨時向我提問


/***************************************************************************/

//#include<stdio.h>

#include<reg51.h>

sbit p20=P2^0; sbit p21=P2^1; sbit led=P2^7;

char dis_2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數碼管顯示編碼

unsigned int h,m,s,t,n;

/***************************************************************************/

void delay(char hs)//延時函數

{char hk;for(;hs>0;hs--){for(hk=100;hk>0;hk--);}}

/***************************************************************************/

void XS(unsigned int xh,unsigned int xs) //顯示子函數

{

char d1,d2,d3,d4;

d1=(xs/1)%10; d2=(xs/10)%10;

d3=(xh/1)%10; d4=(xh/10)%10;


P0=dis_2[d1]; P1=0x08; delay(10); P1=0x00;//秒個位

P0=dis_2[d2]; P1=0x04; delay(10); P1=0x00;//秒十位

P0=0x7f; P1=0x04; delay(10); P1=0x00;//小數點

P0=dis_2[d3]; P1=0x02; delay(10); P1=0x00;//時個位

P0=dis_2[d4]; P1=0x01; delay(10); P1=0x00;//時十位

}

/***************************************************************************/

void main(void)

{

TH0=(65536-1000)/256; TL0=(65536-1000)%256;

TMOD=0x01; EA=1; ET0=1; TR0=1;//定時器初始化

while(1)//主循環

{

if(p20==0){delay(10);if(p20==0){h++;if(h>23){h=0;}}while(!p20){XS(h,m);}}

if(p21==0){delay(10);if(p21==0){m++;if(m>59){m=0;}}while(!p21){XS(h,m);}}

XS(h,m);//調用數碼管顯示函數

}

}

/***************************************************************************/

void int1() interrupt 1 //定時器中斷

{

TH0=(65536-1000)/256; TL0=(65536-1000)%256; n++;t++;

if(t>500){t=0;led=~led;}//LED閃爍

if(n>1000){n=0;s++;}//如果達到一秒,秒加一

if(s>59){s=0;m++;}//如果達到一分,分加一

if(m>59){m=0;h++;}//如果達到一小時,小時加一

if(h>23){h=0;}//如果達到24小時,小時清零

}

/***************************************************************************/

⑺ 51單片機做電子時鍾

使用單片機的定時器中斷可實現。例如定時器中斷方式2,8位自動初值重裝,初值設置為0,晶振為11.0592M的情況下,中斷3600次為1秒鍾..多做幾個變數,比如秒、分、小時等...60秒時,分++,秒清零...60分時,小時++,分清零...外加一個顯示或串口功能..就完成了一個簡單的電子時鍾

⑻ MCS51單片機電子時鍾

* 標題: 試驗數碼管顯示時鍾 *
* *
* 通過本常式了解 DS1302時鍾晶元的基本原理和使用 ,理解並掌握DS1302時鍾晶元 *
* 驅動程序的編寫以及實現數字字元在數碼管中的顯示。 *
* 注意:JP1302跳線冒要短接。 *
* 請學員認真消化本常式,懂DS1302在C語言中的操作 *
********************************************************************************/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include <intrins.h>

sbit SCK=P3^6; //時鍾
sbit SDA=P3^4; //數據
sbit RST = P3^5;// DS1302復位

sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;

bit ReadRTC_Flag;//定義讀DS1302標志

unsigned char l_tmpdate[7]={0,0,12,15,5,3,8};//秒分時日月周年08-05-15 12:00:00
unsigned char l_tmpdisplay[8];

code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分時日月周年 最低位讀寫位
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};

code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
//共陰數碼管 0-9 '-' '熄滅『表

/******************************************************************/
/* 函數聲明 */
/******************************************************************/
void Write_Ds1302_byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void Read_RTC(void);//read RTC
void Set_RTC(void); //set RTC
void InitTIMER0(void);//inital timer0
/******************************************************************/
/* 主函數 */
/******************************************************************/
void main(void)
{
InitTIMER0(); //初始化定時器0
Set_RTC(); //寫入時鍾值,如果使用備用電池時候,不需要沒每次上電寫入,此程序應該屏蔽

while(1)
{
if(ReadRTC_Flag)
{
ReadRTC_Flag=0;
Read_RTC();

l_tmpdisplay[0]=l_tmpdate[2]/16; //數據的轉換,因我們採用數碼管0~9的顯示,將數據分開
l_tmpdisplay[1]=l_tmpdate[2]&0x0f;
l_tmpdisplay[2]=10; //加入"-"
l_tmpdisplay[3]=l_tmpdate[1]/16;
l_tmpdisplay[4]=l_tmpdate[1]&0x0f;
l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[0]/16;
l_tmpdisplay[7]=l_tmpdate[0]&0x0f;

}
}
}
/******************************************************************/
/* 定時器0初始化 */
/******************************************************************/
void InitTIMER0(void)
{
TMOD|=0x01;//定時器設置 16位
TH0=0xef;//初始化值
TL0=0xf0;
ET0=1;
TR0=1;
EA=1;
}

/******************************************************************/
/* 寫一個位元組 */
/******************************************************************/
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++) //循環8次 寫入數據
{
SCK=0;
SDA=temp&0x01; //每次傳輸低位元組
temp>>=1; //右移一位
SCK=1;
}
}
/******************************************************************/
/* 寫入DS1302 */
/******************************************************************/
void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_(); //啟動
Write_Ds1302_Byte(address); //發送地址
Write_Ds1302_Byte(dat); //發送數據
RST=0; //恢復
}
/******************************************************************/
/* 讀出DS1302數據 */
/******************************************************************/
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00;
RST=0;
_nop_();
_nop_();
SCK=0;
_nop_();
_nop_();
RST=1;
_nop_();
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++) //循環8次 讀取數據
{
if(SDA)
temp|=0x80; //每次傳輸低位元組
SCK=0;
temp>>=1; //右移一位
_nop_();
_nop_();
_nop_();
SCK=1;
}
RST=0;
_nop_(); //以下為DS1302復位的穩定時間
_nop_();
RST=0;
SCK=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCK=1;
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
return (temp); //返回
}
/******************************************************************/
/* 讀時鍾數據 */
/******************************************************************/
void Read_RTC(void) //讀取 日歷
{
unsigned char i,*p;
p=read_rtc_address; //地址傳遞
for(i=0;i<7;i++) //分7次讀取 秒分時日月周年
{
l_tmpdate[i]=Read_Ds1302(*p);
p++;
}
}
/******************************************************************/
/* 設定時鍾數據 */
/******************************************************************/
void Set_RTC(void) //設定 日歷
{
unsigned char i,*p,tmp;
for(i=0;i<7;i++){ //BCD處理
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;
}
Write_Ds1302(0x8E,0X00);

p=write_rtc_address; //傳地址
for(i=0;i<7;i++) //7次寫入 秒分時日月周年
{
Write_Ds1302(*p,l_tmpdate[i]);
p++;
}
Write_Ds1302(0x8E,0x80);
}
/******************************************************************/
/* 定時器中斷函數 */
/******************************************************************/
void tim(void) interrupt 1 using 1
//中斷,用於數碼管掃描
{

static unsigned char i,num;
TH0=0xf5;
TL0=0xe0;

P0=table[l_tmpdisplay[i]]; //查表法得到要顯示數字的數碼段

switch(i)
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
case 5:LS138A=1; LS138B=0; LS138C=1; break;
case 6:LS138A=0; LS138B=1; LS138C=1; break;
case 7:LS138A=1; LS138B=1; LS138C=1; break;

}
i++;
if(i==8)
{
i=0;
num++;
if(10==num) //隔段時間讀取1302的數據。時間間隔可以調整
{
ReadRTC_Flag=1; //使用標志位判斷
num=0;
}
}
}

⑼ 51單片機簡易電子鍾設計。匯編語言編寫

KEYVALEQU 30H
KEYTMEQU 31H
KEYSCANEQU 32H
DATEQU 33H
SCANLEDEQU 39H
CLKEQU 77H
SECEQU 78H
MINEQU 79H
HOUREQU 7AH
PAUSEBIT 00H
DOTBIT 01H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR;50ms定時
ORG 001BH
LJMP T1ISR;掃描顯示
ORG 0030H
MAIN:
MOV SP,#5FH
MOV TMOD,#11H
MOV TH0,#03CH
MOV TL0,#0B0H
MOV TH1,#0ECH
MOV TL1,#078H
MOV KEYVAL,#0
MOV SCANLED,#0
MOV 33H,#10H
MOV 34H,#10H
MOV 35H,#10H
MOV 36H,#10H
MOV 37H,#10H
MOV 38H,#10H
MOV SEC,#0
MOV MIN,#0
MOV HOUR,#0
MOV CLK,#0
CLR PAUSE
SETB EA
SETB ET1
SETB TR1
LOOP:
LCALL KEYSEL
MOV A,KEYVAL
CJNE A,#0FFH,LOOP1
SJMP LOOP
LOOP1:
CJNE A,#10,LOOP2;「ON」啟動
SETB TR0
SETB ET0
SETB PAUSE
SJMP LOOP
LOOP2:
CJNE A,#11,LOOP3;「=」清零
MOV SEC,#0
MOV MIN,#0
MOV HOUR,#0
LCALL DISCHG
SJMP LOOP
LOOP3:
CJNE A,#15,LOOP4;「+」暫停
CLR TR0
CLR ET0
CLR PAUSE
SJMP LOOP
LOOP4:
CJNE A,#14,LOOP5;「-」清顯示暫停
MOV 33H,#10H
MOV 34H,#10H
MOV 35H,#10H
MOV 36H,#10H
MOV 37H,#10H
MOV 38H,#10H
CLR TR0
CLR ET0
CLR PAUSE
SJMP LOOP
LOOP5:
CJNE A,#10,LOOP6;數字鍵
LOOP6:
JC LOOP7
LJMP LOOP
LOOP7:
JNB PAUSE,LOOP8;暫停狀態可以輸入數字鍵
LJMP LOOP
LOOP8:
MOV 33H,34H
MOV 34H,35H
MOV 35H,36H
MOV 36H,37H
MOV 37H,38H
MOV 38H,KEYVAL
MOV A,33H
SWAP A
ORL A,34H
LCALL BCDH
MOV HOUR,A
MOV A,35H
SWAP A
ORL A,36H
LCALL BCDH
MOV MIN,A
MOV A,37H
SWAP A
ORL A,38H
LCALL BCDH
MOV SEC,A
LJMP LOOP

;------------------
;BCD轉換為十六進制
BCDH:
MOV B,#10H
DIV AB
MOV R7,B
MOV B,#10
MUL AB
ADD A,R7
RET
;------------------
;十六進制轉換為BCD
HBCD:
MOV B,#10
DIV AB
SWAP A
ORL A,B
RET
;------------------
KEYSEL:
MOVKEYVAL,#0
MOVKEYSCAN,#0EFH
LCALLGETKEY
MOVA,KEYTM
JZKEYS1
MOVKEYVAL,A
SJMPKEYRTN
KEYS1:
MOVKEYSCAN,#0DFH
LCALLGETKEY
MOVA,KEYTM
JZKEYS2
CLRC
ADDA,#4
MOVKEYVAL,A
SJMPKEYRTN
KEYS2:
MOVKEYSCAN,#0BFH
LCALLGETKEY
MOVA,KEYTM
JZKEYS3
CLRC
ADDA,#8
MOVKEYVAL,A
SJMPKEYRTN
KEYS3:
MOVKEYSCAN,#7FH
LCALLGETKEY
MOVA,KEYTM
JZKEYRTN
CLRC
ADDA,#12
MOVKEYVAL,A
KEYRTN:
LCALL CHGKEY
RET
;--------------------
GETKEY:
MOV KEYTM,#0
MOVA,KEYSCAN
MOVP3,A
NOP
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY
MOV R2,#10
LCALL DELAY
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JZNOKEY
MOVA,P3
ANLA,#0FH
MOVR7,A
SF:
MOVA,P3
ANLA,#0FH
XRLA,#0FH
JNZSF
MOVA,R7
CJNEA,#0EH,NK1
MOVKEYTM,#1
SJMPNOKEY
NK1:
CJNEA,#0DH,NK2
MOVKEYTM,#2
SJMPNOKEY
NK2:
CJNEA,#0BH,NK3
MOVKEYTM,#3
SJMPNOKEY
NK3:
CJNEA,#07H,NOKEY
MOVKEYTM,#4
NOKEY:RET
;--------------------
DELAY:
MOV R3,#50
DELAY1:
MOV R4,#100
DJNZ R4,$
DJNZ R3,DELAY1
DJNZ R2,DELAY
RET
;--------------------
T0ISR:
PUSH ACC
CLR TR0
MOV TH0,#3CH
MOV TL0,#0B0H
SETB TR0
INC CLK
MOV A,CLK
CJNE A,#20,T0ISRE
MOV CLK,#0
INC SEC
MOV A,SEC
CJNE A,#60,T0ISRE
MOV SEC,#0
INC MIN
MOV A,MIN
CJNE A,#60,T0ISRE
MOV MIN,#0
INC HOUR
MOV A,HOUR
CJNE A,#24,T0ISRE
MOV SEC,#0
MOV MIN,#0
MOV HOUR,#0
T0ISRE:
LCALL DISCHG
POP ACC
RETI
;--------------------
DISCHG:
MOV A,HOUR
LCALL HBCD
PUSH ACC
ANL A,#0FH
MOV 34H,A
POP ACC
ANL A,#0F0H
SWAP A
MOV 33H,A
MOV A,MIN
LCALL HBCD
PUSH ACC
ANL A,#0FH
MOV 36H,A
POP ACC
ANL A,#0F0H
SWAP A
MOV 35H,A
MOV A,SEC
LCALL HBCD
PUSH ACC
ANL A,#0FH
MOV 38H,A
POP ACC
ANL A,#0F0H
SWAP A
MOV 37H,A
RET
;--------------------
T1ISR:
PUSH ACC
CLR TR1
MOV TH1,#0ECH
MOV TL1,#78H
SETB TR1
MOV DPTR,#LEDTAB
T100:
MOV R0,#DAT
MOV A,SCANLED
ADD A,R0
MOV R0,A
MOV A,SCANLED
JNZ T101
MOV P2,#01H
CLR DOT
SJMP T1DIS
T101:
DEC A
JNZ T102
MOV P2,#02H
SETB DOT
SJMP T1DIS
T102:
DEC A
JNZ T103
MOV P2,#04H
CLR DOT
SJMP T1DIS
T103:
DEC A
JNZ T104
MOV P2,#08H
SETB DOT
SJMP T1DIS
T104:
DEC A
JNZ T105
MOV P2,#10H
CLR DOT
SJMP T1DIS
T105:
MOV P2,#20H
CLR DOT
T1DIS:
MOV A,@R0
MOVC A,@A+DPTR
JNB DOT,T1DIS1
ORL A,#01H
T1DIS1:
CPL A
MOV P0,A
INC SCANLED
MOV A,SCANLED
CJNE A,#6,T1END
MOV SCANLED,#0
T1END:
POP ACC
RETI
;--------------------
CHGKEY:
MOV A,KEYVAL
JZ KV16
DEC A
JNZ KV01
MOV KEYVAL,#7
RET
KV01:
DEC A
JNZ KV02
MOV KEYVAL,#4
RET
KV02:
DEC A
JNZ KV03
MOV KEYVAL,#1
RET
KV03:
DEC A
JNZ KV04
MOV KEYVAL,#10
RET
KV04:
DEC A
JNZ KV05
MOV KEYVAL,#8
RET
KV05:
DEC A
JNZ KV06
MOV KEYVAL,#5
RET
KV06:
DEC A
JNZ KV07
MOV KEYVAL,#2
RET
KV07:
DEC A
JNZ KV08
MOV KEYVAL,#0
RET
KV08:
DEC A
JNZ KV09
MOV KEYVAL,#9
RET
KV09:
DEC A
JNZ KV10
MOV KEYVAL,#6
RET
KV10:
DEC A
JNZ KV11
MOV KEYVAL,#3
RET
KV11:
DEC A
JNZ KV12
MOV KEYVAL,#11
RET
KV12:
DEC A
JNZ KV13
MOV KEYVAL,#12
RET
KV13:
DEC A
JNZ KV14
MOV KEYVAL,#13
RET
KV14:
DEC A
JNZ KV15
MOV KEYVAL,#14
RET
KV15:
DEC A
JNZ KV16
MOV KEYVAL,#15
RET
KV16:
MOV KEYVAL,#0FFH
RET
;--------------------
LEDTAB:DB 0FCH;"0"00H
DB 60H;"1"01H
DB 0DAH;"2"02H
DB 0F2H;"3"03H
DB 66H;"4"04H
DB 0B6H;"5"05H
DB 0BEH;"6"06H
DB 0E0H;"7"07H
DB 0FEH;"8"08H
DB 0F6H;"9"09H
DB 0EEH;"A"0AH
DB 3EH;"B"0BH
DB 9CH;"C"0CH
DB 7AH;"D"0DH
DB 9EH;"E"0EH
DB 8EH;"F"0FH
DB 00H;" "10H
;--------------------
END

⑽ 用51單片機設計一個電子鍾

巧了,國親無聊做了一個玩玩,給你看看把,其實電子鍾挺簡單的,下面是程序:

#include<reg52.h>

#defineucharunsignedchar

#defineuintunsignedint

sbitch=P3^2;

sbitkey=P3^5;

sbitkey1=P3^4;

uchart0,numn,numy,numr,nums,numf,numm,sw,w,q,b,s,g,sw1,w1,q1,b1,s1,g1,rq,temp,x;

uintu;

voidinit();

voiddisplay(uchar,uchar,uchar,uchar,uchar,uchar);

voiddelay(uintz)

{

uintx,y;

for(x=z;x>0;x--)

for(y=70;y>0;y--);

}

voidmain()

{

init();

while(1)

{

if(rq==1)

{

if(rq==1)

display(sw,w,q,b,s,g);

}

elseif(rq==2)

{

if(rq==2)

display(sw1,w1,q1,b1,s1,g1);

}

elseif(rq==3)

{

if(rq==3)

display(w,w,w,w,w,w);

}

elseif(rq==4)

{

uchari;

temp=0x01;

for(i=0;i<8;i++)

{

P1=~temp;

delay(100);

temp<<=1;

}

temp=0x80;

for(i=0;i<8;i++)

{

P1=~temp;

delay(100);

temp>>=1;

}

temp=0x01;

for(i=0;i<8;i++)

{

P1=temp;

delay(100);

temp<<=1;

}

temp=0x7F;

for(i=0;i<8;i++)

{

P1=temp;

delay(100);

temp>>=1;

}

}

else

rq=1;

}

}

voidinit()

{

rq=1;

x=1;

nums=22;

numf=0;

numm=0;

numn=9;

numy=10;

numr=15;

TMOD=0x11;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

IT0=1;

IT0=2;

EA=1;

EX0=1;

EX1=1;

ET0=1;

TR0=1;

ET1=1;//IE=0x82//CPU開中斷,CT0開中斷

}

voidtimer0()interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t0++;

if(key==0)

{

delay(50);

if(key==0)

{

x++;

while(key==0);

}

}

if(x==2&rq==1)

{

//P0=0xf3;

if(key1==0)

{

numf++;

while(key1==0);

}

}

elseif(x==3&rq==1)

{

//P0=0xfc;

if(key1==0)

{

nums++;

while(key1==0);

}

}

elseif(x==2&rq==2)

{

//P0=0xcf;

if(key1==0)

{

numr++;

while(key1==0);

}

}

elseif(x==3&rq==2)

{

//P0=0xf3;

if(key1==0)

{

numy++;

while(key1==0);

}

}

elseif(x==4&rq==2)

{

//P0=0xfc;

if(key1==0)

{

numn++;

while(key1==0);

}

}

else

{

x=1;

}

if(t0==20)

{

t0=0;

numm++;

}

if(numm==60)

{

numm=0;

numf++;

}

if(numf==60)

{

for(u=500;u>0;u--)

{

bell=0;

delay(1);

bell=1;

delay(1);

}

numf=0;

nums++;

}

if(nums==24)

{

nums=0;

numr++;

}

if(numr==30)

{

numr=0;

numy++;

}

if(numy==12)

{

numy=0;

numn++;

}

if(numn==100)

{

numn=0;

}

g=numm%10;

s=numm/10;

b=numf%10;

q=numf/10;

w=nums%10;

sw=nums/10;

g1=numr%10;

s1=numr/10;

b1=numy%10;

q1=numy/10;

w1=numn%10;

sw1=numn/10;

}

voidexert0()interrupt0

{

delay(50);

rq++;

while(ch==0);

}

voidt0int()interrupt3

{

TR1=0;

bell=!bell;

TH1=timer0h;

TL1=timer0l;

TR1=1;

}

voidexert1()interrupt2

{

rq=100;

}

voiddisplay(ucharsw,ucharw,ucharq,ucharb,uchars,ucharg)

{

P2=tab[sw];

P0=tabwe[0];

delay(5);

P0=0xff;

P2=tab[w];

P0=tabwe[1];

delay(5);

P0=0xff;

P2=tab[q];

P0=tabwe[2];

delay(5);

P0=0xff;

P2=tab[b];

P0=tabwe[3];

delay(5);

P0=0xff;

P2=tab[s];

P0=tabwe[4];

delay(5);

P0=0xff;

P2=tab[g];

P0=tabwe[5];

delay(5);

P0=0xff;

}

下面這個是電路圖,圖我沒有畫啊,不過我用模擬去做,應該跟電路圖差不多了,你可以參考下,可以實現流水燈,鬧鈴,日期,時間,等功能,上面給你的是按照你的要求,另外我懶得改了所以多了個功能就是可以看日期,你看上面的程序,第一個按鈕ch,按一下查看日期,再按一下查看溫度(被刪了,隨機現在是隨機顯示一個數字),再按一下是流水燈,再按一下又回到時間,另外兩個鍵key/key1;按key是選擇鎖定分還是時,如果你當前顯示的是日期的話就是順序鎖定日,月,年,按key1調整,圖上顯示的是22點00分09秒,就這樣了

設計方案的話..........呵呵,AT89S52+6個數碼管+11.0592晶振+2個30P電容+3個按鈕+1個10UF電容如圖連接,你自己去寫方案把,分數給那麼少,就只幫你那麼多了

閱讀全文

與電子時鍾51單片機相關的資料

熱點內容
日本影視網站 瀏覽:932
伺服器點亮埠以後有什麼特徵 瀏覽:980
51單片機定時器pwm 瀏覽:685
民國修真 瀏覽:386
php數組作為參數傳遞 瀏覽:991
運行命令查ip 瀏覽:202
漲奶吃奶小說 瀏覽:340
股票十大戰法主圖指標源碼 瀏覽:702
查看網路的命令是什麼意思 瀏覽:589
《鬼吹燈》1-8全本txt 瀏覽:336
python繪圖兩個圓代碼 瀏覽:607
python中end的用法 瀏覽:682
大概率30選股源碼 瀏覽:206
阿里雲伺服器如何鏡像 瀏覽:161
能看的 瀏覽:403
京東伺服器為什麼會崩 瀏覽:836
php超類 瀏覽:822
怎麼在美團APP上請假 瀏覽:100
午夜激情影院 瀏覽:242
歐拉app怎麼下訂單 瀏覽:422