單片機(jī)C語言模塊化編程之?dāng)?shù)碼管顯示電子萬年歷篇_第1頁
單片機(jī)C語言模塊化編程之?dāng)?shù)碼管顯示電子萬年歷篇_第2頁
單片機(jī)C語言模塊化編程之?dāng)?shù)碼管顯示電子萬年歷篇_第3頁
單片機(jī)C語言模塊化編程之?dāng)?shù)碼管顯示電子萬年歷篇_第4頁
單片機(jī)C語言模塊化編程之?dāng)?shù)碼管顯示電子萬年歷篇_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論