單片機時鐘顯示溫度顯示_第1頁
單片機時鐘顯示溫度顯示_第2頁
單片機時鐘顯示溫度顯示_第3頁
單片機時鐘顯示溫度顯示_第4頁
單片機時鐘顯示溫度顯示_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

南華大學計算機技術(shù)綜合課程設(shè)計報告學院:湘南學院題目:單片機LCD時鐘顯示和溫度丈量學生姓名:專業(yè)班級:指導老師:教研室主任:2012年6月29日一、歸納:本次設(shè)計的LCD時鐘顯示和溫度丈量系統(tǒng)是由中央控制器、溫度檢測器、時鐘系統(tǒng)、顯示器及鍵盤部分組成??刂破鞑杉{單片機STC89C51RC,溫度檢測部分采納DS18B20溫度傳感器,時鐘系統(tǒng)用時鐘芯片DS1302,用LCD液晶1602作為顯示器,用蜂鳴器組成鬧鈴模塊。單片機經(jīng)過時鐘芯片

DS1302獲取時間數(shù)據(jù),對數(shù)據(jù)辦理后顯示時間;溫度傳感器

DS18B20收集溫度信號送該給單片機辦理;單片機再把時間數(shù)據(jù)和溫度數(shù)據(jù)送液晶顯示器1602顯示;鍵盤是用來調(diào)整時間的。二、方案設(shè)計及方案論證時鐘顯示和溫度丈量的整體設(shè)計思路依據(jù)系統(tǒng)的設(shè)計功能要求,本時鐘顯示和溫度丈量系統(tǒng)的設(shè)計一定采納單片機軟件系統(tǒng)實現(xiàn),用單片機的自動控制能力配合按鍵控制,來控制時鐘、溫度的調(diào)整及顯示。獲取時鐘顯示和溫度丈量數(shù)據(jù)信息,單片機對其進行一系列的辦理,最后經(jīng)過液晶顯示出來。時鐘顯示和溫度丈量系統(tǒng)方案論證時鐘系統(tǒng)方案選擇方案1:經(jīng)過單片機內(nèi)部的準時器/計數(shù)器,用軟件實現(xiàn),直接用單片機的準時器編程以實現(xiàn)時鐘;方案2:用特意的時鐘芯片實現(xiàn)時鐘的記時,再把時間數(shù)據(jù)送入單片機,由單片機控制顯示。固然用軟件實現(xiàn)時鐘硬件線路簡單,但是程序運轉(zhuǎn)的每一步都需要時間,多一步或少一步程序都會影響記時的正確度,瞄準時器準時也不是十分正確,時鐘精度很低,對于我們實現(xiàn)所需要的功能造成軟件編程特別復雜。用專用時鐘芯片硬件成真相對較高,但它的精度很高,軟件編程很簡單。綜上所述,選擇方案2。本次設(shè)計采納擁有涓細電流充電能力的低功耗實時時鐘電路DS1302。它可以對年、月、日、周日、時、分、秒進行計時,且擁有閏年補償?shù)榷喾N功能。它采納主電源和備用電源雙電源供電。它的工作電壓范圍~,在時,小于300nA。它內(nèi)部含有31個字節(jié)的靜態(tài)RAM,可供給用戶接見。?DS1302可以對年、月、日、周日、時、分、秒進行計時,可以達到我們設(shè)計的基本的要求。內(nèi)部的寄存器為我們調(diào)時,鬧鐘準時供給了寄存空間。備用用電源也實現(xiàn)了當系統(tǒng)斷電后,時鐘依舊可以保持。并且它是串行接口,與單片機通訊所需要的接口少。顯示系統(tǒng)的方案比較方案1:用數(shù)碼管或LED顯示。方案2:用液晶1602顯示。方案3:用液晶12864顯示。時鐘和溫度的顯示可以用數(shù)碼管或LED,并且價格低價。但是數(shù)碼管的只好顯示簡單的設(shè)計的系統(tǒng),與我們設(shè)計要求也不吻合。有很多東西需要顯示,仍是用顯示功能更好的液晶顯示器比較好,它能顯示更多的數(shù)據(jù),用12864顯示略想復雜,用1602液晶顯示可以完整知足本次設(shè)計的數(shù)據(jù)顯示要求。溫度系統(tǒng)方案選擇方案1:用熱敏電阻等測溫元件測出電壓,再變換成對應(yīng)的溫度。需要比很多的外面元件支持,且硬件電路復雜,制作成真相對較高。方案2:用DS18B20直接測溫。DS18B20溫度傳感器是美國DALLAS半導體公司最新推出的一種改進型智能溫度傳感器,它能直接讀出被測溫度,并且可依據(jù)實質(zhì)要求經(jīng)過簡單的編程實現(xiàn)9~12位的數(shù)字值讀數(shù)方式。經(jīng)比較,我們選擇方案2。溫度實現(xiàn)只好經(jīng)過外面的溫度傳感器來實現(xiàn)。經(jīng)上網(wǎng)查閱,DS18b20體積小,只有3只腳,電路接法簡單。精度為°C,也吻合我們設(shè)計的要求。DS18B20也是我們平時使用的型號,所以溫度傳感器用DS18B20。鍵盤控制方案選擇方案1:購買集成鍵盤,采納矩陣形式連接。方案2:購買單個復位開關(guān)做成鍵盤。固然集成鍵盤雅觀,與單片機的接口少,但是它的成本比較高。單片機的IO口對于我們的設(shè)計綽綽有余。平時我們采納價格低價單個復位開關(guān)做成鍵盤。時鐘顯示和溫度丈量系統(tǒng)整體設(shè)計初步確立設(shè)計系統(tǒng)由單片機主控模塊、時鐘模塊、測溫模塊、鬧鈴模塊、顯示模塊、鍵盤接口模塊共6個模塊組成,電路系統(tǒng)框圖以下列圖所示。1602DS18B20主顯示系統(tǒng)溫度收集系統(tǒng)控器蜂鳴器件鬧鈴系統(tǒng)DS1320STC89C51時間收集系統(tǒng)鍵盤控制系統(tǒng)圖1:電路系統(tǒng)框圖三、硬件電路單元設(shè)計1、單片機最小系統(tǒng)設(shè)計復位電路:復位電路有兩種方式:上電復位和按鈕復位,我們主要用按鈕復位方式。以下列圖所示:圖2:復位電路晶振電路晶振電路采用條件:晶振12M,電容20pF到30pF,本電路采用20pF。晶振電路原理以下列圖:圖3:晶振電路2、時鐘系統(tǒng)設(shè)計DS1302時鐘電路晶振采納,原理圖以下:圖4:基于ds1302時鐘系統(tǒng)設(shè)計電路3、溫度系統(tǒng)設(shè)計DS18B20溫度傳感DQ端接單片機口,電路原理圖以下:圖5:基于DS18b20溫度系統(tǒng)設(shè)計電路4、液晶顯示系統(tǒng)設(shè)計1602液晶顯示電路由1K電阻和10K的精美電阻組成,控制端接、、口,數(shù)據(jù)端接P2口,電路圖以下:圖6:液晶1602顯示電路把15腳的10K電阻改成1K電阻5、蜂鳴器系統(tǒng)設(shè)計蜂鳴器鬧鈴電路由蜂鳴器跟1K限流電阻組成,電路圖以下:圖7:蜂鳴器電路6、電源模塊本系統(tǒng)采納USB供電,用發(fā)光二極管顯示通電情況,電源電源電路以下:圖8:電源電路7、時間調(diào)治模塊本系統(tǒng)采納3個按鍵調(diào)治時間。S1是菜單鍵,選綱要調(diào)治的位;S2按一下表示加一;S3按一下表示減一。電路以下:圖9:時鐘調(diào)治電路四、軟件調(diào)試1、程序流程圖以下:圖10:程序流程圖2、程序見附錄五、硬件調(diào)試1、原理圖以下:圖11:總原理圖2、PCB圖以下:圖12:PCB圖此中紅色部分為跳線;3、實物測試板子制作完成后上電測試發(fā)現(xiàn)電源燈沒有顯示,用萬用表丈量此后發(fā)現(xiàn)精美電阻接線錯誤,致使VCC與GND直接連通。修正此后發(fā)現(xiàn)電源指示燈仍是沒有亮,丈量USB兩端電壓為,卸掉USB口,插上排針用杜邦線連接單片機的VCC和GND此后,電源燈可以點亮,液晶可以驅(qū)動,但是亮度不夠。丈量液晶兩端的電壓發(fā)現(xiàn)只有,用導線將液晶背光的VCC直接接上電源VCC后,液晶亮度正常。將程序下載此后經(jīng)過幾次調(diào)試和更正,最后實現(xiàn)了想要達到的收效。六、總結(jié)與領(lǐng)悟在開始本次課程設(shè)計前花銷了十多天的時間認真學習了單片機,經(jīng)過書籍和視頻的學習,對單片機有了進一步的掌握并學會C51編程的一些方法。這對于完成本次課程設(shè)計供給了很大的幫助。此后次的課程設(shè)計中,我真真切正的意識到,在寫程序時,邏輯思想要清楚,要有耐心。同時要奇妙的利用C語言的可移植性,這對寫程序有很大的幫助。參照文件:1.郭天祥單片機學習板配套資料2.《51單片機C語言教程》郭天祥主編電子工業(yè)第一版社3.《C語言程序設(shè)計》尹業(yè)安,白燕主編國防科技大學第一版社4.《單片機原理與應(yīng)用及C51程序設(shè)計》謝維成楊加國主編清華大學第一版社程序以下:#include<>#include<>#defineucharunsignedchar#defineuintunsignedint#defineLCDIOP2sbitDQ=P1^3;write_com(0x01);write_com(0x80);//設(shè)置初始化數(shù)據(jù)指針,是在讀指令的操作里進行的delay(5);write_com(0x80);//初始化顯示時間(tabletable1中的內(nèi)容)for(num=0;num<15;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<15;num++){write_date(table1[num]);delay(5);}}voidWrite1302(uchardat)

