版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
單片機C語言模塊化編程之?dāng)?shù)碼管顯示電子萬年歷篇單片機C語言模塊化編程之?dāng)?shù)碼管顯示電子萬年歷篇單片機C語言模塊化編程之?dāng)?shù)碼管顯示電子萬年歷篇數(shù)碼管顯示模塊化顯示電子萬年歷數(shù)碼管共陽極7407驅(qū)動共陰極max7221/7419驅(qū)動Ds1302實不時間顯示Ds18b20溫度顯示芯片/**/#ifndef_DELAY_H#define_DELAY_H_#defineuintunsignedint#defineucharunsignedcharvoiddelay(uintxms);0fCSB..CLK..sbitCSB=P2^1;sbitCLK=P2^2;sbitDIN1=P2^3;sbitCSB1=P2^4;sbitCLK1=P2^5;externvoidwrite(unsignedcharaddr,unsignedchardat);//max7221寫數(shù)據(jù),變換數(shù)據(jù)函數(shù),num的值為1,或許2,當(dāng)num為1時,片選的是第一塊Max7221,同理亦然。externvoidwrite1(ucharaddr,uchardat);1externvoidinit();//max7221初始化externvoidinit1();#endif/**/#include""#include<>voidwrite(ucharaddr,uchardat)//寫數(shù)據(jù),寫地點函數(shù){uchari;CSB=0;for(i=0;i<8;i++){CLK=0;addr<<=1;DIN=CY;CLK=1;_nop_();_nop_();CLK=0;}for(i=0;i<8;i++){CLK=0;dat<<=1;DIN=CY;CLK=1;_nop_();_nop_();CLK=0;}CSB=1;}voidwrite1(ucharaddr,uchardat){uchari;CSB1=0;for(i=0;i<8;i++){2CLK1=0;addr<<=1;DIN1=CY;CLK1=1;_nop_();_nop_();CLK1=0;}for(i=0;i<8;i++){CLK1=0;dat<<=1;DIN1=CY;CLK1=1;_nop_();_nop_();CLK1=0;}CSB1=1;}voidinit(){write(0x09,0xff);//編碼模式地點0x09,0x00-0xff,為1的則位選通write(0x0a,0x07);//亮度地點0x0a,0x00-0x0f,0x0f時最亮write(0x0b,0x07);//掃描數(shù)碼管個數(shù)地點0x0c,最多掃描8只數(shù)碼管write(0x0c,0x01);//工作模式地點0x0c0x00:封閉;0x01:正常}voidinit1(){write1(0x09,0xff);write1(0x0a,0x07);write1(0x0b,0x07);write1(0x0c,0x01);}/**/#ifndef_DS18B20_H#define_DS18B20_H3#include<>#include""#include<>#defineNOP(){_nop_(),_nop_(),_nop_(),_nop_()}sbitDQ=P1^3;//DS18B20控制線,單線模式。externbitng;//正負(fù)數(shù)標(biāo)記位,ng=0,為正數(shù),反之為負(fù)數(shù),正數(shù)負(fù)數(shù)的辦理方法不一樣樣,externbitDS18B20_IS_OK;//為1時表示目前讀取溫度正常,不然讀取失敗。externucharDisplay_Digit[4];//讀取的溫度值變換后存在這個數(shù)組中externvoidRead_Temperature();//讀取目前溫度值externvoidProcess_Temperature();//辦理目前獲取的溫度值,正數(shù),負(fù)數(shù)等。#endif/**/#include""http://溫度字符ucharcodeTemperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};//溫度小數(shù)比較表ucharcodedf_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};ucharCurrentT=0;//目前讀取的溫度整數(shù)部分ucharTemp_Value[]={0x00,0x00};//從DS18B20讀取的溫度值bitng=0;//正負(fù)數(shù)標(biāo)記位,ng=0,為正數(shù),反之為負(fù)數(shù),正數(shù)負(fù)數(shù)的辦理方法不一樣樣,bitDS18B20_IS_OK=1;//為1時表示目前讀取溫度正常,不然讀取失敗。ucharDisplay_Digit[4]={0,0,0,0};//讀取的溫度值變換后存在這個數(shù)組中//-------------------------------------------------------//初始化DS18B20//-------------------------------------------------------ucharInit_DS18B20(){ucharstatus;DQ=1;delayms(8);DQ=0;delayms(90);DQ=1;delayms(8);status=DQ;delayms(100);DQ=1;returnstatus;}4//-------------------------------------------------------//讀一字節(jié)//-------------------------------------------------------ucharReadOneByte(){uchari,dat=0;DQ=1;_nop_();for(i=0;i<8;i++){DQ=0;dat>>=1;DQ=1;_nop_();_nop_();if(DQ)dat|=0x80;delayms(30);DQ=1;}returndat;}//-------------------------------------------------------寫一字節(jié)//-------------------------------------------------------voidWriteOneByte(uchardat){uchari;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;delayms(5);DQ=1;dat>>=1;}}//----------------------------------------------------------------//讀取溫度值//----------------------------------------------------------------voidRead_Temperature(){if(Init_DS18B20()==1)//DS18B20故障DS18B20_IS_OK=0;else{WriteOneByte(0xCC);//跳過序列號WriteOneByte(0x44);//啟動溫度變換Init_DS18B20();WriteOneByte(0xCC);//跳過序列號WriteOneByte(0xBE);//讀取溫度存放器Temp_Value[0]=ReadOneByte();//溫度低8位Temp_Value[1]=ReadOneByte();//溫度高8位5DS18B20_IS_OK=1;}}//----------------------------------------------------------------//對讀取的溫度值進行判斷,辦理,負(fù)數(shù)的狀況,整數(shù)狀況//----------------------------------------------------------------voidProcess_Temperature(){//uchari;//延市價與負(fù)數(shù)表記//ucharng=0;//高5位全為1(0)則為負(fù)數(shù),為負(fù)數(shù)時取反加1,并設(shè)置負(fù)數(shù)表記if((Temp_Value[1]&0xF8)==0xF8){Temp_Value[1]=~Temp_Value[1];Temp_Value[0]=~Temp_Value[0]+1;if(Temp_Value[0]==0x00)Temp_Value[1]++;//負(fù)數(shù)表記置1ng=1;}elseng=0;查表獲取溫度小數(shù)部分Display_Digit[0]=df_Table[Temp_Value[0]&0x0F];//獲取溫度整數(shù)部分(高字節(jié)中的第三位與低字節(jié)中的高四位,無符號)CurrentT=((Temp_Value[0]&0xF0)>>4)|((Temp_Value[1]&0x07)<<4);將整數(shù)部分分解為3位待顯示數(shù)字Display_Digit[3]=CurrentT/100;Display_Digit[2]=CurrentT%100/10;Display_Digit[1]=CurrentT%10;}/**/#include""#include""#include""ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數(shù)碼管段碼共陽極6uchardisbuff[]={0,0,10,0,0,10,0,0};//第一個max7221顯示緩存uchardisbuff1[]={0,0,10,0,0,10,0,0};//第二個max7221顯示緩存voidinit_T()//準(zhǔn)時器初始化{TMOD=0X01;TH0=-5000/256;TL0=-5000%256;TR0=1;ET0=1;EA=1;}voidmain()//主函數(shù){uchari;init();init1();//第一個max7221初始化init_T();//第二個max7221初始化Read_Temperature();//先讀一遍目前溫度delayms(50000);//讀取溫度有一段時間,先讓他等候一段時間不然下一刻顯示的將會是錯誤的溫度delayms(50000);delayms(50000);while(1){gettime();//讀取目前時間值disbuff[0]=datetime[2]/10;//將獲取的時間值分解出來disbuff[1]=datetime[2]%10;disbuff[3]=datetime[1]/10;disbuff[4]=datetime[1]%10;disbuff[6]=datetime[0]/10;disbuff[7]=datetime[0]%10;disbuff1[0]=datetime[6]/10;disbuff1[1]=datetime[6]%10;disbuff1[3]=datetime[4]/10;disbuff1[4]=datetime[4]%10;disbuff1[6]=datetime[3]/10;disbuff1[7]=datetime[3]%10;for(i=0;i<8;i++)//第一個max7221顯示{write(i+1,disbuff1[i]);}7for(i=0;i<8;i++)//第二個max7221顯示{write1(i+1,disbuff[i]);}Read_Temperature();//再次讀取目前溫度if(DS18B20_IS_OK)//假如讀取成功{Process_Temperature();//對溫度進行辦理,特別要考慮的是負(fù)數(shù)的狀況delayms(50000);//延時等溫度顯示堅固了再次讀取,這個值要取適合,不然數(shù)碼管顯示會出現(xiàn)閃耀狀況delayms(50000);delayms(50000);}}}voidTimer0_1()interrupt1//為了防范溫度顯示在數(shù)碼管上出現(xiàn)閃屏的狀況,這里使用準(zhǔn)時器來顯示目前溫度。{staticnum=0;TH0=-3000/256;//這個數(shù)值要足夠的小,這樣掃描次數(shù)才會更多,顯示才會更堅固TL0=-3000%256;P3=0x00;//每次進來時候要讓位碼清空,也叫做消影switch(num)//經(jīng)過一個Switch語句來實現(xiàn)對數(shù)碼管的掃描{case0://在數(shù)碼管上顯示目前溫度值{P0=table[Display_Digit[0]];//小數(shù)后邊的一位P3=0x20>>0;}break;case1:{P0=table[Display_Digit[1]]&0x7f;//有小數(shù)點的位要&0x7fP3=0x20>>1;//小數(shù)位,個為}break;case2://十位{if(Display_Digit[2]==0)8{if(Display_Digit[3]==0)//若十位為零且百位也為零,則都顯示十位為空P0=0xff;P0=0xff;}elseP0=table[Display_Digit[2]];//不然,正常顯示目前十位的值P3=0x20>>2;}break;case3:{if(Display_Digit[3]==0)//若百位為零,則不顯示,P0=0xff;else//不然正常顯示P0=table[Display_Digit[3]];P3=0x20>>3;}break;case4://顯示口{P0=~0x63;P3=0x80;}break;case5://固定顯示C{P0=~0x39;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版塔吊租賃與拆卸安全指導(dǎo)勞務(wù)分包合同協(xié)議書3篇
- 2025年度機場候機樓日常清潔與安全檢查服務(wù)合同4篇
- 2025年度個人股權(quán)贈與協(xié)議(公益捐贈)4篇
- 2025年度個人與公司承包旅游服務(wù)合同范本2篇
- 2025版明星肖像使用權(quán)獨家轉(zhuǎn)讓合同2篇
- 2025版?zhèn)€人二手房交易房屋抵押貸款服務(wù)協(xié)議
- 2025年度個人獨資企業(yè)數(shù)據(jù)安全管理與隱私保護合同3篇
- 2025年度個人向非營利組織貸款合同樣本2篇
- 2025年度大型橋梁鋼管腳手架施工勞務(wù)承包合同
- 2025-2030全球法庭口譯服務(wù)行業(yè)調(diào)研及趨勢分析報告
- 全球250個國家中英文名稱及縮寫
- 常州市2023-2024學(xué)年八年級上學(xué)期期末地理試卷(含答案解析)
- 道路安全教育課件
- 2023年浙江省衢州市中考語文試題(含答案解析)
- 深靜脈血栓(DVT)課件
- 2023年四川省廣元市中考數(shù)學(xué)試卷
- 醫(yī)務(wù)科運用PDCA循環(huán)提高門診醫(yī)生準(zhǔn)時出診率PDCA成果匯報
- GB/T 19885-2005聲學(xué)隔聲間的隔聲性能測定實驗室和現(xiàn)場測量
- GB/T 17387-1998潛油電泵裝置的操作、維護和故障檢查
- 高標(biāo)準(zhǔn)基本農(nóng)田建設(shè)規(guī)范培訓(xùn)課件
- 學(xué)校委托管理協(xié)議書范本
評論
0/150
提交評論