版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
數(shù)碼管顯示模塊化顯示電子萬年歷數(shù)碼管共陽極7407驅(qū)動(dòng)共陰極max7221/7419驅(qū)動(dòng)Ds1302實(shí)時(shí)時(shí)間顯示Ds18b20溫度顯示芯片/*delay.h*/#ifndef_DELAY_H#define_DELAY_H_#defineuintunsignedint#defineucharunsignedcharvoiddelay(uintxms);//秒級(jí)延時(shí)voiddelayms(uintxms); //毫秒級(jí)延時(shí),不可以更改,若更改,DS18B20將顯示異常#endif/*delay.c*/#include"delay.h"voiddelay(uintxms){ uinti; ucharj; for(i=xms;i>0;i--) for(j=110;j>0;j--);}voiddelayms(uintxms) //毫秒級(jí)別延時(shí){ while(xms--);}/*ds1302.h*/#ifndef_DS1302_H_#define_DS1302_H_#include<reg51.h>#defineuintunsignedint#defineucharunsignedcharsbitIO=P1^0;//ds1302跟單片機(jī)接口sbitSCLK=P1^1;sbitRST=P1^2;externunsignedchardatetime[7];//存儲(chǔ)獲得的時(shí)間值externvoidgettime(); //讀取時(shí)間值函數(shù)#endif/*ds1302.c*/#include<intrins.h>#include"ds1302.h"uchardatetime[7]={0,0,0,0,0,0,0};//用來接收獲得的時(shí)間值voidwrite_a_byte_to_ds1302(ucharX){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++) { CLK1=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時(shí)最亮 write(0x0b,0x07);//掃描數(shù)碼管個(gè)數(shù)地址0x0c,最多掃描8只數(shù)碼管 write(0x0c,0x01);//工作模式地址0x0c0x00:關(guān)閉;0x01:正常 }voidinit1(){ write1(0x09,0xff); write1(0x0a,0x07); write1(0x0b,0x07); write1(0x0c,0x01); }/*ds18b20.h*/#ifndef_DS18B20_H#define_DS18B20_H#include<reg51.h>#include"delay.h"#include<intrins.h>#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時(shí)表示當(dāng)前讀取溫度正常,否則讀取失敗。externucharDisplay_Digit[4]; //讀取的溫度值轉(zhuǎn)換后存在這個(gè)數(shù)組中externvoidRead_Temperature();//讀取當(dāng)前溫度值externvoidProcess_Temperature(); //處理當(dāng)前獲得的溫度值,正數(shù),負(fù)數(shù)等。#endif/*ds18b20.c*/#include"ds18b20.h"http://溫度字符ucharcodeTemperature_Char[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};//溫度小數(shù)對(duì)照表ucharcodedf_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};ucharCurrentT=0;//當(dāng)前讀取的溫度整數(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時(shí)表示當(dāng)前讀取溫度正常,否則讀取失敗。ucharDisplay_Digit[4]={0,0,0,0};//讀取的溫度值轉(zhuǎn)換后存在這個(gè)數(shù)組中//-------------------------------------------------------//初始化DS18B20//-------------------------------------------------------ucharInit_DS18B20(){ucharstatus;DQ=1;delayms(8);DQ=0;delayms(90);DQ=1;delayms(8);status=DQ;delayms(100);DQ=1;returnstatus;}//-------------------------------------------------------//讀一字節(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);//跳過序列號(hào) WriteOneByte(0x44);//啟動(dòng)溫度轉(zhuǎn)換 Init_DS18B20(); WriteOneByte(0xCC);//跳過序列號(hào) WriteOneByte(0xBE);//讀取溫度寄存器 Temp_Value[0]=ReadOneByte();//溫度低8位 Temp_Value[1]=ReadOneByte();//溫度高8位 DS18B20_IS_OK=1; }}//----------------------------------------------------------------//對(duì)讀取的溫度值進(jìn)行判斷,處理,負(fù)數(shù)的情況,整數(shù)情況//----------------------------------------------------------------voidProcess_Temperature(){//uchari;//延時(shí)值與負(fù)數(shù)標(biāo)識(shí)//ucharng=0;//高5位全為1(0)則為負(fù)數(shù),為負(fù)數(shù)時(shí)取反加1,并設(shè)置負(fù)數(shù)標(biāo)識(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ù)標(biāo)識(shí)置1ng=1;}elseng=0;//查表得到溫度小數(shù)部分Display_Digit[0]=df_Table[Temp_Value[0]&0x0F];//獲取溫度整數(shù)部分(高字節(jié)中的第三位與低字節(jié)中的高四位,無符號(hào))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;}/*main.c*/#include"max7221.h"#include"ds1302.h"#include"ds18b20.h"ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //數(shù)碼管段碼共陽極uchardisbuff[]={0,0,10,0,0,10,0,0};//第一個(gè)max7221顯示緩存uchardisbuff1[]={0,0,10,0,0,10,0,0};//第二個(gè)max7221顯示緩存voidinit_T() //定時(shí)器初始化{ TMOD=0X01; TH0=-5000/256; TL0=-5000%256; TR0=1; ET0=1; EA=1;}voidmain() //主函數(shù){ uchari; init(); init1(); //第一個(gè)max7221初始化 init_T(); //第二個(gè)max7221初始化 Read_Temperature(); //先讀一遍當(dāng)前溫度 delayms(50000); //讀取溫度有一段時(shí)間,先讓他等待一段時(shí)間否則下一刻顯示的將會(huì)是錯(cuò)誤的溫度 delayms(50000); delayms(50000); while(1) { gettime(); //讀取當(dāng)前時(shí)間值 disbuff[0]=datetime[2]/10; //將獲得的時(shí)間值分解出來 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++) //第一個(gè)max7221顯示 { write(i+1,disbuff1[i]); } for(i=0;i<8;i++) //第二個(gè)max7221顯示 { write1(i+1,disbuff[i]); } Read_Temperature(); //再次讀取當(dāng)前溫度 if(DS18B20_IS_OK) //如果讀取成功 { Process_Temperature(); //對(duì)溫度進(jìn)行處理,特別要考慮的是負(fù)數(shù)的情況 delayms(50000); //延時(shí)等溫度顯示穩(wěn)定了再次讀取,這個(gè)值要取適當(dāng),否則數(shù)碼管顯示會(huì)出現(xiàn)閃爍情況 delayms(50000); delayms(50000); } }}voidTimer0_1()interrupt1 //為了避免溫度顯示在數(shù)碼管上出現(xiàn)閃屏的情況,這里使用定時(shí)器來顯示當(dāng)前溫度。{ staticnum=0; TH0=-3000/256; //這個(gè)數(shù)值要足夠的小,這樣掃描次數(shù)才會(huì)更多,顯示才會(huì)更穩(wěn)定 TL0=-3000%256; P3=0x00;//每次進(jìn)來時(shí)候要讓位碼清空,也叫做消影 switch(num) //通過一個(gè)Switch語句來實(shí)現(xiàn)對(duì)數(shù)碼管的掃描 { case0: //在數(shù)碼管上顯示當(dāng)前溫度值 { P0=table[Display_Digit[0]]; //小數(shù)后面的一位 P3=0x20>>0; } break; case1: { P0=table[Display_Digit[1]]&0x7f; //有小數(shù)點(diǎn)的位要&0x7f P3=0x20>>1; //小數(shù)位,個(gè)為 } break; case2: //十位 { if(Display_Digit[2]==0) { if(Display_Digit[3]==0) //若十位為零且百位也為零,則都顯示十位為空P0=0xff; P0=0xff; } else P0=table[Dis
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版高端商務(wù)門面租賃合同4篇
- 2025年度智能家庭“魔百和”套餐開通及服務(wù)協(xié)議3篇
- 2024年小學(xué)消防安全責(zé)任制度
- 遺傳算法的課程設(shè)計(jì)論文
- 運(yùn)輸行政管理課程設(shè)計(jì)
- 二零二五年綠色環(huán)保刮瓷施工技術(shù)合作協(xié)議2篇
- 2025年度高端消防工程設(shè)計(jì)合同范本3篇
- 2025年度個(gè)人貸款合同補(bǔ)充協(xié)議(抵押物變更)4篇
- 《中醫(yī)養(yǎng)生學(xué)輔助》課件
- 2025年度商業(yè)樓宇窗簾設(shè)計(jì)安裝一體化合同范本4篇
- 2025年浙江省湖州市湖州職業(yè)技術(shù)學(xué)院招聘5人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- ZK24600型平旋盤使用說明書(環(huán)球)
- 城市基礎(chǔ)設(shè)施維修計(jì)劃
- 2024山西廣播電視臺(tái)招聘專業(yè)技術(shù)崗位編制人員20人歷年高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- 新材料行業(yè)系列深度報(bào)告一:新材料行業(yè)研究框架
- 人教版小學(xué)英語各冊(cè)單詞表(帶英標(biāo))
- 廣東省潮州市潮安區(qū)2023-2024學(xué)年六年級(jí)上學(xué)期期末考試數(shù)學(xué)試題
- 鄉(xiāng)村治理中正式制度與非正式制度的關(guān)系解析
- 智能護(hù)理:人工智能助力的醫(yī)療創(chuàng)新
- 國家中小學(xué)智慧教育平臺(tái)培訓(xùn)專題講座
- 5G+教育5G技術(shù)在智慧校園教育專網(wǎng)系統(tǒng)的應(yīng)用
評(píng)論
0/150
提交評(píng)論