數(shù)碼管模塊化顯示電子萬年歷_第1頁
數(shù)碼管模塊化顯示電子萬年歷_第2頁
數(shù)碼管模塊化顯示電子萬年歷_第3頁
數(shù)碼管模塊化顯示電子萬年歷_第4頁
數(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)

文檔簡介

1、數(shù)碼管顯示模塊化顯示電子萬年歷數(shù)碼管 共陽極7407驅(qū)動(dòng) 共陰極max7221/7419驅(qū)動(dòng)Ds1302 實(shí)時(shí)時(shí)間顯示Ds18b20 溫度顯示芯片/*delay.h*/#ifndef _DELAY_H#define _DELAY_H_#define uint unsigned int #define uchar unsigned char void delay(uint xms); /秒級(jí)延時(shí)void delayms(uint xms); /毫秒級(jí)延時(shí),不可以更改,若更改,DS18B20將顯示異常#endif/*delay.c*/#include "delay.h"void

2、 delay(uint xms)uint i;uchar j;for(i=xms;i>0;i-)for(j=110;j>0;j-);void delayms(uint xms) /毫秒級(jí)別延時(shí)while(xms-);/*ds1302.h*/#ifndef _DS1302_H_#define _DS1302_H_#include <reg51.h>#define uint unsigned int #define uchar unsigned charsbit IO=P10; /ds1302跟單片機(jī)接口sbit SCLK=P11;sbit RST=P12;extern u

3、nsigned char datetime7; /存儲(chǔ)獲得的時(shí)間值extern void gettime();/讀取時(shí)間值函數(shù)#endif/*ds1302.c*/#include <intrins.h>#include "ds1302.h"uchar datetime7=0,0,0,0,0,0,0; /用來接收獲得的時(shí)間值 void write_a_byte_to_ds1302(uchar X) uchar i; for(i=0;i<8;i+) IO=X&0X01; SCLK=1; SCLK=0; X>>=1; uchar get_a_

4、byte_from_ds1302() uchar i,b=0x00; for(i=0;i<8;i+) b|=_crol_(uchar )IO,i); SCLK=1; SCLK=0; /return b/16*10+b%16; /返回的碼轉(zhuǎn)換為十進(jìn)制 return (b>>4)*10+(b&0x0f); /注意運(yùn)算的優(yōu)先級(jí) uchar read_data(uchar add) uchar dat; RST=0; SCLK=0; RST=1; write_a_byte_to_ds1302(add); dat=get_a_byte_from_ds1302(); SCLK=1

5、; RST=0; return dat; void gettime() /ds1302讀取當(dāng)前時(shí)間存儲(chǔ)在datetime中 uchar i,add=0x81; for(i=0;i<7;i+) datetimei=read_data(add); add+=2; /*max7221.h*/#ifndef _MAX7221_H_ /注:Max7221只能用來驅(qū)動(dòng)共陰數(shù)碼管,對(duì)共陽的沒效#define _MAX7221_H_#include <reg51.h>#define uint unsigned int #define uchar unsigned charsbit DIN=P

6、20;/max7221與單片機(jī)接口 DIN.CSB.CLK.sbit CSB=P21;sbit CLK=P22;sbit DIN1=P23;sbit CSB1=P24;sbit CLK1=P25;extern void write(unsigned char addr , unsigned char dat);/max7221寫數(shù)據(jù),轉(zhuǎn)換數(shù)據(jù)函數(shù) ,num的值為1,或者2,當(dāng)num為1時(shí),片選的是第一塊Max7221,同理亦然。extern void write1(uchar addr,uchar dat);extern void init(); /max7221初始化extern void

7、init1();#endif/*max7221.c*/#include "max7221.h"#include <intrins.h>void write(uchar addr,uchar dat) /寫數(shù)據(jù),寫地址函數(shù)uchar i;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;void wr

8、ite1(uchar addr,uchar dat)uchar i;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;void init() write(0x09,0xff); /編碼模式地址0x09 , 0x00-0xff,為1的則位選通write(0x0a,0x07); /亮度地址0x0a ,0x00-0x

9、0f,0x0f時(shí)最亮write(0x0b,0x07); /掃描數(shù)碼管個(gè)數(shù)地址0x0c,最多掃描8只數(shù)碼管write(0x0c,0x01); /工作模式地址0x0c 0x00:關(guān)閉;0x01:正常void init1()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 <intri

10、ns.h>#define NOP() _nop_(),_nop_(),_nop_(),_nop_()sbit DQ=P13; /DS18B20控制線,單線模式。extern bit ng; /正負(fù)數(shù)標(biāo)志位,ng=0,為正數(shù),反之為負(fù)數(shù),正數(shù)負(fù)數(shù)的處理方法不同,extern bit DS18B20_IS_OK;/為1時(shí)表示當(dāng)前讀取溫度正常,否則讀取失敗。extern uchar Display_Digit4; /讀取的溫度值轉(zhuǎn)換后存在這個(gè)數(shù)組中extern void Read_Temperature(); /讀取當(dāng)前溫度值extern void Process_Temperature();

