X雙色點陣字LED點陣屏DS萬年歷電子鐘溫度顯示DSB C 程序.doc_第1頁
X雙色點陣字LED點陣屏DS萬年歷電子鐘溫度顯示DSB C 程序.doc_第2頁
X雙色點陣字LED點陣屏DS萬年歷電子鐘溫度顯示DSB C 程序.doc_第3頁
X雙色點陣字LED點陣屏DS萬年歷電子鐘溫度顯示DSB C 程序.doc_第4頁
X雙色點陣字LED點陣屏DS萬年歷電子鐘溫度顯示DSB C 程序.doc_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、/* 16X64雙色點陣4字LED點陣屏DS1302萬年歷電子鐘溫度顯示DS18B20 C 程序/*單片機:STC89C52 或者其他型號都可以晶振 30M 如果換用其他晶振 DS18B20延時函數(shù)需修改 見void delay_18B20(unsigned int i)說明功能簡介:上電移動一下廣告,然后進入時間顯示 切換顯示時間 星期 月日 年 溫度4個按鍵 分別進行調時設置切換間隔時間可設置 /*點陣屏管腳定義SHCP GNDSTCP GNDR1 GNDG1 GNDOE GNDA GNDB GNDC D/接口說明/A B C D 是138行掃描信號/ SHCP 是595的移位信號/ ST

2、CP 是595的鎖存信號/ OE 是屏的使能端 可以控制亮度/ R 是紅色信號線/ G 是綠色信號線 /* DS1302 接線圖 Vcc2 CLK I/O /RST | - 8 7 6 5 DS1302 | | 1 2 3 4 | - | | VCC1 GND1 腳接+5V 2,3腳32768HZ晶振 4腳接地 5腳接S51的P02 6腳接S51的P01 7接S51的P008腳接后備電源,可以接老計算機主板上的3.6V電池,也可以通過二級管隔離接一個大容量電解電容電壓在2.5V以上即可維持 595連級輸出數(shù)據(jù),138行驅動。/include”NEW_8051.H”#define uchar u

3、nsigned char#define uint unsigned int#define light 3 /定義亮度uchar code hanzi; /漢字字模uchar code shengri;/生日字模uchar code timer1416;/09數(shù)字uchar code sw; /138驅動數(shù)據(jù)uchar U8FLAG;bit zz=0,rr=0;uchar FLAG;uchar ucTemp;uchar U8count,U8temp;uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;uchar U8T_

4、data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;uchar ucComdata;void Show_word(); /待機顯示按三秒間隔分別顯示年、月日、星期、時分秒。void Show_pass(); /不顯示一個字void Send_data(unsigned char d); /發(fā)送一個字節(jié)紅色數(shù)據(jù)*/void Send_data1(unsigned char d); /*發(fā)送一個字節(jié)綠色數(shù)據(jù)*/void Send_data2(unsigned char d);/*發(fā)送一個字節(jié)黃

5、色色數(shù)據(jù)/*/*按鍵定義*/sbit resget=P15;/時鐘復位sbit key_moda=P17;/模式轉換sbit key_up=P43;/時鐘加sbit key_Down=P33;/時鐘減/*DS1302 數(shù)據(jù)IO定義/sbit T_CLK=P07;/DS1302引腳連接sbit T_IO =P06;sbit T_RST=P05;sbit ACC0=ACC0;/1bit數(shù)據(jù)存儲位sbit ACC7=ACC7;/*定義DS18B20 IO接口*/sbit DQ= P3 6;/ds1820data(單總線) 請根據(jù)實際 定義接口/* 點陣接口定義*/sbit SHCP=P27;/595