//寫

8bit

數(shù)據(jù){uchari;SCLK=0;

//拉低

SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準備delay1(2);for(i=0;i<8;i++)

//略微等待,使硬件做好準備//連續(xù)寫8個二進制位數(shù)據(jù){DATA=dat&0x01;

//拿出

dat

的第

0位數(shù)據(jù)寫入

1302delay(2);SCLK=1;

//略微等待,使硬件做好準備//上升沿寫入數(shù)據(jù)delay1(2);SCLK=0;dat>>=1;

//略微等待,使硬件做好準備//重新拉低SCLK,形成脈沖//將dat的各數(shù)據(jù)位右移1位,準備寫入下一個數(shù)據(jù)位}}voidWriteSet1302(ucharCmd,uchardat)//向cmd相應(yīng)地址中寫入一個字節(jié)的數(shù)據(jù){RST=0;//嚴禁數(shù)據(jù)傳達SCLK=0;//保證寫數(shù)居前SCLK被拉低RST=1;//啟動數(shù)據(jù)傳輸delay1(2);//略微等待,使硬件做好準備Write1302(Cmd);//寫入命令字Write1302(dat);//寫數(shù)據(jù)SCLK=1;//將時鐘電平置于已知狀態(tài)RST=0;//嚴禁數(shù)據(jù)傳達}ucharRead1302(void)//讀8bit數(shù)據(jù){uchari,dat;delay(2);//略微等待,使硬件做好準備for(i=0;i<8;i++)//連續(xù)讀8個二進制位數(shù)據(jù){dat>>=1;

//將

dat

的各數(shù)據(jù)位右移

1位,由于先讀出的是字節(jié)的最低位if(DATA==1)dat|=0x80;SCLK=1;

//若是讀出的數(shù)據(jù)是1//將1拿出,寫在dat的最高位//將SCLK置于高電平,為降落沿讀出delay1(2);SCLK=0;

//略微等待//拉低

SCLK,形成脈沖降落沿delay1(2);

//略微等待}returndat;

//將讀出的數(shù)據(jù)返回}ucharReadSet1302(ucharCmd)//從cmd相應(yīng)地址中讀一個字節(jié)的數(shù)據(jù){uchardat;RST=0;SCLK=0;

//拉低RST//保證寫數(shù)居前

SCLK

被拉低RST=1;

//啟動數(shù)據(jù)傳輸Write1302(Cmd);

//寫入命令字dat=Read1302( );SCLK=1;

//讀出數(shù)據(jù)//將時鐘電平置于已知狀態(tài)RST=0;

//嚴禁數(shù)據(jù)傳達returndat;

//將讀出的數(shù)據(jù)返回}voidInit_DS1302(void){WriteSet1302(0x8E,0x00);//依據(jù)寫狀態(tài)寄存器命令字,寫入不保護指令WriteSet1302(0x80,((0/10)<<4|(0%10)));//依據(jù)寫秒寄存器命令字,寫入秒的初始值WriteSet1302(0x82,((45/10)<<4|(45%10)));//依據(jù)寫分寄存器命令字,寫入分的初始值WriteSet1302(0x84,((8/10)<<4|(8%10)));//依據(jù)寫小時寄存器命令字,寫入小時的初始值WriteSet1302(0x86,((29/10)<<4|(29%10)));//依據(jù)寫日寄存器命令字,寫入日的初始值WriteSet1302(0x88,((6/10)<<4|(6%10)));//依據(jù)寫月寄存器命令字,寫入月的初始值WriteSet1302(0x8c,((12/10)<<4|(12%10)));//依據(jù)寫年寄存器命令字,寫入年的初始值WriteSet1302(0x8a,((1/10)<<4|(1%10)));//依據(jù)寫禮拜寄存器命令字,寫入禮拜的初始值}voidDisplaySecond(ucharx){

//顯示秒uchari,j;i=x/10;j=x%10;write_com(0xc7);write_date(0x30+i);write_date(0x30+j);}voidDisplayMinute(ucharx){

//顯示分uchari,j;i=x/10;j=x%10;write_com(0xc4);write_date(0x30+i);write_date(0x30+j);}voidDisplayHour(ucharx)

//顯示小時{uchari,j;i=x/10;j=x%10;write_com(0xc1);write_date(0x30+i);write_date(0x30+j);}voidDisplayDay(ucharx)//顯示日期、天{uchari,j;i=x/10;j=x%10;write_com(0x89);write_date(0x30+i);write_date(0x30+j);}voidDisplayMonth(ucharx)//顯示日期、月{uchari,j;i=x/10;j=x%10;write_com(0x86);write_date(0x30+i);write_date(0x30+j);}voidDisplayYear(ucharx)//顯示日期、年{uchari,j;i=x/10;j=x%10;write_com(0x83);write_date(0x30+i);write_date(0x30+j);}voidDisplayWeek(ucharx)//顯示禮拜{uchari;x=x*3;write_com(0x8c);for(i=0;i<3;i++){write_date(table2[x]);x++;}}voidread_date(void){ReadValue=ReadSet1302(0x81);second=((ReadValue&0x70)>>4)*10

+(ReadValue&0x0F);

//從DS1302讀取時間秒ReadValue=ReadSet1302(0x83);minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

//從DS1302讀取時間分ReadValue=ReadSet1302(0x85);hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

//從

DS1302讀取時間小時ReadValue=ReadSet1302(0x87);day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

//從

DS1302讀取日期日ReadValue=ReadSet1302(0x89);month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);DS1302讀取日期月ReadValue=ReadSet1302(0x8d);year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