11、 /處理當(dāng)前獲得的溫度值,正數(shù),負(fù)數(shù)等。#endif/*ds18b20.c*/#include "ds18b20.h"/溫度字符uchar code Temperature_Char8 = 0x0c,0x12,0x12,0x0c,0x00,0x00, 0x00,0x00;/溫度小數(shù)對(duì)照表uchar code df_Table = 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9 ;uchar CurrentT = 0 ; /當(dāng)前讀取的溫度整數(shù)部分uchar Temp_Value = 0x00,0x00; /從DS18B20讀取的溫度值bit ng=0; /正負(fù)

12、數(shù)標(biāo)志位,ng=0,為正數(shù),反之為負(fù)數(shù),正數(shù)負(fù)數(shù)的處理方法不同,bit DS18B20_IS_OK=1; /為1時(shí)表示當(dāng)前讀取溫度正常,否則讀取失敗。uchar Display_Digit4=0,0,0,0; /讀取的溫度值轉(zhuǎn)換后存在這個(gè)數(shù)組中/-/ 初始化DS18B20/-uchar Init_DS18B20() uchar status; DQ = 1; delayms(8); DQ = 0 ; delayms(90); DQ = 1; delayms(8); status = DQ; delayms(100); DQ = 1; return status;/-/讀一字節(jié)/-uchar R

13、eadOneByte() uchar i, 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; return dat;/-/ 寫一字節(jié)/-void WriteOneByte(uchar dat) uchar i ; for (i = 0; i < 8; i+) DQ = 0 ; DQ = dat & 0x01 ; delayms(5); DQ = 1

14、; dat>>=1; /-/ 讀取溫度值/- void Read_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_Value0 = ReadOneByte(); /溫度低8位 Temp_Value1 = ReadOneByte

15、(); /溫度高8位 DS18B20_IS_OK = 1; /-/對(duì)讀取的溫度值進(jìn)行判斷,處理,負(fù)數(shù)的情況,整數(shù)情況/-void Process_Temperature() / uchar i; /延時(shí)值與負(fù)數(shù)標(biāo)識(shí)/ uchar ng = 0; /高5位全為1(0)則為負(fù)數(shù),為負(fù)數(shù)時(shí)取反加1,并設(shè)置負(fù)數(shù)標(biāo)識(shí) if ( (Temp_Value1 & 0xF8) = 0xF8) Temp_Value1 = Temp_Value1; Temp_Value0 = Temp_Value0 + 1; if (Temp_Value0 = 0x00) Temp_Value1+; /負(fù)數(shù)標(biāo)識(shí)置1 ng

16、= 1; else ng=0; /查表得到溫度小數(shù)部分 Display_Digit0 = df_Table Temp_Value0 & 0x0F ; /獲取溫度整數(shù)部分(高字節(jié)中的第三位與低字節(jié)中的高四位,無符號(hào)) CurrentT = (Temp_Value0 & 0xF0)>>4)|(Temp_Value1 & 0x07)<<4); /將整數(shù)部分分解為3位待顯示數(shù)字 Display_Digit3 = CurrentT / 100; Display_Digit2 = CurrentT % 100 / 10; Display_Digit1 = C

17、urrentT % 10;/*main.c*/#include "max7221.h"#include "ds1302.h"#include "ds18b20.h"uchar code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; /數(shù)碼管段碼共陽極uchar disbuff=0,0,10,0,0,10,0,0; /第一個(gè)max7221顯示緩存uchar disbuff1=0,0,10,0,0,10,0,0; /第二個(gè)max7221顯示緩存void init_T()

18、/定時(shí)器初始化TMOD=0X01;TH0=-5000/256;TL0=-5000%256;TR0=1;ET0=1;EA=1;void main() /主函數(shù)uchar i;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í)間值disbuff0=datetime2/10;

19、 /將獲得的時(shí)間值分解出來disbuff1=datetime2%10;disbuff3=datetime1/10;disbuff4=datetime1%10;disbuff6=datetime0/10;disbuff7=datetime0%10;disbuff10=datetime6/10;disbuff11=datetime6%10;disbuff13=datetime4/10;disbuff14=datetime4%10;disbuff16=datetime3/10;disbuff17=datetime3%10;for(i=0;i<8;i+)/第一個(gè)max7221顯示write(i+

20、1,disbuff1i);for(i=0;i<8;i+) /第二個(gè)max7221顯示write1(i+1,disbuffi);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);void Timer0_1() interrupt 1/為了避免溫度顯示在數(shù)碼管上出現(xiàn)閃屏的情況,這里使用定時(shí)器來顯示當(dāng)前溫度。static num=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ù)碼管的掃描case 0: /在數(shù)碼管上顯示當(dāng)前溫度值P0=tableDisplay_Digit0;/小數(shù)后面的一位P3=0x20>

溫馨提示

  • 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)論