6、的移位信號 sbit STCP=P41;/是595的鎖存信號 /*如果用的是普通單片機 沒有P4。1口 請改為其他口/ sbit SDA_R=P23;/紅數(shù)據(jù) sbit SDA_G=P25;/綠數(shù)據(jù) sbit OE=P04;/輸出使能 sbit ID=P40;/行控制線D /*如果用的是普通單片機 沒有P4.0口 請改為其他口*/ sbit IC=P20;/行控制線C sbit IB=P21;/行控制線B sbit IA=P22;/行控制線A /*/define scan0 IA=0;IB=0;IC=0;ID=0;#define scan1 IA=1;IB=0;IC=0;ID=0;#defin

7、e scan2 IA=0;IB=1;IC=0;ID=0;#define scan3 IA=1;IB=1;IC=0;ID=0;define scan4 IA=0;IB=0;IC=1;ID=0;define scan5 IA=1;IB=0;IC=1;ID=0;define scan6 IA=0;IB=1;IC=1;ID=0;define scan7 IA=1;IB=1;IC=1;ID=0;define scan8 IA=0;IB=0;IC=0;ID=1;#define scan9 IA=1;IB=0;IC=0;ID=1;define scan10 IA=0;IB=1;IC=0;ID=1;#defi

8、ne scan11 IA=1;IB=1;IC=0;ID=1;#define scan12 IA=0;IB=0;IC=1;ID=1;#define scan13 IA=1;IB=0;IC=1;ID=1;#define scan14 IA=0;IB=1;IC=1;ID=1;#define scan15 IA=1;IB=1;IC=1;ID=1; /秒 分 時 日 月 星期 年 所以初始化時間是 12年-12月07日星期222點10分0秒uchar starts_time7=0x00,0x10,0x22,0x07,0x12,0x02,0x12; /初始化后設置uchar idata Move,Spee

9、d,Flicker,line,Sec,Cent,Hour,Year,Month,Day,Week; /時間溫度變量uchar a,b,f,h,msec,id,x; /標志計數(shù)器 a為自動轉換顯示時間,b為手動與自動標志uint zimuo; /字模計數(shù)器uchar BUFF10; /緩存void RTInputByte(uchar); /* 輸入 1Byte */uchar RTOutputByte(void); /* 輸出 1Byte /void W1302(uchar, uchar); / 向DS1302寫入一個字節(jié)uchar R1302(uchar); / 從DS1302讀出一個字節(jié)vo

10、id Set1302(uchar ); / 寫DS1302時間void du1302(); / 讀時間 void DelayMs(void); / 延時void Set(uchar,uchar ); / 變量調整void in_data(); / 調整移動數(shù)據(jù)void rxd_data(); / 串口發(fā)送移動數(shù)據(jù)read_temp(); /*讀取溫度值并轉換/void RH(void);uchar nn=0,mm=0;/*不影響其他端口的掃描*/void scan(unsigned char Value)switch(Value) case 0: scan0;break; case 1: sc

11、an1;break; case 2: scan2;break; case 3: scan3;break; case 4: scan4;break; case 5: scan5;break; case 6: scan6;break; case 7: scan7;break; case 8: scan8;break; case 9: scan9;break; case 10:scan10;break; case 11:scan11;break; case 12:scan12;break; case 13:scan13;break; case 14:scan14;break; case 15:sca

12、n15;break; default:break; /*/void SendOneByte(unsigned char c) SBUF = c; while(!TI); TI = 0;/*/主函數(shù)/void main() Move=0; zimuo=0; TMOD=0x11;/16位定時 TH0=0xC5; /15ms晶振為12M TL0=0x68; TH1 = 0x92;/ 18。2ms TL1 = 0x0CD; ET1=1; EA=1; /開總中斷 TR0=1; /開定時器計數(shù) ET0=1; /開定時器中斷0 rr=1;SCON = 0x50;/TMOD= 0x20;BRT = 0xf8;

13、 /0xfb: 30MHz,12T,SMOD=0,9600bpsAUXR |= 0x11;SendOneByte(0X55); while(zimuo512)/上電顯示一段廣告 while(Move16) /數(shù)據(jù)移位。 for(Speed=0;Speed10;Speed+) /移動速度 for(line=0;line16;line+) in_data(); /調整移動數(shù)據(jù) rxd_data(); scan(line); STCP=1;/鎖存 STCP=0; OE=0;/打開屏使能端 DelayMs(); /延時,等待一問奔洌謎飭邢允鏡哪諶菰諶搜勰誆笆泳踉萘簟畢窒?。? Move+; /移動一步