//從

//從DS1302讀取日期年ReadValue=ReadSet1302(0x8b);week=ReadValue&0x07;

//從

DS1302

讀禮拜DisplaySecond(second);

//顯示秒、分、小時、天、月、年、禮拜DisplayMinute(minute);DisplayHour(hour);DisplayDay(day);DisplayMonth(month);DisplayYear(year);DisplayWeek(week);}voidturn_val(charnewval,ucharflag,ucharnewaddr,uchars1num)//刷新時間(將改變的時間顯示到LCD上){newval=ReadSet1302(newaddr);//讀取當前時間newval=((newval&0x70)>>4)*10+(newval&0x0f);//將bcd碼變換成十進制if(flag)//判斷是加一仍是減一{newval++;switch(s1num){case1:if(newval>99)newval=0;DisplayYear(newval);break;case2:if(newval>12)newval=1;DisplayMonth(newval);break;case3:if(newval>31)newval=1;DisplayDay(newval);break;case4:if(newval>6)newval=0;DisplayWeek(newval);break;case5:if(newval>23)newval=0;DisplayHour(newval);break;case6:if(newval>59)newval=0;DisplayMinute(newval);break;case7:if(newval>59)newval=0;DisplaySecond(newval);break;default:break;}}else{newval--;switch(s1num){case1:if(newval==0)newval=99;DisplayYear(newval);break;case2:if(newval==0)newval=12;DisplayMonth(newval);break;case3:if(newval==0)newval=31;DisplayDay(newval);break;case4:if(newval<0)newval=6;DisplayWeek(newval);break;case5:if(newval<0)newval=23;DisplayHour(newval);break;case6:if(newval<0)newval=59;DisplayMinute(newval);break;case7:if(newval<0)newval=59;DisplaySecond(newval);break;default:break;}}WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10));//將新數(shù)據(jù)寫入寄存器}voidkey_scan(void)

