標題: 基于51單片機設計的數碼管萬年歷proteus仿真及源碼 [打印本頁]
作者: 51黑ff 時間: 2016-10-11 00:32
標題: 基于51單片機設計的數碼管萬年歷proteus仿真及源碼
0.png (38.01 KB, 下載次數: 136)
下載附件
2016-10-11 00:30 上傳
包含:仿真圖+C語言程序+功能說明+元器件清單(非實物)
設計說明:
用一片51系列單片機作為主控制器,DS18B20測量實時溫度,現實范圍為-55到127攝氏度。
用DS1302時鐘芯片,具有閏年閏月自動計算。用共陰極數碼管進行顯示。74hc138和74hc154進行位選驅動數碼管,用74hc595進行傳送數據。
按鍵調整說明:
第一次按下調整鍵,則年的后兩位開始閃爍,此時如果按下加或者減進行年的更改,更改之后,如果無需對其他時間更改,直接按下確認鍵,即可保存更改后的數據,并且返回正常的顯示。如果需要對其的更改,則繼續按下調整鍵,第二次按下調整鍵時,調整對象為月,第三次為日,次為時,第五次為分。這里無需調整星期,星期的調整是調整以后,自動計算星期,并隨著確認鍵的按下進行刷新的。
元器件清單:
- #include<reg51.h>
- #include<absacc.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ture 1
- #define fault 0
- sbit SET=P1^7;
- void delay(uchar k) ;
- uchar monthday(uchar a,uchar b);
- void display() ;
- uchar code dayofmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
- uchar code scan[]={0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,
- 0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
- 0xf8,0xf9,0xfa,0xfb,0xfc,0xfd};
- //掃描的譯碼信號
- uchar i;
- uchar code table[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0xA7,0xFF,0xEF,0xC0};
- uchar buffer[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- uchar shuju=0;
- uchar state=0;
- uchar qxiang;
- typedef struct
- {
- uchar year[2];
- uchar month;
- uchar day;
- uchar week;
- }date;
- typedef struct
- {
- uchar hour;
- uchar minute;
- uchar second;
- }time;
- uchar count=0;
- date today={{9,20},4,20,1};
- time now={11,8,10};
- void main()
- {
- TMOD=0x01;
- TL0=(65536-1000)%256;
- TH0=(65536-1000)/256;
- IE=0x82; //EA=1;ET0=1總中斷允許和定時器中斷允許
- TCON=0x10; //定時器啟動計數
- while(1)
- {
- P1=0xff;
- shuju=P1&0xff;
- qxiang=shuju&0x80;
- switch(qxiang)
- {
- case(0x80):switch(shuju)
- {
- case(0xfe) : //秒調整
- {
- EA=1;
- EX0=1; //IE=0x83; //EA=1;ET0=1;EX0=0總中斷允許,定時器中斷允許,外中斷允許
- IT0=1; //TCON=0x11; //TR0=1;IT0=1;定時器啟動,外中斷為負邊沿觸發
- }break;
- case(0xfd) : //分調整
- {
- EA=1;
- EX0=1; // IE=0x83;
- IT0=1; //TCON=0x11;
- }break;
- case(0xfb) : //時調整
- {
- EA=1;
- EX0=1;
- IT0=1;
-
- }break;
- case(0xf7) : //星期調整
- {
- EA=1;
- EX0=1;
- IT0=1;
-
- }break;
- case(0xef) : //日調整
- {
- EA=1;
- EX0=1;
- IT0=1;
-
- }break;
- case(0xdf): //月調整
- {
- EA=1;
- EX0=1;
- IT0=1;
-
- }break;
- case(0xbf): //年調整
- {
- EA=1;
- EX0=1;
- IT0=1;
-
- }break;
- default: //時鐘正常計時
- {
- EA=1;
- TR0=1;
- EX0=0;
-
- }break;
- }break;
- case(0x00) :switch(shuju)
- {
- case(0x7e):
- {
- EA=1;
- EX0=1;
- IT0=1;
-
- }break;
- case(0x7d):
- {
- EA=1;
- EX0=1;
- IT0=1;
-
- }break;
- case(0x7b):
- {
- EA=1;
- EX0=1;
- IT0=1;
-
- }break;
- case(0x77):
- {
- EA=1;
- EX0=1;
- IT0=1;
-
- }break;
- case(0x6f):
- {
- EA=1;
- EX0=1;
- IT0=1;
-
- }break;
- case(0x5f):
- {
- EA=1;
- EX0=1;
- IT0=1;
-
- }break;
- case(0x3f):
- {
- EA=1;
- EX0=1;
- IT0=1;
-
- }break;
- default: //時鐘正常計時
- {
- EA=1;
- TR0=1;
- EX0=0;
-
- }break;
- }break;
- }
- }
- }
- void inter0() interrupt 0 using 0
- {
- uchar result,z;
- result=shuju;
- switch(qxiang)
- {
- case(0x80): switch(result)
- {
- case(0xfe) : // if(result==0xfe) //秒調整 +
- {
- now.second++;
- if(now.second>=60)
- {
- now.second=0;
- }
- display();
- }break;
-
- case(0xfd) : //if(result==0xfd) //分調整 +
- {
- now.minute++;
- if(now.minute>=60)
- {
- now.minute=0;
- }
- display();
- }break;
-
- case(0xfb) : //if(result==0xfb) //時調整 +
- {
- now.hour++;
- if(now.hour>=24)
- {
- now.hour=0;
- }
- display();
- }break;
-
- case(0xf7) : // if(result==0xf7) //星期調整 +
- {
- today.week++;
- if(today.week>=8)
- {
- today.week=1;
- }
- display();
- }break;
- case(0xef) : //if(result==0xef) //日期調整 +
- {
- today.day++;
- z = monthday( today.year[1] , today.year[0] );
- if((z==1)&&(today.month==2))
- {
- if(today.day>=30)
- today.day=1;
- }
- else if (today.day>dayofmonth[today.month-1])
- today.day=1;
- display();
- }break;
-
- case(0xdf) : //if(result==0xdf) //月調整 +
-
- {
- today.month++;
- if(today.month>=13)
- {
- today.month=1;
- }
- display();
- } break;
-
-
- case(0xbf) : //if(result==0xbf) //年調整 +
- {
- today.year[0]=today.year[0]+1;
- if(today.year[0]>=100)
- {
- today.year[0]=0;
- today.year[1]=today.year[1]+1;
- if(today.year[1]>=100)
- {
- today.year[1]=0;
- }
- }
- display();
- }break;
- default: //時鐘正常計時
- {
- EA=1;
- TR0=1;
- EX0=0;
-
- }break;
- }break;
-
- case(0x00): switch(result)
- {
- case(0x7e): //if(result==0x7f) //秒調整—
- {
- if(now.second>0)
- now.second=now.second-1;
- else now.second=59;
- display();
- }break;
-
- case(0x7d): //if(result==0x7d) //分調整—
- {
- if(now.minute>0)
- now.minute=now.minute-1;
- else now.minute=59;
- display();
- } break;
-
- case(0x7b) : //if(result==0x7b) // 時調整-
-
- {
- if(now.hour>0)
- now.hour=now.hour-1;
- else now.hour=23 ;
- display();
- }break;
-
- case(0x77) : //if(result==0x77) // 周調整—
- {
- if(today.week>1)
- today.week=today.week-1;
- else today.week=7;
- display();
- }break;
-
- case(0x6f): //if(result==0x6f) // 日期調整—
- {
- z = monthday( today.year[1] , today.year[0] );
- if((z==1)&&(today.month==2))
- {
- if(today.day>1)
- today.day=today.day-1;
- else today.day=29;
- }
- else {
- if(today.day>1)
- today.day=today.day-1;
- else today.day=dayofmonth[today.month-1];
- }
- display();
- }break;
- case(0x5f): //if(result==0x5f) // 月調整—
- {
- if(today.month>1)
- today.month=today.month-1;
- else today.month=12;
- display();
- }break;
- case(0x3f) : // 年調整——
- {
- if(today.year[0]>0)
- today.year[0]=today.year[0]-1;
- else
- {
- today.year[0]=99;
- today.year[1]=today.year[1]-1;
- }
- display();
- }break;
- default: //時鐘正常計時
- {
- EA=1;
- TR0=1;
- EX0=0;
- }break;
- }break;
- }
- }
-
- void timer0_int() interrupt 1 using 1
- {
- uchar c;
- TL0=(65536-1000)%256; //中斷時間是10ms
- TH0=(65536-1000)/256;
- TR0=1;
- count++;
- if(count==35)
- {
- count=0;
- now.second=now.second+1;
- if(now.second>=60)
- {
- now.second=0;
- now.minute++;
- if(now.minute>=60)
- {
- now.minute=0;
- now.hour++;
- if(now.hour>=24)
- {
- now.hour=0;
- today.week++;
- today.day++;
- if(today.week>=8)
- {
- today.week=1;
- }
- c=monthday( today.year[1], today.year[0]);
- if((c==1)&&(today.month==2))
- {
- if(today.day>=30)
- {
- today.day=1;
- today.month++;
- }
-
- }
- else if(today.day>=(dayofmonth[today.month-1]+1))
- {
- today.day=1;
- today.month++;
- if(today.month>=13)
- {
- today.month=1;
- today.year[0]=today.year[0]+1;
- if(today.year[0]>=100)
- {
- today.year[0]=0;
- today.year[1]=today.year[1]+1;
- if(today.year[1]>=100)
- {
- today.year[1]=0;
- }
- }
- }
- }
- }
- }
- }
- }
- display();
- }
- void delay(uchar k)
- {
- uchar m,n;
- for(m=0;m<=k;m++)
- for(n=0;n<=40;n++);
- }
- // 計算年份程序
- uchar monthday(uchar a,uchar b)
- {
- uchar x,y;
- x=a*100+b;
- if(x%4!=0)
- y=0;
- else if(x%100!=0)
- y=1;
- else if(x%400!=0)
- y=0;
- else y=1;
-
- //if((x%4==0 && x%100!=0)|| (x%400==0))
- // y=1;
- // else y=0;
- return(y) ;
- }
- void display()
- {
- buffer[0]=now.second%10;
- buffer[1]=now.second/10;
- buffer[2]=10;
- buffer[3]=now.minute%10;
- buffer[4]=now.minute/10;
- buffer[5]=10;
- buffer[6]=now.hour%10;
- buffer[7]=now.hour/10;
- buffer[8]=today.week%10;
- buffer[9]=today.week/10;
- buffer[10]=10;
- buffer[11]=today.day%10;
- buffer[12]=today.day/10;
- buffer[13]=10;
- buffer[14]=today.month%10;
- buffer[15]=today.month/10;
- buffer[16]=10;
- buffer[17]=today.year[0]%10;
- buffer[18]=today.year[0]/10;
- buffer[19]=today.year[1]%10;
- buffer[20]=today.year[1]/10;
- buffer[21]=10;
- for(i=0;i<=21;i++)
- {
- P0=table[buffer[i]];
- P2=scan[i];
- delay(8);
- P2=0xFF;
- }
- }
復制代碼
0.png (60.37 KB, 下載次數: 112)
下載附件
2016-10-11 00:30 上傳
所有資料下載:
51單片機萬年歷3個數碼管顯示.rar
(80.18 KB, 下載次數: 339)
2016-10-11 00:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: lids 時間: 2016-10-12 10:04
下載了,學習學習
作者: HIHiss 時間: 2016-12-27 20:00
謝謝分享
作者: tranhunga 時間: 2017-4-30 16:39
下載了,學習學習
作者: jndkugr 時間: 2017-6-13 18:30
基于51單片機設計的數碼管萬年歷proteus仿真及源碼
這個有設計報告嘛
作者: admin 時間: 2017-6-13 20:24
沒有設計報告
作者: 348652560 時間: 2017-6-15 17:18
謝謝分享!收藏了!
作者: chuailiwei 時間: 2018-4-7 19:26
謝謝分享!
作者: mrq 時間: 2018-5-7 13:29
好棒
作者: mrq 時間: 2018-5-7 17:50
可以把圖給完整嗎?沒有幣無法下載。
作者: 王子的新衣 時間: 2018-5-8 16:40
為什么我的顯示的是09年
作者: feiji666 時間: 2018-5-8 17:47
非常清晰,認真,感謝!
作者: wl020807 時間: 2018-6-20 11:48
謝謝分享
作者: tyuioz 時間: 2018-6-21 15:07
這是數碼管還是液晶呀
作者: 233355 時間: 2018-6-28 21:10
沒有DS18B20啊
作者: gwn 時間: 2018-7-2 14:00
怎么調整日期?
作者: 白前輩two 時間: 2018-7-2 15:05
謝謝分享,收藏了
作者: 18686 時間: 2018-12-7 21:25
請問端口地址是怎么看的?
作者: lbq666 時間: 2018-12-11 10:34
下載了,學習學習
作者: 浪跡天崖 時間: 2019-5-10 10:27
好厲害
作者: LINGLIING 時間: 2019-6-9 13:37
學習一下用法
作者: liming_nefu 時間: 2019-9-19 11:04
為什么我的刷新就只能是一個一個的顯示呀,學習下樓主的思想
作者: liming_nefu 時間: 2019-9-19 22:50
你好,請問display()函數中,最后一行(472行)代碼,P2=0xFF;是什么作用
作者: z844748074 時間: 2019-12-18 08:54
謝謝分享
作者: wbs001 時間: 2019-12-18 17:17
太強了,幫了大忙
作者: wyk1237 時間: 2019-12-18 20:11
一直以來就是想做了
作者: duogeng 時間: 2020-1-23 19:29
下載了,學習學習,謝謝分享
作者: a997389797 時間: 2020-6-14 22:22
我想下載學習學習
作者: dj3365191 時間: 2020-11-5 12:35
和介紹不符啊,哪有DS1302和DS18B20?
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
日韩一区二区三区在线观看
|
免费一区二区三区
|
国产精品亚洲欧美日韩一区在线
|
黄色av网站在线免费观看
|
免费视频一区
|
91免费在线视频
|
农夫在线精品视频免费观看
|
91精品久久久久久久久久
|
国产区第一页
|
黄色成人免费看
|
日韩国产精品一区二区三区
|
成人高清在线
|
国产精品免费一区二区三区
|
欧美日韩国产在线观看
|
久草中文在线
|
国产高清精品在线
|
天天干b|
一级毛片在线播放
|
一区二区三区四区在线
|
在线成人av
|
特级丰满少妇一级aaaa爱毛片
|
中文字幕国产在线
|
蜜臀久久
|
国产一区 在线视频
|
亚州综合在线
|
久久综合国产精品
|
日韩精品福利
|
国产精品99视频
|
国产成人精品av
|
91大片|
欧美中文一区
|
国产一二区免费视频
|
欧美黄色一区
|
精品国产伦一区二区三区观看说明
|
色婷婷久久久久swag精品
|
中文字幕日韩在线
|
羞羞视频免费在线观看
|
成年人网站免费视频
|
欧美午夜一区
|
久久之精品|
国产高清免费
|