




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、單片機(jī)課程設(shè)計(jì)一、 方案該作品是個(gè)性化電子鐘設(shè)計(jì),技術(shù)上主要用單片機(jī)(at89c51)主控,16腳的液晶顯示,有ds1302芯片制作電子時(shí)鐘,用ds18b20芯片來(lái)完成溫度的測(cè)控。二、電路特色 此次設(shè)計(jì)的帶溫度顯示的電子鐘,具有萬(wàn)年歷(調(diào)節(jié)),整點(diǎn)報(bào)時(shí),鬧鐘,蜂鳴器播放音樂(lè)(生日快樂(lè)歌)等功能。三、流程圖四、程序#include #include /#include lcd1602.h/#include ds1302.h#define uint unsigned int#define uchar unsigned charsbit ds1302_clk = p17; /實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳sbi
2、t ds1302_io = p16; /實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳sbit ds1302_rst = p15; /實(shí)時(shí)時(shí)鐘復(fù)位線引腳sbit beep=p34;sbit acc0 = acc0;sbit acc7 = acc7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year,hide_m,hide_f,hide_h;sbit set = p20; /模式切換鍵sbit up = p21; /加法按鈕sbit down = p22; /減法按鈕sbit out = p23; /立刻跳出調(diào)整模式按鈕sbit
3、dq = p10; /溫度傳送數(shù)據(jù)io口sbit dd=p24;char done,count,temp,flag,up_flag,down_flag,key;uchar temp_value; /溫度值uchar m,f,h,mo,d,y,w,kaiguan,h=12,f=30;uchar tempbuffer5,week_value2,nao8;void naotime();uchar code tone=212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,159,169,190,119,119,126,159,1
4、42,159,0;uchar code lon=9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0;void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void music()uint i,j,k=0,m;for(m=0;m26;m+)for(i=0;ilonk*20;i+)beep=beep;for(j=0;j0; i-)ds1302_io = acc0; /相當(dāng)于匯編中的 rrcds1302_clk = 1;ds1302_clk = 0;ac
5、c = acc 1;unsigned char ds1302outputbyte(void) /實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù))unsigned char i;for(i=8; i0; i-)acc = acc 1; /相當(dāng)于匯編中的 rrcacc7 = ds1302_io;ds1302_clk = 1;ds1302_clk = 0;return(acc);void write1302(unsigned char ucaddr, unsigned char ucda)/ucaddr: ds1302地址, ucdata: 要寫(xiě)的數(shù)據(jù)ds1302_rst = 0;ds1302_clk = 0;ds1
6、302_rst = 1;ds1302inputbyte(ucaddr); / 地址,命令ds1302inputbyte(ucda); / 寫(xiě)1byte數(shù)據(jù)ds1302_clk = 1;ds1302_rst = 0;unsigned char read1302(unsigned char ucaddr)/讀取ds1302某地址的數(shù)據(jù)unsigned char ucdata;ds1302_rst = 0;ds1302_clk = 0;ds1302_rst = 1;ds1302inputbyte(ucaddr|0x01); / 地址,命令ucdata = ds1302outputbyte(); /
7、讀1byte數(shù)據(jù)ds1302_clk = 1;ds1302_rst = 0;return(ucdata);void ds1302_gettime(systemtime *time) /獲取時(shí)鐘芯片的時(shí)鐘數(shù)據(jù)到自定義的結(jié)構(gòu)型數(shù)組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
8、+ (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(d
9、s1302_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) /將時(shí)間年,月,日,星期數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符串,放到數(shù)組里datestring if(hide_year2) /這里的if,else語(yǔ)句都是判斷位閃爍,2就不顯示,輸出字符串為 2007/07/22time-datestri
10、ng0 = 2;time-datestring1 = 0;time-datestring2 = time-year/10 + 0;time-datestring3 = time-year%10 + 0;elsetime-datestring0 = ;time-datestring1 = ;time-datestring2 = ;time-datestring3 = ;time-datestring4 = /;if(hide_monthdatestring5 = time-month/10 + 0;time-datestring6 = time-month%10 + 0;elsetime-dat
11、estring5 = ;time-datestring6 = ;time-datestring7 = /;if(hide_daydatestring8 = time-day/10 + 0;time-datestring9 = time-day%10 + 0;time-datestring10 = ;time-datestring11 = ;elsetime-datestring8 = ;time-datestring9 = ;time-datestring10 = ;time-datestring11 = ;if(hide_weekweek%10 + 0; /星期的數(shù)據(jù)另外放到 week_va
12、lue數(shù)組里,跟年,月,日的分開(kāi)存放,因?yàn)榈纫幌乱谧詈箫@示elseweek_value0 = ;week_value1 = 0;time-datestring10 = 0; /字符串末尾加 0 ,判斷結(jié)束字符void timetostr(systemtime *time) /將時(shí),分,秒數(shù)據(jù)轉(zhuǎn)換成液晶顯示字符放到數(shù)組 timestring;if(hide_hourtimestring0 = time-hour/10 + 0;time-timestring1 = time-hour%10 + 0;elsetime-timestring0 = ;time-timestring1 = ;time-
13、timestring2 = :;if(hide_mintimestring3 = time-minute/10 + 0;time-timestring4 = time-minute%10 + 0;elsetime-timestring3 = ;time-timestring4 = ;time-timestring5 = :;if(hide_sectimestring6 = time-second/10 + 0;time-timestring7 = time-second%10 + 0;time-timestring8 = ;elsetime-timestring6 = ;time-timest
14、ring7 = ;time-timestring8 = ;time-datestring9 = 0;void baoshi(systemtime *time)if(time-hourhour8&time-minute/10=0&time-minute%10=0&time-second/10=0&time-second%10=0)music();void naozhong(systemtime *time) if(time-minute%10=(f%10)&time-minute/10=(f/10)&time-hour%10=(h%10)&time-hour/10=(h/10)&time-sec
15、ond%10=(m%10)&time-second/10=(m/10) music();void initial_ds1302(void) /時(shí)鐘芯片初始化unsigned char second=read1302(ds1302_second);if(second&0x80) /判斷時(shí)鐘芯片是否關(guān)閉write1302(0x8e,0x00); /寫(xiě)入允許write1302(0x8c,0x07); /以下寫(xiě)入初始化時(shí)間 日期:07/07/25.星期: 3. 時(shí)間: 23:59:55write1302(0x88,0x07);write1302(0x86,0x25);write1302(0x8a,0x
16、07);write1302(0x84,0x23);write1302(0x82,0x59);write1302(0x80,0x55);write1302(0x8e,0x80); /禁止寫(xiě)入/*ds18b20子程序*/*ds18b20延遲子函數(shù)(晶振12mhz )*/void delay_18b20(unsigned int i)while(i-);/*ds18b20初始化函數(shù)*/void init_ds18b20(void)unsigned char x=0;dq = 1; /dq復(fù)位delay_18b20(8); /稍做延時(shí)dq = 0; /單片機(jī)將dq拉低delay_18b20(80);
17、/精確延時(shí) 大于 480usdq = 1; /拉高總線delay_18b20(14);x=dq; /稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗delay_18b20(20);/*ds18b20讀一個(gè)字節(jié)*/unsigned char readonechar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-)dq = 0; / 給脈沖信號(hào)dat=1;dq = 1; / 給脈沖信號(hào)if(dq)dat|=0x80;delay_18b20(4);return(dat);/*ds18b20寫(xiě)一個(gè)字節(jié)*/void writeonechar(uchar da
18、t)unsigned char i=0;for (i=8; i0; i-)dq = 0;dq = dat&0x01;delay_18b20(5);dq = 1;dat=1;/*讀取ds18b20當(dāng)前溫度*/void readtemp(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;init_ds18b20();writeonechar(0xcc); / 跳過(guò)讀序號(hào)列號(hào)的操作writeonechar(0x44); / 啟動(dòng)溫度轉(zhuǎn)換delay_18b20(100); / this message is wery importan
19、tinit_ds18b20();writeonechar(0xcc); /跳過(guò)讀序號(hào)列號(hào)的操作writeonechar(0xbe); /讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度delay_18b20(100);a=readonechar(); /讀取溫度值低位b=readonechar(); /讀取溫度值高位temp_value=b4;void temp_to_str() /溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示tempbuffer0=temp_value/10+0; /十位tempbuffer1=temp_value%10+0; /個(gè)位tempbuffer2=0xdf; /溫度符號(hào)tempb
20、uffer3=c;tempbuffer4=0;void naoz() if(hide_h2) nao0=h/10+0; nao1=h%10+0;elsenao0= ; nao1= ; nao2=:;if(hide_f2) nao3=f/10+0; nao4=f%10+0;elsenao3= ;nao4= ; nao5=:;if(hide_m2) nao6=m/10+0; nao7=m%10+0;else nao6= ; nao7= ; nao8=0;void delay1ms(unsigned int count)unsigned int i,j;for(i=0;icount;i+)for(j
21、=0;j0;delay-)for(i=0;i0x59) /超過(guò)59秒,清零temp=0;break;case 2:temp=read1302(ds1302_minute); /讀取分?jǐn)?shù)temp=temp+1; /分?jǐn)?shù)加1up_flag=1;if(temp=0)music();delay(2);if(temp0x59) /超過(guò)59分,清零temp=0;break;case 3:temp=read1302(ds1302_hour); /讀取小時(shí)數(shù)temp=temp+1; /小時(shí)數(shù)加1up_flag=1;if(temp0x23) /超過(guò)23小時(shí),清零temp=0;break;case 4:temp=
22、read1302(ds1302_week); /讀取星期數(shù)temp=temp+1; /星期數(shù)加1up_flag=1;if(temp0x7)temp=1;break;case 5:temp=read1302(ds1302_day); /讀取日數(shù)temp=temp+1; /日數(shù)加1up_flag=1;if(temp0x31)temp=1;break;case 6:temp=read1302(ds1302_month); /讀取月數(shù)temp=temp+1; /月數(shù)加1up_flag=1;if(temp0x12)temp=1;break;case 7:temp=read1302(ds1302_year
23、); /讀取年數(shù)temp=temp+1; /年數(shù)加1up_flag=1;if(temp0x85)temp=0;break;default:break;while(up=0);void upkey1()/升序按鍵up=1;if(up=0)mdelay(8);switch(count)case 1:m=m+1; /秒數(shù)加1up_flag=1; /數(shù)據(jù)調(diào)整后更新標(biāo)志if(m59) /超過(guò)59秒,清零m=0;break;case 2:f=f+1; /分?jǐn)?shù)加1up_flag=1;if(f59) /超過(guò)59分,清零f=0;break;case 3:h=h+1; /小時(shí)數(shù)加1up_flag=1;if(h23
24、) /超過(guò)23小時(shí),清零h=0;break;default:break;while(up=0);/ void downkey()/降序按鍵down=1;if(down=0)mdelay(8);switch(count)case 1:temp=read1302(ds1302_second); /讀取秒數(shù)temp=temp-1; /秒數(shù)減1down_flag=1; /數(shù)據(jù)調(diào)整后更新標(biāo)志if(temp=0x7f) /小于0秒,返回59秒temp=0x59;break;case 2:temp=read1302(ds1302_minute); /讀取分?jǐn)?shù)temp=temp-1; /分?jǐn)?shù)減1down_fl
25、ag=1;if(temp=-1)temp=0x59; /小于0秒,返回59秒break;case 3:temp=read1302(ds1302_hour); /讀取小時(shí)數(shù)temp=temp-1; /小時(shí)數(shù)減1down_flag=1;if(temp=-1)temp=0x23;break;case 4:temp=read1302(ds1302_week); /讀取星期數(shù)temp=temp-1; /星期數(shù)減1down_flag=1;if(temp=0)temp=0x7;break;case 5:temp=read1302(ds1302_day); /讀取日數(shù)temp=temp-1; /日數(shù)減1dow
26、n_flag=1;if(temp=0)temp=31;break;case 6:temp=read1302(ds1302_month); /讀取月數(shù)temp=temp-1; /月數(shù)減1down_flag=1;if(temp=0)temp=12;break;case 7:temp=read1302(ds1302_year); /讀取年數(shù)temp=temp-1; /年數(shù)減1down_flag=1;if(temp=-1)temp=0x85;break;default:break;while(down=0);void downkey1()/降序按鍵down=1;if(down=0)mdelay(8);
27、switch(count)case 1:m=m-1; /秒數(shù)減1down_flag=1; /數(shù)據(jù)調(diào)整后更新標(biāo)志if(m=0) /小于0秒,返回59秒m=59;break;case 2:f=f-1; /分?jǐn)?shù)減1down_flag=1;if(f=-1)f=59; /小于0秒,返回59秒break;case 3:h=h-1; /小時(shí)數(shù)減1down_flag=1;if(h=-1)h=23;break;default:break;while(down=0);void setkey()/模式選擇按鍵set=1;if(set=0)mdelay(8);count=count+1; /setkey按一次,cou
28、nt就加1done=1; /進(jìn)入調(diào)整模式while(set=0);void setkey1()dd=1;if(dd=0)mdelay(8);kaiguan=1; /naotime();count=count+1; /setkey按一次,count就加1key=1; /進(jìn)入調(diào)整模式while(dd=0);void keydone()/按鍵功能執(zhí)行 uchar second;if(flag=0) /關(guān)閉時(shí)鐘,停止計(jì)時(shí) write1302(0x8e,0x00); /寫(xiě)入允許temp=read1302(0x80);write1302(0x80,temp|0x80);write1302(0x8e,0x8
29、0); /禁止寫(xiě)入flag=1;setkey(); /掃描模式切換按鍵switch(count)case 1:do /count=1,調(diào)整秒outkey(); /掃描跳出按鈕upkey(); /掃描加按鈕downkey(); /掃描減按鈕if(up_flag=1|down_flag=1) /數(shù)據(jù)更新,重新寫(xiě)入新的數(shù)據(jù)write1302(0x8e,0x00); /寫(xiě)入允許write1302(0x80,temp|0x80); /寫(xiě)入新的秒數(shù)write1302(0x8e,0x80); /禁止寫(xiě)入up_flag=0;down_flag=0;hide_sec+; /位閃計(jì)數(shù)if(hide_sec3)hi
30、de_sec=0;show_time(); /液晶顯示數(shù)據(jù)while(count=2);break;case 2:do /count=2,調(diào)整分hide_sec=0;outkey();upkey();downkey();if(temp0x60)temp=0;if(up_flag=1|down_flag=1)write1302(0x8e,0x00); /寫(xiě)入允許write1302(0x82,temp); /寫(xiě)入新的分?jǐn)?shù)write1302(0x8e,0x80); /禁止寫(xiě)入up_flag=0;down_flag=0;hide_min+;if(hide_min3)hide_min=0;show_ti
31、me();while(count=3);break;case 3:do /count=3,調(diào)整小時(shí)hide_min=0;outkey();upkey();downkey();if(up_flag=1|down_flag=1)write1302(0x8e,0x00); /寫(xiě)入允許write1302(0x84,temp); /寫(xiě)入新的小時(shí)數(shù)write1302(0x8e,0x80); /禁止寫(xiě)入up_flag=0;down_flag=0;hide_hour+;if(hide_hour3)hide_hour=0;show_time();while(count=4);break;case 4:do /c
32、ount=4,調(diào)整星期hide_hour=0;outkey();upkey();downkey();if(up_flag=1|down_flag=1)write1302(0x8e,0x00); /寫(xiě)入允許write1302(0x8a,temp); /寫(xiě)入新的星期數(shù)write1302(0x8e,0x80); /禁止寫(xiě)入up_flag=0;down_flag=0;hide_week+;if(hide_week3)hide_week=0;show_time();while(count=5);break;case 5:do /count=5,調(diào)整日hide_week=0;outkey();upkey(
33、);downkey();if(up_flag=1|down_flag=1)write1302(0x8e,0x00); /寫(xiě)入允許write1302(0x86,temp); /寫(xiě)入新的日數(shù)write1302(0x8e,0x80); /禁止寫(xiě)入up_flag=0;down_flag=0;hide_day+;if(hide_day3)hide_day=0;show_time();while(count=6);break;case 6:do /count=6,調(diào)整月hide_day=0;outkey();upkey();downkey();if(up_flag=1|down_flag=1)write1
34、302(0x8e,0x00); /寫(xiě)入允許write1302(0x88,temp); /寫(xiě)入新的月數(shù)write1302(0x8e,0x80); /禁止寫(xiě)入up_flag=0;down_flag=0;hide_month+;if(hide_month3)hide_month=0;show_time();while(count=7);break;case 7:do /count=7,調(diào)整年hide_month=0;outkey();upkey();downkey();if(up_flag=1|down_flag=1)write1302(0x8e,0x00); /寫(xiě)入允許write1302(0x8c
35、,temp); /寫(xiě)入新的年數(shù)write1302(0x8e,0x80); /禁止寫(xiě)入up_flag=0;down_flag=0;hide_year+;if(hide_year3)hide_year=0;show_time();while(count=8);break;case 8: count=0;hide_year=0; /count8, 跳出調(diào)整模式,返回默認(rèn)顯示狀態(tài)second=read1302(ds1302_second);write1302(0x8e,0x00); /寫(xiě)入允許write1302(0x80,second&0x7f);write1302(0x8e,0x80); /禁止寫(xiě)入done=0;break; /count=7,開(kāi)啟中斷,標(biāo)志位置0并退出default:break;void keydone1()/按鍵功能執(zhí)行 uchar second;setkey1(); /掃描模式切換按鍵switch(count)case 1:do /count=1,調(diào)整秒outkey1(); /掃描跳出按鈕upkey1(); /掃描加按鈕downkey1(); /掃描減按鈕hide_m+; /位閃計(jì)數(shù)if(hide_m3)hide_m=0;naotime()
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東省棗莊市現(xiàn)代實(shí)驗(yàn)學(xué)校2024-2025學(xué)年高考原創(chuàng)信息試卷物理試題(三)含解析
- 山西省忻州市岢嵐縣中學(xué)2025屆高三下學(xué)期教學(xué)質(zhì)量調(diào)研考試(二模)歷史試題試卷含解析
- 四川托普信息技術(shù)職業(yè)學(xué)院《NoSQ數(shù)據(jù)庫(kù)原理》2023-2024學(xué)年第二學(xué)期期末試卷
- 上海外國(guó)語(yǔ)大秀洲外國(guó)語(yǔ)校2024-2025學(xué)年初三4月階段性測(cè)試語(yǔ)文試題含解析
- 西北師范大學(xué)《地方文化研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 武漢科技大學(xué)《印度文化遺產(chǎn)賞析》2023-2024學(xué)年第二學(xué)期期末試卷
- 上海師范大學(xué)《中國(guó)古代文學(xué)I》2023-2024學(xué)年第一學(xué)期期末試卷
- 江蘇省高郵市陽(yáng)光雙語(yǔ)初中重點(diǎn)名校2025年初三最后一考生物試題試卷含解析
- 西安高新科技職業(yè)學(xué)院《外國(guó)史學(xué)史》2023-2024學(xué)年第一學(xué)期期末試卷
- 江蘇省蘇州市東山中學(xué)2025年初三5月月考英語(yǔ)試題理試題含答案
- 不要慌太陽(yáng)下山有月光二部合唱簡(jiǎn)譜
- 中西文化比較與跨文化交際知到課后答案智慧樹(shù)章節(jié)測(cè)試答案2025年春南開(kāi)大學(xué)
- 2025春新七年級(jí)道德與法治下冊(cè)全冊(cè)知識(shí)點(diǎn)
- 2025年農(nóng)村土地使用權(quán)益永久轉(zhuǎn)租協(xié)議范本
- Unit 9 Active learning 教學(xué)設(shè)計(jì)-2023-2024學(xué)年高中英語(yǔ)北師大版(2019)必修第三冊(cè)
- 漁場(chǎng)基地建設(shè)實(shí)施方案
- 病歷書(shū)寫(xiě)規(guī)范培訓(xùn)課件
- 2025年滬科版七年級(jí)數(shù)學(xué)下冊(cè)全套測(cè)試卷
- 《食源性病原體》課件
- (中等生篇)2025年高考備考高中歷史個(gè)性化分層教輔之宋元時(shí)期
- 《藥品泡罩包裝應(yīng)用指南(征求意見(jiàn)稿)》
評(píng)論
0/150
提交評(píng)論