14、 Move=0; zimuo=zimuo+32; zimuo=0; while(1) /重復(無限)循環(huán)顯示 if(resget=0) DelayMs(); if(resget=0) Set1302(starts_time); /初始化 W1302(0x8e,0x00); /控制命令,WP=0,寫操作 W1302(0x90,0xa5); /打開充電二級管 一個二級管串聯(lián)一個2K電阻 du1302(); /讀取 秒 分 時 日 月 星期 年 if (nn=1) /調用溫濕度讀取子程序 RH(); /讀取溫濕度 zimuo=0; if (key_moda=0) /設置和選擇項目鍵 DelayMs(

15、); if(key_moda=0) if(id+=10) id=0; h=0;msec=0; /清閃爍標志 while(key_moda=0) Show_word(); if(id!=0) if (key_up=0) /增加 DelayMs(); if(key_up=0) while(key_up=0)Show_word(); /調用顯示 h=0;msec=0; /清閃爍標志 Set(id,0); /調用時間調調整 if (key_Down=0) /減少 DelayMs(); if(key_Down=0) while(key_Down=0) Show_word(); /調用顯示 h=0;mse

16、c=0; /清閃爍標志 Set(id,1); /調用時間調調整 else if (key_up=0) /增加 DelayMs(); if(key_up=0) while(key_up=0)Show_word(); /調用顯示 h=0;msec=0; /清閃爍標志 if(b!=0) /手動調整顯示的內容 if(f+=5) /f為顯示轉換標志 f=0; Show_word(); /待機顯示按三秒間隔分別顯示年、月日、星期、時分秒. /*/void Show_word() /串行輸出顯示 uchar h; for(h=0;h16;h+) if((id=0)&(f=0)|(id=1)/f為三秒轉換顯示

17、 Send_data(timer00); /不顯示 if((Flicker=1)&(id=1) /閃爍標志為1時不亮,為零時亮 Show_pass(); /不顯示一個字 Show_pass(); else Send_data(timer2h); /20年 Send_data(timer0h); Send_data(timerYear/16h); /年值 Send_data(timerYear%16h); Send_data(hanzih2+641); /年字符 Send_data(hanzih2+640); Send_data(timer00); /不顯示 if(id=0)(f=1)(id=2

18、)(id=3) if((Flicker=1)(id=2)/閃爍標志為1時不亮,為零時亮 Show_pass(); /不顯示一個字 else if(Month/161) Send_data1(timer00); /月十位為零時不顯示 else Send_data1(timerMonth/16h); /月值 Send_data1(timerMonth%16h); Send_data1(hanzih2+673); /月字符 Send_data1(hanzih*2+672); if((Flicker=1)(id=3) /閃爍標志為1時不亮,為零時亮 Show_pass(); /不顯示一個字 else

19、Send_data1(timerDay/16h); /日值 Send_data1(timerDay16h); Send_data1(hanzih*2+961); /日字符 Send_data1(hanzih2+960); if((id=0)&(f=2)|(id=4)) /f為三秒轉換顯示 Send_data2(timer00); /不顯示 Send_data2(hanzih*2+705); /星字符 Send_data2(hanzih2+704); Send_data2(hanzih2+737); /期字符 Send_data2(hanzih*2+736); if((Flicker=1)&(i

20、d=4) /閃爍標志為1時不亮,為零時亮 Show_pass(); /不顯示一個字 else Send_data2(hanziWeek1632+h*2+737); /星期值 Send_data2(hanziWeek%1632+h*2+736); Send_data(timer00); /不顯示 if((id=0)(f=3)(id4)) /f為三秒轉換顯示 if(Flicker=1)(id=5) /閃爍標志為1時不亮,為零時亮 Show_pass(); /不顯示一個字 else if(Hour/167) /id大于7時為對顯示轉換模式設置 if(Flicker=1)&(id=8)) Show_p

21、ass(); Show_pass(); Show_pass(); Show_pass();else if(b=0) Send_data(hanzih2+993); /顯示漢字 “自 Send_data(hanzih2+992); Send_data(hanzih2+1057); /顯示漢字“動” Send_data(hanzih2+1056); Send_data(hanzih*2+1089); /顯示漢字“?!?Send_data(hanzih2+1088); Send_data(hanzih*2+1121); /顯示漢字“式 Send_data(hanzih2+1120); else Se

22、nd_data1(hanzih*2+1025); /顯示漢字“手 Send_data1(hanzih2+1024); Send_data1(hanzih2+1057); /顯示漢字“動” Send_data1(hanzih2+1056); Send_data1(hanzih*2+1089); /顯示漢字“模 Send_data1(hanzih*2+1088); Send_data1(hanzih*2+1121); /顯示漢字“式” Send_data1(hanzih2+1120); if(id=9) if(b=1) /手動模式 id=0;f=0; else Send_data(hanzih*2

23、+993); /顯示漢字“自” Send_data(hanzih2+992); Send_data(hanzih*2+1057); /顯示漢字“動 Send_data(hanzih2+1056); if(Flicker=1) Show_pass(); else Send_data(timera/10h); /轉換時間 Send_data(timera%10h); Send_data(hanzih2+1153); /顯示漢字“秒” Send_data(hanzih*2+1152); scan(h); /輸出行信號 STCP=1;STCP=0; OE=0; /鎖存為高,595鎖存信號 DelayM

24、s(); /延時,等待一段時間,讓這列顯示的內容在人眼內產生“視覺暫留”現(xiàn)象。/ /*/void timer_0(void) interrupt 3 /中斷入口,閃爍TH1 = 0x92;/18。432M 18.2ms TL1 = 0x0CD; zz=1;TR1=0; /temp=255temp;/return temp; void timer_1(void) interrupt 1 /中斷入口,閃爍 TH0=0xC5; /15ms定時 晶振12M TL0=0x68; if(msec+=120) /1000ms msec=0; if(mm+=3) nn=1;/mm=0; x+; if(x=a)