//鍵盤掃描程序{ucharmiao,s1num=0;if(menu==0){delay(5);if(menu==0){while(!menu);s1num++;while(1){if(menu==0){delay(5);if(menu==0){while(!menu);s1num++;}}rd=0;miao=ReadSet1302(0x81);second=miao;WriteSet1302(0x80,miao|0x80);write_com(0x0f);//光標閃射if(s1num==1){year=ReadSet1302(0x8d);write_com(0x80+4);//年光標if(add==0){delay(3);if(add==0){while(!add);turn_val(year,1,0x8d,1);}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(year,0,0x8d,1);}}}if(s1num==2){month=ReadSet1302(0x89);write_com(0x80+7);//月光標if(add==0){delay(3);if(add==0){while(!add);turn_val(month,1,0x89,2);}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(month,0,0x89,2);}}}if(s1num==3){day=ReadSet1302(0x87);write_com(0x80+10);//日光標if(add==0){delay(3);if(add==0){while(!add);turn_val(day,1,0x87,3);}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(day,0,0x87,3);//寫入日寄存器}}}if(s1num==4){week=ReadSet1302(0x8b);write_com(0x80+14);//禮拜光標if(add==0){delay(3);if(add==0){while(!add);turn_val(week,1,0x8b,4);}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(week,0,0x8b,4);}}}if(s1num==5){hour=ReadSet1302(0x85);write_com(0x80+0x40+2);//歲月標if(add==0){delay(3);if(add==0){while(!add);turn_val(hour,1,0x85,5);}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(hour,0,0x85,5);}}}if(s1num==6)//調(diào)時間分{minute=ReadSet1302(0x83);write_com(0x80+0x40+5);if(add==0){delay(5);if(add==0){while(!add);turn_val(minute,1,0x83,6);//寫入分寄存器}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(minute,0,0x83,6);//寫入分寄存器}}}if(s1num==7)//調(diào)時間秒{second=ReadSet1302(0x81);write_com(0x80+0x40+8);//秒光標if(add==0){delay(3);if(add==0){while(!add);if(second==0x60)second=0x00;turn_val(second,1,0x81,7);}}if(dec==0){delay(3);if(dec==0){while(!dec);turn_val(second,0,0x81,7);}}}if(s1num==8){miao=ReadSet1302(0x81);second=miao;WriteSet1302(0x80,second&0x7f);s1num=0;//s1num清零write_com(0x0c);//光標不閃耀break;}}}}}voiddelay_18B20(unsignedinti)//延時1微秒{while(i--);}voidds1820rst( )//ds1820復位{unsignedcharx=0;DQ=1;

//DQ

復位delay_18B20(4);

//延時DQ=0;

//DQ

拉低delay_18B20(100);//精確延時大于480usDQ=1;

//拉高delay_18B20(40);}uchards1820rd( )///讀數(shù)據(jù){unsignedchari=0;unsignedchardat=0;for(i=8;i>0;i--){DQ=0;//給脈沖信號dat>>=1;DQ=1;//給脈沖信號if(DQ)dat|=0x80;delay_18B20(10);}return(dat);}voidds1820wr(ucharwdata)//寫數(shù)據(jù){unsignedchari=0;for(i=8;i>0;i--){DQ=0;DQ=wdata&0x01;delay_18B20(10);DQ=1;wdata>>=1;}}read_temp( )//讀取溫度值并變換{uchara,b;ds1820rst( );ds1820wr

溫馨提示

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

評論

0/150

提交評論