25、 x=0; if(b=0) /自動模式 if(f+=5) f=0; /f顯示轉換計數(shù)器 ,d為用戶設置的自動轉換時間的值。 if(h+=4) /5秒后進入正常走時. id=0;h=0; if(msec=0;s-) /i為向后先擇字節(jié)計數(shù)器,zimuoo為向后先字計數(shù)器 BUFF2s+1=hanzizimuo+32s+2*line; /把第一個字模的第一個字節(jié)放入BUFF0中,第二個字模和第一個字節(jié)放入BUFF2中 BUFF2*s=hanzizimuo+1+32s+2*line; /把第一個字模的第二個字節(jié)放入BUFF1中,第二個字模的第二個字節(jié)放入BUFF3中/*發(fā)送移動的數(shù)據(jù)*/void r

26、xd_data(void) /串行發(fā)送數(shù)據(jù) uchar s; uchar inc,tempyid,temp,k; if(Move8) inc=0; else inc=1; for(s=0+inc;s8+inc;s+) /發(fā)送8字節(jié)數(shù)據(jù) if(Movetempyid)|(BUFFs+1(8tempyid));/h1左移tempyid位后和h2右移8tempyid相或,取出移位后的數(shù)據(jù). temp=255temp; SDA_G=1; for(k=0;k1; /字節(jié)移位 準備送下一位 SHCP=1; /*/void Send_data(unsigned char d) /*發(fā)送紅色數(shù)據(jù)*/uchar

27、 temp,k;temp=d;for(k=0;k8;k+)/一個字節(jié)8位 發(fā)送給595SHCP=0; /上升沿移位595 SDA_R=(bit)(temp0x01);/通過IO口送一個位給 595 發(fā)送最低位SDA_G=1;temp=temp1; /字節(jié)移位 準備送下一位 SHCP=1;/*/void Send_data1(unsigned char d)/*發(fā)送綠色數(shù)據(jù)*/uchar temp,k;temp=d;for(k=0;k8;k+)/一個字節(jié)8位 發(fā)送給595SHCP=0; /上升沿移位595 SDA_G=(bit)(temp&0x01);/通過IO口送一個位給 595 發(fā)送最低位S

28、DA_R=1;temp=temp1; /字節(jié)移位 準備送下一位 SHCP=1;/*/void Send_data2(unsigned char d)/發(fā)送黃色數(shù)據(jù)/uchar temp,k;temp=d;for(k=0;k1; /字節(jié)移位 準備送下一位 SHCP=1;/*/根據(jù)選擇調整相應項目void Set(uchar sel,uchar sel_1) uchar address,time; uchar max,min; if(sel=9) address=0xc2; max=20;min=1; /自動轉換時間時最大為20秒。 if(sel=8) address=0xc0; max=1;mi

29、n=0; /顯示自動轉換或手動轉換.為零自動,為1手動。 if(sel=7) address=0x80; max=59;min=0; /秒 if(sel=6) address=0x82; max=59;min=0; /分鐘 if(sel=5) address=0x84; max=23;min=0; /小時 if(sel=4) address=0x8a; max=7; min=1; /星期 if(sel=3) address=0x86; max=31;min=1; /日 if(sel=2) address=0x88; max=12;min=1; /月 if(sel=1) address=0x8c; max=99;min=0; /年 time=R1302(address+1)/1610+R1302(address+1)%16; if (sel_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論